bootstrap.js 51.7 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
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
 * ======================================================================== */
16
17


XhmikosR's avatar
XhmikosR committed
18
+function ($) { 'use strict';
19

20
21
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
22

23
24
  function transitionEnd() {
    var el = document.createElement('bootstrap')
25

26
    var transEndEventNames = {
Mark Otto's avatar
Mark Otto committed
27
28
29
30
      'WebkitTransition' : 'webkitTransitionEnd',
      'MozTransition'    : 'transitionend',
      'OTransition'      : 'oTransitionEnd otransitionend',
      'transition'       : 'transitionend'
fat's avatar
fat committed
31
    }
32

33
34
35
36
37
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }
38
39
  }

40
41
  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
42
    var called = false, $el = this
liuyl's avatar
liuyl committed
43
44
    $(this).one($.support.transition.end, function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
45
    setTimeout(callback, duration)
46
    return this
47
48
  }

49
50
  $(function () {
    $.support.transition = transitionEnd()
fat's avatar
fat committed
51
  })
52

Chris Rebert's avatar
Chris Rebert committed
53
}(jQuery);
54

55
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
56
 * Bootstrap: alert.js v3.1.0
Mark Otto's avatar
Mark Otto committed
57
 * http://getbootstrap.com/javascript/#alerts
58
 * ========================================================================
fat's avatar
fat committed
59
 * Copyright 2013 Twitter, Inc.
60
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
61
 * ======================================================================== */
62
63


XhmikosR's avatar
XhmikosR committed
64
+function ($) { 'use strict';
65

fat's avatar
fat committed
66
67
  // ALERT CLASS DEFINITION
  // ======================
68
69

  var dismiss = '[data-dismiss="alert"]'
fat's avatar
fat committed
70
71
72
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }
73
74

  Alert.prototype.close = function (e) {
fat's avatar
fat committed
75
76
    var $this    = $(this)
    var selector = $this.attr('data-target')
77
78
79

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

fat's avatar
fat committed
83
    var $parent = $(selector)
84

fat's avatar
fat committed
85
    if (e) e.preventDefault()
86

fat's avatar
fat committed
87
88
89
    if (!$parent.length) {
      $parent = $this.hasClass('alert') ? $this : $this.parent()
    }
90

Mark Otto's avatar
Mark Otto committed
91
    $parent.trigger(e = $.Event('close.bs.alert'))
92
93
94
95
96
97

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
Mark Otto's avatar
Mark Otto committed
98
      $parent.trigger('closed.bs.alert').remove()
99
100
101
    }

    $.support.transition && $parent.hasClass('fade') ?
102
103
104
      $parent
        .one($.support.transition.end, removeElement)
        .emulateTransitionEnd(150) :
105
106
107
108
      removeElement()
  }


fat's avatar
fat committed
109
110
  // ALERT PLUGIN DEFINITION
  // =======================
111

112
113
  var old = $.fn.alert

