bootstrap.js 61.9 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

7
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
8

9
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
10
 * Bootstrap: transition.js v3.2.0
Mark Otto's avatar
Mark Otto committed
11
 * http://getbootstrap.com/javascript/#transitions
12
 * ========================================================================
13
 * Copyright 2011-2014 Twitter, Inc.
14
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
 * ======================================================================== */
16
17


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

XhmikosR's avatar
XhmikosR committed
21
22
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
23

XhmikosR's avatar
XhmikosR committed
24
25
  function transitionEnd() {
    var el = document.createElement('bootstrap')
26

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

XhmikosR's avatar
XhmikosR committed
34
35
36
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
37
      }
Chris Rebert's avatar
Chris Rebert committed
38
39
    }

XhmikosR's avatar
XhmikosR committed
40
41
    return false // explicit for ie8 (  ._.)
  }
42

XhmikosR's avatar
XhmikosR committed
43
44
45
46
47
48
49
50
51
  // 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
  }
52

XhmikosR's avatar
XhmikosR committed
53
54
  $(function () {
    $.support.transition = transitionEnd()
Chris Rebert's avatar
Chris Rebert committed
55

XhmikosR's avatar
XhmikosR committed
56
    if (!$.support.transition) return
57

XhmikosR's avatar
XhmikosR committed
58
59
60
61
62
63
64
    $.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
65
  })
66

XhmikosR's avatar
XhmikosR committed
67
}(jQuery);
68

69
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
70
 * Bootstrap: alert.js v3.2.0
Mark Otto's avatar
Mark Otto committed
71
 * http://getbootstrap.com/javascript/#alerts
72
 * ========================================================================
73
 * Copyright 2011-2014 Twitter, Inc.
74
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
75
 * ======================================================================== */
76
77


XhmikosR's avatar
XhmikosR committed
78
79
+function ($) {
  'use strict';
80

XhmikosR's avatar
XhmikosR committed
81
82
  // ALERT CLASS DEFINITION
  // ======================
83

XhmikosR's avatar
XhmikosR committed
84
85
86
87
  var dismiss = '[data-dismiss="alert"]'
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }
Mark Otto's avatar
grunt    
Mark Otto committed
88

Mark Otto's avatar
Mark Otto committed
89
  Alert.VERSION = '3.2.0'
90

91
92
  Alert.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
93
94
95
  Alert.prototype.close = function (e) {
    var $this    = $(this)
    var selector = $this.attr('data-target')
96

XhmikosR's avatar
XhmikosR committed
97
98
99
100
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
101

XhmikosR's avatar
XhmikosR committed
102
    var $parent = $(selector)
103

XhmikosR's avatar
XhmikosR committed
104
    if (e) e.preventDefault()
105

XhmikosR's avatar
XhmikosR committed
106
    if (!$parent.length) {
Chris Rebert's avatar
grunt    
Chris Rebert committed
107
      $parent = $this.closest('.alert')
XhmikosR's avatar
XhmikosR committed
108
    }
109

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

XhmikosR's avatar
XhmikosR committed
112
    if (e.isDefaultPrevented()) return
113

XhmikosR's avatar
XhmikosR committed
114
    $parent.removeClass('in')
115

XhmikosR's avatar
XhmikosR committed
116
117
118
    function removeElement() {
      // detach from parent, fire event then clean up data
      $parent.detach().trigger('closed.bs.alert').remove()
119
120
    }

XhmikosR's avatar
XhmikosR committed
121
122
123
    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
124
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
125
126
      removeElement()
  }
127
128


XhmikosR's avatar
XhmikosR committed
129
130
  // ALERT PLUGIN DEFINITION
  // =======================
131

XhmikosR's avatar
XhmikosR committed
132
133
134
135
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')
fat's avatar
fat committed
136

XhmikosR's avatar
XhmikosR committed
137
138
139
140
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }
141

XhmikosR's avatar
XhmikosR committed
142
  var old = $.fn.alert
Mark Otto's avatar
Mark Otto committed
143

XhmikosR's avatar
XhmikosR committed
144
145
  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert
146
147


XhmikosR's avatar
XhmikosR committed
148
149
  // ALERT NO CONFLICT
  // =================
150

XhmikosR's avatar
XhmikosR committed
151
152
153
154
  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }
155
156


XhmikosR's avatar
XhmikosR committed
157
158
  // ALERT DATA-API
  // ==============
159

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

XhmikosR's avatar
XhmikosR committed
162
}(jQuery);
163

164
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
165
 * Bootstrap: button.js v3.2.0
Mark Otto's avatar
Mark Otto committed
166
 * http://getbootstrap.com/javascript/#buttons
167
 * ========================================================================
168
 * Copyright 2011-2014 Twitter, Inc.
169
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
170
 * ======================================================================== */
171
172


XhmikosR's avatar
XhmikosR committed
173
174
+function ($) {
  'use strict';
fat's avatar
fat committed
175

XhmikosR's avatar
XhmikosR committed
176
177
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
Mark Otto's avatar
grunt    
Mark Otto committed
178

XhmikosR's avatar
XhmikosR committed
179
180
181
182
183
  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }
184

Mark Otto's avatar
Mark Otto committed
185
  Button.VERSION  = '3.2.0'
186

XhmikosR's avatar
XhmikosR committed
187
188
189
  Button.DEFAULTS = {
    loadingText: 'loading...'
  }
fat's avatar
fat committed
190

XhmikosR's avatar
XhmikosR committed
191
192
193
194
195
  Button.prototype.setState = function (state) {
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()
196

XhmikosR's avatar
XhmikosR committed
197
    state = state + 'Text'
198

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

XhmikosR's avatar
XhmikosR committed
201
    $el[val](data[state] == null ? this.options[state] : data[state])
Chris Rebert's avatar
Chris Rebert committed
202

XhmikosR's avatar
XhmikosR committed
203
204
205
206
207
208
209
210
    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d)
211
      }
XhmikosR's avatar
XhmikosR committed
212
213
214
215
216
217
218
219
220
221
222
223
224
225
    }, 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')
fat's avatar
fat committed
226
    }
227

