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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
7
8
9
10
11
12
13
14
15
16
if (typeof jQuery === 'undefined') {
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
}

+function ($) {
  var version = $.fn.jquery.split(' ')[0].split('.')
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
  }
}(jQuery);
17

18
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
19
 * Bootstrap: transition.js v3.2.0
Mark Otto's avatar
Mark Otto committed
20
 * http://getbootstrap.com/javascript/#transitions
21
 * ========================================================================
22
 * Copyright 2011-2014 Twitter, Inc.
23
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
24
 * ======================================================================== */
25
26


XhmikosR's avatar
XhmikosR committed
27
28
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
29

XhmikosR's avatar
XhmikosR committed
30
31
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
32

XhmikosR's avatar
XhmikosR committed
33
34
  function transitionEnd() {
    var el = document.createElement('bootstrap')
35

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

XhmikosR's avatar
XhmikosR committed
43
44
45
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
46
      }
Chris Rebert's avatar
Chris Rebert committed
47
48
    }

XhmikosR's avatar
XhmikosR committed
49
50
    return false // explicit for ie8 (  ._.)
  }
51

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

XhmikosR's avatar
XhmikosR committed
62
63
  $(function () {
    $.support.transition = transitionEnd()
Chris Rebert's avatar
Chris Rebert committed
64

XhmikosR's avatar
XhmikosR committed
65
    if (!$.support.transition) return
66

XhmikosR's avatar
XhmikosR committed
67
68
69
70
71
72
73
    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
fat's avatar
fat committed
74
  })
75

XhmikosR's avatar
XhmikosR committed
76
}(jQuery);
77

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


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

XhmikosR's avatar
XhmikosR committed
90
91
  // ALERT CLASS DEFINITION
  // ======================
92

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

Mark Otto's avatar
Mark Otto committed
98
  Alert.VERSION = '3.2.0'
99

100
101
  Alert.TRANSITION_DURATION = 150

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

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

XhmikosR's avatar
XhmikosR committed
111
    var $parent = $(selector)
112

XhmikosR's avatar
XhmikosR committed
113
    if (e) e.preventDefault()
114

XhmikosR's avatar
XhmikosR committed
115
    if (!$parent.length) {
Chris Rebert's avatar
grunt    
Chris Rebert committed
116
      $parent = $this.closest('.alert')
XhmikosR's avatar
XhmikosR committed
117
    }
118

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

XhmikosR's avatar
XhmikosR committed
121
    if (e.isDefaultPrevented()) return
122

XhmikosR's avatar
XhmikosR committed
123
    $parent.removeClass('in')
124

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

XhmikosR's avatar
XhmikosR committed
130
131
132
    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
133
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
134
135
      removeElement()
  }
136
137


XhmikosR's avatar
XhmikosR committed
138
139
  // ALERT PLUGIN DEFINITION
  // =======================
140

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

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

XhmikosR's avatar
XhmikosR committed
151
  var old = $.fn.alert
Mark Otto's avatar
Mark Otto committed
152

XhmikosR's avatar
XhmikosR committed
153
154
  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert
155
156


XhmikosR's avatar
XhmikosR committed
157
158
  // ALERT NO CONFLICT
  // =================
159

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


XhmikosR's avatar
XhmikosR committed
166
167
  // ALERT DATA-API
  // ==============
168

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

XhmikosR's avatar
XhmikosR committed
171
}(jQuery);
172

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


XhmikosR's avatar
XhmikosR committed
182
183
+function ($) {
  'use strict';
fat's avatar
fat committed
184

XhmikosR's avatar
XhmikosR committed
185
186
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
Mark Otto's avatar
grunt    
Mark Otto committed
187

XhmikosR's avatar
XhmikosR committed
188
189
190
191
192
  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }
193

Mark Otto's avatar
Mark Otto committed
194
  Button.VERSION  = '3.2.0'
195

XhmikosR's avatar
XhmikosR committed
196
197
198
  Button.DEFAULTS = {
    loadingText: 'loading...'
  }
fat's avatar
fat committed
199

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

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

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

XhmikosR's avatar
XhmikosR committed
210
211
    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
212
213
      $el[val](data[state] == null ? this.options[state] : data[state])

XhmikosR's avatar
XhmikosR committed
214
215
216
217
218
219
      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d)
220
      }
XhmikosR's avatar
XhmikosR committed
221
222
223
224
225
226
227
228
229
230
231
232
233
234
    }, this), 0)
  }

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

    if ($parent.length) {
      var $input = this.$element.find('input')
      if ($input.prop('type') == 'radio') {
        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
        else $parent.find('.active').removeClass('active')
      }
      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
235
236
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
fat's avatar
fat committed
237
    }
238

XhmikosR's avatar
XhmikosR committed
239
240
    if (changed) this.$element.toggleClass('active')
  }
241
242


XhmikosR's avatar
XhmikosR committed
243
244
  // BUTTON PLUGIN DEFINITION
  // ========================
245

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

XhmikosR's avatar
XhmikosR committed
252
      if (!data) $this.data('bs.button', (data = new Button(this, options)))
fat's avatar
fat committed
253

XhmikosR's avatar
XhmikosR committed
254
255
256
257
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }
258

XhmikosR's avatar
XhmikosR committed
259
  var old = $.fn.button
Mark Otto's avatar
Mark Otto committed
260

XhmikosR's avatar
XhmikosR committed
261
262
  $.fn.button             = Plugin
  $.fn.button.Constructor = Button
263
264


XhmikosR's avatar
XhmikosR committed
265
266
  // BUTTON NO CONFLICT
  // ==================
267

XhmikosR's avatar
XhmikosR committed
268
269
270
271
  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }
272
273


XhmikosR's avatar
XhmikosR committed
274
275
  // BUTTON DATA-API
  // ===============
276

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

XhmikosR's avatar
XhmikosR committed
288
}(jQuery);
289

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


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

XhmikosR's avatar
XhmikosR committed
302
303
  // CAROUSEL CLASS DEFINITION
  // =========================
304

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
315
316
    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))

317
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
XhmikosR's avatar
XhmikosR committed
318
319
320
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
321

Mark Otto's avatar
Mark Otto committed
322
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
323

324
325
  Carousel.TRANSITION_DURATION = 600

XhmikosR's avatar
XhmikosR committed
326
327
328
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
329
330
    wrap: true,
    keyboard: true
XhmikosR's avatar
XhmikosR committed
331
  }
332

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

XhmikosR's avatar
XhmikosR committed
340
341
    e.preventDefault()
  }
342

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

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

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

XhmikosR's avatar
XhmikosR committed
352
353
    return this
  }
354

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

