bootstrap.js 52.6 KB
Newer Older
1
/* ========================================================================
fat's avatar
fat committed
2
 * Bootstrap: transition.js v3.0.0
3
 * http://twitter.github.com/bootstrap/javascript.html#transitions
4
 * ========================================================================
fat's avatar
fat committed
5
 * Copyright 2013 Twitter, Inc.
6
7
8
9
10
11
12
13
14
15
16
17
 *
 * 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.
18
 * ======================================================================== */
19
20


21
+function ($) { "use strict";
22

fat's avatar
fat committed
23
24
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
25

fat's avatar
fat committed
26
  function transitionEnd() {
fat's avatar
fat committed
27
    var el = document.createElement('bootstrap')
28

fat's avatar
fat committed
29
    var transEndEventNames = {
fat's avatar
fat committed
30
31
32
33
34
      'WebkitTransition' : 'webkitTransitionEnd'
    , 'MozTransition'    : 'transitionend'
    , 'OTransition'      : 'oTransitionEnd otransitionend'
    , 'transition'       : 'transitionend'
    }
35

fat's avatar
fat committed
36
37
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
fat's avatar
fat committed
38
        return { end: transEndEventNames[name] }
39
      }
fat's avatar
fat committed
40
41
    }
  }
42

fat's avatar
fat committed
43
  $(function () {
fat's avatar
fat committed
44
45
    $.support.transition = transitionEnd()
  })
46

Mark Otto's avatar
Mark Otto committed
47
}(window.jQuery);
48
/* ========================================================================
fat's avatar
fat committed
49
 * Bootstrap: alert.js v3.0.0
50
 * http://twitter.github.com/bootstrap/javascript.html#alerts
51
 * ========================================================================
fat's avatar
fat committed
52
 * Copyright 2013 Twitter, Inc.
53
54
55
56
57
58
59
60
61
62
63
64
 *
 * 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.
65
 * ======================================================================== */
66
67


68
+function ($) { "use strict";
69

fat's avatar
fat committed
70
71
  // ALERT CLASS DEFINITION
  // ======================
72
73

  var dismiss = '[data-dismiss="alert"]'
fat's avatar
fat committed
74
75
76
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }
77
78

  Alert.prototype.close = function (e) {
fat's avatar
fat committed
79
80
    var $this    = $(this)
    var selector = $this.attr('data-target')
81
82
83

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

fat's avatar
fat committed
87
    var $parent = $(selector)
88

fat's avatar
fat committed
89
    if (e) e.preventDefault()
90

fat's avatar
fat committed
91
92
93
    if (!$parent.length) {
      $parent = $this.hasClass('alert') ? $this : $this.parent()
    }
94

Mark Otto's avatar
Mark Otto committed
95
    $parent.trigger(e = $.Event('close.bs.alert'))
96
97
98
99
100
101

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
Mark Otto's avatar
Mark Otto committed
102
      $parent.trigger('closed.bs.alert').remove()
103
104
105
106
107
108
109
110
    }

    $.support.transition && $parent.hasClass('fade') ?
      $parent.on($.support.transition.end, removeElement) :
      removeElement()
  }


fat's avatar
fat committed
111
112
  // ALERT PLUGIN DEFINITION
  // =======================
113

114
115
  var old = $.fn.alert

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

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

  $.fn.alert.Constructor = Alert


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

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


fat's avatar
fat committed
138
  // ALERT DATA-API
fat's avatar
fat committed
139
  // ==============
140

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

Mark Otto's avatar
Mark Otto committed
143
}(window.jQuery);
144
/* ========================================================================
fat's avatar
fat committed
145
 * Bootstrap: button.js v3.0.0
146
 * http://twitter.github.com/bootstrap/javascript.html#buttons
147
 * ========================================================================
fat's avatar
fat committed
148
 * Copyright 2013 Twitter, Inc.
149
150
151
152
153
154
155
156
157
158
159
160
 *
 * 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.
161
 * ======================================================================== */
162
163


164
+function ($) { "use strict";
165

fat's avatar
fat committed
166
167
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
168
169
170

  var Button = function (element, options) {
    this.$element = $(element)
fat's avatar
fat committed
171
172
173
174
175
    this.options  = $.extend({}, Button.DEFAULTS, options)
  }

  Button.DEFAULTS = {
    loadingText: 'loading...'
176
177
178
  }

  Button.prototype.setState = function (state) {
fat's avatar
fat committed
179
180
181
182
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()
183
184

    state = state + 'Text'
fat's avatar
fat committed
185
186

    if (!data.resetText) $el.data('resetText', $el[val]())
187
188
189
190
191
192
193

    $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
194
        $el.removeClass(d).removeAttr(d);
195
196
197
198
    }, 0)
  }

  Button.prototype.toggle = function () {
Jacob Thornton's avatar
Jacob Thornton committed
199
    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
200

fat's avatar
fat committed
201
202
203
    if ($parent) {
      $parent.find('.active').removeClass('active')
    }
204
205
206
207
208

    this.$element.toggleClass('active')
  }


fat's avatar
fat committed
209
210
  // BUTTON PLUGIN DEFINITION
  // ========================
211

212
213
  var old = $.fn.button

