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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

100
101
  Alert.TRANSITION_DURATION = 150

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

324
325
  Carousel.TRANSITION_DURATION = 600

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
402
403
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
404
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
405
406
407
408
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var fallback  = type == 'next' ? 'first' : 'last'
    var that      = this
Jacob Thornton's avatar
Jacob Thornton committed
409

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

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

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

    this.sliding = true

    isCycling && this.pause()

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

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

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

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


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

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

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

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

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


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

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

fat's avatar
fat committed
495

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

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

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

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

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

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

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

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


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

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

XhmikosR's avatar
XhmikosR committed
541
542
543
544
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
545

XhmikosR's avatar
XhmikosR committed
546
547
548
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
549

Mark Otto's avatar
Mark Otto committed
550
  Collapse.VERSION  = '3.2.0'
551

552
553
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
554
555
556
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
557

XhmikosR's avatar
XhmikosR committed
558
559
560
561
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
562

XhmikosR's avatar
XhmikosR committed
563
564
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
565

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
566
567
568
569
570
571
572
573
    var activesData
    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')

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

XhmikosR's avatar
XhmikosR committed
574
575
576
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
577

XhmikosR's avatar
XhmikosR committed
578
579
    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
580
      activesData || actives.data('bs.collapse', null)
XhmikosR's avatar
XhmikosR committed
581
    }
582

XhmikosR's avatar
XhmikosR committed
583
    var dimension = this.dimension()
584

XhmikosR's avatar
XhmikosR committed
585
586
587
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
588
      .attr('aria-expanded', true)
589

XhmikosR's avatar
XhmikosR committed
590
    this.transitioning = 1
591

XhmikosR's avatar
XhmikosR committed
592
593
594
595
596
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
597
      this.$element
XhmikosR's avatar
XhmikosR committed
598
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
599
    }
600

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

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

XhmikosR's avatar
XhmikosR committed
605
606
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
607
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
608
  }
609

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

XhmikosR's avatar
XhmikosR committed
613
614
615
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
616

XhmikosR's avatar
XhmikosR committed
617
    var dimension = this.dimension()
618

XhmikosR's avatar
XhmikosR committed
619
620
621
622
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
626
    this.transitioning = 1
627

XhmikosR's avatar
XhmikosR committed
628
629
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
630
      this.$element
XhmikosR's avatar
XhmikosR committed
631
632
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
633
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
634
    }
635

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

XhmikosR's avatar
XhmikosR committed
638
639
640
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
641
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
642
  }
643

XhmikosR's avatar
XhmikosR committed
644
645
646
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
647

648

XhmikosR's avatar
XhmikosR committed
649
650
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
651

XhmikosR's avatar
XhmikosR committed
652
653
654
655
656
  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
657

Mark Otto's avatar
grunt    
Mark Otto committed
658
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
659
660
661
662
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
663

XhmikosR's avatar
XhmikosR committed
664
  var old = $.fn.collapse
665

XhmikosR's avatar
XhmikosR committed
666
667
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
668

669

XhmikosR's avatar
XhmikosR committed
670
671
  // COLLAPSE NO CONFLICT
  // ====================
672

XhmikosR's avatar
XhmikosR committed
673
674
675
676
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
677

678

XhmikosR's avatar
XhmikosR committed
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  // COLLAPSE DATA-API
  // =================

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

    if (!data || !data.transitioning) {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
695
696
697
      if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed').attr('aria-expanded', false)
      var isCollapsed = $target.hasClass('in')
      $this.toggleClass('collapsed', isCollapsed).attr('aria-expanded', !isCollapsed)
XhmikosR's avatar
XhmikosR committed
698
    }
fat's avatar
fat committed
699

XhmikosR's avatar
XhmikosR committed
700
    Plugin.call($target, option)
701
702
  })

XhmikosR's avatar
XhmikosR committed
703
}(jQuery);
704

705
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
706
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
707
 * http://getbootstrap.com/javascript/#dropdowns
708
 * ========================================================================
709
 * Copyright 2011-2014 Twitter, Inc.
710
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
711
 * ======================================================================== */
712
713


XhmikosR's avatar
XhmikosR committed
714
715
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
716

XhmikosR's avatar
XhmikosR committed
717
718
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
719

XhmikosR's avatar
XhmikosR committed
720
721
722
723
724
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
725

Mark Otto's avatar
Mark Otto committed
726
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
727

XhmikosR's avatar
XhmikosR committed
728
729
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
730

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

XhmikosR's avatar
XhmikosR committed
733
734
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
735

XhmikosR's avatar
XhmikosR committed
736
    clearMenus()
