bootstrap.js 66.3 KB
Newer Older
1
/*!
Chris Rebert's avatar
Chris Rebert committed
2
 * Bootstrap v3.3.4 (http://getbootstrap.com)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
3
 * Copyright 2011-2015 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
if (typeof jQuery === 'undefined') {
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
}

+function ($) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
12
  'use strict';
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
13
14
15
16
17
  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);
18

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


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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
53
54
55
56
57
58
59
60
61
  // 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
  }
62

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

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

XhmikosR's avatar
XhmikosR committed
68
69
70
71
72
73
74
    $.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
75
  })
76

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

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


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

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

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

Chris Rebert's avatar
Chris Rebert committed
99
  Alert.VERSION = '3.3.4'
100

101
102
  Alert.TRANSITION_DURATION = 150

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

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

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

Chris Rebert's avatar
Chris Rebert committed
195
  Button.VERSION  = '3.3.4'
196

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

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

207
    state += 'Text'
208

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

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

XhmikosR's avatar
XhmikosR committed
215
216
217
218
219
220
      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d)
221
      }
XhmikosR's avatar
XhmikosR committed
222
223
224
225
226
227
228
229
230
231
    }, 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') {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
232
233
        if ($input.prop('checked')) changed = false
        if (!$input.prop('checked') || !this.$element.hasClass('active')) $parent.find('.active').removeClass('active')
XhmikosR's avatar
XhmikosR committed
234
235
      }
      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
236
237
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
fat's avatar
fat committed
238
    }
239

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


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

XhmikosR's avatar
XhmikosR committed
247
248
249
250
251
  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
252

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

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

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

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


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

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


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

Mark Otto's avatar
grunt    
Mark Otto committed
278
279
280
281
282
  $(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')
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
283
      if (!$(e.target).is('input[type="radio"]')) e.preventDefault()
Mark Otto's avatar
grunt    
Mark Otto committed
284
    })
Chris Rebert's avatar
Chris Rebert committed
285
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
286
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
Mark Otto's avatar
grunt    
Mark Otto committed
287
    })
288

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

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


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

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

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

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

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

Chris Rebert's avatar
Chris Rebert committed
323
  Carousel.VERSION  = '3.3.4'
Mark Otto's avatar
grunt    
Mark Otto committed
324

325
326
  Carousel.TRANSITION_DURATION = 600

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

XhmikosR's avatar
XhmikosR committed
334
  Carousel.prototype.keydown = function (e) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
335
    if (/input|textarea/i.test(e.target.tagName)) return
XhmikosR's avatar
XhmikosR committed
336
337
338
339
    switch (e.which) {
      case 37: this.prev(); break
      case 39: this.next(); break
      default: return
Mark Otto's avatar
Mark Otto committed
340
341
    }

XhmikosR's avatar
XhmikosR committed
342
343
    e.preventDefault()
  }
344

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

XhmikosR's avatar
XhmikosR committed
348
    this.interval && clearInterval(this.interval)
349

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

XhmikosR's avatar
XhmikosR committed
354
355
    return this
  }
356

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

XhmikosR's avatar
XhmikosR committed
362
363
  Carousel.prototype.getItemForDirection = function (direction, active) {
    var activeIndex = this.getItemIndex(active)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
364
365
366
367
    var willWrap = (direction == 'prev' && activeIndex === 0)
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
    if (willWrap && !this.options.wrap) return active
    var delta = direction == 'prev' ? -1 : 1
XhmikosR's avatar
XhmikosR committed
368
369
370
371
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

XhmikosR's avatar
XhmikosR committed
372
373
374
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
375

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

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

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

XhmikosR's avatar
XhmikosR committed
384
385
386
387
388
389
  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)
390
391
    }

XhmikosR's avatar
XhmikosR committed
392
    this.interval = clearInterval(this.interval)
393

XhmikosR's avatar
XhmikosR committed
394
395
    return this
  }
396

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

XhmikosR's avatar
XhmikosR committed
402
403
404
405
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
406

XhmikosR's avatar
XhmikosR committed
407
408
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
409
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
410
411
412
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var that      = this
Jacob Thornton's avatar
Jacob Thornton committed
413

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

XhmikosR's avatar
XhmikosR committed
416
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
    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)
        })
449
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
450
451
452
453
454
455
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
456

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

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


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

XhmikosR's avatar
XhmikosR committed
466
467
468
469
470
471
472
473
474
475
476
477
478
  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()
    })
  }
479

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

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


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

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

fat's avatar
fat committed
494

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
498
  var clickHandler = function (e) {
XhmikosR's avatar
XhmikosR committed
499
500
501
502
503
504
505
    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
506

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

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

XhmikosR's avatar
XhmikosR committed
513
    e.preventDefault()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
514
515
516
517
518
  }

  $(document)
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
519

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

XhmikosR's avatar
XhmikosR committed
527
}(jQuery);
528

529
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
530
 * Bootstrap: collapse.js v3.3.4
Mark Otto's avatar
Mark Otto committed
531
 * http://getbootstrap.com/javascript/#collapse
532
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
533
 * Copyright 2011-2015 Twitter, Inc.
534
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
535
 * ======================================================================== */
536
537


XhmikosR's avatar
XhmikosR committed
538
539
+function ($) {
  'use strict';
540

XhmikosR's avatar
XhmikosR committed
541
542
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
543

XhmikosR's avatar
XhmikosR committed
544
545
546
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
547
548
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
XhmikosR's avatar
XhmikosR committed
549
    this.transitioning = null
550

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
551
552
553
554
555
556
    if (this.options.parent) {
      this.$parent = this.getParent()
    } else {
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
    }

XhmikosR's avatar
XhmikosR committed
557
558
    if (this.options.toggle) this.toggle()
  }
559