214
215
  $.fn.button = function (option) {
    return this.each(function () {
fat's avatar
fat committed
216
217
218
219
      var $this   = $(this)
      var data    = $this.data('button')
      var options = typeof option == 'object' && option

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

222
223
224
225
226
227
228
229
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  $.fn.button.Constructor = Button


fat's avatar
fat committed
230
231
  // BUTTON NO CONFLICT
  // ==================
232
233
234
235
236
237
238

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


fat's avatar
fat committed
239
240
  // BUTTON DATA-API
  // ===============
241

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

Mark Otto's avatar
Mark Otto committed
248
}(window.jQuery);
249
/* ========================================================================
fat's avatar
fat committed
250
 * Bootstrap: carousel.js v3.0.0
251
 * http://twitter.github.com/bootstrap/javascript.html#carousel
252
 * ========================================================================
253
254
255
256
257
258
259
260
261
262
263
264
265
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
266
 * ======================================================================== */
267
268


269
+function ($) { "use strict";
270

fat's avatar
fat committed
271
272
  // CAROUSEL CLASS DEFINITION
  // =========================
273
274

  var Carousel = function (element, options) {
fat's avatar
fat committed
275
    this.$element    = $(element)
fat's avatar
fat committed
276
    this.$indicators = this.$element.find('.carousel-indicators')
fat's avatar
fat committed
277
278
279
280
281
282
283
    this.options     = options
    this.paused      =
    this.sliding     =
    this.interval    =
    this.$active     =
    this.$items      = null

284
285
286
287
288
    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
      .on('mouseleave', $.proxy(this.cycle, this))
  }

fat's avatar
fat committed
289
290
291
292
  Carousel.DEFAULTS = {
    interval: 5000
  , pause: 'hover'
  }
293

fat's avatar
fat committed
294
295
  Carousel.prototype.cycle =  function (e) {
    e || (this.paused = false)
296

fat's avatar
fat committed
297
    this.interval && clearInterval(this.interval)
fat's avatar
fat committed
298

fat's avatar
fat committed
299
300
301
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
302

fat's avatar
fat committed
303
304
    return this
  }
305

fat's avatar
fat committed
306
307
308
  Carousel.prototype.getActiveIndex = function () {
    this.$active = this.$element.find('.item.active')
    this.$items  = this.$active.parent().children()
309

fat's avatar
fat committed
310
311
    return this.$items.index(this.$active)
  }
312

fat's avatar
fat committed
313
314
315
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getActiveIndex()
316

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

fat's avatar
fat committed
319
320
321
322
323
    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })
    if (activeIndex == pos) return this.pause().cycle()

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

fat's avatar
fat committed
325
326
327
328
329
330
  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)
331
332
    }

fat's avatar
fat committed
333
    this.interval = clearInterval(this.interval)
334

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

fat's avatar
fat committed
338
339
340
341
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
342

fat's avatar
fat committed
343
344
345
346
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
347

fat's avatar
fat committed
348
349
350
351
352
353
354
  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
355

fat's avatar
fat committed
356
    this.sliding = true
357

fat's avatar
fat committed
358
    isCycling && this.pause()
fat's avatar
fat committed
359

fat's avatar
fat committed
360
    $next = $next.length ? $next : this.$element.find('.item')[fallback]()
361

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

fat's avatar
fat committed
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
    if ($next.hasClass('active')) return

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      this.$element.one('slid', function () {
        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)
      this.$element.one($.support.transition.end, function () {
        $next.removeClass([type, direction].join(' ')).addClass('active')
        $active.removeClass(['active', direction].join(' '))
        that.sliding = false
        setTimeout(function () { that.$element.trigger('slid') }, 0)
      })
    } else {
      this.$element.trigger(e)
      if (e.isDefaultPrevented()) return
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger('slid')
394
395
    }

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

    return this
399
400
401
  }


fat's avatar
fat committed
402
403
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
404

405
406
  var old = $.fn.carousel

407
408
  $.fn.carousel = function (option) {
    return this.each(function () {
fat's avatar
fat committed
409
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
410
      var data    = $this.data('bs.carousel')
fat's avatar
fat committed
411
412
413
      var options = $.extend({}, Carousel.DEFAULTS, typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

Mark Otto's avatar
Mark Otto committed
414
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
415
      if (typeof option == 'number') data.to(option)
Jacob Thornton's avatar
Jacob Thornton committed
416
      else if (action) data[action]()
Mark Otto's avatar
Mark Otto committed
417
      else if (options.interval) data.pause().cycle()
418
419
420
421
422
423
    })
  }

  $.fn.carousel.Constructor = Carousel


fat's avatar
fat committed
424
425
  // CAROUSEL NO CONFLICT
  // ====================
426
427
428
429
430
431

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

fat's avatar
fat committed
432

fat's avatar
fat committed
433
434
  // CAROUSEL DATA-API
  // =================
435

436
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
437
    var $this = $(this), href
fat's avatar
fat committed
438
439
440
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex
441

442
    $target.carousel(options)
443
444

    if (slideIndex = $this.attr('data-slide-to')) {
fat's avatar
fat committed
445
      $target.data('bs-carousel').pause().to(slideIndex).cycle()
446
447
    }

448
    e.preventDefault()
449
450
  })

Mark Otto's avatar
Mark Otto committed
451
}(window.jQuery);
452
/* ========================================================================
fat's avatar
fat committed
453
 * Bootstrap: collapse.js v3.0.0
454
 * http://twitter.github.com/bootstrap/javascript.html#collapse
455
 * ========================================================================
456
457
458
459
460
461
462
463
464
465
466
467
468
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
469
 * ======================================================================== */
470
471


472
+function ($) { "use strict";
473

474
475
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
476
477

  var Collapse = function (element, options) {
478
479
480
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
481

482
483
484
485
486
487
488
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }

  Collapse.DEFAULTS = {
    toggle: true
  }
489

490
491
492
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
493
494
  }

495
496
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
497

498
499
500
    var dimension = this.dimension()
    var scroll    = $.camelCase(['scroll', dimension].join('-'))
    var actives   = this.$parent && this.$parent.find('> .accordion-group > .in')
501