XhmikosR's avatar
XhmikosR committed
228
229
    if (changed) this.$element.toggleClass('active')
  }
230
231


XhmikosR's avatar
XhmikosR committed
232
233
  // BUTTON PLUGIN DEFINITION
  // ========================
234

XhmikosR's avatar
XhmikosR committed
235
236
237
238
239
  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
240

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

XhmikosR's avatar
XhmikosR committed
243
244
245
246
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }
247

XhmikosR's avatar
XhmikosR committed
248
  var old = $.fn.button
Mark Otto's avatar
Mark Otto committed
249

XhmikosR's avatar
XhmikosR committed
250
251
  $.fn.button             = Plugin
  $.fn.button.Constructor = Button
252
253


XhmikosR's avatar
XhmikosR committed
254
255
  // BUTTON NO CONFLICT
  // ==================
256

XhmikosR's avatar
XhmikosR committed
257
258
259
260
  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }
261
262


XhmikosR's avatar
XhmikosR committed
263
264
  // BUTTON DATA-API
  // ===============
265

Mark Otto's avatar
grunt    
Mark Otto committed
266
267
268
269
270
271
272
  $(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
273
274
    .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
275
    })
276

XhmikosR's avatar
XhmikosR committed
277
}(jQuery);
278

279
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
280
 * Bootstrap: carousel.js v3.2.0
Mark Otto's avatar
Mark Otto committed
281
 * http://getbootstrap.com/javascript/#carousel
282
 * ========================================================================
283
 * Copyright 2011-2014 Twitter, Inc.
284
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
285
 * ======================================================================== */
286
287


XhmikosR's avatar
XhmikosR committed
288
289
+function ($) {
  'use strict';
290

XhmikosR's avatar
XhmikosR committed
291
292
  // CAROUSEL CLASS DEFINITION
  // =========================
293

XhmikosR's avatar
XhmikosR committed
294
295
296
297
298
299
300
301
302
  var Carousel = function (element, options) {
    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
    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
303

XhmikosR's avatar
XhmikosR committed
304
305
306
307
    this.options.pause == 'hover' && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
308

Mark Otto's avatar
Mark Otto committed
309
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
310

311
312
  Carousel.TRANSITION_DURATION = 600

XhmikosR's avatar
XhmikosR committed
313
314
315
316
317
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true
  }
318

XhmikosR's avatar
XhmikosR committed
319
320
321
322
323
  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
324
325
    }

XhmikosR's avatar
XhmikosR committed
326
327
    e.preventDefault()
  }
328

XhmikosR's avatar
XhmikosR committed
329
330
  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)
fat's avatar
fat committed
331

XhmikosR's avatar
XhmikosR committed
332
    this.interval && clearInterval(this.interval)
333

XhmikosR's avatar
XhmikosR committed
334
335
336
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
337

XhmikosR's avatar
XhmikosR committed
338
339
    return this
  }
340

XhmikosR's avatar
XhmikosR committed
341
342
343
344
  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }
345

XhmikosR's avatar
XhmikosR committed
346
347
348
349
350
351
352
  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
353
354
355
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
356

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

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

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

XhmikosR's avatar
XhmikosR committed
365
366
367
368
369
370
  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)
371
372
    }

XhmikosR's avatar
XhmikosR committed
373
    this.interval = clearInterval(this.interval)
374

XhmikosR's avatar
XhmikosR committed
375
376
    return this
  }
377

XhmikosR's avatar
XhmikosR committed
378
379
380
381
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
382

XhmikosR's avatar
XhmikosR committed
383
384
385
386
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
387

XhmikosR's avatar
XhmikosR committed
388
389
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
390
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
391
392
393
394
    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
395

XhmikosR's avatar
XhmikosR committed
396
397
398
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
399
400
    }

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

XhmikosR's avatar
XhmikosR committed
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
    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)
        })
436
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
437
438
439
440
441
442
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
443

XhmikosR's avatar
XhmikosR committed
444
    isCycling && this.cycle()
445

XhmikosR's avatar
XhmikosR committed
446
447
    return this
  }
448
449


XhmikosR's avatar
XhmikosR committed
450
451
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
452

XhmikosR's avatar
XhmikosR committed
453
454
455
456
457
458
459
460
461
462
463
464
465
  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()
    })
  }
466

XhmikosR's avatar
XhmikosR committed
467
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
468

XhmikosR's avatar
XhmikosR committed
469
470
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
471
472


XhmikosR's avatar
XhmikosR committed
473
474
  // CAROUSEL NO CONFLICT
  // ====================
475

XhmikosR's avatar
XhmikosR committed
476
477
478
479
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
480

fat's avatar
fat committed
481

XhmikosR's avatar
XhmikosR committed
482
483
  // CAROUSEL DATA-API
  // =================
484

XhmikosR's avatar
XhmikosR committed
485
486
487
488
489
490
491
492
  $(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
493

XhmikosR's avatar
XhmikosR committed
494
    Plugin.call($target, options)
495

XhmikosR's avatar
XhmikosR committed
496
497
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
498
499
    }

XhmikosR's avatar
XhmikosR committed
500
501
    e.preventDefault()
  })
502

XhmikosR's avatar
XhmikosR committed
503
504
505
506
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
fat's avatar
fat committed
507
508
509
    })
  })

XhmikosR's avatar
XhmikosR committed
510
}(jQuery);
511

512
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
513
 * Bootstrap: collapse.js v3.2.0
Mark Otto's avatar
Mark Otto committed
514
 * http://getbootstrap.com/javascript/#collapse
515
 * ========================================================================
516
 * Copyright 2011-2014 Twitter, Inc.
517
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
518
 * ======================================================================== */
519
520