114
115
116
  $.fn.alert = function (option) {
    return this.each(function () {
      var $this = $(this)
Mark Otto's avatar
Mark Otto committed
117
      var data  = $this.data('bs.alert')
fat's avatar
fat committed
118

Mark Otto's avatar
Mark Otto committed
119
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
120
121
122
123
124
125
126
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.alert.Constructor = Alert


fat's avatar
fat committed
127
128
  // ALERT NO CONFLICT
  // =================
129
130
131
132
133
134
135

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


fat's avatar
fat committed
136
  // ALERT DATA-API
fat's avatar
fat committed
137
  // ==============
138

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

Chris Rebert's avatar
Chris Rebert committed
141
}(jQuery);
142

143
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
144
 * Bootstrap: button.js v3.1.0
Mark Otto's avatar
Mark Otto committed
145
 * http://getbootstrap.com/javascript/#buttons
146
 * ========================================================================
fat's avatar
fat committed
147
 * Copyright 2013 Twitter, Inc.
148
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
149
 * ======================================================================== */
150
151


XhmikosR's avatar
XhmikosR committed
152
+function ($) { 'use strict';
153

fat's avatar
fat committed
154
155
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
156
157
158

  var Button = function (element, options) {
    this.$element = $(element)
fat's avatar
fat committed
159
160
161
162
163
    this.options  = $.extend({}, Button.DEFAULTS, options)
  }

  Button.DEFAULTS = {
    loadingText: 'loading...'
164
165
166
  }

  Button.prototype.setState = function (state) {
fat's avatar
fat committed
167
168
169
170
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()
171
172

    state = state + 'Text'
fat's avatar
fat committed
173
174

    if (!data.resetText) $el.data('resetText', $el[val]())
175
176
177
178
179
180
181

    $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
182
        $el.removeClass(d).removeAttr(d);
183
184
185
186
    }, 0)
  }

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

190
    if ($parent.length) {
fat's avatar
fat committed
191
      var $input = this.$element.find('input')
192
193
194
195
196
197
198
199
      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
200
    }
201

202
    if (changed) this.$element.toggleClass('active')
203
204
205
  }


fat's avatar
fat committed
206
207
  // BUTTON PLUGIN DEFINITION
  // ========================
208

209
210
  var old = $.fn.button

211
212
  $.fn.button = function (option) {
    return this.each(function () {
fat's avatar
fat committed
213
      var $this   = $(this)
fat's avatar
fat committed
214
      var data    = $this.data('bs.button')
fat's avatar
fat committed
215
216
      var options = typeof option == 'object' && option

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

219
220
221
222
223
224
225
226
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  $.fn.button.Constructor = Button


fat's avatar
fat committed
227
228
  // BUTTON NO CONFLICT
  // ==================
229
230
231
232
233
234
235

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


fat's avatar
fat committed
236
237
  // BUTTON DATA-API
  // ===============
238

Mark Otto's avatar
Mark Otto committed
239
  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
240
241
242
    var $btn = $(e.target)
    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
    $btn.button('toggle')
243
    e.preventDefault()
244
245
  })

Chris Rebert's avatar
Chris Rebert committed
246
}(jQuery);
247

248
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
249
 * Bootstrap: carousel.js v3.1.0
Mark Otto's avatar
Mark Otto committed
250
 * http://getbootstrap.com/javascript/#carousel
251
 * ========================================================================
252
 * Copyright 2013 Twitter, Inc.
253
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
254
 * ======================================================================== */
255
256


XhmikosR's avatar
XhmikosR committed
257
+function ($) { 'use strict';
258

fat's avatar
fat committed
259
260
  // CAROUSEL CLASS DEFINITION
  // =========================
261
262

  var Carousel = function (element, options) {
fat's avatar
fat committed
263
    this.$element    = $(element)
fat's avatar
fat committed
264
    this.$indicators = this.$element.find('.carousel-indicators')
fat's avatar
fat committed
265
266
267
268
269
270
271
    this.options     = options
    this.paused      =
    this.sliding     =
    this.interval    =
    this.$active     =
    this.$items      = null

272
273
274
275
276
    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
      .on('mouseleave', $.proxy(this.cycle, this))
  }

fat's avatar
fat committed
277
  Carousel.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
278
279
280
    interval: 5000,
    pause: 'hover',
    wrap: true
fat's avatar
fat committed
281
  }
282

fat's avatar
fat committed
283
284
  Carousel.prototype.cycle =  function (e) {
    e || (this.paused = false)
285

fat's avatar
fat committed
286
    this.interval && clearInterval(this.interval)
fat's avatar
fat committed
287

fat's avatar
fat committed
288
289
290
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
291

fat's avatar
fat committed
292
293
    return this
  }
294

fat's avatar
fat committed
295
296
297
  Carousel.prototype.getActiveIndex = function () {
    this.$active = this.$element.find('.item.active')
    this.$items  = this.$active.parent().children()
298

fat's avatar
fat committed
299
300
    return this.$items.index(this.$active)
  }