fat's avatar
fat committed
737

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

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

XhmikosR's avatar
XhmikosR committed
747
      if (e.isDefaultPrevented()) return
748

749
750
751
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
752

XhmikosR's avatar
XhmikosR committed
753
754
755
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
756
    }
757

XhmikosR's avatar
XhmikosR committed
758
759
    return false
  }
760

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

XhmikosR's avatar
XhmikosR committed
764
    var $this = $(this)
765

XhmikosR's avatar
XhmikosR committed
766
767
    e.preventDefault()
    e.stopPropagation()
768

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

XhmikosR's avatar
XhmikosR committed
771
772
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
773

Mark Otto's avatar
grunt    
Mark Otto committed
774
    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
XhmikosR's avatar
XhmikosR committed
775
776
777
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
778

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

XhmikosR's avatar
XhmikosR committed
782
    if (!$items.length) return
783

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

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

XhmikosR's avatar
XhmikosR committed
790
791
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
792

XhmikosR's avatar
XhmikosR committed
793
794
795
796
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
797
798
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
799
      var relatedTarget = { relatedTarget: this }
800

XhmikosR's avatar
XhmikosR committed
801
      if (!$parent.hasClass('open')) return
802

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

XhmikosR's avatar
XhmikosR committed
805
      if (e.isDefaultPrevented()) return
806
807

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
808
809
810
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
811

XhmikosR's avatar
XhmikosR committed
812
813
  function getParent($this) {
    var selector = $this.attr('data-target')
814

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

XhmikosR's avatar
XhmikosR committed
820
    var $parent = selector && $(selector)
821

XhmikosR's avatar
XhmikosR committed
822
823
    return $parent && $parent.length ? $parent : $this.parent()
  }
824
825


XhmikosR's avatar
XhmikosR committed
826
827
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
828

XhmikosR's avatar
XhmikosR committed
829
830
831
832
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
833

XhmikosR's avatar
XhmikosR committed
834
835
836
837
      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
838

XhmikosR's avatar
XhmikosR committed
839
  var old = $.fn.dropdown
840

XhmikosR's avatar
XhmikosR committed
841
842
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
843

844

XhmikosR's avatar
XhmikosR committed
845
846
  // DROPDOWN NO CONFLICT
  // ====================
847

XhmikosR's avatar
XhmikosR committed
848
849
850
851
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
852

853

XhmikosR's avatar
XhmikosR committed
854
855
856
857
858
859
860
861
  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

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

XhmikosR's avatar
XhmikosR committed
863
}(jQuery);
864

865
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
866
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
867
 * http://getbootstrap.com/javascript/#modals
868
 * ========================================================================
869
 * Copyright 2011-2014 Twitter, Inc.
870
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
871
 * ======================================================================== */
872
873


XhmikosR's avatar
XhmikosR committed
874
875
+function ($) {
  'use strict';
876

XhmikosR's avatar
XhmikosR committed
877
878
  // MODAL CLASS DEFINITION
  // ======================
879

XhmikosR's avatar
XhmikosR committed
880
881
882
883
884
885
886
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
887

XhmikosR's avatar
XhmikosR committed
888
889
890
891
892
893
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
894
    }
XhmikosR's avatar
XhmikosR committed
895
  }
896

Mark Otto's avatar
Mark Otto committed
897
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
898

899
900
901
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
902
903
904
905
906
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
907

XhmikosR's avatar
XhmikosR committed
908
909
910
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
911

XhmikosR's avatar
XhmikosR committed
912
913
914
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
915

XhmikosR's avatar
XhmikosR committed
916
    this.$element.trigger(e)
917

XhmikosR's avatar
XhmikosR committed
918
    if (this.isShown || e.isDefaultPrevented()) return
919

XhmikosR's avatar
XhmikosR committed
920
    this.isShown = true
fat's avatar
build    
fat committed
921

XhmikosR's avatar
XhmikosR committed
922
923
    this.checkScrollbar()
    this.$body.addClass('modal-open')
924

XhmikosR's avatar
XhmikosR committed
925
926
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
927

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

XhmikosR's avatar
XhmikosR committed
930
931
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
932

XhmikosR's avatar
XhmikosR committed
933
934
935
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
936

XhmikosR's avatar
XhmikosR committed
937
938
939
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
940

XhmikosR's avatar
XhmikosR committed
941
942
943
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
948

XhmikosR's avatar
XhmikosR committed
949
      that.enforceFocus()
950

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

XhmikosR's avatar
XhmikosR committed
953
954
955
956
957
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
958
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
959
960
961
        that.$element.trigger('focus').trigger(e)
    })
  }