XhmikosR's avatar
XhmikosR committed
521
522
+function ($) {
  'use strict';
523

XhmikosR's avatar
XhmikosR committed
524
525
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
526

XhmikosR's avatar
XhmikosR committed
527
528
529
530
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
531

XhmikosR's avatar
XhmikosR committed
532
533
534
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
535

Mark Otto's avatar
Mark Otto committed
536
  Collapse.VERSION  = '3.2.0'
537

538
539
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
540
541
542
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
543

XhmikosR's avatar
XhmikosR committed
544
545
546
547
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
548

XhmikosR's avatar
XhmikosR committed
549
550
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
551

XhmikosR's avatar
XhmikosR committed
552
553
554
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
555

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
556
    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
557

XhmikosR's avatar
XhmikosR committed
558
559
560
561
562
563
    if (actives && actives.length) {
      var hasData = actives.data('bs.collapse')
      if (hasData && hasData.transitioning) return
      Plugin.call(actives, 'hide')
      hasData || actives.data('bs.collapse', null)
    }
564

XhmikosR's avatar
XhmikosR committed
565
    var dimension = this.dimension()
566

XhmikosR's avatar
XhmikosR committed
567
568
569
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
570
      .attr('aria-expanded', true)
571

XhmikosR's avatar
XhmikosR committed
572
    this.transitioning = 1
573

XhmikosR's avatar
XhmikosR committed
574
575
576
577
578
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
579
      this.$element
XhmikosR's avatar
XhmikosR committed
580
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
581
    }
582

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

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

XhmikosR's avatar
XhmikosR committed
587
588
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
589
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
590
  }
591

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

XhmikosR's avatar
XhmikosR committed
595
596
597
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
598

XhmikosR's avatar
XhmikosR committed
599
    var dimension = this.dimension()
600

XhmikosR's avatar
XhmikosR committed
601
602
603
604
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
608
    this.transitioning = 1
609

XhmikosR's avatar
XhmikosR committed
610
611
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
612
      this.$element
XhmikosR's avatar
XhmikosR committed
613
614
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
615
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
616
    }
617

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

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

XhmikosR's avatar
XhmikosR committed
626
627
628
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
629

630

XhmikosR's avatar
XhmikosR committed
631
632
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
633

XhmikosR's avatar
XhmikosR committed
634
635
636
637
638
  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
639

Mark Otto's avatar
grunt    
Mark Otto committed
640
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
641
642
643
644
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
645

XhmikosR's avatar
XhmikosR committed
646
  var old = $.fn.collapse
647

XhmikosR's avatar
XhmikosR committed
648
649
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
650

651

XhmikosR's avatar
XhmikosR committed
652
653
  // COLLAPSE NO CONFLICT
  // ====================
654

XhmikosR's avatar
XhmikosR committed
655
656
657
658
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
659

660

XhmikosR's avatar
XhmikosR committed
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
  // 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
677
678
679
      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
680
    }
fat's avatar
fat committed
681

XhmikosR's avatar
XhmikosR committed
682
    Plugin.call($target, option)
683
684
  })

XhmikosR's avatar
XhmikosR committed
685
}(jQuery);
686

687
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
688
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
689
 * http://getbootstrap.com/javascript/#dropdowns
690
 * ========================================================================
691
 * Copyright 2011-2014 Twitter, Inc.
692
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
693
 * ======================================================================== */
694
695


XhmikosR's avatar
XhmikosR committed
696
697
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
698

XhmikosR's avatar
XhmikosR committed
699
700
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
701

XhmikosR's avatar
XhmikosR committed
702
703
704
705
706
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
707

Mark Otto's avatar
Mark Otto committed
708
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
709

XhmikosR's avatar
XhmikosR committed
710
711
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
712

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

XhmikosR's avatar
XhmikosR committed
715
716
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
717

XhmikosR's avatar
XhmikosR committed
718
    clearMenus()
fat's avatar
fat committed
719

XhmikosR's avatar
XhmikosR committed
720
721
722
723
724
    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)
      }
725

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

XhmikosR's avatar
XhmikosR committed
729
      if (e.isDefaultPrevented()) return
730

731
732
733
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
734

XhmikosR's avatar
XhmikosR committed
735
736
737
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
738
    }
739

XhmikosR's avatar
XhmikosR committed
740
741
    return false
  }
742

XhmikosR's avatar
XhmikosR committed
743
744
  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return
745

XhmikosR's avatar
XhmikosR committed
746
    var $this = $(this)
747

XhmikosR's avatar
XhmikosR committed
748
749
    e.preventDefault()
    e.stopPropagation()
750

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

XhmikosR's avatar
XhmikosR committed
753
754
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
755

XhmikosR's avatar
XhmikosR committed
756
757
758
759
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
760

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

XhmikosR's avatar
XhmikosR committed
764
    if (!$items.length) return
765

XhmikosR's avatar
XhmikosR committed
766
    var index = $items.index($items.filter(':focus'))
767

XhmikosR's avatar
XhmikosR committed
768
769
770
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    if (!~index)                                      index = 0
771

XhmikosR's avatar
XhmikosR committed
772
773
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
774

XhmikosR's avatar
XhmikosR committed
775
776
777
778
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
779
780
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
781
      var relatedTarget = { relatedTarget: this }
782

XhmikosR's avatar
XhmikosR committed
783
      if (!$parent.hasClass('open')) return
784

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

XhmikosR's avatar
XhmikosR committed
787
      if (e.isDefaultPrevented()) return
788
789

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
790
791
792
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
793

XhmikosR's avatar
XhmikosR committed
794
795
  function getParent($this) {
    var selector = $this.attr('data-target')
796

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

XhmikosR's avatar
XhmikosR committed
802
    var $parent = selector && $(selector)
803

XhmikosR's avatar
XhmikosR committed
804
805
    return $parent && $parent.length ? $parent : $this.parent()
  }
806
807


XhmikosR's avatar
XhmikosR committed
808
809
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
810

XhmikosR's avatar
XhmikosR committed
811
812
813
814
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
815

XhmikosR's avatar
XhmikosR committed
816
817
818
819
      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
820

XhmikosR's avatar
XhmikosR committed
821
  var old = $.fn.dropdown
822

XhmikosR's avatar
XhmikosR committed
823
824
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
825

826

XhmikosR's avatar
XhmikosR committed
827
828
  // DROPDOWN NO CONFLICT
  // ====================
829

XhmikosR's avatar
XhmikosR committed
830
831
832
833
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
834

835

XhmikosR's avatar
XhmikosR committed
836
837
838
839
840
841
842
843
  // 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)