301

fat's avatar
fat committed
302
303
304
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getActiveIndex()
305

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

308
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
fat's avatar
fat committed
309
310
311
312
    if (activeIndex == pos) return this.pause().cycle()

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

fat's avatar
fat committed
314
315
316
317
318
319
  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)
320
321
    }

fat's avatar
fat committed
322
    this.interval = clearInterval(this.interval)
323

fat's avatar
fat committed
324
325
    return this
  }
326

fat's avatar
fat committed
327
328
329
330
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
331

fat's avatar
fat committed
332
333
334
335
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
336

fat's avatar
fat committed
337
338
339
340
341
342
343
  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
344

Jacob Thornton's avatar
Jacob Thornton committed
345
346
347
348
349
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
    }

fat's avatar
fat committed
350
    this.sliding = true
351

fat's avatar
fat committed
352
    isCycling && this.pause()
fat's avatar
fat committed
353

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

fat's avatar
fat committed
356
357
358
359
    if ($next.hasClass('active')) return

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
360
      this.$element.one('slid.bs.carousel', function () {
fat's avatar
fat committed
361
362
363
364
365
366
367
368
369
370
371
372
        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
373
      $active
374
375
376
377
        .one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
378
          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
379
        })
Mark Otto's avatar
Mark Otto committed
380
        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
fat's avatar
fat committed
381
382
383
384
385
386
    } else {
      this.$element.trigger(e)
      if (e.isDefaultPrevented()) return
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
387
      this.$element.trigger('slid.bs.carousel')
388
389
    }

fat's avatar
fat committed
390
391
392
    isCycling && this.cycle()

    return this
393
394
395
  }


fat's avatar
fat committed
396
397
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
398

399
400
  var old = $.fn.carousel

401
402
  $.fn.carousel = function (option) {
    return this.each(function () {
fat's avatar
fat committed
403
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
404
      var data    = $this.data('bs.carousel')
Jacob Thornton's avatar
Jacob Thornton committed
405
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
fat's avatar
fat committed
406
407
      var action  = typeof option == 'string' ? option : options.slide

Mark Otto's avatar
Mark Otto committed
408
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
409
      if (typeof option == 'number') data.to(option)
Jacob Thornton's avatar
Jacob Thornton committed
410
      else if (action) data[action]()
Mark Otto's avatar
Mark Otto committed
411
      else if (options.interval) data.pause().cycle()
412
413
414
415
416
417
    })
  }

  $.fn.carousel.Constructor = Carousel


fat's avatar
fat committed
418
419
  // CAROUSEL NO CONFLICT
  // ====================
420
421
422
423
424
425

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

fat's avatar
fat committed
426

fat's avatar
fat committed
427
428
  // CAROUSEL DATA-API
  // =================
429

430
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
fat's avatar
fat committed
431
    var $this   = $(this), href
fat's avatar
fat committed
432
433
    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
434
435
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
436

437
    $target.carousel(options)
438
439

    if (slideIndex = $this.attr('data-slide-to')) {
fat's avatar
fat committed
440
      $target.data('bs.carousel').to(slideIndex)
441
442
    }

443
    e.preventDefault()
444
445
  })

fat's avatar
fat committed
446
447
448
449
450
451
452
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      $carousel.carousel($carousel.data())
    })
  })

Chris Rebert's avatar
Chris Rebert committed
453
}(jQuery);
454

455
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
456
 * Bootstrap: collapse.js v3.1.0
Mark Otto's avatar
Mark Otto committed
457
 * http://getbootstrap.com/javascript/#collapse
458
 * ========================================================================
459
 * Copyright 2013 Twitter, Inc.
460
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
461
 * ======================================================================== */
462
463


