bootstrap.js 57.2 KB
Newer Older
1
/*!
Mark Otto's avatar
Mark Otto committed
2
 * Bootstrap v3.1.0 (http://getbootstrap.com)
Chris Rebert's avatar
Chris Rebert committed
3
 * Copyright 2013 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

Mark Otto's avatar
Mark Otto committed
7
if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }
8

9
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
10
 * Bootstrap: transition.js v3.1.0
Mark Otto's avatar
Mark Otto committed
11
 * http://getbootstrap.com/javascript/#transitions
12
 * ========================================================================
13
 * Copyright 2013 Twitter, Inc.
14
15
16
17
18
19
20
21
22
23
24
25
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
26
 * ======================================================================== */
27
28


XhmikosR's avatar
XhmikosR committed
29
+function ($) { 'use strict';
30

31
32
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
33

34
35
  function transitionEnd() {
    var el = document.createElement('bootstrap')
36

37
    var transEndEventNames = {
Mark Otto's avatar
Mark Otto committed
38
39
40
41
      'WebkitTransition' : 'webkitTransitionEnd',
      'MozTransition'    : 'transitionend',
      'OTransition'      : 'oTransitionEnd otransitionend',
      'transition'       : 'transitionend'
fat's avatar
fat committed
42
    }
43

44
45
46
47
48
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }
49
50
  }

51
52
  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
53
    var called = false, $el = this
liuyl's avatar
liuyl committed
54
55
    $(this).one($.support.transition.end, function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
56
    setTimeout(callback, duration)
57
    return this
58
59
  }

60
61
  $(function () {
    $.support.transition = transitionEnd()
fat's avatar
fat committed
62
  })
63

Chris Rebert's avatar
Chris Rebert committed
64
}(jQuery);
65

66
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
67
 * Bootstrap: alert.js v3.1.0
Mark Otto's avatar
Mark Otto committed
68
 * http://getbootstrap.com/javascript/#alerts
69
 * ========================================================================
fat's avatar
fat committed
70
 * Copyright 2013 Twitter, Inc.
71
72
73
74
75
76
77
78
79
80
81
82
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
83
 * ======================================================================== */
84
85


XhmikosR's avatar
XhmikosR committed
86
+function ($) { 'use strict';
87

fat's avatar
fat committed
88
89
  // ALERT CLASS DEFINITION
  // ======================
90
91

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

  Alert.prototype.close = function (e) {
fat's avatar
fat committed
97
98
    var $this    = $(this)
    var selector = $this.attr('data-target')
99
100
101

    if (!selector) {
      selector = $this.attr('href')
fat's avatar
fat committed
102
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
103
104
    }

fat's avatar
fat committed
105
    var $parent = $(selector)
106

fat's avatar
fat committed
107
    if (e) e.preventDefault()
108

fat's avatar
fat committed
109
110
111
    if (!$parent.length) {
      $parent = $this.hasClass('alert') ? $this : $this.parent()
    }
112

Mark Otto's avatar
Mark Otto committed
113
    $parent.trigger(e = $.Event('close.bs.alert'))
114
115
116
117
118
119

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
Mark Otto's avatar
Mark Otto committed
120
      $parent.trigger('closed.bs.alert').remove()
121
122
123
    }

    $.support.transition && $parent.hasClass('fade') ?
124
125
126
      $parent
        .one($.support.transition.end, removeElement)
        .emulateTransitionEnd(150) :
127
128
129
130
      removeElement()
  }


fat's avatar
fat committed
131
132
  // ALERT PLUGIN DEFINITION
  // =======================
133

134
135
  var old = $.fn.alert