Chris Rebert's avatar
Chris Rebert committed
560
  Collapse.VERSION  = '3.3.4'
561

562
563
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
564
  Collapse.DEFAULTS = {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
565
    toggle: true
XhmikosR's avatar
XhmikosR committed
566
  }
fat's avatar
fat committed
567

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

XhmikosR's avatar
XhmikosR committed
573
574
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
575

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
576
    var activesData
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
577
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
578
579
580
581
582
583

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

XhmikosR's avatar
XhmikosR committed
584
585
586
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
587

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

XhmikosR's avatar
XhmikosR committed
593
    var dimension = this.dimension()
594

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
600
601
602
603
    this.$trigger
      .removeClass('collapsed')
      .attr('aria-expanded', true)

XhmikosR's avatar
XhmikosR committed
604
    this.transitioning = 1
605

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
627
628
629
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
630

XhmikosR's avatar
XhmikosR committed
631
    var dimension = this.dimension()
632

XhmikosR's avatar
XhmikosR committed
633
634
635
636
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
640
641
642
643
    this.$trigger
      .addClass('collapsed')
      .attr('aria-expanded', false)

XhmikosR's avatar
XhmikosR committed
644
    this.transitioning = 1
645

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

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

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

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
  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)
  }

693

XhmikosR's avatar
XhmikosR committed
694
695
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
696

XhmikosR's avatar
XhmikosR committed
697
698
699
700
701
  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
702

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
703
      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
XhmikosR's avatar
XhmikosR committed
704
705
706
707
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
708

XhmikosR's avatar
XhmikosR committed
709
  var old = $.fn.collapse
710

XhmikosR's avatar
XhmikosR committed
711
712
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
713

714

XhmikosR's avatar
XhmikosR committed
715
716
  // COLLAPSE NO CONFLICT
  // ====================
717

XhmikosR's avatar
XhmikosR committed
718
719
720
721
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
722

723

XhmikosR's avatar
XhmikosR committed
724
725
726
727
728
  // 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
729
730
731
732

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

    var $target = getTargetFromTrigger($this)
XhmikosR's avatar
XhmikosR committed
733
    var data    = $target.data('bs.collapse')
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
734
    var option  = data ? 'toggle' : $this.data()
fat's avatar
fat committed
735

XhmikosR's avatar
XhmikosR committed
736
    Plugin.call($target, option)
737
738
  })

XhmikosR's avatar
XhmikosR committed
739
}(jQuery);
740

741
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
742
 * Bootstrap: dropdown.js v3.3.4
Mark Otto's avatar
Mark Otto committed
743
 * http://getbootstrap.com/javascript/#dropdowns
744
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
745
 * Copyright 2011-2015 Twitter, Inc.
746
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
747
 * ======================================================================== */
748
749


XhmikosR's avatar
XhmikosR committed
750
751
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
752

XhmikosR's avatar
XhmikosR committed
753
754
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
755

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

Chris Rebert's avatar
Chris Rebert committed
762
  Dropdown.VERSION = '3.3.4'
Mark Otto's avatar
grunt    
Mark Otto committed
763

764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
  function getParent($this) {
    var selector = $this.attr('data-target')

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

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
  }

  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
      var $this         = $(this)
      var $parent       = getParent($this)
      var relatedTarget = { relatedTarget: this }

      if (!$parent.hasClass('open')) return

      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return

      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this.attr('aria-expanded', 'false')
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }

XhmikosR's avatar
XhmikosR committed
798
799
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
800

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

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

XhmikosR's avatar
XhmikosR committed
806
    clearMenus()
fat's avatar
fat committed
807

XhmikosR's avatar
XhmikosR committed
808
809
810
    if (!isActive) {
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        // if mobile we use a backdrop because click events don't delegate
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
811
812
813
814
        $(document.createElement('div'))
          .addClass('dropdown-backdrop')
          .insertAfter($(this))
          .on('click', clearMenus)
XhmikosR's avatar
XhmikosR committed
815
      }
816

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

XhmikosR's avatar
XhmikosR committed
820
      if (e.isDefaultPrevented()) return
821

822
823
824
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
825

XhmikosR's avatar
XhmikosR committed
826
827
828
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
829
    }
830

XhmikosR's avatar
XhmikosR committed
831
832
    return false
  }
833

XhmikosR's avatar
XhmikosR committed
834
  Dropdown.prototype.keydown = function (e) {
Mark Otto's avatar
grunt    
Mark Otto committed
835
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
836

XhmikosR's avatar
XhmikosR committed
837
    var $this = $(this)
838

XhmikosR's avatar
XhmikosR committed
839
840
    e.preventDefault()
    e.stopPropagation()
841

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

XhmikosR's avatar
XhmikosR committed
844
845
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
846

847
    if (!isActive && e.which != 27 || isActive && e.which == 27) {
XhmikosR's avatar
XhmikosR committed
848
849
850
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
851

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
852
    var desc = ' li:not(.disabled):visible a'
XhmikosR's avatar
XhmikosR committed
853
    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
854

XhmikosR's avatar
XhmikosR committed
855
    if (!$items.length) return
856

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

859
860
861
    if (e.which == 38 && index > 0)                 index--         // up
    if (e.which == 40 && index < $items.length - 1) index++         // down
    if (!~index)                                    index = 0
862

XhmikosR's avatar
XhmikosR committed
863
864
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
865

866

XhmikosR's avatar
XhmikosR committed
867
868
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
869

XhmikosR's avatar
XhmikosR committed
870
871
872
873
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
874

XhmikosR's avatar
XhmikosR committed
875
876
877
878
      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
879

XhmikosR's avatar
XhmikosR committed
880
  var old = $.fn.dropdown
881

XhmikosR's avatar
XhmikosR committed
882
883
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
884

885

XhmikosR's avatar
XhmikosR committed
886
887
  // DROPDOWN NO CONFLICT
  // ====================
888

XhmikosR's avatar
XhmikosR committed
889
890
891
892
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
893

894

XhmikosR's avatar
XhmikosR committed
895
896
897
898
899
900
901
  // 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)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
902
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
903
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
904

XhmikosR's avatar
XhmikosR committed
905
}(jQuery);
906

907
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
908
 * Bootstrap: modal.js v3.3.4
Mark Otto's avatar
Mark Otto committed
909
 * http://getbootstrap.com/javascript/#modals
910
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
911
 * Copyright 2011-2015 Twitter, Inc.
912
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
913
 * ======================================================================== */
914
915


XhmikosR's avatar
XhmikosR committed
916
917
+function ($) {
  'use strict';
918

XhmikosR's avatar
XhmikosR committed
919
920
  // MODAL CLASS DEFINITION
  // ======================
921

XhmikosR's avatar
XhmikosR committed
922
  var Modal = function (element, options) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
923
924
925
926
927
928
929
930
931
    this.options             = options
    this.$body               = $(document.body)
    this.$element            = $(element)
    this.$dialog             = this.$element.find('.modal-dialog')
    this.$backdrop           = null
    this.isShown             = null
    this.originalBodyPad     = null
    this.scrollbarWidth      = 0
    this.ignoreBackdropClick = false
932

XhmikosR's avatar
XhmikosR committed
933
934
935
936
937
938
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
939
    }
XhmikosR's avatar
XhmikosR committed
940
  }