962

XhmikosR's avatar
XhmikosR committed
963
964
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
965

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

XhmikosR's avatar
XhmikosR committed
968
    this.$element.trigger(e)
969

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

XhmikosR's avatar
XhmikosR committed
972
    this.isShown = false
973

XhmikosR's avatar
XhmikosR committed
974
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
975

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

XhmikosR's avatar
XhmikosR committed
978
979
980
981
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
982

XhmikosR's avatar
XhmikosR committed
983
984
985
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
986
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
987
988
      this.hideModal()
  }
989

XhmikosR's avatar
XhmikosR committed
990
991
992
993
994
995
996
997
998
999
1000
1001
  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
1002
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1003
1004
1005
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1006
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1007
1008
1009
1010
1011
1012
1013
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1014
1015
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1016
1017
1018
      that.$element.trigger('hidden.bs.modal')
    })
  }
1019

XhmikosR's avatar
XhmikosR committed
1020
1021
1022
1023
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1024

XhmikosR's avatar
XhmikosR committed
1025
1026
1027
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1028

XhmikosR's avatar
XhmikosR committed
1029
1030
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1031

XhmikosR's avatar
XhmikosR committed
1032
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1033
1034
1035
1036
1037
1038
1039
        .prependTo(this.$element)
        .on('click.dismiss.bs.modal', $.proxy(function (e) {
          if (e.target !== e.currentTarget) return
          this.options.backdrop == 'static'
            ? this.$element[0].focus.call(this.$element[0])
            : this.hide.call(this)
        }, this))
1040

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

XhmikosR's avatar
XhmikosR committed
1043
      this.$backdrop.addClass('in')
1044

XhmikosR's avatar
XhmikosR committed
1045
      if (!callback) return
1046

XhmikosR's avatar
XhmikosR committed
1047
1048
1049
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1050
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1051
        callback()
1052

XhmikosR's avatar
XhmikosR committed
1053
1054
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1055

XhmikosR's avatar
XhmikosR committed
1056
1057
1058
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1059
      }
XhmikosR's avatar
XhmikosR committed
1060
1061
1062
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1063
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1064
        callbackRemove()
1065

XhmikosR's avatar
XhmikosR committed
1066
1067
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1068
    }
XhmikosR's avatar
XhmikosR committed
1069
  }
1070

XhmikosR's avatar
XhmikosR committed
1071
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1072
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1073
  }
fat's avatar
build    
fat committed
1074

XhmikosR's avatar
XhmikosR committed
1075
1076
1077
1078
  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
    if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
  }
fat's avatar
build    
fat committed
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
1082
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1083

XhmikosR's avatar
XhmikosR committed
1084
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1085
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1086
1087
1088
1089
1090
1091
1092
    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
  }
1093
1094


XhmikosR's avatar
XhmikosR committed
1095
1096
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1097

XhmikosR's avatar
XhmikosR committed
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
  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)
    })
  }
1109

XhmikosR's avatar
XhmikosR committed
1110
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1111

XhmikosR's avatar
XhmikosR committed
1112
1113
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1114
1115


XhmikosR's avatar
XhmikosR committed
1116
1117
  // MODAL NO CONFLICT
  // =================
1118

XhmikosR's avatar
XhmikosR committed
1119
1120
1121
1122
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1123
1124


XhmikosR's avatar
XhmikosR committed
1125
1126
  // MODAL DATA-API
  // ==============
1127

XhmikosR's avatar
XhmikosR committed
1128
1129
1130
1131
1132
  $(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())
1133

XhmikosR's avatar
XhmikosR committed
1134
    if ($this.is('a')) e.preventDefault()
1135

XhmikosR's avatar
XhmikosR committed
1136
1137
1138
1139
    $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
1140
      })
Mark Otto's avatar
Mark Otto committed
1141
    })
XhmikosR's avatar
XhmikosR committed
1142
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1143
  })
1144

XhmikosR's avatar
XhmikosR committed
1145
}(jQuery);
1146

1147
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1148
 * Bootstrap: tooltip.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1149
 * http://getbootstrap.com/javascript/#tooltip
1150
 * Inspired by the original jQuery.tipsy by Jason Frame
1151
 * ========================================================================
1152
 * Copyright 2011-2014 Twitter, Inc.
1153
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1154
 * ======================================================================== */
1155
1156