136
137
138
  $.fn.alert = function (option) {
    return this.each(function () {
      var $this = $(this)
Mark Otto's avatar
Mark Otto committed
139
      var data  = $this.data('bs.alert')
fat's avatar
fat committed
140

Mark Otto's avatar
Mark Otto committed
141
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
142
143
144
145
146
147
148
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.alert.Constructor = Alert


fat's avatar
fat committed
149
150
  // ALERT NO CONFLICT
  // =================
151
152
153
154
155
156
157

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


fat's avatar
fat committed
158
  // ALERT DATA-API
fat's avatar
fat committed
159
  // ==============
160

Mark Otto's avatar
Mark Otto committed
161
  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
162

Chris Rebert's avatar
Chris Rebert committed
163
}(jQuery);
164

165
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
166
 * Bootstrap: button.js v3.1.0
Mark Otto's avatar
Mark Otto committed
167
 * http://getbootstrap.com/javascript/#buttons
168
 * ========================================================================
fat's avatar
fat committed
169
 * Copyright 2013 Twitter, Inc.
170
171
172
173
174
175
176
177
178
179
180
181
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
182
 * ======================================================================== */
183
184


XhmikosR's avatar
XhmikosR committed
185
+function ($) { 'use strict';
186

fat's avatar
fat committed
187
188
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
189
190
191

  var Button = function (element, options) {
    this.$element = $(element)
fat's avatar
fat committed
192
193
194
195
196
    this.options  = $.extend({}, Button.DEFAULTS, options)
  }

  Button.DEFAULTS = {
    loadingText: 'loading...'
197
198
199
  }

  Button.prototype.setState = function (state) {
fat's avatar
fat committed
200
201
202
203
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()
204
205

    state = state + 'Text'
fat's avatar
fat committed
206
207

    if (!data.resetText) $el.data('resetText', $el[val]())
208
209
210
211
212
213
214

    $el[val](data[state] || this.options[state])

    // push to event loop to allow forms to submit
    setTimeout(function () {
      state == 'loadingText' ?
        $el.addClass(d).attr(d, d) :
fat's avatar
fat committed
215
        $el.removeClass(d).removeAttr(d);
216
217
218
219
    }, 0)
  }

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

223
    if ($parent.length) {
fat's avatar
fat committed
224
      var $input = this.$element.find('input')
225
226
227
228
229
230
231
232
      if ($input.prop('type') === 'radio') {
        // see if clicking on current one
        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')
fat's avatar
fat committed
233
    }
234

235
    if (changed) this.$element.toggleClass('active')
236
237
238
  }


fat's avatar
fat committed
239
240
  // BUTTON PLUGIN DEFINITION
  // ========================
241

242
243
  var old = $.fn.button

244
245
  $.fn.button = function (option) {
    return this.each(function () {
fat's avatar
fat committed
246
      var $this   = $(this)
fat's avatar
fat committed
247
      var data    = $this.data('bs.button')
fat's avatar
fat committed
248
249
      var options = typeof option == 'object' && option

Mark Otto's avatar
Mark Otto committed
250
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
fat's avatar
fat committed
251

252
253
254
255
256
257
258
259
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  $.fn.button.Constructor = Button


fat's avatar
fat committed
260
261
  // BUTTON NO CONFLICT
  // ==================
262
263
264
265
266
267
268

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


fat's avatar
fat committed
269
270
  // BUTTON DATA-API
  // ===============
271

Mark Otto's avatar
Mark Otto committed
272
  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
273
274
275
    var $btn = $(e.target)
    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
    $btn.button('toggle')
276
    e.preventDefault()
277
278
  })

Chris Rebert's avatar
Chris Rebert committed
279
}(jQuery);
280

281
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
282
 * Bootstrap: carousel.js v3.1.0
Mark Otto's avatar
Mark Otto committed
283
 * http://getbootstrap.com/javascript/#carousel
284
 * ========================================================================
285
 * Copyright 2013 Twitter, Inc.
286
287
288
289
290
291
292
293
294
295
296
297
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
298
 * ======================================================================== */
299
300


XhmikosR's avatar
XhmikosR committed
301
+function ($) { 'use strict';
302

fat's avatar
fat committed
303
304
  // CAROUSEL CLASS DEFINITION
  // =========================
305
306

  var Carousel = function (element, options) {
fat's avatar
fat committed
307
    this.$element    = $(element)
fat's avatar
fat committed
308
    this.$indicators = this.$element.find('.carousel-indicators')
fat's avatar
fat committed
309
310
311
312
313
314
315
    this.options     = options
    this.paused      =
    this.sliding     =
    this.interval    =
    this.$active     =
    this.$items      = null

316
317
318
319
320
    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
      .on('mouseleave', $.proxy(this.cycle, this))
  }

fat's avatar
fat committed
321
  Carousel.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
322
323
324
    interval: 5000,
    pause: 'hover',
    wrap: true
fat's avatar
fat committed
325
  }
326

fat's avatar
fat committed
327
328
  Carousel.prototype.cycle =  function (e) {
    e || (this.paused = false)
329

fat's avatar
fat committed
330
    this.interval && clearInterval(this.interval)
fat's avatar
fat committed
331

fat's avatar
fat committed
332
333
334
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
335

fat's avatar
fat committed
336
337
    return this
  }
338

fat's avatar
fat committed
339
340
341
  Carousel.prototype.getActiveIndex = function () {
    this.$active = this.$element.find('.item.active')
    this.$items  = this.$active.parent().children()
342

fat's avatar
fat committed
343
344
    return this.$items.index(this.$active)
  }
345

fat's avatar
fat committed
346
347
348
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getActiveIndex()
349

fat's avatar
fat committed
350
    if (pos > (this.$items.length - 1) || pos < 0) return
351

352
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
fat's avatar
fat committed
353
354
355
356
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
  }
357

fat's avatar
fat committed
358
359
360
361
362
363
  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

    if (this.$element.find('.next, .prev').length && $.support.transition.end) {
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
364
365
    }

fat's avatar
fat committed
366
    this.interval = clearInterval(this.interval)
367

fat's avatar
fat committed
368
369
    return this
  }
370

fat's avatar
fat committed
371
372
373
374
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
375

fat's avatar
fat committed
376
377
378
379
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
380

fat's avatar
fat committed
381
382
383
384
385
386
387
  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
Jacob Thornton's avatar
Jacob Thornton committed
388

Jacob Thornton's avatar
Jacob Thornton committed
389
390
391
392
393
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
    }