XhmikosR's avatar
XhmikosR committed
360
361
362
363
364
365
366
  Carousel.prototype.getItemForDirection = function (direction, active) {
    var delta = direction == 'prev' ? -1 : 1
    var activeIndex = this.getItemIndex(active)
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

XhmikosR's avatar
XhmikosR committed
367
368
369
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
370

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

XhmikosR's avatar
XhmikosR committed
373
374
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
    if (activeIndex == pos) return this.pause().cycle()
375

XhmikosR's avatar
XhmikosR committed
376
    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
XhmikosR's avatar
XhmikosR committed
377
  }
fat's avatar
fat committed
378

XhmikosR's avatar
XhmikosR committed
379
380
381
382
383
384
  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

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

XhmikosR's avatar
XhmikosR committed
387
    this.interval = clearInterval(this.interval)
388

XhmikosR's avatar
XhmikosR committed
389
390
    return this
  }
391

XhmikosR's avatar
XhmikosR committed
392
393
394
395
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
396

XhmikosR's avatar
XhmikosR committed
397
398
399
400
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
401

XhmikosR's avatar
XhmikosR committed
402
403
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
404
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
405
406
407
408
    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
409

XhmikosR's avatar
XhmikosR committed
410
411
412
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
413
414
    }

XhmikosR's avatar
XhmikosR committed
415
    if ($next.hasClass('active')) return (this.sliding = false)
416

XhmikosR's avatar
XhmikosR committed
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
    var relatedTarget = $next[0]
    var slideEvent = $.Event('slide.bs.carousel', {
      relatedTarget: relatedTarget,
      direction: direction
    })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return

    this.sliding = true

    isCycling && this.pause()

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
    }

    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
      $active
        .one('bsTransitionEnd', function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
        })
450
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
451
452
453
454
455
456
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
457

XhmikosR's avatar
XhmikosR committed
458
    isCycling && this.cycle()
459

XhmikosR's avatar
XhmikosR committed
460
461
    return this
  }
462
463


XhmikosR's avatar
XhmikosR committed
464
465
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
466

XhmikosR's avatar
XhmikosR committed
467
468
469
470
471
472
473
474
475
476
477
478
479
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.carousel')
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }
480

XhmikosR's avatar
XhmikosR committed
481
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
482

XhmikosR's avatar
XhmikosR committed
483
484
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
485
486


XhmikosR's avatar
XhmikosR committed
487
488
  // CAROUSEL NO CONFLICT
  // ====================
489

XhmikosR's avatar
XhmikosR committed
490
491
492
493
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
494

fat's avatar
fat committed
495

XhmikosR's avatar
XhmikosR committed
496
497
  // CAROUSEL DATA-API
  // =================
498

XhmikosR's avatar
XhmikosR committed
499
500
501
502
503
504
505
506
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
    var href
    var $this   = $(this)
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
    if (!$target.hasClass('carousel')) return
    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
507

XhmikosR's avatar
XhmikosR committed
508
    Plugin.call($target, options)
509

XhmikosR's avatar
XhmikosR committed
510
511
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
512
513
    }

XhmikosR's avatar
XhmikosR committed
514
515
    e.preventDefault()
  })
516

XhmikosR's avatar
XhmikosR committed
517
518
519
520
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
fat's avatar
fat committed
521
522
523
    })
  })

XhmikosR's avatar
XhmikosR committed
524
}(jQuery);
525

526
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
527
 * Bootstrap: collapse.js v3.2.0
Mark Otto's avatar
Mark Otto committed
528
 * http://getbootstrap.com/javascript/#collapse
529
 * ========================================================================
530
 * Copyright 2011-2014 Twitter, Inc.
531
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
532
 * ======================================================================== */
533
534


XhmikosR's avatar
XhmikosR committed
535
536
+function ($) {
  'use strict';
537

XhmikosR's avatar
XhmikosR committed
538
539
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
540

XhmikosR's avatar
XhmikosR committed
541
542
543
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
544
    this.$trigger      = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
XhmikosR's avatar
XhmikosR committed
545
    this.transitioning = null
546

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
547
548
549
550
551
552
    if (this.options.parent) {
      this.$parent = this.getParent()
    } else {
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
    }

XhmikosR's avatar
XhmikosR committed
553
554
    if (this.options.toggle) this.toggle()
  }
555

Mark Otto's avatar
Mark Otto committed
556
  Collapse.VERSION  = '3.2.0'
557

558
559
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
560
  Collapse.DEFAULTS = {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
561
562
    toggle: true,
    trigger: '[data-toggle="collapse"]'
XhmikosR's avatar
XhmikosR committed
563
  }
fat's avatar
fat committed
564

XhmikosR's avatar
XhmikosR committed
565
566
567
568
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
569

XhmikosR's avatar
XhmikosR committed
570
571
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
572

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
573
574
575
576
577
578
579
580
    var activesData
    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')

    if (actives && actives.length) {
      activesData = actives.data('bs.collapse')
      if (activesData && activesData.transitioning) return
    }

XhmikosR's avatar
XhmikosR committed
581
582
583
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
584

XhmikosR's avatar
XhmikosR committed
585
586
    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
587
      activesData || actives.data('bs.collapse', null)
XhmikosR's avatar
XhmikosR committed
588
    }
589

XhmikosR's avatar
XhmikosR committed
590
    var dimension = this.dimension()
591

XhmikosR's avatar
XhmikosR committed
592
593
594
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
595
      .attr('aria-expanded', true)
596

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
597
598
599
600
    this.$trigger
      .removeClass('collapsed')
      .attr('aria-expanded', true)

XhmikosR's avatar
XhmikosR committed
601
    this.transitioning = 1
602

XhmikosR's avatar
XhmikosR committed
603
604
605
606
607
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
608
      this.$element
XhmikosR's avatar
XhmikosR committed
609
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
610
    }
611

XhmikosR's avatar
XhmikosR committed
612
    if (!$.support.transition) return complete.call(this)
fat's avatar
fat committed
613

XhmikosR's avatar
XhmikosR committed
614
    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
fat's avatar
fat committed
615

XhmikosR's avatar
XhmikosR committed
616
617
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
618
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
619
  }
620

XhmikosR's avatar
XhmikosR committed
621
622
  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return
623

XhmikosR's avatar
XhmikosR committed
624
625
626
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
627

XhmikosR's avatar
XhmikosR committed
628
    var dimension = this.dimension()
629

XhmikosR's avatar
XhmikosR committed
630
631
632
633
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
Mark Otto's avatar
grunt    
Mark Otto committed
634
      .removeClass('collapse in')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
635
      .attr('aria-expanded', false)
636

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
637
638
639
640
    this.$trigger
      .addClass('collapsed')
      .attr('aria-expanded', false)

XhmikosR's avatar
XhmikosR committed
641
    this.transitioning = 1
642

XhmikosR's avatar
XhmikosR committed
643
644
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
645
      this.$element
XhmikosR's avatar
XhmikosR committed
646
647
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
648
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
649
    }
650

XhmikosR's avatar
XhmikosR committed
651
    if (!$.support.transition) return complete.call(this)