941

Chris Rebert's avatar
Chris Rebert committed
942
  Modal.VERSION  = '3.3.4'
Mark Otto's avatar
grunt    
Mark Otto committed
943

944
945
946
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
947
948
949
950
951
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
952

XhmikosR's avatar
XhmikosR committed
953
954
955
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
956

XhmikosR's avatar
XhmikosR committed
957
958
959
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
960

XhmikosR's avatar
XhmikosR committed
961
    this.$element.trigger(e)
962

XhmikosR's avatar
XhmikosR committed
963
    if (this.isShown || e.isDefaultPrevented()) return
964

XhmikosR's avatar
XhmikosR committed
965
    this.isShown = true
fat's avatar
build    
fat committed
966

XhmikosR's avatar
XhmikosR committed
967
    this.checkScrollbar()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
968
    this.setScrollbar()
XhmikosR's avatar
XhmikosR committed
969
    this.$body.addClass('modal-open')
970

XhmikosR's avatar
XhmikosR committed
971
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
972
    this.resize()
fat's avatar
rebuild    
fat committed
973

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

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
976
977
978
979
980
981
    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
      })
    })

XhmikosR's avatar
XhmikosR committed
982
983
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
984

XhmikosR's avatar
XhmikosR committed
985
986
987
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
988

XhmikosR's avatar
XhmikosR committed
989
990
991
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
992

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
993
      that.adjustDialog()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
994

XhmikosR's avatar
XhmikosR committed
995
996
997
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
998

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
999
      that.$element.addClass('in')
1000

XhmikosR's avatar
XhmikosR committed
1001
      that.enforceFocus()
1002

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

XhmikosR's avatar
XhmikosR committed
1005
      transition ?
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1006
        that.$dialog // wait for modal to slide in
XhmikosR's avatar
XhmikosR committed
1007
1008
1009
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
1010
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1011
1012
1013
        that.$element.trigger('focus').trigger(e)
    })
  }
1014

XhmikosR's avatar
XhmikosR committed
1015
1016
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
1017

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

XhmikosR's avatar
XhmikosR committed
1020
    this.$element.trigger(e)
1021

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

XhmikosR's avatar
XhmikosR committed
1024
    this.isShown = false
1025

XhmikosR's avatar
XhmikosR committed
1026
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1027
    this.resize()
Chris Rebert's avatar
Chris Rebert committed
1028

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

XhmikosR's avatar
XhmikosR committed
1031
1032
1033
    this.$element
      .removeClass('in')
      .off('click.dismiss.bs.modal')
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1034
1035
1036
      .off('mouseup.dismiss.bs.modal')

    this.$dialog.off('mousedown.dismiss.bs.modal')
1037

XhmikosR's avatar
XhmikosR committed
1038
1039
1040
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1041
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1042
1043
      this.hideModal()
  }
1044

XhmikosR's avatar
XhmikosR committed
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
  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
1057
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1058
1059
1060
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1061
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1062
1063
1064
    }
  }

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1065
1066
  Modal.prototype.resize = function () {
    if (this.isShown) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1067
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1068
1069
1070
1071
1072
    } else {
      $(window).off('resize.bs.modal')
    }
  }

XhmikosR's avatar
XhmikosR committed
1073
1074
1075
1076
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1077
      that.$body.removeClass('modal-open')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1078
      that.resetAdjustments()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1079
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1080
1081
1082
      that.$element.trigger('hidden.bs.modal')
    })
  }
1083

XhmikosR's avatar
XhmikosR committed
1084
1085
1086
1087
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1088

XhmikosR's avatar
XhmikosR committed
1089
1090
1091
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1092

XhmikosR's avatar
XhmikosR committed
1093
1094
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1095

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1096
1097
      this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
        .appendTo(this.$body)

      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        if (this.ignoreBackdropClick) {
          this.ignoreBackdropClick = false
          return
        }
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus()
          : this.hide()
      }, this))
1110

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

XhmikosR's avatar
XhmikosR committed
1113
      this.$backdrop.addClass('in')
1114

XhmikosR's avatar
XhmikosR committed
1115
      if (!callback) return
1116

XhmikosR's avatar
XhmikosR committed
1117
1118
1119
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1120
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1121
        callback()
1122

XhmikosR's avatar
XhmikosR committed
1123
1124
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1125