fat's avatar
fat committed
394
    this.sliding = true
395

fat's avatar
fat committed
396
    isCycling && this.pause()
fat's avatar
fat committed
397

Mark Otto's avatar
Mark Otto committed
398
    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
399

fat's avatar
fat committed
400
401
402
403
    if ($next.hasClass('active')) return

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
404
      this.$element.one('slid.bs.carousel', function () {
fat's avatar
fat committed
405
406
407
408
409
410
411
412
413
414
415
416
        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
        $nextIndicator && $nextIndicator.addClass('active')
      })
    }

    if ($.support.transition && this.$element.hasClass('slide')) {
      this.$element.trigger(e)
      if (e.isDefaultPrevented()) return
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
Jacob Thornton's avatar
Jacob Thornton committed
417
      $active
418
419
420
421
        .one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
422
          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
423
        })
Mark Otto's avatar
Mark Otto committed
424
        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
fat's avatar
fat committed
425
426
427
428
429
430
    } else {
      this.$element.trigger(e)
      if (e.isDefaultPrevented()) return
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
431
      this.$element.trigger('slid.bs.carousel')
432
433
    }

fat's avatar
fat committed
434
435
436
    isCycling && this.cycle()

    return this
437
438
439
  }


fat's avatar
fat committed
440
441
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
442

443
444
  var old = $.fn.carousel

445
446
  $.fn.carousel = function (option) {
    return this.each(function () {
fat's avatar
fat committed
447
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
448
      var data    = $this.data('bs.carousel')
Jacob Thornton's avatar
Jacob Thornton committed
449
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
fat's avatar
fat committed
450
451
      var action  = typeof option == 'string' ? option : options.slide

Mark Otto's avatar
Mark Otto committed
452
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
453
      if (typeof option == 'number') data.to(option)
Jacob Thornton's avatar
Jacob Thornton committed
454
      else if (action) data[action]()
Mark Otto's avatar
Mark Otto committed
455
      else if (options.interval) data.pause().cycle()
456
457
458
459
460
461
    })
  }

  $.fn.carousel.Constructor = Carousel


fat's avatar
fat committed
462
463
  // CAROUSEL NO CONFLICT
  // ====================
464
465
466
467
468
469

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

fat's avatar
fat committed
470

fat's avatar
fat committed
471
472
  // CAROUSEL DATA-API
  // =================
473

474
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
fat's avatar
fat committed
475
    var $this   = $(this), href
fat's avatar
fat committed
476
477
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    var options = $.extend({}, $target.data(), $this.data())
fat's avatar
fat committed
478
479
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
480

481
    $target.carousel(options)
482
483

    if (slideIndex = $this.attr('data-slide-to')) {
fat's avatar
fat committed
484
      $target.data('bs.carousel').to(slideIndex)
485
486
    }

487
    e.preventDefault()
488
489
  })

fat's avatar
fat committed
490
491
492
493
494
495
496
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      $carousel.carousel($carousel.data())
    })
  })

Chris Rebert's avatar
Chris Rebert committed
497
}(jQuery);
498