XhmikosR's avatar
XhmikosR committed
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
+function ($) {
  'use strict';

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

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

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

Mark Otto's avatar
Mark Otto committed
1174
  Tooltip.VERSION  = '3.2.0'
XhmikosR's avatar
XhmikosR committed
1175

1176
1177
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
  Tooltip.DEFAULTS = {
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false,
    viewport: {
      selector: 'body',
      padding: 0
    }
  }

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

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

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

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

        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }
    }
1216

XhmikosR's avatar
XhmikosR committed
1217
1218
1219
1220
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1221

XhmikosR's avatar
XhmikosR committed
1222
1223
1224
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1225

XhmikosR's avatar
XhmikosR committed
1226
1227
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1228

XhmikosR's avatar
XhmikosR committed
1229
1230
1231
1232
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1233
1234
      }
    }
1235

XhmikosR's avatar
XhmikosR committed
1236
1237
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1238

XhmikosR's avatar
XhmikosR committed
1239
1240
1241
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1242

XhmikosR's avatar
XhmikosR committed
1243
1244
1245
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1246

XhmikosR's avatar
XhmikosR committed
1247
1248
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1249

XhmikosR's avatar
XhmikosR committed
1250
1251
1252
  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
1253

XhmikosR's avatar
XhmikosR committed
1254
1255
1256
1257
1258
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1259
1260
1261
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1262
    }
1263

XhmikosR's avatar
XhmikosR committed
1264
    clearTimeout(self.timeout)
1265

XhmikosR's avatar
XhmikosR committed
1266
    self.hoverState = 'in'
1267

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

XhmikosR's avatar
XhmikosR committed
1270
1271
1272
1273
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1274

XhmikosR's avatar
XhmikosR committed
1275
1276
1277
  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
1278

XhmikosR's avatar
XhmikosR committed
1279
1280
1281
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1282
    }
1283

XhmikosR's avatar
XhmikosR committed
1284
    clearTimeout(self.timeout)
fat's avatar
fat committed
1285

XhmikosR's avatar
XhmikosR committed
1286
    self.hoverState = 'out'
1287

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

XhmikosR's avatar
XhmikosR committed
1290
1291
1292
1293
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1294

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

XhmikosR's avatar
XhmikosR committed
1298
1299
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1300

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1301
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1302
1303
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1304

XhmikosR's avatar
XhmikosR committed
1305
      var $tip = this.tip()
fat's avatar
fat committed
1306

XhmikosR's avatar
XhmikosR committed
1307
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1308

XhmikosR's avatar
XhmikosR committed
1309
1310
1311
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1312

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

XhmikosR's avatar
XhmikosR committed
1315
1316
1317
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1318

XhmikosR's avatar
XhmikosR committed
1319
1320
1321
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1322

XhmikosR's avatar
XhmikosR committed
1323
1324
1325
1326
1327
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1328

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

XhmikosR's avatar
XhmikosR committed
1331
1332
1333
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1334

XhmikosR's avatar
XhmikosR committed
1335
1336
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1337
1338
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1339

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1340
1341
1342
1343
        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
XhmikosR's avatar
XhmikosR committed
1344
                    placement
fat's avatar
fat committed
1345

1346
        $tip
XhmikosR's avatar
XhmikosR committed
1347
          .removeClass(orgPlacement)
1348
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1349
      }
1350

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

XhmikosR's avatar
XhmikosR committed
1353
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1354

XhmikosR's avatar
XhmikosR committed
1355
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1356
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1357
1358
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1359
1360

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

XhmikosR's avatar
XhmikosR committed
1363
1364
1365
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1366
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1367
1368
1369
        complete()
    }
  }
fat's avatar
fat committed
1370

XhmikosR's avatar
XhmikosR committed
1371
1372
1373
1374
  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
1375

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

XhmikosR's avatar
XhmikosR committed
1380
1381
1382
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1383

XhmikosR's avatar
XhmikosR committed
1384
1385
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1386

XhmikosR's avatar
XhmikosR committed
1387
1388
1389
1390
1391
1392
1393
1394
    // $.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)
        })
1395
      }
XhmikosR's avatar
XhmikosR committed
1396
    }, offset), 0)
1397

XhmikosR's avatar
XhmikosR committed
1398
    $tip.addClass('in')
fat's avatar
fat committed
1399

XhmikosR's avatar
XhmikosR committed
1400
1401
1402
    // 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
1403

XhmikosR's avatar
XhmikosR committed
1404
1405
1406
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1407

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

XhmikosR's avatar
XhmikosR committed
1410
1411
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1412

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

XhmikosR's avatar
XhmikosR committed
1417
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1418
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1419
  }
1420

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1421
1422
1423
1424
  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
    this.arrow()
      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isHorizontal ? 'top' : 'left', '')