844

XhmikosR's avatar
XhmikosR committed
845
}(jQuery);
846

847
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
848
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
849
 * http://getbootstrap.com/javascript/#modals
850
 * ========================================================================
851
 * Copyright 2011-2014 Twitter, Inc.
852
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
853
 * ======================================================================== */
854
855


XhmikosR's avatar
XhmikosR committed
856
857
+function ($) {
  'use strict';
858

XhmikosR's avatar
XhmikosR committed
859
860
  // MODAL CLASS DEFINITION
  // ======================
861

XhmikosR's avatar
XhmikosR committed
862
863
864
865
866
867
868
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
869

XhmikosR's avatar
XhmikosR committed
870
871
872
873
874
875
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
876
    }
XhmikosR's avatar
XhmikosR committed
877
  }
878

Mark Otto's avatar
Mark Otto committed
879
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
880

881
882
883
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
884
885
886
887
888
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
889

XhmikosR's avatar
XhmikosR committed
890
891
892
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
893

XhmikosR's avatar
XhmikosR committed
894
895
896
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
897

XhmikosR's avatar
XhmikosR committed
898
    this.$element.trigger(e)
899

XhmikosR's avatar
XhmikosR committed
900
    if (this.isShown || e.isDefaultPrevented()) return
901

XhmikosR's avatar
XhmikosR committed
902
    this.isShown = true
fat's avatar
build    
fat committed
903

XhmikosR's avatar
XhmikosR committed
904
905
    this.checkScrollbar()
    this.$body.addClass('modal-open')
906

XhmikosR's avatar
XhmikosR committed
907
908
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
909

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

XhmikosR's avatar
XhmikosR committed
912
913
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
914

XhmikosR's avatar
XhmikosR committed
915
916
917
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
918

XhmikosR's avatar
XhmikosR committed
919
920
921
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
922

XhmikosR's avatar
XhmikosR committed
923
924
925
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
926

XhmikosR's avatar
XhmikosR committed
927
928
929
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
930

XhmikosR's avatar
XhmikosR committed
931
      that.enforceFocus()
932

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

XhmikosR's avatar
XhmikosR committed
935
936
937
938
939
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
940
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
941
942
943
        that.$element.trigger('focus').trigger(e)
    })
  }
944

XhmikosR's avatar
XhmikosR committed
945
946
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
947

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

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

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

XhmikosR's avatar
XhmikosR committed
954
    this.isShown = false
955

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

XhmikosR's avatar
XhmikosR committed
958
959
    this.resetScrollbar()
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
960

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

XhmikosR's avatar
XhmikosR committed
963
964
965
966
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
967

XhmikosR's avatar
XhmikosR committed
968
969
970
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
971
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
972
973
      this.hideModal()
  }
974

XhmikosR's avatar
XhmikosR committed
975
976
977
978
979
980
981
982
983
984
985
986
  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
987
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
988
989
990
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
991
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
992
993
994
995
996
997
998
999
1000
1001
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.$element.trigger('hidden.bs.modal')
    })
  }
1002

XhmikosR's avatar
XhmikosR committed
1003
1004
1005
1006
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1007

XhmikosR's avatar
XhmikosR committed
1008
1009
1010
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1011

XhmikosR's avatar
XhmikosR committed
1012
1013
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1014

XhmikosR's avatar
XhmikosR committed
1015
1016
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
        .appendTo(this.$body)
1017

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1018
      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1019
1020
1021
1022
1023
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus.call(this.$element[0])
          : this.hide.call(this)
      }, this))
1024

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

XhmikosR's avatar
XhmikosR committed
1027
      this.$backdrop.addClass('in')
1028

XhmikosR's avatar
XhmikosR committed
1029
      if (!callback) return
1030

XhmikosR's avatar
XhmikosR committed
1031
1032
1033
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1034
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1035
        callback()
1036

XhmikosR's avatar
XhmikosR committed
1037
1038
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1039

XhmikosR's avatar
XhmikosR committed
1040
1041
1042
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1043
      }
XhmikosR's avatar
XhmikosR committed
1044
1045
1046
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1047
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1048
        callbackRemove()
1049

XhmikosR's avatar
XhmikosR committed
1050
1051
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1052
    }
XhmikosR's avatar
XhmikosR committed
1053
  }
1054

XhmikosR's avatar
XhmikosR committed
1055
  Modal.prototype.checkScrollbar = function () {
Mark Otto's avatar
grunt    
Mark Otto committed
1056
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1057
  }
fat's avatar
build    
fat committed
1058

XhmikosR's avatar
XhmikosR committed
1059
1060
1061
1062
  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
1063

XhmikosR's avatar
XhmikosR committed
1064
1065
1066
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1067

XhmikosR's avatar
XhmikosR committed
1068
  Modal.prototype.measureScrollbar = function () { // thx walsh
Mark Otto's avatar
grunt    
Mark Otto committed
1069
    if (document.body.clientWidth >= window.innerWidth) return 0
XhmikosR's avatar
XhmikosR committed
1070
1071
1072
1073
1074
1075
1076
    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
  }
1077
1078


XhmikosR's avatar
XhmikosR committed
1079
1080
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1081

XhmikosR's avatar
XhmikosR committed
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
  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)
    })
  }
1093

XhmikosR's avatar
XhmikosR committed
1094
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1095

XhmikosR's avatar
XhmikosR committed
1096
1097
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1098
1099


XhmikosR's avatar
XhmikosR committed
1100
1101
  // MODAL NO CONFLICT
  // =================
1102

XhmikosR's avatar
XhmikosR committed
1103
1104
1105
1106
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1107
1108


XhmikosR's avatar
XhmikosR committed
1109
1110
  // MODAL DATA-API
  // ==============
1111

XhmikosR's avatar
XhmikosR committed
1112
1113
1114
1115
1116
  $(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())
1117

XhmikosR's avatar
XhmikosR committed
1118
    if ($this.is('a')) e.preventDefault()
1119

XhmikosR's avatar
XhmikosR committed
1120
1121
1122
1123
    $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
1124
      })