652

XhmikosR's avatar
XhmikosR committed
653
654
655
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
656
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
657
  }
658

XhmikosR's avatar
XhmikosR committed
659
660
661
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
662

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
  Collapse.prototype.getParent = function () {
    return $(this.options.parent)
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
      .each($.proxy(function (i, element) {
        var $element = $(element)
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
      }, this))
      .end()
  }

  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
    var isOpen = $element.hasClass('in')

    $element.attr('aria-expanded', isOpen)
    $trigger
      .toggleClass('collapsed', !isOpen)
      .attr('aria-expanded', isOpen)
  }

  function getTargetFromTrigger($trigger) {
    var href
    var target = $trigger.attr('data-target')
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7

    return $(target)
  }

690

XhmikosR's avatar
XhmikosR committed
691
692
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
693

XhmikosR's avatar
XhmikosR committed
694
695
696
697
698
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.collapse')
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
Mark Otto's avatar
Mark Otto committed
699

Mark Otto's avatar
grunt    
Mark Otto committed
700
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
701
702
703
704
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
705

XhmikosR's avatar
XhmikosR committed
706
  var old = $.fn.collapse
707

XhmikosR's avatar
XhmikosR committed
708
709
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
710

711

XhmikosR's avatar
XhmikosR committed
712
713
  // COLLAPSE NO CONFLICT
  // ====================
714

XhmikosR's avatar
XhmikosR committed
715
716
717
718
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
719

720

XhmikosR's avatar
XhmikosR committed
721
722
723
724
725
  // COLLAPSE DATA-API
  // =================

  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
    var $this   = $(this)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
726
727
728
729

    if (!$this.attr('data-target')) e.preventDefault()

    var $target = getTargetFromTrigger($this)
XhmikosR's avatar
XhmikosR committed
730
    var data    = $target.data('bs.collapse')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
731
    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
fat's avatar
fat committed
732

XhmikosR's avatar
XhmikosR committed
733
    Plugin.call($target, option)
734
735
  })

XhmikosR's avatar
XhmikosR committed
736
}(jQuery);
737

738
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
739
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
740
 * http://getbootstrap.com/javascript/#dropdowns
741
 * ========================================================================
742
 * Copyright 2011-2014 Twitter, Inc.
743
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
744
 * ======================================================================== */
745
746


XhmikosR's avatar
XhmikosR committed
747
748
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
749

XhmikosR's avatar
XhmikosR committed
750
751
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
752

XhmikosR's avatar
XhmikosR committed
753
754
755
756
757
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
758

Mark Otto's avatar
Mark Otto committed
759
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
760

XhmikosR's avatar
XhmikosR committed
761
762
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
763

XhmikosR's avatar
XhmikosR committed
764
    if ($this.is('.disabled, :disabled')) return
765

XhmikosR's avatar
XhmikosR committed
766
767
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
768

XhmikosR's avatar
XhmikosR committed
769
    clearMenus()
fat's avatar
fat committed
770

XhmikosR's avatar
XhmikosR committed
771
772
773
774
775
    if (!isActive) {
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        // if mobile we use a backdrop because click events don't delegate
        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
      }
776

XhmikosR's avatar
XhmikosR committed
777
778
      var relatedTarget = { relatedTarget: this }
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
779

XhmikosR's avatar
XhmikosR committed
780
      if (e.isDefaultPrevented()) return
781

782
783
784
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
785

XhmikosR's avatar
XhmikosR committed
786
787
788
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
789
    }
790

XhmikosR's avatar
XhmikosR committed
791
792
    return false
  }
793

XhmikosR's avatar
XhmikosR committed
794
  Dropdown.prototype.keydown = function (e) {
Mark Otto's avatar
grunt    
Mark Otto committed
795
    if (!/(38|40|27|32)/.test(e.which)) return
796

XhmikosR's avatar
XhmikosR committed
797
    var $this = $(this)
798

XhmikosR's avatar
XhmikosR committed
799
800
    e.preventDefault()
    e.stopPropagation()
801

XhmikosR's avatar
XhmikosR committed
802
    if ($this.is('.disabled, :disabled')) return
803

XhmikosR's avatar
XhmikosR committed
804
805
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
806

Mark Otto's avatar
grunt    
Mark Otto committed
807
    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
XhmikosR's avatar
XhmikosR committed
808
809
810
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
811

XhmikosR's avatar
XhmikosR committed
812
813
    var desc = ' li:not(.divider):visible a'
    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
814

XhmikosR's avatar
XhmikosR committed
815
    if (!$items.length) return
816

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
817
    var index = $items.index(e.target)
818

Mark Otto's avatar
grunt    
Mark Otto committed
819
820
    if (e.which == 38 && index > 0)                 index--                        // up
    if (e.which == 40 && index < $items.length - 1) index++                        // down
XhmikosR's avatar
XhmikosR committed
821
    if (!~index)                                      index = 0
822

XhmikosR's avatar
XhmikosR committed
823
824
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
825

XhmikosR's avatar
XhmikosR committed
826
827
828
829
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
830
831
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
832
      var relatedTarget = { relatedTarget: this }
833

XhmikosR's avatar
XhmikosR committed
834
      if (!$parent.hasClass('open')) return
835

XhmikosR's avatar
XhmikosR committed
836
      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
837

XhmikosR's avatar
XhmikosR committed
838
      if (e.isDefaultPrevented()) return
839
840

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
841
842
843
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
844

XhmikosR's avatar
XhmikosR committed
845
846
  function getParent($this) {
    var selector = $this.attr('data-target')
847

XhmikosR's avatar
XhmikosR committed
848
849
850
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
851
852
    }

XhmikosR's avatar
XhmikosR committed
853
    var $parent = selector && $(selector)
854

XhmikosR's avatar
XhmikosR committed
855
856
    return $parent && $parent.length ? $parent : $this.parent()
  }
857
858


XhmikosR's avatar
XhmikosR committed
859
860
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
861

XhmikosR's avatar
XhmikosR committed
862
863
864
865
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
866

XhmikosR's avatar
XhmikosR committed
867
868
869
870
      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }
Mark Otto's avatar
Mark Otto committed
871

XhmikosR's avatar
XhmikosR committed
872
  var old = $.fn.dropdown
873

XhmikosR's avatar
XhmikosR committed
874
875
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
876

877

XhmikosR's avatar
XhmikosR committed
878
879
  // DROPDOWN NO CONFLICT
  // ====================
880

XhmikosR's avatar
XhmikosR committed
881
882
883
884
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
885

886

XhmikosR's avatar
XhmikosR committed
887
888
889
890
891
892
893
894
  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

  $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
895

XhmikosR's avatar
XhmikosR committed
896
}(jQuery);
897

898
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
899
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
900
 * http://getbootstrap.com/javascript/#modals
901
 * ========================================================================
902
 * Copyright 2011-2014 Twitter, Inc.