XhmikosR's avatar
XhmikosR committed
1425
  }
1426

XhmikosR's avatar
XhmikosR committed
1427
1428
1429
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1430

XhmikosR's avatar
XhmikosR committed
1431
1432
1433
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1434

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1435
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1436
1437
1438
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1439

XhmikosR's avatar
XhmikosR committed
1440
1441
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1442
1443
1444
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1445
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1446
    }
Jacob Thornton's avatar
Jacob Thornton committed
1447

XhmikosR's avatar
XhmikosR committed
1448
    this.$element.trigger(e)
1449

XhmikosR's avatar
XhmikosR committed
1450
    if (e.isDefaultPrevented()) return
1451

XhmikosR's avatar
XhmikosR committed
1452
    $tip.removeClass('in')
1453

XhmikosR's avatar
XhmikosR committed
1454
1455
1456
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1457
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1458
      complete()
1459

XhmikosR's avatar
XhmikosR committed
1460
    this.hoverState = null
1461

XhmikosR's avatar
XhmikosR committed
1462
1463
    return this
  }
1464

XhmikosR's avatar
XhmikosR committed
1465
1466
1467
1468
  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1469
    }
XhmikosR's avatar
XhmikosR committed
1470
  }
1471

XhmikosR's avatar
XhmikosR committed
1472
1473
1474
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1475

XhmikosR's avatar
XhmikosR committed
1476
1477
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1478

XhmikosR's avatar
XhmikosR committed
1479
1480
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1481

Mark Otto's avatar
grunt    
Mark Otto committed
1482
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1483
1484
1485
1486
    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
1487
1488
    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
1489
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1490
1491

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

XhmikosR's avatar
XhmikosR committed
1494
1495
1496
1497
1498
  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }
1499

XhmikosR's avatar
XhmikosR committed
1500
  }
1501

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

XhmikosR's avatar
XhmikosR committed
1506
1507
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1508

XhmikosR's avatar
XhmikosR committed
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1524
      }
Chris Rebert's avatar
Chris Rebert committed
1525
    }
fat's avatar
fat committed
1526

XhmikosR's avatar
XhmikosR committed
1527
1528
    return delta
  }
1529

XhmikosR's avatar
XhmikosR committed
1530
1531
1532
1533
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1534

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

XhmikosR's avatar
XhmikosR committed
1538
1539
    return title
  }
1540

XhmikosR's avatar
XhmikosR committed
1541
1542
1543
1544
1545
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1546

XhmikosR's avatar
XhmikosR committed
1547
1548
1549
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1550

XhmikosR's avatar
XhmikosR committed
1551
1552
1553
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1554

XhmikosR's avatar
XhmikosR committed
1555
1556
1557
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1558

XhmikosR's avatar
XhmikosR committed
1559
1560
1561
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1562

XhmikosR's avatar
XhmikosR committed
1563
1564
1565
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1566

XhmikosR's avatar
XhmikosR committed
1567
1568
1569
1570
1571
1572
1573
1574
  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
1575
1576
    }

XhmikosR's avatar
XhmikosR committed
1577
1578
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1579

XhmikosR's avatar
XhmikosR committed
1580
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1581
    var that = this
XhmikosR's avatar
XhmikosR committed
1582
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1583
1584
1585
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1586
  }
1587
1588


XhmikosR's avatar
XhmikosR committed
1589
1590
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1591

XhmikosR's avatar
XhmikosR committed
1592
1593
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1594
1595
1596
1597
      var $this    = $(this)
      var data     = $this.data('bs.tooltip')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
fat's avatar
fat committed
1598

XhmikosR's avatar
XhmikosR committed
1599
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1600
1601
1602
1603
1604
1605
      if (selector) {
        if (!data) $this.data('bs.tooltip', (data = {}))
        if (!data[selector]) data[selector] = new Tooltip(this, options)
      } else {
        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1606
1607
1608
      if (typeof option == 'string') data[option]()
    })
  }
1609

XhmikosR's avatar
XhmikosR committed
1610
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1611

XhmikosR's avatar
XhmikosR committed
1612
1613
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1614

1615

XhmikosR's avatar
XhmikosR committed
1616
1617
  // TOOLTIP NO CONFLICT
  // ===================
1618

XhmikosR's avatar
XhmikosR committed
1619
1620
1621
1622
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1623

XhmikosR's avatar
XhmikosR committed
1624
}(jQuery);
1625

1626
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1627
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1628
 * http://getbootstrap.com/javascript/#popovers
1629
 * ========================================================================