499
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
500
 * Bootstrap: collapse.js v3.1.0
Mark Otto's avatar
Mark Otto committed
501
 * http://getbootstrap.com/javascript/#collapse
502
 * ========================================================================
503
 * Copyright 2013 Twitter, Inc.
504
505
506
507
508
509
510
511
512
513
514
515
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
516
 * ======================================================================== */
517
518


XhmikosR's avatar
XhmikosR committed
519
+function ($) { 'use strict';
520

521
522
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
523
524

  var Collapse = function (element, options) {
525
526
527
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
528

529
530
531
532
533
534
535
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }

  Collapse.DEFAULTS = {
    toggle: true
  }
536

537
538
539
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
540
541
  }

542
543
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
544

fat's avatar
fat committed
545
546
547
548
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

Mark Otto's avatar
Mark Otto committed
549
    var actives = this.$parent && this.$parent.find('> .panel > .in')
550

551
    if (actives && actives.length) {
fat's avatar
fat committed
552
      var hasData = actives.data('bs.collapse')
553
554
      if (hasData && hasData.transitioning) return
      actives.collapse('hide')
fat's avatar
fat committed
555
      hasData || actives.data('bs.collapse', null)
556
557
    }

558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
    var dimension = this.dimension()

    this.$element
      .removeClass('collapse')
      .addClass('collapsing')
      [dimension](0)

    this.transitioning = 1

    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('in')
        [dimension]('auto')
      this.transitioning = 0
      this.$element.trigger('shown.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
579

580
581
582
583
    this.$element
      .one($.support.transition.end, $.proxy(complete, this))
      .emulateTransitionEnd(350)
      [dimension](this.$element[0][scrollSize])
584
  }
585

586
587
  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return
fat's avatar
fat committed
588
589
590
591
592

    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

593
    var dimension = this.dimension()
594

595
596
597
    this.$element
      [dimension](this.$element[dimension]())
      [0].offsetHeight
598

599
    this.$element
600
      .addClass('collapsing')
601
      .removeClass('collapse')
602
      .removeClass('in')
603

604
    this.transitioning = 1
605

606
    var complete = function () {
607
608
609
610
611
      this.transitioning = 0
      this.$element
        .trigger('hidden.bs.collapse')
        .removeClass('collapsing')
        .addClass('collapse')
612
613
    }

614
    if (!$.support.transition) return complete.call(this)
615

616
617
618
619
    this.$element
      [dimension](0)
      .one($.support.transition.end, $.proxy(complete, this))
      .emulateTransitionEnd(350)
620
  }
621

622
623
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
624
625
626
  }


627
628
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
629
630

  var old = $.fn.collapse
631
632
633

  $.fn.collapse = function (option) {
    return this.each(function () {
634
      var $this   = $(this)
fat's avatar
fat committed
635
      var data    = $this.data('bs.collapse')
636
637
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

fat's avatar
fat committed
638
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
639
640
641
642
643
644
645
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.Constructor = Collapse


646
647
  // COLLAPSE NO CONFLICT
  // ====================
648

649
650
651
652
653
654
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


655
656
  // COLLAPSE DATA-API
  // =================
657

658
  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
659
660
    var $this   = $(this), href
    var target  = $this.attr('data-target')
661
662
        || e.preventDefault()
        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
663
664
665
666
    var $target = $(target)
    var data    = $target.data('bs.collapse')
    var option  = data ? 'toggle' : $this.data()
    var parent  = $this.attr('data-parent')
Mark Otto's avatar
Mark Otto committed
667
    var $parent = parent && $(parent)
668

fat's avatar
fat committed
669
    if (!data || !data.transitioning) {
670
      if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
671
      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
fat's avatar
fat committed
672
673
    }

674
    $target.collapse(option)
675
676
  })

Chris Rebert's avatar
Chris Rebert committed
677
}(jQuery);
678

679
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
680
 * Bootstrap: dropdown.js v3.1.0
Mark Otto's avatar
Mark Otto committed
681
 * http://getbootstrap.com/javascript/#dropdowns
682
 * ========================================================================
683
 * Copyright 2013 Twitter, Inc.
684
685
686
687
688
689
690
691
692
693
694
695
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
696
 * ======================================================================== */
697
698