903
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
904
 * ======================================================================== */
905
906


XhmikosR's avatar
XhmikosR committed
907
908
+function ($) {
  'use strict';
909

XhmikosR's avatar
XhmikosR committed
910
911
  // MODAL CLASS DEFINITION
  // ======================
912

XhmikosR's avatar
XhmikosR committed
913
914
915
916
917
918
919
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
920

XhmikosR's avatar
XhmikosR committed
921
922
923
924
925
926
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
927
    }
XhmikosR's avatar
XhmikosR committed
928
  }
929

Mark Otto's avatar
Mark Otto committed
930
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
931

932
933
934
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
935
936
937
938
939
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
940

XhmikosR's avatar
XhmikosR committed
941
942
943
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
948

XhmikosR's avatar
XhmikosR committed
949
    this.$element.trigger(e)
950

XhmikosR's avatar
XhmikosR committed
951
    if (this.isShown || e.isDefaultPrevented()) return
952

XhmikosR's avatar
XhmikosR committed
953
    this.isShown = true
fat's avatar
build    
fat committed
954

XhmikosR's avatar
XhmikosR committed
955
956
    this.checkScrollbar()
    this.$body.addClass('modal-open')
957

XhmikosR's avatar
XhmikosR committed
958
959
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
960

XhmikosR's avatar
XhmikosR committed
961
    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
962

XhmikosR's avatar
XhmikosR committed
963
964
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
965

XhmikosR's avatar
XhmikosR committed
966
967
968
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
969

XhmikosR's avatar
XhmikosR committed
970
971
972
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
973

XhmikosR's avatar
XhmikosR committed
974
975
976
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
977

XhmikosR's avatar
XhmikosR committed
978
979
980
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
981

XhmikosR's avatar
XhmikosR committed
982
      that.enforceFocus()
983

XhmikosR's avatar
XhmikosR committed
984
      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
985

XhmikosR's avatar
XhmikosR committed
986
987
988
989
990
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
991
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
992
993
994
        that.$element.trigger('focus').trigger(e)
    })
  }
995

XhmikosR's avatar
XhmikosR committed
996
997
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
998

XhmikosR's avatar
XhmikosR committed
999
    e = $.Event('hide.bs.modal')
fat's avatar
build    
fat committed
1000

XhmikosR's avatar
XhmikosR committed
1001
    this.$element.trigger(e)
1002

XhmikosR's avatar
XhmikosR committed
1003
    if (!this.isShown || e.isDefaultPrevented()) return
1004

XhmikosR's avatar
XhmikosR committed
1005
    this.isShown = false
1006

XhmikosR's avatar
XhmikosR committed
1007
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
1008

XhmikosR's avatar
XhmikosR committed
1009
    $(document).off('focusin.bs.modal')
Chris Rebert's avatar
Chris Rebert committed
1010

XhmikosR's avatar
XhmikosR committed
1011
1012
1013
1014
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
1015

XhmikosR's avatar
XhmikosR committed
1016
1017
1018
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1019
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1020
1021
      this.hideModal()
  }
1022

XhmikosR's avatar
XhmikosR committed
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
Mark Otto's avatar
grunt    
Mark Otto committed
1035
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1036
1037
1038
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1039
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1040
1041
1042
1043
1044
1045
1046
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1047
1048
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1049
1050
1051
      that.$element.trigger('hidden.bs.modal')
    })
  }
1052

XhmikosR's avatar
XhmikosR committed
1053
1054
1055
1056
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1057

XhmikosR's avatar
XhmikosR committed
1058
1059
1060
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1061

XhmikosR's avatar
XhmikosR committed
1062
1063
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1064

XhmikosR's avatar
XhmikosR committed
1065
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1066
1067
1068
1069
1070
1071
1072
        .prependTo(this.$element)
        .on('click.dismiss.bs.modal', $.proxy(function (e) {
          if (e.target !== e.currentTarget) return
          this.options.backdrop == 'static'
            ? this.$element[0].focus.call(this.$element[0])
            : this.hide.call(this)
        }, this))
1073

XhmikosR's avatar
XhmikosR committed
1074
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1075

XhmikosR's avatar
XhmikosR committed
1076
      this.$backdrop.addClass('in')
1077

XhmikosR's avatar
XhmikosR committed
1078
      if (!callback) return
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
1082
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1083
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1084
        callback()
1085

XhmikosR's avatar
XhmikosR committed
1086
1087
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1088

XhmikosR's avatar
XhmikosR committed
1089
1090
1091
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1092
      }
XhmikosR's avatar
XhmikosR committed
1093
1094
1095
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1096
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1097
        callbackRemove()
1098

XhmikosR's avatar
XhmikosR committed
1099
1100
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1101
    }
XhmikosR's avatar
XhmikosR committed
1102
  }
1103

XhmikosR's avatar
XhmikosR committed
1104
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1105
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1106
  }
fat's avatar
build    
fat committed
1107

XhmikosR's avatar
XhmikosR committed
1108
1109
1110
1111
  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
  }
fat's avatar
build    
fat committed
1112

XhmikosR's avatar
XhmikosR committed
1113
1114
1115
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1116

XhmikosR's avatar
XhmikosR committed
1117
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1118
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1119
1120
1121
1122
1123
1124
1125
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }
1126
1127


XhmikosR's avatar
XhmikosR committed
1128
1129
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1130

XhmikosR's avatar
XhmikosR committed
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
  function Plugin(option, _relatedTarget) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.modal')
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
    })
  }
1142

XhmikosR's avatar
XhmikosR committed
1143
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1144

XhmikosR's avatar
XhmikosR committed
1145
1146
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1147
1148


XhmikosR's avatar
XhmikosR committed
1149
1150
  // MODAL NO CONFLICT
  // =================
1151

XhmikosR's avatar
XhmikosR committed
1152
1153
1154
1155
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1156
1157


XhmikosR's avatar
XhmikosR committed
1158
1159
  // MODAL DATA-API
  // ==============
1160

XhmikosR's avatar
XhmikosR committed
1161
1162
1163
1164
1165
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    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('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1166

XhmikosR's avatar
XhmikosR committed
1167
    if ($this.is('a')) e.preventDefault()
1168

XhmikosR's avatar
XhmikosR committed
1169
1170
1171
1172
    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () {
        $this.is(':visible') && $this.trigger('focus')
Mark Otto's avatar
grunt    
Mark Otto committed
1173
      })
Mark Otto's avatar
Mark Otto committed
1174
    })
XhmikosR's avatar
XhmikosR committed
1175
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1176
  })
1177

XhmikosR's avatar
XhmikosR committed
1178
}(jQuery);
1179

1180
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1181
 * Bootstrap: tooltip.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1182
 * http://getbootstrap.com/javascript/#tooltip
1183
 * Inspired by the original jQuery.tipsy by Jason Frame