XhmikosR's avatar
XhmikosR committed
1126
1127
1128
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1129
      }
XhmikosR's avatar
XhmikosR committed
1130
1131
1132
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1133
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1134
        callbackRemove()
1135

XhmikosR's avatar
XhmikosR committed
1136
1137
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1138
    }
XhmikosR's avatar
XhmikosR committed
1139
  }
1140

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
  // these following methods are used to handle overflowing modals

  Modal.prototype.handleUpdate = function () {
    this.adjustDialog()
  }

  Modal.prototype.adjustDialog = function () {
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight

    this.$element.css({
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
    })
  }

  Modal.prototype.resetAdjustments = function () {
    this.$element.css({
      paddingLeft: '',
      paddingRight: ''
    })
  }

XhmikosR's avatar
XhmikosR committed
1163
  Modal.prototype.checkScrollbar = function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1164
1165
1166
1167
1168
1169
    var fullWindowWidth = window.innerWidth
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
      var documentElementRect = document.documentElement.getBoundingClientRect()
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
    }
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
Mark Otto's avatar
grunt    
Mark Otto committed
1170
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1171
  }
fat's avatar
build    
fat committed
1172

XhmikosR's avatar
XhmikosR committed
1173
1174
  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1175
    this.originalBodyPad = document.body.style.paddingRight || ''
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1176
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
XhmikosR's avatar
XhmikosR committed
1177
  }
fat's avatar
build    
fat committed
1178

XhmikosR's avatar
XhmikosR committed
1179
  Modal.prototype.resetScrollbar = function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1180
    this.$body.css('padding-right', this.originalBodyPad)
XhmikosR's avatar
XhmikosR committed
1181
  }
fat's avatar
build    
fat committed
1182

XhmikosR's avatar
XhmikosR committed
1183
1184
1185
1186
1187
1188
1189
1190
  Modal.prototype.measureScrollbar = function () { // thx walsh
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }
1191
1192


XhmikosR's avatar
XhmikosR committed
1193
1194
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1195

XhmikosR's avatar
XhmikosR committed
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
  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)
    })
  }
1207

XhmikosR's avatar
XhmikosR committed
1208
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1209

XhmikosR's avatar
XhmikosR committed
1210
1211
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1212
1213


XhmikosR's avatar
XhmikosR committed
1214
1215
  // MODAL NO CONFLICT
  // =================
1216

XhmikosR's avatar
XhmikosR committed
1217
1218
1219
1220
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1221
1222


XhmikosR's avatar
XhmikosR committed
1223
1224
  // MODAL DATA-API
  // ==============
1225

XhmikosR's avatar
XhmikosR committed
1226
1227
1228
1229
1230
  $(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())
1231

XhmikosR's avatar
XhmikosR committed
1232
    if ($this.is('a')) e.preventDefault()
1233

XhmikosR's avatar
XhmikosR committed
1234
1235
1236
1237
    $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
1238
      })
Mark Otto's avatar
Mark Otto committed
1239
    })
XhmikosR's avatar
XhmikosR committed
1240
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1241
  })
1242

XhmikosR's avatar
XhmikosR committed
1243
}(jQuery);
1244

1245
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
1246
 * Bootstrap: tooltip.js v3.3.4
Mark Otto's avatar
Mark Otto committed
1247
 * http://getbootstrap.com/javascript/#tooltip
1248
 * Inspired by the original jQuery.tipsy by Jason Frame
1249
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1250
 * Copyright 2011-2015 Twitter, Inc.
1251
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1252
 * ======================================================================== */
1253
1254


XhmikosR's avatar
XhmikosR committed
1255
1256
1257
1258
1259
1260
1261
+function ($) {
  'use strict';

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

  var Tooltip = function (element, options) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1262
1263
1264
1265
1266
    this.type       = null
    this.options    = null
    this.enabled    = null
    this.timeout    = null
    this.hoverState = null
XhmikosR's avatar
XhmikosR committed
1267
1268
1269
1270
1271
    this.$element   = null

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

Chris Rebert's avatar
Chris Rebert committed
1272
  Tooltip.VERSION  = '3.3.4'
XhmikosR's avatar
XhmikosR committed
1273

1274
1275
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
  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)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1297
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
XhmikosR's avatar
XhmikosR committed
1298

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1299
    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1300
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1301
1302
    }

XhmikosR's avatar
XhmikosR committed
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
    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))
      }
    }
1318

XhmikosR's avatar
XhmikosR committed
1319
1320
1321
1322
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1323

XhmikosR's avatar
XhmikosR committed
1324
1325
1326
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1327

XhmikosR's avatar
XhmikosR committed
1328
1329
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1330

XhmikosR's avatar
XhmikosR committed
1331
1332
1333
1334
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1335
1336
      }
    }
1337

XhmikosR's avatar
XhmikosR committed
1338
1339
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1340

XhmikosR's avatar
XhmikosR committed
1341
1342
1343
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1344

XhmikosR's avatar
XhmikosR committed
1345
1346
1347
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1348

XhmikosR's avatar
XhmikosR committed
1349
1350
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1351

XhmikosR's avatar
XhmikosR committed
1352
1353
1354
  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
1355

XhmikosR's avatar
XhmikosR committed
1356
1357
1358
1359
1360
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1361
1362
1363
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1364
    }
1365

XhmikosR's avatar
XhmikosR committed
1366
    clearTimeout(self.timeout)
1367

XhmikosR's avatar
XhmikosR committed
1368
    self.hoverState = 'in'
1369

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

XhmikosR's avatar
XhmikosR committed
1372
1373
1374
1375
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1376

XhmikosR's avatar
XhmikosR committed
1377
1378
1379
  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
1380

XhmikosR's avatar
XhmikosR committed
1381
1382
1383
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1384
    }
1385