502
503
504
505
506
    if (actives && actives.length) {
      var hasData = actives.data('collapse')
      if (hasData && hasData.transitioning) return
      actives.collapse('hide')
      hasData || actives.data('collapse', null)
507
508
    }

509
    this.$element[dimension](0)
Mark Otto's avatar
Mark Otto committed
510
    this.transition('addClass', $.Event('show.bs.collapse'), 'shown.bs.collapse')
511

512
513
    if ($.support.transition) this.$element[dimension](this.$element[0][scroll])
  }
514

515
516
517
518
  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return
    var dimension = this.dimension()
    this.reset(this.$element[dimension]())
Mark Otto's avatar
Mark Otto committed
519
    this.transition('removeClass', $.Event('hide.bs.collapse'), 'hidden')
520
521
    this.$element[dimension](0)
  }
522

523
524
  Collapse.prototype.reset = function (size) {
    var dimension = this.dimension()
525

526
527
528
529
    this.$element
      .removeClass('collapse')
      [dimension](size || 'auto')
      [0].offsetWidth
530

531
    this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
532

533
534
    return this
  }
535

536
537
538
  Collapse.prototype.transition = function (method, startEvent, completeEvent) {
    var that     = this
    var complete = function () {
Mark Otto's avatar
Mark Otto committed
539
      if (startEvent.type == 'show') that.reset()
540
541
      that.transitioning = 0
      that.$element.trigger(completeEvent)
542
543
    }

544
    this.$element.trigger(startEvent)
545

546
    if (startEvent.isDefaultPrevented()) return
547

548
    this.transitioning = 1
549

550
    this.$element[method]('in')
551

552
553
554
555
    $.support.transition && this.$element.hasClass('collapse') ?
      this.$element.one($.support.transition.end, complete) :
      complete()
  }
556

557
558
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
559
560
561
  }


562
563
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
564
565

  var old = $.fn.collapse
566
567
568

  $.fn.collapse = function (option) {
    return this.each(function () {
569
570
571
572
      var $this   = $(this)
      var data    = $this.data('collapse')
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

573
574
575
576
577
578
579
580
      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.collapse.Constructor = Collapse


581
582
  // COLLAPSE NO CONFLICT
  // ====================
583

584
585
586
587
588
589
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


590
591
  // COLLAPSE DATA-API
  // =================
592

593
  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
594
595
    var $this  = $(this), href
    var target = $this.attr('data-target')
596
597
        || e.preventDefault()
        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
598
599
    var option = $(target).data('collapse') ? 'toggle' : $this.data()

600
601
    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
    $(target).collapse(option)
602
603
  })

Mark Otto's avatar
Mark Otto committed
604
}(window.jQuery);
605
/* ========================================================================
fat's avatar
fat committed
606
 * Bootstrap: dropdown.js v3.0.0
607
 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
608
 * ========================================================================
609
610
611
612
613
614
615
616
617
618
619
620
621
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
622
 * ======================================================================== */
623
624


625
+function ($) { "use strict";
626

627
628
  // DROPDOWN CLASS DEFINITION
  // =========================
629

630
631
632
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle=dropdown]'
  var Dropdown = function (element) {
633
    var $el = $(element).on('click.bs.dropdown', this.toggle)
634
  }
635

636
637
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
638

639
    if ($this.is('.disabled, :disabled')) return
640

641
642
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
643

644
    clearMenus()
fat's avatar
fat committed
645

646
    if (!isActive) {
fat's avatar
fat committed
647
648
649
650
      if ('ontouchstart' in document.documentElement) {
        // if mobile we we use a backdrop because click events don't delegate
        $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
      }
651
652
653
654
655
656
657
658

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

      if (e.isDefaultPrevented()) return

      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown')
659
660
    }

661
    $this.focus()
662

663
664
    return false
  }
665

666
667
  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return
668

669
    var $this = $(this)
670

671
672
    e.preventDefault()
    e.stopPropagation()
673

674
    if ($this.is('.disabled, :disabled')) return
675

676
677
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
678

679
680
681
682
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).focus()
      return $this.click()
    }
683

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

686
    if (!$items.length) return
687

688
    var index = $items.index($items.filter(':focus'))
689

690
691
692
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    if (!~index)                                      index=0
693

694
    $items.eq(index).focus()
695
696
  }

Mark Otto's avatar
Mark Otto committed
697
  function clearMenus() {
698
    $(backdrop).remove()
699
700
701
702
703
704
705
    $(toggle).each(function (e) { 
      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')
    })
706
707
708
709
710
711
712
  }

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

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

716
    var $parent = selector && $(selector)
717

718
    return $parent && $parent.length ? $parent : $this.parent()
719
720
721
  }


722
723
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
724

725
726
  var old = $.fn.dropdown