XhmikosR's avatar
XhmikosR committed
699
+function ($) { 'use strict';
700

701
702
  // DROPDOWN CLASS DEFINITION
  // =========================
703

704
705
706
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle=dropdown]'
  var Dropdown = function (element) {
707
    $(element).on('click.bs.dropdown', this.toggle)
708
  }
709

710
711
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
712

713
    if ($this.is('.disabled, :disabled')) return
714

715
716
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
717

718
    clearMenus()
fat's avatar
fat committed
719

720
    if (!isActive) {
fat's avatar
fat committed
721
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
Mark Otto's avatar
Mark Otto committed
722
        // if mobile we use a backdrop because click events don't delegate
Jacob Thornton's avatar
Jacob Thornton committed
723
        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
fat's avatar
fat committed
724
      }
725
726
727
728
729
730
731
732

      $parent.trigger(e = $.Event('show.bs.dropdown'))

      if (e.isDefaultPrevented()) return

      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown')
733

fat's avatar
rebuild    
fat committed
734
735
      $this.focus()
    }
736

737
738
    return false
  }
739

740
741
  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return
742

743
    var $this = $(this)
744

745
746
    e.preventDefault()
    e.stopPropagation()
747

748
    if ($this.is('.disabled, :disabled')) return
749

750
751
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
752

753
754
755
756
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).focus()
      return $this.click()
    }
757

758
    var $items = $('[role=menu] li:not(.divider):visible a', $parent)
759

760
    if (!$items.length) return
761

762
    var index = $items.index($items.filter(':focus'))
763

764
765
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
Mark Otto's avatar
Mark Otto committed
766
    if (!~index)                                      index = 0
767

768
    $items.eq(index).focus()
769
770
  }

Mark Otto's avatar
Mark Otto committed
771
  function clearMenus() {
772
    $(backdrop).remove()
773
    $(toggle).each(function (e) {
774
775
776
777
778
779
      var $parent = getParent($(this))
      if (!$parent.hasClass('open')) return
      $parent.trigger(e = $.Event('hide.bs.dropdown'))
      if (e.isDefaultPrevented()) return
      $parent.removeClass('open').trigger('hidden.bs.dropdown')
    })
780
781
782
783
784
785
786
  }

  function getParent($this) {
    var selector = $this.attr('data-target')

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

790
    var $parent = selector && $(selector)
791

792
    return $parent && $parent.length ? $parent : $this.parent()
793
794
795
  }


796
797
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
798

799
800
  var old = $.fn.dropdown

801
802
803
  $.fn.dropdown = function (option) {
    return this.each(function () {
      var $this = $(this)
804
      var data  = $this.data('bs.dropdown')
805

806
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
807
808
809
810
811
812
813
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.dropdown.Constructor = Dropdown


814
815
  // DROPDOWN NO CONFLICT
  // ====================
816
817
818
819
820
821
822

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


823
824
825
  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

826
  $(document)
827
828
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
Mark Otto's avatar
Mark Otto committed
829
830
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]', Dropdown.prototype.keydown)
831

Chris Rebert's avatar
Chris Rebert committed
832
}(jQuery);
833

834
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
835
 * Bootstrap: modal.js v3.1.0
Mark Otto's avatar
Mark Otto committed
836
 * http://getbootstrap.com/javascript/#modals
837
 * ========================================================================
838
 * Copyright 2013 Twitter, Inc.
839
840
841
842
843
844
845
846
847
848
849
850
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
851
 * ======================================================================== */
852
853


XhmikosR's avatar
XhmikosR committed
854
+function ($) { 'use strict';
855

fat's avatar
fat committed
856
857
  // MODAL CLASS DEFINITION
  // ======================
858

Jacob Thornton's avatar
Jacob Thornton committed
859
  var Modal = function (element, options) {
fat's avatar
fat committed
860
    this.options   = options
fat's avatar
rebuild    
fat committed
861
    this.$element  = $(element)
fat's avatar
fat committed
862
863
    this.$backdrop =
    this.isShown   = null
864

Jacob Thornton's avatar
Jacob Thornton committed
865
    if (this.options.remote) this.$element.load(this.options.remote)
fat's avatar
fat committed
866
  }
867

fat's avatar
fat committed
868
  Modal.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
869
870
871
    backdrop: true,
    keyboard: true,
    show: true
fat's avatar
fat committed
872
  }
873

Jacob Thornton's avatar
Jacob Thornton committed
874
875
  Modal.prototype.toggle = function (_relatedTarget) {
    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
fat's avatar
fat committed
876
  }
877

Jacob Thornton's avatar
Jacob Thornton committed
878
  Modal.prototype.show = function (_relatedTarget) {
fat's avatar
fat committed
879
    var that = this
Jacob Thornton's avatar
Jacob Thornton committed
880
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
881

fat's avatar
fat committed
882
    this.$element.trigger(e)
883

fat's avatar
fat committed
884
    if (this.isShown || e.isDefaultPrevented()) return
885

fat's avatar
fat committed
886
    this.isShown = true
887

fat's avatar
fat committed
888
    this.escape()
889

fat's avatar
rebuild    
fat committed
890
891
    this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))