XhmikosR's avatar
XhmikosR committed
1386
    clearTimeout(self.timeout)
fat's avatar
fat committed
1387

XhmikosR's avatar
XhmikosR committed
1388
    self.hoverState = 'out'
1389

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

XhmikosR's avatar
XhmikosR committed
1392
1393
1394
1395
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1396

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

XhmikosR's avatar
XhmikosR committed
1400
1401
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1402

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1403
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1404
1405
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1406

XhmikosR's avatar
XhmikosR committed
1407
      var $tip = this.tip()
fat's avatar
fat committed
1408

XhmikosR's avatar
XhmikosR committed
1409
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1410

XhmikosR's avatar
XhmikosR committed
1411
1412
1413
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1414

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

XhmikosR's avatar
XhmikosR committed
1417
1418
1419
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1420

XhmikosR's avatar
XhmikosR committed
1421
1422
1423
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1424

XhmikosR's avatar
XhmikosR committed
1425
1426
1427
1428
1429
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1430

XhmikosR's avatar
XhmikosR committed
1431
      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1432
      this.$element.trigger('inserted.bs.' + this.type)
1433

XhmikosR's avatar
XhmikosR committed
1434
1435
1436
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1437

XhmikosR's avatar
XhmikosR committed
1438
1439
      if (autoPlace) {
        var orgPlacement = placement
1440
        var viewportDim = this.getPosition(this.$viewport)
Chris Rebert's avatar
Chris Rebert committed
1441

1442
1443
1444
1445
        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
XhmikosR's avatar
XhmikosR committed
1446
                    placement
fat's avatar
fat committed
1447

1448
        $tip
XhmikosR's avatar
XhmikosR committed
1449
          .removeClass(orgPlacement)
1450
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1451
      }
1452

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

XhmikosR's avatar
XhmikosR committed
1455
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1456

XhmikosR's avatar
XhmikosR committed
1457
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1458
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1459
1460
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1461
1462

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

XhmikosR's avatar
XhmikosR committed
1465
1466
1467
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1468
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1469
1470
1471
        complete()
    }
  }
fat's avatar
fat committed
1472

XhmikosR's avatar
XhmikosR committed
1473
1474
1475
1476
  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
1477

XhmikosR's avatar
XhmikosR committed
1478
1479
1480
    // 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
1481

XhmikosR's avatar
XhmikosR committed
1482
1483
1484
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1485

1486
1487
    offset.top  += marginTop
    offset.left += marginLeft
fat's avatar
fat committed
1488

XhmikosR's avatar
XhmikosR committed
1489
1490
1491
1492
1493
1494
1495
1496
    // $.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)
        })
1497
      }
XhmikosR's avatar
XhmikosR committed
1498
    }, offset), 0)
1499

XhmikosR's avatar
XhmikosR committed
1500
    $tip.addClass('in')
fat's avatar
fat committed
1501

XhmikosR's avatar
XhmikosR committed
1502
1503
1504
    // 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
1505

XhmikosR's avatar
XhmikosR committed
1506
1507
1508
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1509

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

XhmikosR's avatar
XhmikosR committed
1512
1513
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1514

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

XhmikosR's avatar
XhmikosR committed
1519
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1520
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1521
  }
1522

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1523
  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1524
    this.arrow()
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1525
1526
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isVertical ? 'top' : 'left', '')
XhmikosR's avatar
XhmikosR committed
1527
  }
1528

XhmikosR's avatar
XhmikosR committed
1529
1530
1531
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1532

XhmikosR's avatar
XhmikosR committed
1533
1534
1535
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1536

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1537
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1538
    var that = this
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1539
    var $tip = $(this.$tip)
XhmikosR's avatar
XhmikosR committed
1540
    var e    = $.Event('hide.bs.' + this.type)
1541

XhmikosR's avatar
XhmikosR committed
1542
1543
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1544
1545
1546
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1547
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1548
    }
Jacob Thornton's avatar
Jacob Thornton committed
1549

XhmikosR's avatar
XhmikosR committed
1550
    this.$element.trigger(e)
1551

XhmikosR's avatar
XhmikosR committed
1552
    if (e.isDefaultPrevented()) return
1553

XhmikosR's avatar
XhmikosR committed
1554
    $tip.removeClass('in')
1555

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1556
    $.support.transition && $tip.hasClass('fade') ?
XhmikosR's avatar
XhmikosR committed
1557
1558
      $tip
        .one('bsTransitionEnd', complete)
1559
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1560
      complete()
1561

XhmikosR's avatar
XhmikosR committed
1562
    this.hoverState = null
1563

XhmikosR's avatar
XhmikosR committed
1564
1565
    return this
  }
1566

XhmikosR's avatar
XhmikosR committed
1567
1568
  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
1569
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
XhmikosR's avatar
XhmikosR committed
1570
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1571
    }
XhmikosR's avatar
XhmikosR committed
1572
  }
1573

XhmikosR's avatar
XhmikosR committed
1574
1575
1576
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1577

XhmikosR's avatar
XhmikosR committed
1578
1579
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1580

XhmikosR's avatar
XhmikosR committed
1581
1582
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1583

Mark Otto's avatar
grunt    
Mark Otto committed
1584
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1585
1586
1587
1588
    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
1589
1590
    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
1591
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1592
1593

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

XhmikosR's avatar
XhmikosR committed
1596
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1597
1598
    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 } :
XhmikosR's avatar
XhmikosR committed
1599
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1600
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1601

XhmikosR's avatar
XhmikosR committed
1602
  }
1603

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

XhmikosR's avatar
XhmikosR committed
1608
1609
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1610

XhmikosR's avatar
XhmikosR committed
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
    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
1624
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
XhmikosR's avatar
XhmikosR committed
1625
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1626
      }
Chris Rebert's avatar
Chris Rebert committed
1627
    }