XhmikosR's avatar
XhmikosR committed
464
+function ($) { 'use strict';
465

466
467
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
468
469

  var Collapse = function (element, options) {
470
471
472
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
473

474
475
476
477
478
479
480
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }

  Collapse.DEFAULTS = {
    toggle: true
  }
481

482
483
484
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
485
486
  }

487
488
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
489

fat's avatar
fat committed
490
491
492
493
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

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

496
    if (actives && actives.length) {
fat's avatar
fat committed
497
      var hasData = actives.data('bs.collapse')
498
499
      if (hasData && hasData.transitioning) return
      actives.collapse('hide')
fat's avatar
fat committed
500
      hasData || actives.data('bs.collapse', null)
501
502
    }

503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
    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('-'))
524

525
526
527
528
    this.$element
      .one($.support.transition.end, $.proxy(complete, this))
      .emulateTransitionEnd(350)
      [dimension](this.$element[0][scrollSize])
529
  }
530

531
532
  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return
fat's avatar
fat committed
533
534
535
536
537

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

538
    var dimension = this.dimension()
539

540
541
542
    this.$element
      [dimension](this.$element[dimension]())
      [0].offsetHeight
543

544
    this.$element
545
      .addClass('collapsing')
546
      .removeClass('collapse')
547
      .removeClass('in')
548

549
    this.transitioning = 1
550

551
    var complete = function () {
552
553
554
555
556
      this.transitioning = 0
      this.$element
        .trigger('hidden.bs.collapse')
        .removeClass('collapsing')
        .addClass('collapse')
557
558
    }

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

561
562
563
564
    this.$element
      [dimension](0)
      .one($.support.transition.end, $.proxy(complete, this))
      .emulateTransitionEnd(350)
565
  }
566

567
568
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
569
570
571
  }


572
573
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
574
575

  var old = $.fn.collapse
576
577
578

  $.fn.collapse = function (option) {
    return this.each(function () {
579
      var $this   = $(this)
fat's avatar
fat committed
580
      var data    = $this.data('bs.collapse')
581
582
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

fat's avatar
fat committed
583
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
584
585
586
587
588
589
590
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.Constructor = Collapse


591
592
  // COLLAPSE NO CONFLICT
  // ====================
593

594
595
596
597
598
599
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


600
601
  // COLLAPSE DATA-API
  // =================
602

603
  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
604
605
    var $this   = $(this), href
    var target  = $this.attr('data-target')
606
607
        || e.preventDefault()
        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
608
609
610
611
    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
612
    var $parent = parent && $(parent)
613

fat's avatar
fat committed
614
    if (!data || !data.transitioning) {
615
      if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
616
      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
fat's avatar
fat committed
617
618
    }

619
    $target.collapse(option)
620
621
  })

Chris Rebert's avatar
Chris Rebert committed
622
}(jQuery);
623

624
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
625
 * Bootstrap: dropdown.js v3.1.0
Mark Otto's avatar
Mark Otto committed
626
 * http://getbootstrap.com/javascript/#dropdowns
627
 * ========================================================================
628
 * Copyright 2013 Twitter, Inc.
629
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
630
 * ======================================================================== */
631
632


XhmikosR's avatar
XhmikosR committed
633
+function ($) { 'use strict';
634

635
636
  // DROPDOWN CLASS DEFINITION
  // =========================
637

638
639
640
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle=dropdown]'
  var Dropdown = function (element) {
641
    $(element).on('click.bs.dropdown', this.toggle)
642
  }
643

644
645
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
646

647
    if ($this.is('.disabled, :disabled')) return
648

649
650
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
651

652
    clearMenus()
fat's avatar
fat committed
653

654
    if (!isActive) {
fat's avatar
fat committed
655
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
Mark Otto's avatar
Mark Otto committed
656
        // if mobile we use a backdrop because click events don't delegate
Jacob Thornton's avatar
Jacob Thornton committed
657
        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
fat's avatar
fat committed
658
      }
659
660
661
662
663
664
665
666

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

      if (e.isDefaultPrevented()) return

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