1630
 * Copyright 2011-2014 Twitter, Inc.
1631
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1632
 * ======================================================================== */
1633
1634


XhmikosR's avatar
XhmikosR committed
1635
1636
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1637

XhmikosR's avatar
XhmikosR committed
1638
1639
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1640

XhmikosR's avatar
XhmikosR committed
1641
1642
1643
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1644

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

Mark Otto's avatar
Mark Otto committed
1647
  Popover.VERSION  = '3.2.0'
1648

XhmikosR's avatar
XhmikosR committed
1649
1650
1651
1652
1653
1654
  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
1655
1656


XhmikosR's avatar
XhmikosR committed
1657
1658
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1659

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

XhmikosR's avatar
XhmikosR committed
1662
  Popover.prototype.constructor = Popover
1663

XhmikosR's avatar
XhmikosR committed
1664
1665
1666
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1667

XhmikosR's avatar
XhmikosR committed
1668
1669
1670
1671
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1672

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

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

XhmikosR's avatar
XhmikosR committed
1680
1681
1682
1683
    // 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()
  }
1684

XhmikosR's avatar
XhmikosR committed
1685
1686
1687
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1688

XhmikosR's avatar
XhmikosR committed
1689
1690
1691
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1692

XhmikosR's avatar
XhmikosR committed
1693
1694
1695
1696
1697
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1698

XhmikosR's avatar
XhmikosR committed
1699
1700
1701
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1702

XhmikosR's avatar
XhmikosR committed
1703
1704
1705
1706
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1707

1708

XhmikosR's avatar
XhmikosR committed
1709
1710
  // POPOVER PLUGIN DEFINITION
  // =========================
1711

XhmikosR's avatar
XhmikosR committed
1712
1713
  function Plugin(option) {
    return this.each(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1714
1715
1716
1717
      var $this    = $(this)
      var data     = $this.data('bs.popover')
      var options  = typeof option == 'object' && option
      var selector = options && options.selector
Chris Rebert's avatar
Chris Rebert committed
1718

XhmikosR's avatar
XhmikosR committed
1719
      if (!data && option == 'destroy') return
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1720
1721
1722
1723
1724
1725
      if (selector) {
        if (!data) $this.data('bs.popover', (data = {}))
        if (!data[selector]) data[selector] = new Popover(this, options)
      } else {
        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      }
XhmikosR's avatar
XhmikosR committed
1726
1727
1728
      if (typeof option == 'string') data[option]()
    })
  }
1729

XhmikosR's avatar
XhmikosR committed
1730
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1731

XhmikosR's avatar
XhmikosR committed
1732
1733
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1734

1735

XhmikosR's avatar
XhmikosR committed
1736
1737
  // POPOVER NO CONFLICT
  // ===================
1738

XhmikosR's avatar
XhmikosR committed
1739
1740
1741
1742
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1743

XhmikosR's avatar
XhmikosR committed
1744
}(jQuery);
1745

1746
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1747
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1748
 * http://getbootstrap.com/javascript/#scrollspy
1749
 * ========================================================================
1750
 * Copyright 2011-2014 Twitter, Inc.
1751
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1752
 * ======================================================================== */
1753
1754


XhmikosR's avatar
XhmikosR committed
1755
1756
+function ($) {
  'use strict';
1757

XhmikosR's avatar
XhmikosR committed
1758
1759
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1760

XhmikosR's avatar
XhmikosR committed
1761
1762
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1763

XhmikosR's avatar
XhmikosR committed
1764
1765
1766
1767
1768
1769
1770
1771
    this.$body          = $('body')
    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0
1772

XhmikosR's avatar
XhmikosR committed
1773
1774
1775
1776
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1777

Mark Otto's avatar
Mark Otto committed
1778
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1779

XhmikosR's avatar
XhmikosR committed
1780
1781
1782
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1783

XhmikosR's avatar
XhmikosR committed
1784
1785
1786
  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
1787

XhmikosR's avatar
XhmikosR committed
1788
1789
1790
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1791

XhmikosR's avatar
XhmikosR committed
1792
1793
1794
1795
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1796

XhmikosR's avatar
XhmikosR committed
1797
1798
1799
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1800

XhmikosR's avatar
XhmikosR committed
1801
    var self     = this
XhmikosR's avatar
XhmikosR committed
1802

XhmikosR's avatar
XhmikosR committed
1803
1804
1805
1806
1807
1808
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1809

XhmikosR's avatar
XhmikosR committed
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }

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

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

XhmikosR's avatar
XhmikosR committed
1835
1836
1837
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1838

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1839
1840
1841
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1842
    }