Mark Otto's avatar
Mark Otto committed
1125
    })
XhmikosR's avatar
XhmikosR committed
1126
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1127
  })
1128

XhmikosR's avatar
XhmikosR committed
1129
}(jQuery);
1130

1131
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1132
 * Bootstrap: tooltip.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1133
 * http://getbootstrap.com/javascript/#tooltip
1134
 * Inspired by the original jQuery.tipsy by Jason Frame
1135
 * ========================================================================
1136
 * Copyright 2011-2014 Twitter, Inc.
1137
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1138
 * ======================================================================== */
1139
1140


XhmikosR's avatar
XhmikosR committed
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
+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
1158
  Tooltip.VERSION  = '3.2.0'
XhmikosR's avatar
XhmikosR committed
1159

1160
1161
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
  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))
      }
    }
1200

XhmikosR's avatar
XhmikosR committed
1201
1202
1203
1204
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1205

XhmikosR's avatar
XhmikosR committed
1206
1207
1208
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1209

XhmikosR's avatar
XhmikosR committed
1210
1211
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1212

XhmikosR's avatar
XhmikosR committed
1213
1214
1215
1216
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1217
1218
      }
    }
1219

XhmikosR's avatar
XhmikosR committed
1220
1221
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1222

XhmikosR's avatar
XhmikosR committed
1223
1224
1225
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1226

XhmikosR's avatar
XhmikosR committed
1227
1228
1229
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1230

XhmikosR's avatar
XhmikosR committed
1231
1232
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1233

XhmikosR's avatar
XhmikosR committed
1234
1235
1236
  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
1237

XhmikosR's avatar
XhmikosR committed
1238
1239
1240
1241
1242
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1243
1244
1245
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1246
    }
1247

XhmikosR's avatar
XhmikosR committed
1248
    clearTimeout(self.timeout)
1249

XhmikosR's avatar
XhmikosR committed
1250
    self.hoverState = 'in'
1251

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

XhmikosR's avatar
XhmikosR committed
1254
1255
1256
1257
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1258

XhmikosR's avatar
XhmikosR committed
1259
1260
1261
  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
1262

XhmikosR's avatar
XhmikosR committed
1263
1264
1265
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1266
    }
1267

XhmikosR's avatar
XhmikosR committed
1268
    clearTimeout(self.timeout)
fat's avatar
fat committed
1269

XhmikosR's avatar
XhmikosR committed
1270
    self.hoverState = 'out'
1271

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

XhmikosR's avatar
XhmikosR committed
1274
1275
1276
1277
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1278

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

XhmikosR's avatar
XhmikosR committed
1282
1283
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1284

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1285
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1286
1287
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1288

XhmikosR's avatar
XhmikosR committed
1289
      var $tip = this.tip()
fat's avatar
fat committed
1290

XhmikosR's avatar
XhmikosR committed
1291
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1292

XhmikosR's avatar
XhmikosR committed
1293
1294
1295
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1296

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

XhmikosR's avatar
XhmikosR committed
1299
1300
1301
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1302

XhmikosR's avatar
XhmikosR committed
1303
1304
1305
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1306

XhmikosR's avatar
XhmikosR committed
1307
1308
1309
1310
1311
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1312

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

XhmikosR's avatar
XhmikosR committed
1315
1316
1317
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1318

XhmikosR's avatar
XhmikosR committed
1319
1320
1321
1322
      if (autoPlace) {
        var orgPlacement = placement
        var $parent      = this.$element.parent()
        var parentDim    = this.getPosition($parent)
Chris Rebert's avatar
Chris Rebert committed
1323

XhmikosR's avatar
XhmikosR committed
1324
1325
1326
1327
1328
        placement = placement == 'bottom' && pos.top   + pos.height       + actualHeight - parentDim.scroll > parentDim.height ? 'top'    :
                    placement == 'top'    && pos.top   - parentDim.scroll - actualHeight < 0                                   ? 'bottom' :
                    placement == 'right'  && pos.right + actualWidth      > parentDim.width                                    ? 'left'   :
                    placement == 'left'   && pos.left  - actualWidth      < parentDim.left                                     ? 'right'  :
                    placement
fat's avatar
fat committed
1329

1330
        $tip
XhmikosR's avatar
XhmikosR committed
1331
          .removeClass(orgPlacement)
1332
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1333
      }
1334

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

XhmikosR's avatar
XhmikosR committed
1337
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1338

XhmikosR's avatar
XhmikosR committed
1339
1340
1341
1342
      var complete = function () {
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
      }
fat's avatar
fat committed
1343

XhmikosR's avatar
XhmikosR committed
1344
1345
1346
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1347
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1348
1349
1350
        complete()
    }
  }
fat's avatar
fat committed
1351

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

XhmikosR's avatar
XhmikosR committed
1357
1358
1359
    // 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
1360

XhmikosR's avatar
XhmikosR committed
1361
1362
1363
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1364

XhmikosR's avatar
XhmikosR committed
1365
1366
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1367

XhmikosR's avatar
XhmikosR committed
1368
1369
1370
1371
1372
1373
1374
1375
    // $.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)
        })
1376
      }
XhmikosR's avatar
XhmikosR committed
1377
    }, offset), 0)
1378

XhmikosR's avatar
XhmikosR committed
1379
    $tip.addClass('in')
fat's avatar
fat committed
1380

XhmikosR's avatar
XhmikosR committed
1381
1382
1383
    // 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
1384

XhmikosR's avatar
XhmikosR committed
1385
1386
1387
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1388

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

XhmikosR's avatar
XhmikosR committed
1391
1392
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1393

XhmikosR's avatar
XhmikosR committed
1394
1395
1396
    var arrowDelta          = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowPosition       = delta.left ? 'left'        : 'top'
    var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
1397

XhmikosR's avatar
XhmikosR committed
1398
1399
1400
    $tip.offset(offset)
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition)
  }
1401

XhmikosR's avatar
XhmikosR committed
1402
1403
1404
  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
  }
1405

XhmikosR's avatar
XhmikosR committed
1406
1407
1408
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1409

XhmikosR's avatar
XhmikosR committed
1410
1411
1412
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1413

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1414
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1415
1416
1417
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1418