1184
 * ========================================================================
1185
 * Copyright 2011-2014 Twitter, Inc.
1186
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1187
 * ======================================================================== */
1188
1189


XhmikosR's avatar
XhmikosR committed
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
+function ($) {
  'use strict';

  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================

  var Tooltip = function (element, options) {
    this.type       =
    this.options    =
    this.enabled    =
    this.timeout    =
    this.hoverState =
    this.$element   = null

    this.init('tooltip', element, options)
  }

Mark Otto's avatar
Mark Otto committed
1207
  Tooltip.VERSION  = '3.2.0'
XhmikosR's avatar
XhmikosR committed
1208

1209
1210
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
  Tooltip.DEFAULTS = {
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false,
    viewport: {
      selector: 'body',
      padding: 0
    }
  }

  Tooltip.prototype.init = function (type, element, options) {
    this.enabled   = true
    this.type      = type
    this.$element  = $(element)
    this.options   = this.getOptions(options)
    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)

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

    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]

      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'

        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))
      }
    }
1249

XhmikosR's avatar
XhmikosR committed
1250
1251
1252
1253
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1254

XhmikosR's avatar
XhmikosR committed
1255
1256
1257
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1258

XhmikosR's avatar
XhmikosR committed
1259
1260
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1261

XhmikosR's avatar
XhmikosR committed
1262
1263
1264
1265
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1266
1267
      }
    }
1268

XhmikosR's avatar
XhmikosR committed
1269
1270
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1271

XhmikosR's avatar
XhmikosR committed
1272
1273
1274
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1275

XhmikosR's avatar
XhmikosR committed
1276
1277
1278
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1279

XhmikosR's avatar
XhmikosR committed
1280
1281
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1282

XhmikosR's avatar
XhmikosR committed
1283
1284
1285
  Tooltip.prototype.enter = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)
Mark Otto's avatar
Mark Otto committed
1286

XhmikosR's avatar
XhmikosR committed
1287
1288
1289
1290
1291
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1292
1293
1294
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1295
    }
1296

XhmikosR's avatar
XhmikosR committed
1297
    clearTimeout(self.timeout)
1298

XhmikosR's avatar
XhmikosR committed
1299
    self.hoverState = 'in'
1300

XhmikosR's avatar
XhmikosR committed
1301
    if (!self.options.delay || !self.options.delay.show) return self.show()
1302

XhmikosR's avatar
XhmikosR committed
1303
1304
1305
1306
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1307

XhmikosR's avatar
XhmikosR committed
1308
1309
1310
  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)
Mark Otto's avatar
Mark Otto committed
1311

XhmikosR's avatar
XhmikosR committed
1312
1313
1314
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1315
    }
1316

XhmikosR's avatar
XhmikosR committed
1317
    clearTimeout(self.timeout)
fat's avatar
fat committed
1318

XhmikosR's avatar
XhmikosR committed
1319
    self.hoverState = 'out'
1320

XhmikosR's avatar
XhmikosR committed
1321
    if (!self.options.delay || !self.options.delay.hide) return self.hide()
1322

XhmikosR's avatar
XhmikosR committed
1323
1324
1325
1326
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1327

XhmikosR's avatar
XhmikosR committed
1328
1329
  Tooltip.prototype.show = function () {
    var e = $.Event('show.bs.' + this.type)
Chris Rebert's avatar
Chris Rebert committed
1330

XhmikosR's avatar
XhmikosR committed
1331
1332
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1333

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1334
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1335
1336
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1337

XhmikosR's avatar
XhmikosR committed
1338
      var $tip = this.tip()
fat's avatar
fat committed
1339

XhmikosR's avatar
XhmikosR committed
1340
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1341

XhmikosR's avatar
XhmikosR committed
1342
1343
1344
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1345

XhmikosR's avatar
XhmikosR committed
1346
      if (this.options.animation) $tip.addClass('fade')
1347

XhmikosR's avatar
XhmikosR committed
1348
1349
1350
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1351

XhmikosR's avatar
XhmikosR committed
1352
1353
1354
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1355

XhmikosR's avatar
XhmikosR committed
1356
1357
1358
1359
1360
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1361

XhmikosR's avatar
XhmikosR committed
1362
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1363

XhmikosR's avatar
XhmikosR committed
1364
1365
1366
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1367

XhmikosR's avatar
XhmikosR committed
1368
1369
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1370
1371
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1372

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1373
1374
1375
1376
        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
XhmikosR's avatar
XhmikosR committed
1377
                    placement
fat's avatar
fat committed
1378

1379
        $tip
XhmikosR's avatar
XhmikosR committed
1380
          .removeClass(orgPlacement)
1381
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1382
      }
1383

XhmikosR's avatar
XhmikosR committed
1384
      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1385

XhmikosR's avatar
XhmikosR committed
1386
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1387

XhmikosR's avatar
XhmikosR committed
1388
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1389
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1390
1391
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1392
1393

        if (prevHoverState == 'out') that.leave(that)
XhmikosR's avatar
XhmikosR committed
1394
      }
fat's avatar
fat committed
1395

XhmikosR's avatar
XhmikosR committed
1396
1397
1398
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1399
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1400
1401
1402
        complete()
    }
  }
fat's avatar
fat committed
1403

XhmikosR's avatar
XhmikosR committed
1404
1405
1406
1407
  Tooltip.prototype.applyPlacement = function (offset, placement) {
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight
fat's avatar
fat committed
1408

XhmikosR's avatar
XhmikosR committed
1409
1410
1411
    // manually read margins because getBoundingClientRect includes difference
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)
fat's avatar
fat committed
1412

XhmikosR's avatar
XhmikosR committed
1413
1414
1415
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1416

XhmikosR's avatar
XhmikosR committed
1417
1418
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1419

XhmikosR's avatar
XhmikosR committed
1420
1421
1422
1423
1424
1425
1426
1427
    // $.fn.offset doesn't round pixel values
    // so we use setOffset directly with our own function B-0
    $.offset.setOffset($tip[0], $.extend({
      using: function (props) {
        $tip.css({
          top: Math.round(props.top),
          left: Math.round(props.left)
        })
1428
      }
XhmikosR's avatar
XhmikosR committed
1429
    }, offset), 0)
1430

XhmikosR's avatar
XhmikosR committed
1431
    $tip.addClass('in')
fat's avatar
fat committed
1432

XhmikosR's avatar
XhmikosR committed
1433
1434
1435
    // check to see if placing tip in new offset caused the tip to resize itself
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight
fat's avatar
fat committed
1436

XhmikosR's avatar
XhmikosR committed
1437
1438
1439
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1440

XhmikosR's avatar
XhmikosR committed
1441
    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
fat's avatar
fat committed
1442

XhmikosR's avatar
XhmikosR committed
1443
1444
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1445

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1446
1447
1448
    var isVertical          = /top|bottom/.test(placement)
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1449