1843

XhmikosR's avatar
XhmikosR committed
1844
1845
1846
1847
1848
1849
1850
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1851

XhmikosR's avatar
XhmikosR committed
1852
1853
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1854

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1855
    this.clear()
1856

XhmikosR's avatar
XhmikosR committed
1857
1858
1859
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1860

XhmikosR's avatar
XhmikosR committed
1861
1862
1863
    var active = $(selector)
      .parents('li')
      .addClass('active')
1864

XhmikosR's avatar
XhmikosR committed
1865
1866
1867
1868
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1869
    }
1870

XhmikosR's avatar
XhmikosR committed
1871
1872
    active.trigger('activate.bs.scrollspy')
  }
1873

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1874
1875
1876
1877
1878
1879
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1880

XhmikosR's avatar
XhmikosR committed
1881
1882
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1883

XhmikosR's avatar
XhmikosR committed
1884
1885
1886
1887
1888
  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
1889

XhmikosR's avatar
XhmikosR committed
1890
1891
1892
1893
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1894

XhmikosR's avatar
XhmikosR committed
1895
  var old = $.fn.scrollspy
1896

XhmikosR's avatar
XhmikosR committed
1897
1898
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1899

1900

XhmikosR's avatar
XhmikosR committed
1901
1902
  // SCROLLSPY NO CONFLICT
  // =====================
1903

XhmikosR's avatar
XhmikosR committed
1904
1905
1906
1907
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1908

Chris Rebert's avatar
Chris Rebert committed
1909

XhmikosR's avatar
XhmikosR committed
1910
1911
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1912

XhmikosR's avatar
XhmikosR committed
1913
1914
1915
1916
1917
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1918
  })
1919

XhmikosR's avatar
XhmikosR committed
1920
}(jQuery);
1921

1922
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1923
 * Bootstrap: tab.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1924
 * http://getbootstrap.com/javascript/#tabs
1925
 * ========================================================================
1926
 * Copyright 2011-2014 Twitter, Inc.
1927
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1928
 * ======================================================================== */
1929

1930

XhmikosR's avatar
XhmikosR committed
1931
1932
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1933

XhmikosR's avatar
XhmikosR committed
1934
1935
  // TAB CLASS DEFINITION
  // ====================
1936

XhmikosR's avatar
XhmikosR committed
1937
1938
1939
  var Tab = function (element) {
    this.element = $(element)
  }
1940

Mark Otto's avatar
Mark Otto committed
1941
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1942

1943
1944
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1945
1946
1947
1948
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1949

XhmikosR's avatar
XhmikosR committed
1950
1951
1952
1953
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1954

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1957
1958
1959
1960
1961
1962
    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
1963
    })
1964

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1965
1966
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
1967

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

XhmikosR's avatar
XhmikosR committed
1970
    var $target = $(selector)
1971

XhmikosR's avatar
XhmikosR committed
1972
1973
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1974
1975
1976
1977
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
1978
1979
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1980
        relatedTarget: $previous[0]
1981
      })
XhmikosR's avatar
XhmikosR committed
1982
1983
    })
  }
1984

XhmikosR's avatar
XhmikosR committed
1985
1986
1987
1988
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
Mark Otto's avatar
grunt    
Mark Otto committed
1989
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
1990

XhmikosR's avatar
XhmikosR committed
1991
1992
1993
1994
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
1995
1996
1997
1998
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
1999

Mark Otto's avatar
grunt    
Mark Otto committed
2000
2001
2002
2003
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2004
2005
2006
2007
2008
2009

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

XhmikosR's avatar
XhmikosR committed
2012
      if (element.parent('.dropdown-menu')) {
Mark Otto's avatar
grunt    
Mark Otto committed
2013
2014
2015
2016
2017
2018
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2019
      }
fat's avatar
fat committed
2020

XhmikosR's avatar
XhmikosR committed
2021
      callback && callback()
2022
    }
fat's avatar
fat committed
2023

Mark Otto's avatar
grunt    
Mark Otto committed
2024
    $active.length && transition ?
XhmikosR's avatar
XhmikosR committed
2025
2026
      $active
        .one('bsTransitionEnd', next)
2027
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
2028
      next()
2029

XhmikosR's avatar
XhmikosR committed
2030
2031
    $active.removeClass('in')
  }
2032
2033


XhmikosR's avatar
XhmikosR committed
2034
2035
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
2036

XhmikosR's avatar
XhmikosR committed
2037
2038
2039
2040
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
2041

XhmikosR's avatar
XhmikosR committed
2042
2043
2044
2045
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
Mark Otto's avatar
Mark Otto committed
2046