XhmikosR's avatar
XhmikosR committed
1419
1420
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1421
1422
1423
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1424
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1425
    }
Jacob Thornton's avatar
Jacob Thornton committed
1426

XhmikosR's avatar
XhmikosR committed
1427
    this.$element.trigger(e)
1428

XhmikosR's avatar
XhmikosR committed
1429
    if (e.isDefaultPrevented()) return
1430

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

XhmikosR's avatar
XhmikosR committed
1433
1434
1435
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1436
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1437
      complete()
1438

XhmikosR's avatar
XhmikosR committed
1439
    this.hoverState = null
1440

XhmikosR's avatar
XhmikosR committed
1441
1442
    return this
  }
1443

XhmikosR's avatar
XhmikosR committed
1444
1445
1446
1447
  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', '')
1448
    }
XhmikosR's avatar
XhmikosR committed
1449
  }
1450

XhmikosR's avatar
XhmikosR committed
1451
1452
1453
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1454

XhmikosR's avatar
XhmikosR committed
1455
1456
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1457

XhmikosR's avatar
XhmikosR committed
1458
1459
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1460
1461
    var isSvg  = window.SVGElement && el instanceof window.SVGElement

Mark Otto's avatar
grunt    
Mark Otto committed
1462
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1463
1464
1465
1466
    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
1467
1468
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
Chris Rebert's avatar
Chris Rebert committed
1469
    var outerDims = isSvg ? {} : {
XhmikosR's avatar
XhmikosR committed
1470
1471
      width:  isBody ? $(window).width()  : $element.outerWidth(),
      height: isBody ? $(window).height() : $element.outerHeight()
Chris Rebert's avatar
Chris Rebert committed
1472
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1473
1474

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

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

XhmikosR's avatar
XhmikosR committed
1483
  }
1484

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

XhmikosR's avatar
XhmikosR committed
1489
1490
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1491

XhmikosR's avatar
XhmikosR committed
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
    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
1507
      }
Chris Rebert's avatar
Chris Rebert committed
1508
    }
fat's avatar
fat committed
1509

XhmikosR's avatar
XhmikosR committed
1510
1511
    return delta
  }
1512

XhmikosR's avatar
XhmikosR committed
1513
1514
1515
1516
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1517

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

XhmikosR's avatar
XhmikosR committed
1521
1522
    return title
  }
1523

XhmikosR's avatar
XhmikosR committed
1524
1525
1526
1527
1528
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1529

XhmikosR's avatar
XhmikosR committed
1530
1531
1532
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1533

XhmikosR's avatar
XhmikosR committed
1534
1535
1536
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1537

XhmikosR's avatar
XhmikosR committed
1538
1539
1540
1541
1542
  Tooltip.prototype.validate = function () {
    if (!this.$element[0].parentNode) {
      this.hide()
      this.$element = null
      this.options  = null
Chris Rebert's avatar
Chris Rebert committed
1543
    }
XhmikosR's avatar
XhmikosR committed
1544
  }
1545

XhmikosR's avatar
XhmikosR committed
1546
1547
1548
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1549

XhmikosR's avatar
XhmikosR committed
1550
1551
1552
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1553

XhmikosR's avatar
XhmikosR committed
1554
1555
1556
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1557

XhmikosR's avatar
XhmikosR committed
1558
1559
1560
1561
1562
1563
1564
1565
  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
1566
1567
    }

XhmikosR's avatar
XhmikosR committed
1568
1569
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1570

XhmikosR's avatar
XhmikosR committed
1571
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1572
    var that = this
XhmikosR's avatar
XhmikosR committed
1573
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1574
1575
1576
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1577
  }
1578
1579


XhmikosR's avatar
XhmikosR committed
1580
1581
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1582

XhmikosR's avatar
XhmikosR committed
1583
1584
1585
1586
1587
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1588

XhmikosR's avatar
XhmikosR committed
1589
1590
1591
1592
1593
      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1594

XhmikosR's avatar
XhmikosR committed
1595
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1596

XhmikosR's avatar
XhmikosR committed
1597
1598
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1599

1600

XhmikosR's avatar
XhmikosR committed
1601
1602
  // TOOLTIP NO CONFLICT
  // ===================
1603

XhmikosR's avatar
XhmikosR committed
1604
1605
1606
1607
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1608

XhmikosR's avatar
XhmikosR committed
1609
}(jQuery);
1610

1611
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1612
 * Bootstrap: popover.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1613
 * http://getbootstrap.com/javascript/#popovers
1614
 * ========================================================================
1615
 * Copyright 2011-2014 Twitter, Inc.
1616
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1617
 * ======================================================================== */
1618
1619


XhmikosR's avatar
XhmikosR committed
1620
1621
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1622

XhmikosR's avatar
XhmikosR committed
1623
1624
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1625

XhmikosR's avatar
XhmikosR committed
1626
1627
1628
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1629

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

Mark Otto's avatar
Mark Otto committed
1632
  Popover.VERSION  = '3.2.0'
1633

XhmikosR's avatar
XhmikosR committed
1634
1635
1636
1637
1638
1639
  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
1640
1641


XhmikosR's avatar
XhmikosR committed
1642
1643
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1644

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

XhmikosR's avatar
XhmikosR committed
1647
  Popover.prototype.constructor = Popover
1648

XhmikosR's avatar
XhmikosR committed
1649
1650
1651
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1652

XhmikosR's avatar
XhmikosR committed
1653
1654
1655
1656
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1657

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

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

XhmikosR's avatar
XhmikosR committed
1665
1666
1667
1668
    // 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()
  }
1669

XhmikosR's avatar
XhmikosR committed
1670
1671
1672
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1673

XhmikosR's avatar
XhmikosR committed
1674
1675
1676
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1677

XhmikosR's avatar
XhmikosR committed
1678
1679
1680
1681
1682
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1683

XhmikosR's avatar
XhmikosR committed
1684
1685
1686
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1687

XhmikosR's avatar
XhmikosR committed
1688
1689
1690
1691
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1692

1693