XhmikosR's avatar
XhmikosR committed
1450
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1451
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1452
  }
1453

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1454
1455
1456
1457
  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
    this.arrow()
      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isHorizontal ? 'top' : 'left', '')
XhmikosR's avatar
XhmikosR committed
1458
  }
1459

XhmikosR's avatar
XhmikosR committed
1460
1461
1462
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1463

XhmikosR's avatar
XhmikosR committed
1464
1465
1466
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1467

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1468
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1469
1470
1471
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1472

XhmikosR's avatar
XhmikosR committed
1473
1474
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1475
1476
1477
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1478
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1479
    }
Jacob Thornton's avatar
Jacob Thornton committed
1480

XhmikosR's avatar
XhmikosR committed
1481
    this.$element.trigger(e)
1482

XhmikosR's avatar
XhmikosR committed
1483
    if (e.isDefaultPrevented()) return
1484

XhmikosR's avatar
XhmikosR committed
1485
    $tip.removeClass('in')
1486

XhmikosR's avatar
XhmikosR committed
1487
1488
1489
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1490
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1491
      complete()
1492

XhmikosR's avatar
XhmikosR committed
1493
    this.hoverState = null
1494

XhmikosR's avatar
XhmikosR committed
1495
1496
    return this
  }
1497

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

XhmikosR's avatar
XhmikosR committed
1505
1506
1507
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1508

XhmikosR's avatar
XhmikosR committed
1509
1510
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1511

XhmikosR's avatar
XhmikosR committed
1512
1513
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1514

Mark Otto's avatar
grunt    
Mark Otto committed
1515
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1516
1517
1518
1519
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1520
1521
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1522
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1523
1524

    return $.extend({}, elRect, scroll, outerDims, elOffset)
XhmikosR's avatar
XhmikosR committed
1525
  }
1526

XhmikosR's avatar
XhmikosR committed
1527
1528
1529
1530
1531
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
1532

XhmikosR's avatar
XhmikosR committed
1533
  }
1534

XhmikosR's avatar
XhmikosR committed
1535
1536
1537
  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
    var delta = { top: 0, left: 0 }
    if (!this.$viewport) return delta
1538

XhmikosR's avatar
XhmikosR committed
1539
1540
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1541

XhmikosR's avatar
XhmikosR committed
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1557
      }
Chris Rebert's avatar
Chris Rebert committed
1558
    }
fat's avatar
fat committed
1559

XhmikosR's avatar
XhmikosR committed
1560
1561
    return delta
  }
1562

XhmikosR's avatar
XhmikosR committed
1563
1564
1565
1566
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1567

XhmikosR's avatar
XhmikosR committed
1568
1569
    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
1570

XhmikosR's avatar
XhmikosR committed
1571
1572
    return title
  }
1573

XhmikosR's avatar
XhmikosR committed
1574
1575
1576
1577
1578
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1579

XhmikosR's avatar
XhmikosR committed
1580
1581
1582
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1583

XhmikosR's avatar
XhmikosR committed
1584
1585
1586
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1587

XhmikosR's avatar
XhmikosR committed
1588
1589
1590
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1591

XhmikosR's avatar
XhmikosR committed
1592
1593
1594
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1595

XhmikosR's avatar
XhmikosR committed
1596
1597
1598
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1599

XhmikosR's avatar
XhmikosR committed
1600
1601
1602
1603
1604
1605
1606
1607
  Tooltip.prototype.toggle = function (e) {
    var self = this
    if (e) {
      self = $(e.currentTarget).data('bs.' + this.type)
      if (!self) {
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        $(e.currentTarget).data('bs.' + this.type, self)
      }
Mark Otto's avatar
Mark Otto committed
1608
1609
    }

XhmikosR's avatar
XhmikosR committed
1610
1611
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1612

XhmikosR's avatar
XhmikosR committed
1613
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1614
    var that = this
XhmikosR's avatar
XhmikosR committed
1615
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1616
1617
1618
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1619
  }
1620
1621


XhmikosR's avatar
XhmikosR committed
1622
1623
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1624

XhmikosR's avatar
XhmikosR committed
1625
1626
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1627
1628
1629
1630
      var $this    = $(this)
      var data     = $this.data('bs.tooltip')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
fat's avatar
fat committed
1631

XhmikosR's avatar
XhmikosR committed
1632
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1633
1634
1635
1636
1637
1638
      if (selector) {
        if (!data) $this.data('bs.tooltip', (data = {}))
        if (!data[selector]) data[selector] = new Tooltip(this, options)
      } else {
        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1639
1640
1641
      if (typeof option == 'string') data[option]()
    })
  }
1642

XhmikosR's avatar
XhmikosR committed
1643
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1644

XhmikosR's avatar
XhmikosR committed
1645
1646
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1647

1648

XhmikosR's avatar
XhmikosR committed
1649
1650
  // TOOLTIP NO CONFLICT
  // ===================
1651

XhmikosR's avatar
XhmikosR committed
1652
1653
1654
1655
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1656

XhmikosR's avatar
XhmikosR committed
1657
}(jQuery);
1658

1659
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1660
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1661
 * http://getbootstrap.com/javascript/#popovers
1662
 * ========================================================================
1663
 * Copyright 2011-2014 Twitter, Inc.
1664
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1665
 * ======================================================================== */
1666
1667


XhmikosR's avatar
XhmikosR committed
1668
1669
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1670

XhmikosR's avatar
XhmikosR committed
1671
1672
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1673

XhmikosR's avatar
XhmikosR committed
1674
1675
1676
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1677

XhmikosR's avatar
XhmikosR committed
1678
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1679

Mark Otto's avatar
Mark Otto committed
1680
  Popover.VERSION  = '3.2.0'
1681

XhmikosR's avatar
XhmikosR committed
1682
1683
1684
1685
1686
1687
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
  })
fat's avatar
fat committed
1688
1689


XhmikosR's avatar
XhmikosR committed
1690
1691
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1692

XhmikosR's avatar
XhmikosR committed
1693
  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
fat's avatar
fat committed
1694

XhmikosR's avatar
XhmikosR committed
1695
  Popover.prototype.constructor = Popover
1696

XhmikosR's avatar
XhmikosR committed
1697
1698
1699
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1700

XhmikosR's avatar
XhmikosR committed
1701
1702
1703
1704
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1705

XhmikosR's avatar
XhmikosR committed
1706
    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
Mark Otto's avatar
grunt    
Mark Otto committed
1707
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
XhmikosR's avatar
XhmikosR committed
1708
1709
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
    ](content)
1710

XhmikosR's avatar
XhmikosR committed
1711
    $tip.removeClass('fade top bottom left right in')
1712

XhmikosR's avatar
XhmikosR committed
1713
1714
1715
1716
    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
  }
1717

XhmikosR's avatar
XhmikosR committed
1718
1719
1720
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1721