fat's avatar
fat committed
1628

XhmikosR's avatar
XhmikosR committed
1629
1630
    return delta
  }
1631

XhmikosR's avatar
XhmikosR committed
1632
1633
1634
1635
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1636

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

XhmikosR's avatar
XhmikosR committed
1640
1641
    return title
  }
1642

XhmikosR's avatar
XhmikosR committed
1643
1644
1645
1646
1647
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1648

XhmikosR's avatar
XhmikosR committed
1649
  Tooltip.prototype.tip = function () {
1650
1651
1652
1653
1654
1655
1656
    if (!this.$tip) {
      this.$tip = $(this.options.template)
      if (this.$tip.length != 1) {
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
      }
    }
    return this.$tip
XhmikosR's avatar
XhmikosR committed
1657
  }
1658

XhmikosR's avatar
XhmikosR committed
1659
1660
1661
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1662

XhmikosR's avatar
XhmikosR committed
1663
1664
1665
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1666

XhmikosR's avatar
XhmikosR committed
1667
1668
1669
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1670

XhmikosR's avatar
XhmikosR committed
1671
1672
1673
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1674

XhmikosR's avatar
XhmikosR committed
1675
1676
1677
1678
1679
1680
1681
1682
  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
1683
1684
    }

XhmikosR's avatar
XhmikosR committed
1685
1686
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1687

XhmikosR's avatar
XhmikosR committed
1688
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1689
    var that = this
XhmikosR's avatar
XhmikosR committed
1690
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1691
1692
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1693
1694
1695
1696
1697
1698
      if (that.$tip) {
        that.$tip.detach()
      }
      that.$tip = null
      that.$arrow = null
      that.$viewport = null
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1699
    })
XhmikosR's avatar
XhmikosR committed
1700
  }
1701
1702


XhmikosR's avatar
XhmikosR committed
1703
1704
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1705

XhmikosR's avatar
XhmikosR committed
1706
1707
  function Plugin(option) {
    return this.each(function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1708
1709
1710
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1711

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1712
      if (!data && /destroy|hide/.test(option)) return
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1713
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
XhmikosR's avatar
XhmikosR committed
1714
1715
1716
      if (typeof option == 'string') data[option]()
    })
  }
1717

XhmikosR's avatar
XhmikosR committed
1718
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1719

XhmikosR's avatar
XhmikosR committed
1720
1721
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1722

1723

XhmikosR's avatar
XhmikosR committed
1724
1725
  // TOOLTIP NO CONFLICT
  // ===================
1726

XhmikosR's avatar
XhmikosR committed
1727
1728
1729
1730
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1731

XhmikosR's avatar
XhmikosR committed
1732
}(jQuery);
1733

1734
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
1735
 * Bootstrap: popover.js v3.3.4
Mark Otto's avatar
Mark Otto committed
1736
 * http://getbootstrap.com/javascript/#popovers
1737
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1738
 * Copyright 2011-2015 Twitter, Inc.
1739
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1740
 * ======================================================================== */
1741
1742


XhmikosR's avatar
XhmikosR committed
1743
1744
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1745

XhmikosR's avatar
XhmikosR committed
1746
1747
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1748

XhmikosR's avatar
XhmikosR committed
1749
1750
1751
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1752

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

Chris Rebert's avatar
Chris Rebert committed
1755
  Popover.VERSION  = '3.3.4'
1756

XhmikosR's avatar
XhmikosR committed
1757
1758
1759
1760
1761
1762
  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
1763
1764


XhmikosR's avatar
XhmikosR committed
1765
1766
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1767

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

XhmikosR's avatar
XhmikosR committed
1770
  Popover.prototype.constructor = Popover
1771

XhmikosR's avatar
XhmikosR committed
1772
1773
1774
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1775

XhmikosR's avatar
XhmikosR committed
1776
1777
1778
1779
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1780

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

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

XhmikosR's avatar
XhmikosR committed
1788
1789
1790
1791
    // 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()
  }
1792

XhmikosR's avatar
XhmikosR committed
1793
1794
1795
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1796

XhmikosR's avatar
XhmikosR committed
1797
1798
1799
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1800

XhmikosR's avatar
XhmikosR committed
1801
1802
1803
1804
1805
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1806

XhmikosR's avatar
XhmikosR committed
1807
1808
1809
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1810
1811


XhmikosR's avatar
XhmikosR committed
1812
1813
  // POPOVER PLUGIN DEFINITION
  // =========================
1814

XhmikosR's avatar
XhmikosR committed
1815
1816
  function Plugin(option) {
    return this.each(function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1817
1818
1819
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
Chris Rebert's avatar
Chris Rebert committed
1820

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1821
      if (!data && /destroy|hide/.test(option)) return
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1822
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
XhmikosR's avatar
XhmikosR committed
1823
1824
1825
      if (typeof option == 'string') data[option]()
    })
  }
1826

XhmikosR's avatar
XhmikosR committed
1827
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1828

XhmikosR's avatar
XhmikosR committed
1829
1830
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1831

1832

XhmikosR's avatar
XhmikosR committed
1833
1834
  // POPOVER NO CONFLICT
  // ===================
1835

XhmikosR's avatar
XhmikosR committed
1836
1837
1838
1839
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1840

XhmikosR's avatar
XhmikosR committed
1841
}(jQuery);
1842

1843
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
1844
 * Bootstrap: scrollspy.js v3.3.4
Mark Otto's avatar
Mark Otto committed
1845
 * http://getbootstrap.com/javascript/#scrollspy
1846
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1847
 * Copyright 2011-2015 Twitter, Inc.
1848
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1849
 * ======================================================================== */
1850
1851