XhmikosR's avatar
XhmikosR committed
1694
1695
  // POPOVER PLUGIN DEFINITION
  // =========================
1696

XhmikosR's avatar
XhmikosR committed
1697
1698
1699
1700
1701
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
Chris Rebert's avatar
Chris Rebert committed
1702

XhmikosR's avatar
XhmikosR committed
1703
1704
1705
1706
1707
      if (!data && option == 'destroy') return
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1708

XhmikosR's avatar
XhmikosR committed
1709
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1710

XhmikosR's avatar
XhmikosR committed
1711
1712
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1713

1714

XhmikosR's avatar
XhmikosR committed
1715
1716
  // POPOVER NO CONFLICT
  // ===================
1717

XhmikosR's avatar
XhmikosR committed
1718
1719
1720
1721
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1722

XhmikosR's avatar
XhmikosR committed
1723
}(jQuery);
1724

1725
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1726
 * Bootstrap: scrollspy.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1727
 * http://getbootstrap.com/javascript/#scrollspy
1728
 * ========================================================================
1729
 * Copyright 2011-2014 Twitter, Inc.
1730
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1731
 * ======================================================================== */
1732
1733


XhmikosR's avatar
XhmikosR committed
1734
1735
+function ($) {
  'use strict';
1736

XhmikosR's avatar
XhmikosR committed
1737
1738
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1739

XhmikosR's avatar
XhmikosR committed
1740
1741
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1742

XhmikosR's avatar
XhmikosR committed
1743
1744
1745
1746
1747
1748
1749
1750
    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
1751

XhmikosR's avatar
XhmikosR committed
1752
1753
1754
1755
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1756

Mark Otto's avatar
Mark Otto committed
1757
  ScrollSpy.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1758

XhmikosR's avatar
XhmikosR committed
1759
1760
1761
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1762

XhmikosR's avatar
XhmikosR committed
1763
1764
1765
  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
1766

XhmikosR's avatar
XhmikosR committed
1767
1768
1769
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1770

XhmikosR's avatar
XhmikosR committed
1771
1772
1773
1774
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1775

XhmikosR's avatar
XhmikosR committed
1776
1777
1778
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1779

XhmikosR's avatar
XhmikosR committed
1780
    var self     = this
XhmikosR's avatar
XhmikosR committed
1781

XhmikosR's avatar
XhmikosR committed
1782
1783
1784
1785
1786
1787
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1788

XhmikosR's avatar
XhmikosR committed
1789
1790
1791
        return ($href
          && $href.length
          && $href.is(':visible')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1792
          && $el.is(':visible')
XhmikosR's avatar
XhmikosR committed
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
          && [[$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
1813
1814
    }

XhmikosR's avatar
XhmikosR committed
1815
1816
1817
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1818

XhmikosR's avatar
XhmikosR committed
1819
1820
    if (activeTarget && scrollTop <= offsets[0]) {
      return activeTarget != (i = targets[0]) && this.activate(i)
Chris Rebert's avatar
Chris Rebert committed
1821
    }
1822

XhmikosR's avatar
XhmikosR committed
1823
1824
1825
1826
1827
1828
1829
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1830

XhmikosR's avatar
XhmikosR committed
1831
1832
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1833

XhmikosR's avatar
XhmikosR committed
1834
1835
1836
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
1837

XhmikosR's avatar
XhmikosR committed
1838
1839
1840
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1841

XhmikosR's avatar
XhmikosR committed
1842
1843
1844
    var active = $(selector)
      .parents('li')
      .addClass('active')
1845

XhmikosR's avatar
XhmikosR committed
1846
1847
1848
1849
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1850
    }
1851

XhmikosR's avatar
XhmikosR committed
1852
1853
    active.trigger('activate.bs.scrollspy')
  }
1854
1855


XhmikosR's avatar
XhmikosR committed
1856
1857
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1858

XhmikosR's avatar
XhmikosR committed
1859
1860
1861
1862
1863
  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
1864

XhmikosR's avatar
XhmikosR committed
1865
1866
1867
1868
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1869

XhmikosR's avatar
XhmikosR committed
1870
  var old = $.fn.scrollspy
1871

XhmikosR's avatar
XhmikosR committed
1872
1873
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1874

1875

XhmikosR's avatar
XhmikosR committed
1876
1877
  // SCROLLSPY NO CONFLICT
  // =====================
1878

XhmikosR's avatar
XhmikosR committed
1879
1880
1881
1882
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1883

Chris Rebert's avatar
Chris Rebert committed
1884

XhmikosR's avatar
XhmikosR committed
1885
1886
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1887

XhmikosR's avatar
XhmikosR committed
1888
1889
1890
1891
1892
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1893
  })
1894

XhmikosR's avatar
XhmikosR committed
1895
}(jQuery);
1896

1897
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1898
 * Bootstrap: tab.js v3.2.0
Mark Otto's avatar
Mark Otto committed
1899
 * http://getbootstrap.com/javascript/#tabs
1900
 * ========================================================================
1901
 * Copyright 2011-2014 Twitter, Inc.
1902
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1903
 * ======================================================================== */
1904

1905

XhmikosR's avatar
XhmikosR committed
1906
1907
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1908

XhmikosR's avatar
XhmikosR committed
1909
1910
  // TAB CLASS DEFINITION
  // ====================
1911

XhmikosR's avatar
XhmikosR committed
1912
1913
1914
  var Tab = function (element) {
    this.element = $(element)
  }
1915

Mark Otto's avatar
Mark Otto committed
1916
  Tab.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
1917

1918
1919
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1920
1921
1922
1923
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
1924

XhmikosR's avatar
XhmikosR committed
1925
1926
1927
1928
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
1929

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

XhmikosR's avatar
XhmikosR committed
1932
1933
1934
1935
    var previous = $ul.find('.active:last a')[0]
    var e        = $.Event('show.bs.tab', {
      relatedTarget: previous
    })
1936

XhmikosR's avatar
XhmikosR committed
1937
    $this.trigger(e)
1938

XhmikosR's avatar
XhmikosR committed
1939
    if (e.isDefaultPrevented()) return
1940

XhmikosR's avatar
XhmikosR committed
1941
    var $target = $(selector)