XhmikosR's avatar
XhmikosR committed
2047
  var old = $.fn.tab
2048

XhmikosR's avatar
XhmikosR committed
2049
2050
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
2051

2052

XhmikosR's avatar
XhmikosR committed
2053
2054
  // TAB NO CONFLICT
  // ===============
2055

XhmikosR's avatar
XhmikosR committed
2056
2057
2058
2059
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
2060
2061


XhmikosR's avatar
XhmikosR committed
2062
2063
2064
2065
2066
2067
  // TAB DATA-API
  // ============

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

XhmikosR's avatar
XhmikosR committed
2070
}(jQuery);
2071

2072
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2073
 * Bootstrap: affix.js v3.2.0
Mark Otto's avatar
Mark Otto committed
2074
 * http://getbootstrap.com/javascript/#affix
2075
 * ========================================================================
2076
 * Copyright 2011-2014 Twitter, Inc.
2077
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2078
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2079
2080


XhmikosR's avatar
XhmikosR committed
2081
2082
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2083

XhmikosR's avatar
XhmikosR committed
2084
2085
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
2086

XhmikosR's avatar
XhmikosR committed
2087
2088
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
Mark Otto's avatar
Mark Otto committed
2089

XhmikosR's avatar
XhmikosR committed
2090
2091
2092
    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
2093

XhmikosR's avatar
XhmikosR committed
2094
2095
2096
2097
    this.$element     = $(element)
    this.affixed      =
    this.unpin        =
    this.pinnedOffset = null
fat's avatar
fat committed
2098

XhmikosR's avatar
XhmikosR committed
2099
2100
    this.checkPosition()
  }
fat's avatar
fat committed
2101

Mark Otto's avatar
Mark Otto committed
2102
  Affix.VERSION  = '3.2.0'
2103

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

XhmikosR's avatar
XhmikosR committed
2106
2107
2108
2109
  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }
2110

2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

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

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

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

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

    return false
  }

XhmikosR's avatar
XhmikosR committed
2133
2134
2135
2136
2137
2138
2139
  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)
  }
2140

XhmikosR's avatar
XhmikosR committed
2141
2142
2143
  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }
fat's avatar
fat committed
2144

XhmikosR's avatar
XhmikosR committed
2145
2146
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return
2147

2148
    var height       = this.$element.height()
XhmikosR's avatar
XhmikosR committed
2149
2150
2151
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
2152
    var scrollHeight = $('body').height()
2153

XhmikosR's avatar
XhmikosR committed
2154
2155
2156
    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)
2157

2158
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2159

2160
2161
    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')
2162

2163
2164
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2165

2166
      this.$element.trigger(e)
2167

2168
      if (e.isDefaultPrevented()) return
2169

2170
2171
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2172

2173
2174
2175
2176
2177
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }
2178

XhmikosR's avatar
XhmikosR committed
2179
2180
    if (affix == 'bottom') {
      this.$element.offset({
2181
        top: scrollHeight - height - offsetBottom
XhmikosR's avatar
XhmikosR committed
2182
      })
2183
    }
XhmikosR's avatar
XhmikosR committed
2184
  }
Mark Otto's avatar
Mark Otto committed
2185

2186

XhmikosR's avatar
XhmikosR committed
2187
2188
  // AFFIX PLUGIN DEFINITION
  // =======================
2189

XhmikosR's avatar
XhmikosR committed
2190
2191
2192
2193
2194
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option
2195

XhmikosR's avatar
XhmikosR committed
2196
2197
2198
2199
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
2200

XhmikosR's avatar
XhmikosR committed
2201
  var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2202

XhmikosR's avatar
XhmikosR committed
2203
2204
  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix
2205
2206


XhmikosR's avatar
XhmikosR committed
2207
2208
  // AFFIX NO CONFLICT
  // =================
2209

XhmikosR's avatar
XhmikosR committed
2210
2211
2212
2213
  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }
2214
2215


XhmikosR's avatar
XhmikosR committed
2216
2217
  // AFFIX DATA-API
  // ==============
2218

XhmikosR's avatar
XhmikosR committed
2219
2220
2221
2222
  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()
2223

XhmikosR's avatar
XhmikosR committed
2224
      data.offset = data.offset || {}
2225

Heinrich Fenkart's avatar
Heinrich Fenkart committed
2226
2227
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
2228

XhmikosR's avatar
XhmikosR committed
2229
      Plugin.call($spy, data)
2230
    })
Mark Otto's avatar
Mark Otto committed
2231
2232
  })

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