XhmikosR's avatar
XhmikosR committed
1852
1853
+function ($) {
  'use strict';
1854

XhmikosR's avatar
XhmikosR committed
1855
1856
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1857

XhmikosR's avatar
XhmikosR committed
1858
  function ScrollSpy(element, options) {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1859
1860
    this.$body          = $(document.body)
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
XhmikosR's avatar
XhmikosR committed
1861
1862
1863
1864
1865
1866
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0
1867

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1868
    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
XhmikosR's avatar
XhmikosR committed
1869
1870
1871
    this.refresh()
    this.process()
  }
1872

Chris Rebert's avatar
Chris Rebert committed
1873
  ScrollSpy.VERSION  = '3.3.4'
Mark Otto's avatar
grunt    
Mark Otto committed
1874

XhmikosR's avatar
XhmikosR committed
1875
1876
1877
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1878

XhmikosR's avatar
XhmikosR committed
1879
1880
1881
  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
1882

XhmikosR's avatar
XhmikosR committed
1883
  ScrollSpy.prototype.refresh = function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1884
1885
1886
1887
1888
1889
1890
    var that          = this
    var offsetMethod  = 'offset'
    var offsetBase    = 0

    this.offsets      = []
    this.targets      = []
    this.scrollHeight = this.getScrollHeight()
Mark Otto's avatar
grunt    
Mark Otto committed
1891

XhmikosR's avatar
XhmikosR committed
1892
1893
1894
1895
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1896

XhmikosR's avatar
XhmikosR committed
1897
1898
1899
1900
1901
1902
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1903

XhmikosR's avatar
XhmikosR committed
1904
1905
1906
1907
1908
1909
1910
        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1911
1912
        that.offsets.push(this[0])
        that.targets.push(this[1])
XhmikosR's avatar
XhmikosR committed
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
      })
  }

  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
1927
1928
    }

XhmikosR's avatar
XhmikosR committed
1929
1930
1931
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1932

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1933
1934
1935
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1936
    }
1937

XhmikosR's avatar
XhmikosR committed
1938
1939
1940
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1941
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
XhmikosR's avatar
XhmikosR committed
1942
1943
1944
        && this.activate(targets[i])
    }
  }
1945

XhmikosR's avatar
XhmikosR committed
1946
1947
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1948

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1949
    this.clear()
1950

XhmikosR's avatar
XhmikosR committed
1951
    var selector = this.selector +
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1952
1953
      '[data-target="' + target + '"],' +
      this.selector + '[href="' + target + '"]'
1954

XhmikosR's avatar
XhmikosR committed
1955
1956
1957
    var active = $(selector)
      .parents('li')
      .addClass('active')
1958

XhmikosR's avatar
XhmikosR committed
1959
1960
1961
1962
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1963
    }
1964

XhmikosR's avatar
XhmikosR committed
1965
1966
    active.trigger('activate.bs.scrollspy')
  }
1967

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1968
1969
1970
1971
1972
1973
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1974

XhmikosR's avatar
XhmikosR committed
1975
1976
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1977

XhmikosR's avatar
XhmikosR committed
1978
1979
1980
1981
1982
  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
1983

XhmikosR's avatar
XhmikosR committed
1984
1985
1986
1987
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1988

XhmikosR's avatar
XhmikosR committed
1989
  var old = $.fn.scrollspy
1990

XhmikosR's avatar
XhmikosR committed
1991
1992
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1993

1994

XhmikosR's avatar
XhmikosR committed
1995
1996
  // SCROLLSPY NO CONFLICT
  // =====================
1997

XhmikosR's avatar
XhmikosR committed
1998
1999
2000
2001
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
2002

Chris Rebert's avatar
Chris Rebert committed
2003

XhmikosR's avatar
XhmikosR committed
2004
2005
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
2006

XhmikosR's avatar
XhmikosR committed
2007
2008
2009
2010
2011
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
2012
  })
2013

XhmikosR's avatar
XhmikosR committed
2014
}(jQuery);
2015

2016
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
2017
 * Bootstrap: tab.js v3.3.4
Mark Otto's avatar
Mark Otto committed
2018
 * http://getbootstrap.com/javascript/#tabs
2019
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
2020
 * Copyright 2011-2015 Twitter, Inc.
2021
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2022
 * ======================================================================== */
2023

2024

XhmikosR's avatar
XhmikosR committed
2025
2026
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2027

XhmikosR's avatar
XhmikosR committed
2028
2029
  // TAB CLASS DEFINITION
  // ====================
2030

XhmikosR's avatar
XhmikosR committed
2031
2032
2033
  var Tab = function (element) {
    this.element = $(element)
  }
2034

Chris Rebert's avatar
Chris Rebert committed
2035
  Tab.VERSION = '3.3.4'
Mark Otto's avatar
grunt    
Mark Otto committed
2036

2037
2038
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
2039
2040
2041
2042
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
2043

XhmikosR's avatar
XhmikosR committed
2044
2045
2046
2047
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
2048

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2051
2052
2053
2054
2055
2056
    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
2057
    })
2058

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2059
2060
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
2061

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

XhmikosR's avatar
XhmikosR committed
2064
    var $target = $(selector)
2065

XhmikosR's avatar
XhmikosR committed
2066
2067
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2068
2069
2070
2071
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
2072
2073
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2074
        relatedTarget: $previous[0]
2075
      })
XhmikosR's avatar
XhmikosR committed
2076
2077
    })
  }
2078

XhmikosR's avatar
XhmikosR committed
2079
2080
2081
2082
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
2083
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
2084

XhmikosR's avatar
XhmikosR committed
2085
2086
2087
2088
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
2089
2090
2091
2092
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
2093

Mark Otto's avatar
grunt    
Mark Otto committed
2094
2095
2096
2097
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2098
2099
2100
2101
2102
2103

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

Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
2106
      if (element.parent('.dropdown-menu').length) {
Mark Otto's avatar
grunt    
Mark Otto committed
2107
2108
2109
2110
2111
2112
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2113
      }