fat's avatar
fat committed
892
893
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
894

fat's avatar
fat committed
895
      if (!that.$element.parent().length) {
Jacob Thornton's avatar
Jacob Thornton committed
896
        that.$element.appendTo(document.body) // don't move modals dom position
fat's avatar
fat committed
897
      }
898

fat's avatar
fat committed
899
      that.$element.show()
900

fat's avatar
fat committed
901
902
903
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
904

fat's avatar
fat committed
905
906
907
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
908

fat's avatar
fat committed
909
      that.enforceFocus()
910

Jacob Thornton's avatar
Jacob Thornton committed
911
912
      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })

fat's avatar
fat committed
913
      transition ?
fat's avatar
fat committed
914
        that.$element.find('.modal-dialog') // wait for modal to slide in
915
          .one($.support.transition.end, function () {
Jacob Thornton's avatar
Jacob Thornton committed
916
            that.$element.focus().trigger(e)
917
918
          })
          .emulateTransitionEnd(300) :
Jacob Thornton's avatar
Jacob Thornton committed
919
        that.$element.focus().trigger(e)
fat's avatar
fat committed
920
921
    })
  }
922

fat's avatar
fat committed
923
  Modal.prototype.hide = function (e) {
fat's avatar
fat committed
924
    if (e) e.preventDefault()
925

Mark Otto's avatar
Mark Otto committed
926
    e = $.Event('hide.bs.modal')
927

fat's avatar
fat committed
928
    this.$element.trigger(e)
929

fat's avatar
fat committed
930
    if (!this.isShown || e.isDefaultPrevented()) return
931

fat's avatar
fat committed
932
    this.isShown = false
933

fat's avatar
fat committed
934
    this.escape()
935

Mark Otto's avatar
Mark Otto committed
936
    $(document).off('focusin.bs.modal')
937

fat's avatar
fat committed
938
939
940
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
Jacob Thornton's avatar
Jacob Thornton committed
941
      .off('click.dismiss.modal')
942

fat's avatar
fat committed
943
    $.support.transition && this.$element.hasClass('fade') ?
944
945
946
      this.$element
        .one($.support.transition.end, $.proxy(this.hideModal, this))
        .emulateTransitionEnd(300) :
fat's avatar
fat committed
947
948
      this.hideModal()
  }
949

fat's avatar
fat committed
950
  Modal.prototype.enforceFocus = function () {
Jacob Thornton's avatar
Jacob Thornton committed
951
952
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
fat's avatar
fat committed
953
954
955
956
957
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
          this.$element.focus()
        }
      }, this))
fat's avatar
fat committed
958
  }
959

fat's avatar
fat committed
960
961
  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
fat's avatar
fat committed
962
      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
fat's avatar
fat committed
963
        e.which == 27 && this.hide()
fat's avatar
fat committed
964
      }, this))
fat's avatar
fat committed
965
    } else if (!this.isShown) {
Mark Otto's avatar
Mark Otto committed
966
      this.$element.off('keyup.dismiss.bs.modal')
fat's avatar
fat committed
967
968
    }
  }
969

fat's avatar
fat committed
970
971
972
973
974
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.removeBackdrop()
Mark Otto's avatar
Mark Otto committed
975
      that.$element.trigger('hidden.bs.modal')
fat's avatar
fat committed
976
977
    })
  }
978

fat's avatar
fat committed
979
980
981
982
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
983