XhmikosR's avatar
XhmikosR committed
1722
1723
1724
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1725

XhmikosR's avatar
XhmikosR committed
1726
1727
1728
1729
1730
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1731

XhmikosR's avatar
XhmikosR committed
1732
1733
1734
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1735

XhmikosR's avatar
XhmikosR committed
1736
1737
1738
1739
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1740

1741

XhmikosR's avatar
XhmikosR committed
1742
1743
  // POPOVER PLUGIN DEFINITION
  // =========================
1744

XhmikosR's avatar
XhmikosR committed
1745
1746
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1747
1748
1749
1750
      var $this    = $(this)
      var data     = $this.data('bs.popover')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
Chris Rebert's avatar
Chris Rebert committed
1751

XhmikosR's avatar
XhmikosR committed
1752
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1753
1754
1755
1756
1757
1758
      if (selector) {
        if (!data) $this.data('bs.popover', (data = {}))
        if (!data[selector]) data[selector] = new Popover(this, options)
      } else {
        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1759
1760
1761
      if (typeof option == 'string') data[option]()
    })
  }
1762

XhmikosR's avatar
XhmikosR committed
1763
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1764

XhmikosR's avatar
XhmikosR committed
1765
1766
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1767

1768

XhmikosR's avatar
XhmikosR committed
1769
1770
  // POPOVER NO CONFLICT
  // ===================
1771

XhmikosR's avatar
XhmikosR committed
1772
1773
1774
1775
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1776

XhmikosR's avatar
XhmikosR committed
1777
}(jQuery);
1778

1779
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1780
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1781
 * http://getbootstrap.com/javascript/#scrollspy
1782
 * ========================================================================
1783
 * Copyright 2011-2014 Twitter, Inc.
1784
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1785
 * ======================================================================== */
1786
1787


XhmikosR's avatar
XhmikosR committed
1788
1789
+function ($) {
  'use strict';
1790

XhmikosR's avatar
XhmikosR committed
1791
1792
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1793

XhmikosR's avatar
XhmikosR committed
1794
1795
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1796

XhmikosR's avatar
XhmikosR committed
1797
1798
1799
1800
1801
1802
1803
1804
    this.$body          = $('body')
    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0
1805

XhmikosR's avatar
XhmikosR committed
1806
1807
1808
1809
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1810

Mark Otto's avatar
Mark Otto committed
1811
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1812

XhmikosR's avatar
XhmikosR committed
1813
1814
1815
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1816

XhmikosR's avatar
XhmikosR committed
1817
1818
1819
  ScrollSpy.prototype.getScrollHeight = function () {
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
  }
Mark Otto's avatar
grunt    
Mark Otto committed
1820

XhmikosR's avatar
XhmikosR committed
1821
1822
1823
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1824

XhmikosR's avatar
XhmikosR committed
1825
1826
1827
1828
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1829

XhmikosR's avatar
XhmikosR committed
1830
1831
1832
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1833

XhmikosR's avatar
XhmikosR committed
1834
    var self     = this
XhmikosR's avatar
XhmikosR committed
1835

XhmikosR's avatar
XhmikosR committed
1836
1837
1838
1839
1840
1841
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1842

XhmikosR's avatar
XhmikosR committed
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }

  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.getScrollHeight()
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i

    if (this.scrollHeight != scrollHeight) {
      this.refresh()
Mark Otto's avatar
grunt    
Mark Otto committed
1866
1867
    }

XhmikosR's avatar
XhmikosR committed
1868
1869
1870
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1871

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1872
1873
1874
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1875
    }
1876

XhmikosR's avatar
XhmikosR committed
1877
1878
1879
1880
1881
1882
1883
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1884

XhmikosR's avatar
XhmikosR committed
1885
1886
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1887

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1888
    this.clear()
1889

XhmikosR's avatar
XhmikosR committed
1890
1891
1892
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1893

XhmikosR's avatar
XhmikosR committed
1894
1895
1896
    var active = $(selector)
      .parents('li')
      .addClass('active')
1897

XhmikosR's avatar
XhmikosR committed
1898
1899
1900
1901
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1902
    }
1903

XhmikosR's avatar
XhmikosR committed
1904
1905
    active.trigger('activate.bs.scrollspy')
  }
1906

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1907
1908
1909
1910
1911
1912
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1913

XhmikosR's avatar
XhmikosR committed
1914
1915
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1916

XhmikosR's avatar
XhmikosR committed
1917
1918
1919
1920
1921
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option
Mark Otto's avatar
Mark Otto committed
1922

XhmikosR's avatar
XhmikosR committed
1923
1924
1925
1926
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1927

XhmikosR's avatar
XhmikosR committed
1928
  var old = $.fn.scrollspy
1929

XhmikosR's avatar
XhmikosR committed
1930
1931
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1932

1933

XhmikosR's avatar
XhmikosR committed
1934
1935
  // SCROLLSPY NO CONFLICT
  // =====================
1936

XhmikosR's avatar
XhmikosR committed
1937
1938
1939
1940
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1941

Chris Rebert's avatar
Chris Rebert committed
1942

XhmikosR's avatar
XhmikosR committed
1943
1944
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1945

XhmikosR's avatar
XhmikosR committed
1946
1947
1948
1949
1950
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1951
  })
1952

XhmikosR's avatar
XhmikosR committed
1953
}(jQuery);
1954

1955
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1956
 * Bootstrap: tab.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1957
 * http://getbootstrap.com/javascript/#tabs
1958
 * ========================================================================
1959
 * Copyright 2011-2014 Twitter, Inc.
1960
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1961
 * ======================================================================== */
1962

1963

XhmikosR's avatar
XhmikosR committed
1964
1965
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1966

XhmikosR's avatar
XhmikosR committed
1967
1968
  // TAB CLASS DEFINITION
  // ====================
1969

XhmikosR's avatar
XhmikosR committed
1970
1971
1972
  var Tab = function (element) {
    this.element = $(element)
  }
1973

Mark Otto's avatar
Mark Otto committed
1974
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1975

1976
1977
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1978
1979
1980
1981
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1982

XhmikosR's avatar
XhmikosR committed
1983
1984
1985
1986
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1987

XhmikosR's avatar
XhmikosR committed
1988
    if ($this.parent('li').hasClass('active')) return
1989

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1990
1991
1992
1993
1994
1995
    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
XhmikosR's avatar
XhmikosR committed
1996
    })
1997

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1998
1999
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
2000

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2001
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2002

XhmikosR's avatar
XhmikosR committed
2003
    var $target = $(selector)
2004

XhmikosR's avatar
XhmikosR committed
2005
2006
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2007
2008
2009
2010
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
2011
2012
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2013
        relatedTarget: $previous[0]
2014
      })
XhmikosR's avatar
XhmikosR committed
2015
2016
    })
  }
2017