fat's avatar
rebuild    
fat committed
668
669
      $this.focus()
    }
670

671
672
    return false
  }
673

674
675
  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return
676

677
    var $this = $(this)
678

679
680
    e.preventDefault()
    e.stopPropagation()
681

682
    if ($this.is('.disabled, :disabled')) return
683

684
685
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
686

687
688
689
690
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).focus()
      return $this.click()
    }
691

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

694
    if (!$items.length) return
695

696
    var index = $items.index($items.filter(':focus'))
697

698
699
    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
700
    if (!~index)                                      index = 0
701

702
    $items.eq(index).focus()
703
704
  }

Mark Otto's avatar
Mark Otto committed
705
  function clearMenus() {
706
    $(backdrop).remove()
707
    $(toggle).each(function (e) {
708
709
710
711
712
713
      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')
    })
714
715
716
717
718
719
720
  }

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

    if (!selector) {
      selector = $this.attr('href')
721
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
722
723
    }

724
    var $parent = selector && $(selector)
725

726
    return $parent && $parent.length ? $parent : $this.parent()
727
728
729
  }


730
731
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
732

733
734
  var old = $.fn.dropdown

735
736
737
  $.fn.dropdown = function (option) {
    return this.each(function () {
      var $this = $(this)
738
      var data  = $this.data('bs.dropdown')
739

740
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
741
742
743
744
745
746
747
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.dropdown.Constructor = Dropdown


748
749
  // DROPDOWN NO CONFLICT
  // ====================
750
751
752
753
754
755
756

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


757
758
759
  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

760
  $(document)
761
762
    .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
763
764
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]', Dropdown.prototype.keydown)
765

Chris Rebert's avatar
Chris Rebert committed
766
}(jQuery);
767

768
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
769
 * Bootstrap: modal.js v3.1.0
Mark Otto's avatar
Mark Otto committed
770
 * http://getbootstrap.com/javascript/#modals
771
 * ========================================================================
772
 * Copyright 2013 Twitter, Inc.
773
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
774
 * ======================================================================== */
775
776


XhmikosR's avatar
XhmikosR committed
777
+function ($) { 'use strict';
778

fat's avatar
fat committed
779
780
  // MODAL CLASS DEFINITION
  // ======================
781

Jacob Thornton's avatar
Jacob Thornton committed
782
  var Modal = function (element, options) {
fat's avatar
fat committed
783
    this.options   = options
fat's avatar
rebuild    
fat committed
784
    this.$element  = $(element)
fat's avatar
fat committed
785
786
    this.$backdrop =
    this.isShown   = null
787

Jacob Thornton's avatar
Jacob Thornton committed
788
    if (this.options.remote) this.$element.load(this.options.remote)
fat's avatar
fat committed
789
  }
790

fat's avatar
fat committed
791
  Modal.DEFAULTS = {
Mark Otto's avatar
Mark Otto committed
792
793
794
    backdrop: true,
    keyboard: true,
    show: true
fat's avatar
fat committed
795
  }
796

Jacob Thornton's avatar
Jacob Thornton committed
797
798
  Modal.prototype.toggle = function (_relatedTarget) {
    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
fat's avatar
fat committed
799
  }
800

Jacob Thornton's avatar
Jacob Thornton committed
801
  Modal.prototype.show = function (_relatedTarget) {
fat's avatar
fat committed
802
    var that = this
Jacob Thornton's avatar
Jacob Thornton committed
803
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
804

fat's avatar
fat committed
805
    this.$element.trigger(e)
806

fat's avatar
fat committed
807
    if (this.isShown || e.isDefaultPrevented()) return
808

fat's avatar
fat committed
809
    this.isShown = true
810

fat's avatar
fat committed
811
    this.escape()
812

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

fat's avatar
fat committed
815
816
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
817

fat's avatar
fat committed
818
      if (!that.$element.parent().length) {
Jacob Thornton's avatar
Jacob Thornton committed
819
        that.$element.appendTo(document.body) // don't move modals dom position
fat's avatar
fat committed
820
      }
821

fat's avatar
fat committed
822
      that.$element.show()
823

fat's avatar
fat committed
824
825
826
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
827

fat's avatar
fat committed
828
829
830
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
831

fat's avatar
fat committed
832
      that.enforceFocus()
833

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

fat's avatar
fat committed
836
      transition ?
fat's avatar
fat committed
837
        that.$element.find('.modal-dialog') // wait for modal to slide in
838
          .one($.support.transition.end, function () {
Jacob Thornton's avatar
Jacob Thornton committed
839
            that.$element.focus().trigger(e)
840
841
          })
          .emulateTransitionEnd(300) :
Jacob Thornton's avatar
Jacob Thornton committed
842
        that.$element.focus().trigger(e)
fat's avatar
fat committed
843
844
    })
  }