fat's avatar
fat committed
984
985
  Modal.prototype.backdrop = function (callback) {
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
986

fat's avatar
fat committed
987
988
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
989

fat's avatar
fat committed
990
991
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
        .appendTo(document.body)
992

Jacob Thornton's avatar
Jacob Thornton committed
993
      this.$element.on('click.dismiss.modal', $.proxy(function (e) {
fat's avatar
fat committed
994
995
996
997
998
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus.call(this.$element[0])
          : this.hide.call(this)
      }, this))
999

fat's avatar
fat committed
1000
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1001

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

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

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

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

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

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


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

1030
1031
  var old = $.fn.modal

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

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

  $.fn.modal.Constructor = Modal


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

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


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

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

1065
    e.preventDefault()
1066

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

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

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

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


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

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

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

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

1117
  Tooltip.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
1118
1119
1120
1121
1122
1123
1124
1125
1126
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false
1127
  }
1128

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

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

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

1140
1141
1142
1143
1144
      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1145

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

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

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

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

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

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

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

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

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

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

1188
    clearTimeout(self.timeout)
1189

1190
1191
    self.hoverState = 'in'

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

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

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

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

1205
1206
    self.hoverState = 'out'

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

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

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

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

1220
      if (e.isDefaultPrevented()) return
1221

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

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

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

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

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

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

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

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

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

1250
1251
1252
1253
1254
        var orgPlacement = placement
        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop
        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()
        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left
fat's avatar
fat committed
1255

1256
1257
1258
1259
1260
        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :
                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :
                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :
                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :
                    placement
fat's avatar
fat committed
1261

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

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

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

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

1280
    // manually read margins because getBoundingClientRect includes difference
fat's avatar
fat committed
1281
1282
1283
1284
1285
1286
1287
1288
1289
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)

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

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

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

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

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

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

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

1311
        $tip.offset(offset)
1312

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

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

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

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

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

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

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

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

1346
    this.$element.trigger(e)
1347

1348
    if (e.isDefaultPrevented()) return
1349

1350
    $tip.removeClass('in')
1351

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

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

1360
    return this
1361
1362
  }

1363
1364
1365
1366
  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1367
    }
1368
  }
1369

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

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

1382
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
fat's avatar
fat committed
1383
1384
1385
1386
1387
1388
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
  }

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

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

1397
    return title
1398
  }
1399

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

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

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

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

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

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

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

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


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

1441
  var old = $.fn.tooltip
1442

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

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

1454
  $.fn.tooltip.Constructor = Tooltip
1455

1456

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

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

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

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


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

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

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

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

Mark Otto's avatar
Mark Otto committed
1498
1499
1500
1501
1502
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1503
  })
1504

fat's avatar
fat committed
1505

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

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

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

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

1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()

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

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

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

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

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

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

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

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

1555

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

1559
  var old = $.fn.popover
1560

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

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

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

1574

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

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

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

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


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

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

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

fat's avatar
fat committed
1614
    this.$element       = $(element).is('body') ? $(window) : $(element)
1615
    this.$body          = $('body')
fat's avatar
fat committed
1616
    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
1617
1618
1619
1620
1621
1622
1623
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target
      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      || '') + ' .nav li > a'
    this.offsets        = $([])
    this.targets        = $([])
    this.activeTarget   = null
1624

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

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

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

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

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

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

1658
1659
1660
1661
1662
1663
1664
1665
  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
    var maxScroll    = scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i
1666

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

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

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

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

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

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

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

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


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

1707
  var old = $.fn.scrollspy
1708

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

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

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


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

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


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

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

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

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

1763

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

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

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

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

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

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

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

1790
    $this.trigger(e)
1791

1792
    if (e.isDefaultPrevented()) return
1793

1794
    var $target = $(selector)
1795

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

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

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

1817
      element.addClass('active')
1818

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

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

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

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

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


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

1846
  var old = $.fn.tab
1847

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

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

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


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

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

1869
1870
1871
1872
1873
1874
1875
1876
1877

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

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

Chris Rebert's avatar
Chris Rebert committed
1878
}(jQuery);
1879

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


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

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

1905
1906
1907
1908
1909
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
    this.$window = $(window)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
fat's avatar
fat committed
1910

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

1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
    this.checkPosition()
  }

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

  Affix.DEFAULTS = {
    offset: 0
  }

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

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

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

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

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

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

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

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

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

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

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

  var old = $.fn.affix

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

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

1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
  $.fn.affix.Constructor = Affix


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

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


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

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

      data.offset = data.offset || {}

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

      $spy.affix(data)
    })
Mark Otto's avatar
Mark Otto committed
2003
2004
  })

Chris Rebert's avatar
Chris Rebert committed
2005
}(jQuery);