XhmikosR's avatar
XhmikosR committed
2018
2019
2020
2021
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
Mark Otto's avatar
grunt    
Mark Otto committed
2022
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
2023

XhmikosR's avatar
XhmikosR committed
2024
2025
2026
2027
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
2028
2029
2030
2031
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
2032

Mark Otto's avatar
grunt    
Mark Otto committed
2033
2034
2035
2036
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2037
2038
2039
2040
2041
2042

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

XhmikosR's avatar
XhmikosR committed
2045
      if (element.parent('.dropdown-menu')) {
Mark Otto's avatar
grunt    
Mark Otto committed
2046
2047
2048
2049
2050
2051
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2052
      }
fat's avatar
fat committed
2053

XhmikosR's avatar
XhmikosR committed
2054
      callback && callback()
2055
    }
fat's avatar
fat committed
2056

Mark Otto's avatar
grunt    
Mark Otto committed
2057
    $active.length && transition ?
XhmikosR's avatar
XhmikosR committed
2058
2059
      $active
        .one('bsTransitionEnd', next)
2060
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
2061
      next()
2062

XhmikosR's avatar
XhmikosR committed
2063
2064
    $active.removeClass('in')
  }
2065
2066


XhmikosR's avatar
XhmikosR committed
2067
2068
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
2069

XhmikosR's avatar
XhmikosR committed
2070
2071
2072
2073
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
2074

XhmikosR's avatar
XhmikosR committed
2075
2076
2077
2078
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
Mark Otto's avatar
Mark Otto committed
2079

XhmikosR's avatar
XhmikosR committed
2080
  var old = $.fn.tab
2081

XhmikosR's avatar
XhmikosR committed
2082
2083
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
2084

2085

XhmikosR's avatar
XhmikosR committed
2086
2087
  // TAB NO CONFLICT
  // ===============
2088

XhmikosR's avatar
XhmikosR committed
2089
2090
2091
2092
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
2093
2094


XhmikosR's avatar
XhmikosR committed
2095
2096
2097
2098
2099
2100
  // TAB DATA-API
  // ============

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

XhmikosR's avatar
XhmikosR committed
2103
}(jQuery);
2104

2105
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2106
 * Bootstrap: affix.js v3.2.0
Mark Otto's avatar
Mark Otto committed
2107
 * http://getbootstrap.com/javascript/#affix
2108
 * ========================================================================
2109
 * Copyright 2011-2014 Twitter, Inc.
2110
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2111
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2112
2113


XhmikosR's avatar
XhmikosR committed
2114
2115
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2116

XhmikosR's avatar
XhmikosR committed
2117
2118
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
2119

XhmikosR's avatar
XhmikosR committed
2120
2121
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
Mark Otto's avatar
Mark Otto committed
2122

XhmikosR's avatar
XhmikosR committed
2123
2124
2125
    this.$target = $(this.options.target)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
Chris Rebert's avatar
Chris Rebert committed
2126

XhmikosR's avatar
XhmikosR committed
2127
2128
2129
2130
    this.$element     = $(element)
    this.affixed      =
    this.unpin        =
    this.pinnedOffset = null
fat's avatar
fat committed
2131

XhmikosR's avatar
XhmikosR committed
2132
2133
    this.checkPosition()
  }
fat's avatar
fat committed
2134

Mark Otto's avatar
Mark Otto committed
2135
  Affix.VERSION  = '3.2.0'
2136

XhmikosR's avatar
XhmikosR committed
2137
  Affix.RESET    = 'affix affix-top affix-bottom'
Mark Otto's avatar
grunt    
Mark Otto committed
2138

XhmikosR's avatar
XhmikosR committed
2139
2140
2141
2142
  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }
2143

2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false

    if (this.affixed == 'bottom') {
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
    }

    var initializing   = this.affixed == null
    var colliderTop    = initializing ? scrollTop : position.top
    var colliderHeight = initializing ? targetHeight : height

    if (offsetTop != null && colliderTop <= offsetTop) return 'top'
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

XhmikosR's avatar
XhmikosR committed
2166
2167
2168
2169
2170
2171
2172
  Affix.prototype.getPinnedOffset = function () {
    if (this.pinnedOffset) return this.pinnedOffset
    this.$element.removeClass(Affix.RESET).addClass('affix')
    var scrollTop = this.$target.scrollTop()
    var position  = this.$element.offset()
    return (this.pinnedOffset = position.top - scrollTop)
  }
2173

XhmikosR's avatar
XhmikosR committed
2174
2175
2176
  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }
fat's avatar
fat committed
2177

XhmikosR's avatar
XhmikosR committed
2178
2179
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return
2180

2181
    var height       = this.$element.height()
XhmikosR's avatar
XhmikosR committed
2182
2183
2184
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
2185
    var scrollHeight = $('body').height()
2186

XhmikosR's avatar
XhmikosR committed
2187
2188
2189
    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2190

2191
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2192

2193
2194
    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')
2195

2196
2197
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2198

2199
      this.$element.trigger(e)
2200

2201
      if (e.isDefaultPrevented()) return
2202

2203
2204
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2205

2206
2207
2208
2209
2210
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }
2211

XhmikosR's avatar
XhmikosR committed
2212
2213
    if (affix == 'bottom') {
      this.$element.offset({
2214
        top: scrollHeight - height - offsetBottom
XhmikosR's avatar
XhmikosR committed
2215
      })
2216
    }
XhmikosR's avatar
XhmikosR committed
2217
  }
Mark Otto's avatar
Mark Otto committed
2218

2219

XhmikosR's avatar
XhmikosR committed
2220
2221
  // AFFIX PLUGIN DEFINITION
  // =======================
2222

XhmikosR's avatar
XhmikosR committed
2223
2224
2225
2226
2227
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option
2228

XhmikosR's avatar
XhmikosR committed
2229
2230
2231
2232
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
2233

XhmikosR's avatar
XhmikosR committed
2234
  var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2235

XhmikosR's avatar
XhmikosR committed
2236
2237
  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix
2238
2239


XhmikosR's avatar
XhmikosR committed
2240
2241
  // AFFIX NO CONFLICT
  // =================
2242

XhmikosR's avatar
XhmikosR committed
2243
2244
2245
2246
  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }
2247
2248


XhmikosR's avatar
XhmikosR committed
2249
2250
  // AFFIX DATA-API
  // ==============
2251

XhmikosR's avatar
XhmikosR committed
2252
2253
2254
2255
  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()
2256

XhmikosR's avatar
XhmikosR committed
2257
      data.offset = data.offset || {}
2258

Heinrich Fenkart's avatar
Heinrich Fenkart committed
2259
2260
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
2261

XhmikosR's avatar
XhmikosR committed
2262
      Plugin.call($spy, data)
2263
    })
Mark Otto's avatar
Mark Otto committed
2264
2265
  })

XhmikosR's avatar
XhmikosR committed
2266
}(jQuery);