fat's avatar
fat committed
2114

XhmikosR's avatar
XhmikosR committed
2115
      callback && callback()
2116
    }
fat's avatar
fat committed
2117

Mark Otto's avatar
grunt    
Mark Otto committed
2118
    $active.length && transition ?
XhmikosR's avatar
XhmikosR committed
2119
2120
      $active
        .one('bsTransitionEnd', next)
2121
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
2122
      next()
2123

XhmikosR's avatar
XhmikosR committed
2124
2125
    $active.removeClass('in')
  }
2126
2127


XhmikosR's avatar
XhmikosR committed
2128
2129
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
2130

XhmikosR's avatar
XhmikosR committed
2131
2132
2133
2134
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
2135

XhmikosR's avatar
XhmikosR committed
2136
2137
2138
2139
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
Mark Otto's avatar
Mark Otto committed
2140

XhmikosR's avatar
XhmikosR committed
2141
  var old = $.fn.tab
2142

XhmikosR's avatar
XhmikosR committed
2143
2144
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
2145

2146

XhmikosR's avatar
XhmikosR committed
2147
2148
  // TAB NO CONFLICT
  // ===============
2149

XhmikosR's avatar
XhmikosR committed
2150
2151
2152
2153
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
2154
2155


XhmikosR's avatar
XhmikosR committed
2156
2157
2158
  // TAB DATA-API
  // ============

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2159
  var clickHandler = function (e) {
XhmikosR's avatar
XhmikosR committed
2160
2161
    e.preventDefault()
    Plugin.call($(this), 'show')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2162
2163
2164
2165
2166
  }

  $(document)
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
2167

XhmikosR's avatar
XhmikosR committed
2168
}(jQuery);
2169

2170
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
2171
 * Bootstrap: affix.js v3.3.4
Mark Otto's avatar
Mark Otto committed
2172
 * http://getbootstrap.com/javascript/#affix
2173
 * ========================================================================
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
2174
 * Copyright 2011-2015 Twitter, Inc.
2175
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2176
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2177
2178


XhmikosR's avatar
XhmikosR committed
2179
2180
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2181

XhmikosR's avatar
XhmikosR committed
2182
2183
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
2184

XhmikosR's avatar
XhmikosR committed
2185
2186
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
Mark Otto's avatar
Mark Otto committed
2187

XhmikosR's avatar
XhmikosR committed
2188
2189
2190
    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
2191

XhmikosR's avatar
XhmikosR committed
2192
    this.$element     = $(element)
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
2193
2194
    this.affixed      = null
    this.unpin        = null
XhmikosR's avatar
XhmikosR committed
2195
    this.pinnedOffset = null
fat's avatar
fat committed
2196

XhmikosR's avatar
XhmikosR committed
2197
2198
    this.checkPosition()
  }
fat's avatar
fat committed
2199

Chris Rebert's avatar
Chris Rebert committed
2200
  Affix.VERSION  = '3.3.4'
2201

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

XhmikosR's avatar
XhmikosR committed
2204
2205
2206
2207
  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }
2208

2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
  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

Chris Rebert's avatar
Chris Rebert committed
2225
    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2226
2227
2228
2229
2230
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

XhmikosR's avatar
XhmikosR committed
2231
2232
2233
2234
2235
2236
2237
  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)
  }
2238

XhmikosR's avatar
XhmikosR committed
2239
2240
2241
  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }
fat's avatar
fat committed
2242

XhmikosR's avatar
XhmikosR committed
2243
2244
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return
2245

2246
    var height       = this.$element.height()
XhmikosR's avatar
XhmikosR committed
2247
2248
2249
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
2250
    var scrollHeight = $(document.body).height()
2251

XhmikosR's avatar
XhmikosR committed
2252
2253
2254
    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)
2255

2256
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2257

2258
2259
    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')
2260

2261
2262
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2263

2264
      this.$element.trigger(e)
2265

2266
      if (e.isDefaultPrevented()) return
2267

2268
2269
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2270

2271
2272
2273
2274
2275
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }
2276

XhmikosR's avatar
XhmikosR committed
2277
2278
    if (affix == 'bottom') {
      this.$element.offset({
2279
        top: scrollHeight - height - offsetBottom
XhmikosR's avatar
XhmikosR committed
2280
      })
2281
    }
XhmikosR's avatar
XhmikosR committed
2282
  }
Mark Otto's avatar
Mark Otto committed
2283

2284

XhmikosR's avatar
XhmikosR committed
2285
2286
  // AFFIX PLUGIN DEFINITION
  // =======================
2287

XhmikosR's avatar
XhmikosR committed
2288
2289
2290
2291
2292
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option
2293

XhmikosR's avatar
XhmikosR committed
2294
2295
2296
2297
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
2298

XhmikosR's avatar
XhmikosR committed
2299
  var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2300

XhmikosR's avatar
XhmikosR committed
2301
2302
  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix
2303
2304


XhmikosR's avatar
XhmikosR committed
2305
2306
  // AFFIX NO CONFLICT
  // =================
2307

XhmikosR's avatar
XhmikosR committed
2308
2309
2310
2311
  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }
2312
2313


XhmikosR's avatar
XhmikosR committed
2314
2315
  // AFFIX DATA-API
  // ==============
2316

XhmikosR's avatar
XhmikosR committed
2317
2318
2319
2320
  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()
2321

XhmikosR's avatar
XhmikosR committed
2322
      data.offset = data.offset || {}
2323

Heinrich Fenkart's avatar
Heinrich Fenkart committed
2324
2325
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
2326

XhmikosR's avatar
XhmikosR committed
2327
      Plugin.call($spy, data)
2328
    })
Mark Otto's avatar
Mark Otto committed
2329
2330
  })

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