727
728
729
  $.fn.dropdown = function (option) {
    return this.each(function () {
      var $this = $(this)
730
731
      var data  = $this.data('dropdown')

732
733
734
735
736
737
738
739
      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  $.fn.dropdown.Constructor = Dropdown


740
741
  // DROPDOWN NO CONFLICT
  // ====================
742
743
744
745
746
747
748

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


749
750
751
  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

752

753
  $(document)
754
755
756
757
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
758

fat's avatar
fat committed
759
}(window.jQuery);
760
/* ========================================================================
fat's avatar
fat committed
761
 * Bootstrap: modal.js v3.0.0
762
 * http://twitter.github.com/bootstrap/javascript.html#modals
763
 * ========================================================================
764
765
766
767
768
769
770
771
772
773
774
775
776
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
777
 * ======================================================================== */
778
779


780
+function ($) { "use strict";
781

fat's avatar
fat committed
782
783
  // MODAL CLASS DEFINITION
  // ======================
784

Jacob Thornton's avatar
Jacob Thornton committed
785
  var Modal = function (element, options) {
fat's avatar
fat committed
786
787
788
789
    this.options   = options
    this.$element  = $(element).delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
    this.$backdrop =
    this.isShown   = null
790

fat's avatar
fat committed
791
792
    if (this.options.remote) this.$element.find('.modal-body').load(this.options.remote)
  }
793

fat's avatar
fat committed
794
795
796
797
798
  Modal.DEFAULTS = {
      backdrop: true
    , keyboard: true
    , show: true
  }
799

fat's avatar
fat committed
800
801
802
  Modal.prototype.toggle = function () {
    return this[!this.isShown ? 'show' : 'hide']()
  }
803

fat's avatar
fat committed
804
805
  Modal.prototype.show = function () {
    var that = this
Mark Otto's avatar
Mark Otto committed
806
    var e    = $.Event('show.bs.modal')
807

fat's avatar
fat committed
808
    this.$element.trigger(e)
809

fat's avatar
fat committed
810
    if (this.isShown || e.isDefaultPrevented()) return
811

fat's avatar
fat committed
812
    this.isShown = true
813

fat's avatar
fat committed
814
    this.escape()
815

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

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

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

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

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

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

fat's avatar
fat committed
835
      transition ?
Mark Otto's avatar
Mark Otto committed
836
837
        that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown.bs.modal') }) :
        that.$element.focus().trigger('shown.bs.modal')
fat's avatar
fat committed
838
839
    })
  }
840

fat's avatar
fat committed
841
  Modal.prototype.hide = function (e) {
fat's avatar
fat committed
842
    if (e) e.preventDefault()
843

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

fat's avatar
fat committed
846
    this.$element.trigger(e)
847

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

fat's avatar
fat committed
850
    this.isShown = false
851

fat's avatar
fat committed
852
    this.escape()
853

Mark Otto's avatar
Mark Otto committed
854
    $(document).off('focusin.bs.modal')
855

fat's avatar
fat committed
856
857
858
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
859

fat's avatar
fat committed
860
861
862
863
    $.support.transition && this.$element.hasClass('fade') ?
      this.hideWithTransition() :
      this.hideModal()
  }
864

fat's avatar
fat committed
865
  Modal.prototype.enforceFocus = function () {
Jacob Thornton's avatar
Jacob Thornton committed
866
867
868
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', function (e) {
fat's avatar
fat committed
869
870
      if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
        this.$element.focus()
871
      }
fat's avatar
fat committed
872
873
    }, this)
  }
874

fat's avatar
fat committed
875
876
  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
Mark Otto's avatar
Mark Otto committed
877
      this.$element.on('keyup.dismiss.bs.modal', function ( e ) {
fat's avatar
fat committed
878
879
880
        e.which == 27 && this.hide()
      }, this)
    } else if (!this.isShown) {
Mark Otto's avatar
Mark Otto committed
881
      this.$element.off('keyup.dismiss.bs.modal')
fat's avatar
fat committed
882
883
    }
  }
884

fat's avatar
fat committed
885
886
887
888
889
890
  Modal.prototype.hideWithTransition = function () {
    var that    = this
    var timeout = setTimeout(function () {
      that.$element.off($.support.transition.end)
      that.hideModal()
    }, 500)
891

fat's avatar
fat committed
892
893
894
895
896
    this.$element.one($.support.transition.end, function () {
      clearTimeout(timeout)
      that.hideModal()
    })
  }
897

fat's avatar
fat committed
898
899
900
901
902
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.removeBackdrop()
Mark Otto's avatar
Mark Otto committed
903
      that.$element.trigger('hidden.bs.modal')
fat's avatar
fat committed
904
905
    })
  }
906

fat's avatar
fat committed
907
908
909
910
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
911

fat's avatar
fat committed
912
913
914
  Modal.prototype.backdrop = function (callback) {
    var that    = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
915

fat's avatar
fat committed
916
917
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
918

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

fat's avatar
fat committed
922
923
924
925
926
      this.$backdrop.click(
        this.options.backdrop == 'static' ?
          $.proxy(this.$element[0].focus, this.$element[0])
        : $.proxy(this.hide, this)
      )
927

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

fat's avatar
fat committed
930
      this.$backdrop.addClass('in')
931

fat's avatar
fat committed
932
      if (!callback) return
933

fat's avatar
fat committed
934
935
936
      doAnimate ?
        this.$backdrop.one($.support.transition.end, callback) :
        callback()
937

fat's avatar
fat committed
938
939
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
940

fat's avatar
fat committed
941
942
943
      $.support.transition && this.$element.hasClass('fade')?
        this.$backdrop.one($.support.transition.end, callback) :
        callback()
944

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


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

954
955
  var old = $.fn.modal

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

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

  $.fn.modal.Constructor = Modal


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

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


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

Mark Otto's avatar
Mark Otto committed
983
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
fat's avatar
fat committed
984
985
986
987
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
988

989
    e.preventDefault()
990

991
992
993
994
995
    $target
      .modal(option)
      .one('hide', function () {
        $this.focus()
      })
996
997
    })

998
    var $body = $(document.body)
Mark Otto's avatar
Mark Otto committed
999
1000
      .on('bs.modal.shown',  '.modal', function () { $body.addClass('modal-open') })
      .on('bs.modal.hidden', '.modal', function () { $body.removeClass('modal-open') })
1001

1002
}(window.jQuery);
1003
/* ========================================================================
fat's avatar
fat committed
1004
 * Bootstrap: tooltip.js v3.0.0
1005
 * http://twitter.github.com/bootstrap/javascript.html#affix
1006
 * Inspired by the original jQuery.tipsy by Jason Frame
1007
 * ========================================================================
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
1021
 * ======================================================================== */