1942

XhmikosR's avatar
XhmikosR committed
1943
1944
1945
1946
1947
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $this.trigger({
        type: 'shown.bs.tab',
        relatedTarget: previous
1948
      })
XhmikosR's avatar
XhmikosR committed
1949
1950
    })
  }
1951

XhmikosR's avatar
XhmikosR committed
1952
1953
1954
1955
  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
1956
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
1957

XhmikosR's avatar
XhmikosR committed
1958
1959
1960
1961
1962
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
        .removeClass('active')
1963

XhmikosR's avatar
XhmikosR committed
1964
1965
1966
1967
1968
1969
1970
      element.addClass('active')

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

XhmikosR's avatar
XhmikosR committed
1973
1974
1975
      if (element.parent('.dropdown-menu')) {
        element.closest('li.dropdown').addClass('active')
      }
fat's avatar
fat committed
1976

XhmikosR's avatar
XhmikosR committed
1977
      callback && callback()
1978
    }
fat's avatar
fat committed
1979

Mark Otto's avatar
grunt    
Mark Otto committed
1980
    $active.length && transition ?
XhmikosR's avatar
XhmikosR committed
1981
1982
      $active
        .one('bsTransitionEnd', next)
1983
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1984
      next()
1985

XhmikosR's avatar
XhmikosR committed
1986
1987
    $active.removeClass('in')
  }
1988
1989


XhmikosR's avatar
XhmikosR committed
1990
1991
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
1992

XhmikosR's avatar
XhmikosR committed
1993
1994
1995
1996
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
1997

XhmikosR's avatar
XhmikosR committed
1998
1999
2000
2001
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
Mark Otto's avatar
Mark Otto committed
2002

XhmikosR's avatar
XhmikosR committed
2003
  var old = $.fn.tab
2004

XhmikosR's avatar
XhmikosR committed
2005
2006
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
2007

2008

XhmikosR's avatar
XhmikosR committed
2009
2010
  // TAB NO CONFLICT
  // ===============
2011

XhmikosR's avatar
XhmikosR committed
2012
2013
2014
2015
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
2016
2017


XhmikosR's avatar
XhmikosR committed
2018
2019
2020
2021
2022
2023
  // TAB DATA-API
  // ============

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

XhmikosR's avatar
XhmikosR committed
2026
}(jQuery);
2027

2028
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2029
 * Bootstrap: affix.js v3.2.0
Mark Otto's avatar
Mark Otto committed
2030
 * http://getbootstrap.com/javascript/#affix
2031
 * ========================================================================
2032
 * Copyright 2011-2014 Twitter, Inc.
2033
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2034
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2035
2036


XhmikosR's avatar
XhmikosR committed
2037
2038
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2039

XhmikosR's avatar
XhmikosR committed
2040
2041
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
2042

XhmikosR's avatar
XhmikosR committed
2043
2044
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
Mark Otto's avatar
Mark Otto committed
2045

XhmikosR's avatar
XhmikosR committed
2046
2047
2048
    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
2049

XhmikosR's avatar
XhmikosR committed
2050
2051
2052
2053
    this.$element     = $(element)
    this.affixed      =
    this.unpin        =
    this.pinnedOffset = null
fat's avatar
fat committed
2054

XhmikosR's avatar
XhmikosR committed
2055
2056
    this.checkPosition()
  }
fat's avatar
fat committed
2057

Mark Otto's avatar
Mark Otto committed
2058
  Affix.VERSION  = '3.2.0'
2059

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

XhmikosR's avatar
XhmikosR committed
2062
2063
2064
2065
  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }
2066

2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
  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
2089
2090
2091
2092
2093
2094
2095
  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)
  }
2096

XhmikosR's avatar
XhmikosR committed
2097
2098
2099
  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }
fat's avatar
fat committed
2100

XhmikosR's avatar
XhmikosR committed
2101
2102
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return
2103

2104
    var height       = this.$element.height()
XhmikosR's avatar
XhmikosR committed
2105
2106
2107
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
2108
    var scrollHeight = $('body').height()
2109

XhmikosR's avatar
XhmikosR committed
2110
2111
2112
    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)
2113

2114
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2115

2116
2117
    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')
2118

2119
2120
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2121

2122
      this.$element.trigger(e)
2123

2124
      if (e.isDefaultPrevented()) return
2125

2126
2127
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2128

2129
2130
2131
2132
2133
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }
2134

XhmikosR's avatar
XhmikosR committed
2135
2136
    if (affix == 'bottom') {
      this.$element.offset({
2137
        top: scrollHeight - height - offsetBottom
XhmikosR's avatar
XhmikosR committed
2138
      })
2139
    }
XhmikosR's avatar
XhmikosR committed
2140
  }
Mark Otto's avatar
Mark Otto committed
2141

2142

XhmikosR's avatar
XhmikosR committed
2143
2144
  // AFFIX PLUGIN DEFINITION
  // =======================
2145

XhmikosR's avatar
XhmikosR committed
2146
2147
2148
2149
2150
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option
2151

XhmikosR's avatar
XhmikosR committed
2152
2153
2154
2155
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
2156

XhmikosR's avatar
XhmikosR committed
2157
  var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2158

XhmikosR's avatar
XhmikosR committed
2159
2160
  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix
2161
2162


XhmikosR's avatar
XhmikosR committed
2163
2164
  // AFFIX NO CONFLICT
  // =================
2165

XhmikosR's avatar
XhmikosR committed
2166
2167
2168
2169
  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }
2170
2171


XhmikosR's avatar
XhmikosR committed
2172
2173
  // AFFIX DATA-API
  // ==============
2174

XhmikosR's avatar
XhmikosR committed
2175
2176
2177
2178
  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()
2179

XhmikosR's avatar
XhmikosR committed
2180
      data.offset = data.offset || {}
2181

Heinrich Fenkart's avatar
Heinrich Fenkart committed
2182
2183
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
2184

XhmikosR's avatar
XhmikosR committed
2185
      Plugin.call($spy, data)
2186
    })
Mark Otto's avatar
Mark Otto committed
2187
2188
  })

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