845

fat's avatar
fat committed
846
  Modal.prototype.hide = function (e) {
fat's avatar
fat committed
847
    if (e) e.preventDefault()
848

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

fat's avatar
fat committed
851
    this.$element.trigger(e)
852

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

fat's avatar
fat committed
855
    this.isShown = false
856

fat's avatar
fat committed
857
    this.escape()
858

Mark Otto's avatar
Mark Otto committed
859
    $(document).off('focusin.bs.modal')
860

fat's avatar
fat committed
861
862
863
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
Jacob Thornton's avatar
Jacob Thornton committed
864
      .off('click.dismiss.modal')
865

fat's avatar
fat committed
866
    $.support.transition && this.$element.hasClass('fade') ?
867
868
869
      this.$element
        .one($.support.transition.end, $.proxy(this.hideModal, this))
        .emulateTransitionEnd(300) :
fat's avatar
fat committed
870
871
      this.hideModal()
  }
872

fat's avatar
fat committed
873
  Modal.prototype.enforceFocus = function () {
Jacob Thornton's avatar
Jacob Thornton committed
874
875
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
fat's avatar
fat committed
876
877
878
879
880
      .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
881
  }
882

fat's avatar
fat committed
883
884
  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
fat's avatar
fat committed
885
      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
fat's avatar
fat committed
886
        e.which == 27 && this.hide()
fat's avatar
fat committed
887
      }, this))
fat's avatar
fat committed
888
    } else if (!this.isShown) {
Mark Otto's avatar
Mark Otto committed
889
      this.$element.off('keyup.dismiss.bs.modal')
fat's avatar
fat committed
890
891
    }
  }
892

fat's avatar
fat committed
893
894
895
896
897
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.removeBackdrop()
Mark Otto's avatar
Mark Otto committed
898
      that.$element.trigger('hidden.bs.modal')
fat's avatar
fat committed
899
900
    })
  }
901

fat's avatar
fat committed
902
903
904
905
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
906

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

fat's avatar
fat committed
910
911
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
912

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

Jacob Thornton's avatar
Jacob Thornton committed
916
      this.$element.on('click.dismiss.modal', $.proxy(function (e) {
fat's avatar
fat committed
917
918
919
920
921
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus.call(this.$element[0])
          : this.hide.call(this)
      }, this))
922

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

fat's avatar
fat committed
925
      this.$backdrop.addClass('in')
926

fat's avatar
fat committed
927
      if (!callback) return
928

fat's avatar
fat committed
929
      doAnimate ?
930
931
932
        this.$backdrop
          .one($.support.transition.end, callback)
          .emulateTransitionEnd(150) :
fat's avatar
fat committed
933
        callback()
934

fat's avatar
fat committed
935
936
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
937

Mark Otto's avatar
Mark Otto committed
938
      $.support.transition && this.$element.hasClass('fade') ?
939
940
941
        this.$backdrop
          .one($.support.transition.end, callback)
          .emulateTransitionEnd(150) :