1022
1023


1024
+function ($) { "use strict";
1025

fat's avatar
fat committed
1026
1027
  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================
1028
1029

  var Tooltip = function (element, options) {
fat's avatar
fat committed
1030
1031
1032
1033
1034
1035
1036
    this.type       =
    this.options    =
    this.enabled    =
    this.timeout    =
    this.hoverState =
    this.$element   = null

1037
1038
1039
    this.init('tooltip', element, options)
  }

fat's avatar
fat committed
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
  Tooltip.DEFAULTS = {
    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
  }
1051

fat's avatar
fat committed
1052
1053
  Tooltip.prototype.init = function (type, element, options) {
    this.enabled  = true
fat's avatar
fat committed
1054
    this.type     = type
fat's avatar
fat committed
1055
    this.$element = $(element)
fat's avatar
fat committed
1056
    this.options  = this.getOptions(options)
1057

fat's avatar
fat committed
1058
    var triggers = this.options.trigger.split(' ')
1059

fat's avatar
fat committed
1060
1061
    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]
1062

fat's avatar
fat committed
1063
1064
1065
1066
1067
      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'
1068

fat's avatar
fat committed
1069
1070
        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1071
1072
1073
      }
    }

fat's avatar
fat committed
1074
1075
1076
1077
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1078

fat's avatar
fat committed
1079
1080
1081
1082
1083
1084
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }

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

fat's avatar
fat committed
1086
1087
1088
1089
1090
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay
      , hide: options.delay
      }
1091
1092
    }

fat's avatar
fat committed
1093
1094
    return options
  }
1095

fat's avatar
fat committed
1096
  Tooltip.prototype.enter = function (e) {
fat's avatar
fat committed
1097
    var defaults = this.getDefaults()
fat's avatar
fat committed
1098
    var options  = {}
1099

fat's avatar
fat committed
1100
1101
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
fat's avatar
fat committed
1102
    })
1103

Mark Otto's avatar
Mark Otto committed
1104
    var self = $(e.currentTarget)[this.type](options).data('bs.' + this.type)
1105

fat's avatar
fat committed
1106
    if (!self.options.delay || !self.options.delay.show) return self.show()
1107

fat's avatar
fat committed
1108
    clearTimeout(this.timeout)
1109

fat's avatar
fat committed
1110
1111
1112
1113
1114
    self.hoverState = 'in'
    this.timeout    = setTimeout(function() {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1115

fat's avatar
fat committed
1116
  Tooltip.prototype.leave = function (e) {
Mark Otto's avatar
Mark Otto committed
1117
    var self = $(e.currentTarget)[this.type](this._options).data('bs.' + this.type)
1118

fat's avatar
fat committed
1119
1120
    if (this.timeout) clearTimeout(this.timeout)
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
1121

fat's avatar
fat committed
1122
1123
1124
1125
1126
    self.hoverState = 'out'
    this.timeout    = setTimeout(function() {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1127

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

fat's avatar
fat committed
1131
1132
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
1133

fat's avatar
fat committed
1134
1135
1136
      if (e.isDefaultPrevented()) return

      var $tip = this.tip()
1137

fat's avatar
fat committed
1138
      this.setContent()
1139

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

fat's avatar
fat committed
1142
1143
1144
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1145

fat's avatar
fat committed
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })

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

      var tp
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight

      switch (placement) {
        case 'bottom':
          tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
          break
        case 'top':
          tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
          break
        case 'left':
          tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
          break
        case 'right':
          tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
          break
1170
      }
fat's avatar
fat committed
1171
1172

      this.applyPlacement(tp, placement)
Mark Otto's avatar
Mark Otto committed
1173
      this.$element.trigger('shown.bs.' + this.type)
1174
    }
fat's avatar
fat committed
1175
  }
1176

fat's avatar
fat committed
1177
1178
1179
1180
1181
  Tooltip.prototype.applyPlacement = function(offset, placement) {
    var replace
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight
fat's avatar
fat committed
1182

fat's avatar
fat committed
1183
1184
1185
1186
    $tip
      .offset(offset)
      .addClass(placement)
      .addClass('in')
fat's avatar
fat committed
1187

fat's avatar
fat committed
1188
1189
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1190

fat's avatar
fat committed
1191
1192
1193
1194
    if (placement == 'top' && actualHeight != height) {
      replace = true
      offset.top  = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1195

fat's avatar
fat committed
1196
1197
    if (placement == 'bottom' || placement == 'top') {
      var delta = 0
fat's avatar
fat committed
1198

fat's avatar
fat committed
1199
1200
1201
      if (offset.left < 0){
        delta       = offset.left * -2
        offset.left = 0
fat's avatar
fat committed
1202

fat's avatar
fat committed
1203
1204
1205
1206
        $tip.offset(offset)

        actualWidth  = $tip[0].offsetWidth
        actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1207
1208
      }

fat's avatar
fat committed
1209
1210
1211
      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
    } else {
      this.replaceArrow(actualHeight - height, actualHeight, 'top')
fat's avatar
fat committed
1212
1213
    }

fat's avatar
fat committed
1214
1215
    if (replace) $tip.offset(offset)
  }
fat's avatar
fat committed
1216

fat's avatar
fat committed
1217
1218
1219
  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {
    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
  }
1220

fat's avatar
fat committed
1221
1222
1223
1224
1225
1226
1227
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()

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

fat's avatar
fat committed
1229
1230
1231
  Tooltip.prototype.hide = function () {
    var that = this
    var $tip = this.tip()
Mark Otto's avatar
Mark Otto committed
1232
    var e    = $.Event('hide.bs.' + this.type)
1233

fat's avatar
fat committed
1234
    this.$element.trigger(e)
1235

fat's avatar
fat committed
1236
    if (e.isDefaultPrevented()) return
1237

fat's avatar
fat committed
1238
    $tip.removeClass('in')
1239

fat's avatar
fat committed
1240
1241
1242
1243
    function removeWithAnimation() {
      var timeout = setTimeout(function () {
        $tip.off($.support.transition.end).detach()
      }, 500)
1244

fat's avatar
fat committed
1245
1246
      $tip.one($.support.transition.end, function () {
        clearTimeout(timeout)
Jacob Thornton's avatar
rebuild    
Jacob Thornton committed
1247
        $tip.detach()
fat's avatar
fat committed
1248
1249
      })
    }
Jacob Thornton's avatar
Jacob Thornton committed
1250

fat's avatar
fat committed
1251
1252
1253
    $.support.transition && this.$tip.hasClass('fade') ?
      removeWithAnimation() :
      $tip.detach()
1254

Mark Otto's avatar
Mark Otto committed
1255
    this.$element.trigger('hidden.bs.' + this.type)
1256

fat's avatar
fat committed
1257
1258
    return this
  }
1259

fat's avatar
fat committed
1260
1261
1262
1263
  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', '')
1264
    }
fat's avatar
fat committed
1265
  }