fat's avatar
fat committed
942
        callback()
943

fat's avatar
fat committed
944
945
946
    } else if (callback) {
      callback()
    }
947
948
949
  }


fat's avatar
fat committed
950
951
  // MODAL PLUGIN DEFINITION
  // =======================
952

953
954
  var old = $.fn.modal

Jacob Thornton's avatar
Jacob Thornton committed
955
  $.fn.modal = function (option, _relatedTarget) {
956
    return this.each(function () {
fat's avatar
fat committed
957
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
958
      var data    = $this.data('bs.modal')
fat's avatar
fat committed
959
960
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

Mark Otto's avatar
Mark Otto committed
961
      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
Jacob Thornton's avatar
Jacob Thornton committed
962
963
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
964
965
966
967
968
969
    })
  }

  $.fn.modal.Constructor = Modal


fat's avatar
fat committed
970
971
  // MODAL NO CONFLICT
  // =================
972
973
974
975
976
977
978

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


fat's avatar
fat committed
979
980
  // MODAL DATA-API
  // ==============
981

Mark Otto's avatar
Mark Otto committed
982
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
fat's avatar
fat committed
983
984
985
    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
986
    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
987

988
    e.preventDefault()
989

990
    $target
Jacob Thornton's avatar
Jacob Thornton committed
991
      .modal(option, this)
992
      .one('hide', function () {
993
        $this.is(':visible') && $this.focus()
994
      })
Jacob Thornton's avatar
Jacob Thornton committed
995
  })
996

Jacob Thornton's avatar
Jacob Thornton committed
997
  $(document)
fat's avatar
fat committed
998
    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
Jacob Thornton's avatar
Jacob Thornton committed
999
    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
1000

Chris Rebert's avatar
Chris Rebert committed
1001
}(jQuery);
1002

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


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

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

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

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

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

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

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

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

1052
1053
1054
1055
1056
      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
1057

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

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

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

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

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

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

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

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

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

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

1100
    clearTimeout(self.timeout)
1101

1102
1103
    self.hoverState = 'in'

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

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

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

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

1117
1118
    self.hoverState = 'out'

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

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

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

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

1132
      if (e.isDefaultPrevented()) return
1133

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1224
        $tip.offset(offset)
1225

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

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

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

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

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

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

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

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

1259
    this.$element.trigger(e)
1260

1261
    if (e.isDefaultPrevented()) return
1262

1263
    $tip.removeClass('in')
1264

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

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

1274
    return this
1275
1276
  }

1277
1278
1279
1280
  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1281
    }
1282
  }
1283

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

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

1296
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
fat's avatar
fat committed
1297
1298
1299
1300
1301
1302
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
  }

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

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

1311
    return title
1312
  }
1313

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

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

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

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

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

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

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

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


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

1355
  var old = $.fn.tooltip
1356

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

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

1368
  $.fn.tooltip.Constructor = Tooltip
1369

1370

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

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

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

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


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

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

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

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

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

fat's avatar
fat committed
1408

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

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

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

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

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

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

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

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

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

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

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

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

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

1458

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

1462
  var old = $.fn.popover
1463

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

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

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

1477

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

1599
  var old = $.fn.scrollspy
1600

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

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

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


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

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


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

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

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

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

1644

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

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

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

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

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

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

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

1671
    $this.trigger(e)
1672

1673
    if (e.isDefaultPrevented()) return
1674

1675
    var $target = $(selector)
1676

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

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

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

1698
      element.addClass('active')
1699

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

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

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

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

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


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

1727
  var old = $.fn.tab
1728

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

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

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


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

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

1750
1751
1752
1753
1754
1755
1756
1757
1758

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

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

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

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


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

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

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

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

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

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

  Affix.DEFAULTS = {
    offset: 0
  }

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

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

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

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

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

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

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

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

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

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

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

  var old = $.fn.affix

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

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

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


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

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


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

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

      data.offset = data.offset || {}

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

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

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