1266

fat's avatar
fat committed
1267
1268
1269
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1270

fat's avatar
fat committed
1271
1272
1273
1274
1275
1276
1277
  Tooltip.prototype.getPosition = function () {
    var el = this.$element[0]
    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
      width: el.offsetWidth
    , height: el.offsetHeight
    }, this.$element.offset())
  }
1278

fat's avatar
fat committed
1279
1280
1281
1282
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1283

fat's avatar
fat committed
1284
1285
    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1286

fat's avatar
fat committed
1287
1288
    return title
  }
1289

fat's avatar
fat committed
1290
1291
1292
  Tooltip.prototype.tip = function () {
    return this.$tip = this.$tip || $(this.options.template)
  }
fat's avatar
fat committed
1293

fat's avatar
fat committed
1294
1295
1296
  Tooltip.prototype.arrow =function(){
    return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
  }
1297

fat's avatar
fat committed
1298
1299
1300
1301
1302
  Tooltip.prototype.validate = function () {
    if (!this.$element[0].parentNode) {
      this.hide()
      this.$element = null
      this.options  = null
1303
    }
fat's avatar
fat committed
1304
  }
1305

fat's avatar
fat committed
1306
1307
1308
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1309

fat's avatar
fat committed
1310
1311
1312
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
1313

fat's avatar
fat committed
1314
1315
1316
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
1317

fat's avatar
fat committed
1318
  Tooltip.prototype.toggle = function (e) {
Mark Otto's avatar
Mark Otto committed
1319
    var self = e ? $(e.currentTarget)[this.type](this._options).data('bs.' + this.type) : this
fat's avatar
fat committed
1320
1321
    self.tip().hasClass('in') ? self.hide() : self.show()
  }
Mark Otto's avatar
Mark Otto committed
1322

fat's avatar
fat committed
1323
  Tooltip.prototype.destroy = function () {
Mark Otto's avatar
Mark Otto committed
1324
    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
1325
1326
1327
  }


fat's avatar
fat committed
1328
1329
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1330

1331
1332
  var old = $.fn.tooltip

fat's avatar
fat committed
1333
  $.fn.tooltip = function (option) {
1334
    return this.each(function () {
fat's avatar
fat committed
1335
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
1336
      var data    = $this.data('bs.tooltip')
fat's avatar
fat committed
1337
1338
      var options = typeof option == 'object' && option

Mark Otto's avatar
Mark Otto committed
1339
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1340
1341
1342
1343
1344
1345
1346
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.tooltip.Constructor = Tooltip


fat's avatar
fat committed
1347
1348
  // TOOLTIP NO CONFLICT
  // ===================
1349
1350
1351
1352
1353
1354

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

1355
}(window.jQuery);
1356
/* ========================================================================
fat's avatar
fat committed
1357
 * Bootstrap: popover.js v3.0.0
1358
 * http://twitter.github.com/bootstrap/javascript.html#popovers
1359
 * ========================================================================
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
1373
 * ======================================================================== */
1374
1375


1376
+function ($) { "use strict";
1377

fat's avatar
fat committed
1378
1379
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1380

Jacob Thornton's avatar
Jacob Thornton committed
1381
  var Popover = function (element, options) {
1382
1383
1384
    this.init('popover', element, options)
  }

fat's avatar
fat committed
1385
1386
1387
1388
1389
1390
  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>'
  })
1391
1392


fat's avatar
fat committed
1393
1394
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1395

fat's avatar
fat committed
1396
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1397

fat's avatar
fat committed
1398
  Popover.prototype.constructor = Popover
1399

fat's avatar
fat committed
1400
1401
1402
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1403

fat's avatar
fat committed
1404
1405
1406
1407
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1408

fat's avatar
fat committed
1409
1410
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
1411

fat's avatar
fat committed
1412
1413
    $tip.removeClass('fade top bottom left right in')
  }
1414

fat's avatar
fat committed
1415
1416
1417
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1418

fat's avatar
fat committed
1419
1420
1421
1422
  Popover.prototype.getContent = function () {
    var content = typeof this.options.content == 'function' ?
      this.options.content.call(this.$element[0]) :
      this.options.content
1423

fat's avatar
fat committed
1424
1425
    return content || this.$element.attr('data-content')
  }
1426

fat's avatar
fat committed
1427
1428
1429
1430
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
Mark Otto's avatar
Mark Otto committed
1431

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


fat's avatar
fat committed
1437
1438
  // POPOVER PLUGIN DEFINITION
  // =========================
1439

1440
1441
  var old = $.fn.popover

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

Mark Otto's avatar
Mark Otto committed
1448
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1449
1450
1451
1452
1453
1454
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.popover.Constructor = Popover

1455

fat's avatar
fat committed
1456
1457
  // POPOVER NO CONFLICT
  // ===================
1458
1459
1460
1461
1462
1463

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

Mark Otto's avatar
Mark Otto committed
1464
}(window.jQuery);
1465
/* ========================================================================
fat's avatar
fat committed
1466
 * Bootstrap: scrollspy.js v3.0.0
1467
 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
1468
 * ========================================================================
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
1482
 * ======================================================================== */
1483
1484


1485
+function ($) { "use strict";
1486

fat's avatar
fat committed
1487
1488
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1489

Jacob Thornton's avatar
Jacob Thornton committed
1490
  function ScrollSpy(element, options) {
fat's avatar
fat committed
1491
1492
1493
1494
1495
    var href
    var process  = $.proxy(this.process, this)
    var $element = $(element).is('body') ? $(window) : $(element)

    this.$body          = $('body')
1496
    this.$scrollElement = $element.on('scroll.bs.scroll-spy.data-api', process)
fat's avatar
fat committed
1497
1498
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target
1499
1500
      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      || '') + ' .nav li > a'
fat's avatar
fat committed
1501
1502
1503
1504
    this.offsets        = $([])
    this.targets        = $([])
    this.activeTarget   = null

1505
1506
1507
1508
    this.refresh()
    this.process()
  }

fat's avatar
fat committed
1509
1510
1511
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1512

fat's avatar
fat committed
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
  ScrollSpy.prototype.refresh = function () {
    this.offsets = $([])
    this.targets = $([])

    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)

        return ($href
          && $href.length
          && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }
1535

fat's avatar
fat committed
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
  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

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

fat's avatar
fat committed
1549
1550
1551
1552
1553
1554
1555
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate( targets[i] )
    }
  }
1556

fat's avatar
fat committed
1557
1558
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1559

fat's avatar
fat committed
1560
1561
1562
    $(this.selector)
      .parents('.active')
      .removeClass('active')
1563

fat's avatar
fat committed
1564
1565
1566
    var selector = this.selector
      + '[data-target="' + target + '"],'
      + this.selector + '[href="' + target + '"]'
1567

fat's avatar
fat committed
1568
1569
1570
    var active = $(selector)
      .parents('li')
      .addClass('active')
1571

fat's avatar
fat committed
1572
1573
1574
1575
1576
    if (active.parent('.dropdown-menu').length)  {
      active = active
        .closest('li.dropdown')
        .addClass('active')
    }
1577

fat's avatar
fat committed
1578
    active.trigger('activate')
1579
1580
1581
  }


fat's avatar
fat committed
1582
1583
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1584

1585
1586
  var old = $.fn.scrollspy

Jacob Thornton's avatar
Jacob Thornton committed
1587
  $.fn.scrollspy = function (option) {
1588
    return this.each(function () {
fat's avatar
fat committed
1589
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
1590
      var data    = $this.data('bs.scrollspy')
fat's avatar
fat committed
1591
1592
      var options = typeof option == 'object' && option

Mark Otto's avatar
Mark Otto committed
1593
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
1594
1595
1596
1597
1598
1599
1600
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.scrollspy.Constructor = ScrollSpy


fat's avatar
fat committed
1601
1602
  // SCROLLSPY NO CONFLICT
  // =====================
1603
1604
1605
1606
1607
1608
1609

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


fat's avatar
fat committed
1610
1611
  // SCROLLSPY DATA-API
  // ==================
1612

Jacob Thornton's avatar
Jacob Thornton committed
1613
  $(window).on('load', function () {
1614
1615
1616
1617
1618
1619
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      $spy.scrollspy($spy.data())
    })
  })

Mark Otto's avatar
Mark Otto committed
1620
}(window.jQuery);
1621
/* ========================================================================
fat's avatar
fat committed
1622
 * Bootstrap: tab.js v3.0.0
1623
 * http://twitter.github.com/bootstrap/javascript.html#tabs
1624
 * ========================================================================
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
1638
 * ======================================================================== */
1639
1640


1641
+function ($) { "use strict";
1642

fat's avatar
fat committed
1643
1644
  // TAB CLASS DEFINITION
  // ====================
1645

Jacob Thornton's avatar
Jacob Thornton committed
1646
  var Tab = function (element) {
1647
1648
1649
    this.element = $(element)
  }

fat's avatar
fat committed
1650
1651
1652
1653
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.attr('data-target')
1654

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

fat's avatar
fat committed
1660
    if ($this.parent('li').hasClass('active')) return
1661

fat's avatar
fat committed
1662
    var previous = $ul.find('.active:last a')[0]
Mark Otto's avatar
Mark Otto committed
1663
    var e        = $.Event('show.bs.tab', {
fat's avatar
fat committed
1664
1665
      relatedTarget: previous
    })
1666

fat's avatar
fat committed
1667
    $this.trigger(e)
1668

fat's avatar
fat committed
1669
    if (e.isDefaultPrevented()) return
1670

fat's avatar
fat committed
1671
    var $target = $(selector)
1672

fat's avatar
fat committed
1673
1674
1675
    this.activate($this.parent('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $this.trigger({
Mark Otto's avatar
Mark Otto committed
1676
        type: 'shown.bs.tab'
fat's avatar
fat committed
1677
      , relatedTarget: previous
1678
      })
fat's avatar
fat committed
1679
1680
    })
  }
1681

fat's avatar
fat committed
1682
1683
1684
1685
1686
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && $active.hasClass('fade')
1687

fat's avatar
fat committed
1688
1689
1690
1691
1692
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
        .removeClass('active')
1693

fat's avatar
fat committed
1694
      element.addClass('active')
1695

fat's avatar
fat committed
1696
1697
1698
1699
1700
      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
1701
1702
      }

fat's avatar
fat committed
1703
1704
1705
      if (element.parent('.dropdown-menu')) {
        element.closest('li.dropdown').addClass('active')
      }
1706

fat's avatar
fat committed
1707
      callback && callback()
1708
    }
fat's avatar
fat committed
1709
1710
1711
1712
1713
1714

    transition ?
      $active.one($.support.transition.end, next) :
      next()

    $active.removeClass('in')
1715
1716
1717
  }


fat's avatar
fat committed
1718
1719
  // TAB PLUGIN DEFINITION
  // =====================
1720

1721
1722
  var old = $.fn.tab

1723
1724
1725
  $.fn.tab = function ( option ) {
    return this.each(function () {
      var $this = $(this)
Mark Otto's avatar
Mark Otto committed
1726
      var data  = $this.data('bs.tab')
fat's avatar
fat committed
1727

Mark Otto's avatar
Mark Otto committed
1728
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
1729
1730
1731
1732
1733
1734
1735
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.tab.Constructor = Tab


fat's avatar
fat committed
1736
1737
  // TAB NO CONFLICT
  // ===============
1738
1739
1740
1741
1742
1743
1744

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


fat's avatar
fat committed
1745
1746
  // TAB DATA-API
  // ============
1747

Mark Otto's avatar
Mark Otto committed
1748
  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
1749
1750
    e.preventDefault()
    $(this).tab('show')
1751
1752
  })

1753
}(window.jQuery);
1754
/* ========================================================================
fat's avatar
fat committed
1755
 * Bootstrap: affix.js v3.0.0
Mark Otto's avatar
Mark Otto committed
1756
 * http://twitter.github.com/bootstrap/javascript.html#affix
1757
 * ========================================================================
Mark Otto's avatar
Mark Otto committed
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
 * Copyright 2012 Twitter, Inc.
 *
 * 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.
1771
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
1772
1773


1774
+function ($) { "use strict";
Mark Otto's avatar
Mark Otto committed
1775

fat's avatar
fat committed
1776
1777
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
1778
1779

  var Affix = function (element, options) {
fat's avatar
fat committed
1780
    this.options = $.extend({}, Affix.DEFAULTS, options)
1781
    this.$window = $(window)
Mark Otto's avatar
Mark Otto committed
1782
1783
      .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
1784

Mark Otto's avatar
Mark Otto committed
1785
    this.$element = $(element)
fat's avatar
fat committed
1786
1787
1788
    this.affixed  =
    this.unpin    = null

Mark Otto's avatar
Mark Otto committed
1789
1790
1791
    this.checkPosition()
  }

fat's avatar
fat committed
1792
1793
1794
1795
1796
1797
1798
1799
  Affix.DEFAULTS = {
    offset: 0
  }

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

Mark Otto's avatar
Mark Otto committed
1800
1801
1802
1803
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var scrollHeight = $(document).height()
fat's avatar
fat committed
1804
1805
1806
1807
1808
1809
1810
1811
1812
    var scrollTop    = this.$window.scrollTop()
    var position     = this.$element.offset()
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
    var reset        = 'affix affix-top affix-bottom'

    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top()
Mark Otto's avatar
Mark Otto committed
1813
1814
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()

fat's avatar
fat committed
1815
1816
1817
    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
Mark Otto's avatar
Mark Otto committed
1818
1819
1820
1821

    if (this.affixed === affix) return

    this.affixed = affix
fat's avatar
fat committed
1822
    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null
Mark Otto's avatar
Mark Otto committed
1823
1824
1825
1826
1827

    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
  }


fat's avatar
fat committed
1828
1829
  // AFFIX PLUGIN DEFINITION
  // =======================
Mark Otto's avatar
Mark Otto committed
1830

1831
1832
  var old = $.fn.affix

Mark Otto's avatar
Mark Otto committed
1833
1834
  $.fn.affix = function (option) {
    return this.each(function () {
fat's avatar
fat committed
1835
      var $this   = $(this)
Mark Otto's avatar
Mark Otto committed
1836
      var data    = $this.data('bs.affix')
fat's avatar
fat committed
1837
1838
      var options = typeof option == 'object' && option

Mark Otto's avatar
Mark Otto committed
1839
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
Mark Otto's avatar
Mark Otto committed
1840
1841
1842
1843
1844
1845
1846
      if (typeof option == 'string') data[option]()
    })
  }

  $.fn.affix.Constructor = Affix


fat's avatar
fat committed
1847
1848
  // AFFIX NO CONFLICT
  // =================
1849
1850
1851
1852
1853
1854
1855

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


fat's avatar
fat committed
1856
1857
  // AFFIX DATA-API
  // ==============
Mark Otto's avatar
Mark Otto committed
1858
1859
1860
1861

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
fat's avatar
fat committed
1862
      var data = $spy.data()
Mark Otto's avatar
Mark Otto committed
1863
1864
1865

      data.offset = data.offset || {}

fat's avatar
fat committed
1866
1867
      if (data.offsetBottom) data.offset.bottom = data.offsetBottom
      if (data.offsetTop)    data.offset.top    = data.offsetTop
Mark Otto's avatar
Mark Otto committed
1868
1869
1870
1871
1872

      $spy.affix(data)
    })
  })

1873
}(window.jQuery);