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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

100
101
  Alert.TRANSITION_DURATION = 150

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

324
325
  Carousel.TRANSITION_DURATION = 600

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
    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)
        })
448
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
449
450
451
452
453
454
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
455

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

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


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

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

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

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


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

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

fat's avatar
fat committed
493

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

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

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

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

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

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

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

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

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


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

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

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

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

XhmikosR's avatar
XhmikosR committed
555
556
    if (this.options.toggle) this.toggle()
  }
557

Mark Otto's avatar
Mark Otto committed
558
  Collapse.VERSION  = '3.3.1'
559

560
561
  Collapse.TRANSITION_DURATION = 350

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    return $(target)
  }

692

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

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

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

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

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

713

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

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

722

XhmikosR's avatar
XhmikosR committed
723
724
725
726
727
  // COLLAPSE DATA-API
  // =================

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

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

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

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

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

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


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

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

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

Mark Otto's avatar
Mark Otto committed
761
  Dropdown.VERSION = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
762

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

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

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

XhmikosR's avatar
XhmikosR committed
771
    clearMenus()
fat's avatar
fat committed
772

XhmikosR's avatar
XhmikosR committed
773
774
775
776
777
    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)
      }
778

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

XhmikosR's avatar
XhmikosR committed
782
      if (e.isDefaultPrevented()) return
783

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

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

XhmikosR's avatar
XhmikosR committed
793
794
    return false
  }
795

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

XhmikosR's avatar
XhmikosR committed
799
    var $this = $(this)
800

XhmikosR's avatar
XhmikosR committed
801
802
    e.preventDefault()
    e.stopPropagation()
803

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

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

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

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

XhmikosR's avatar
XhmikosR committed
817
    if (!$items.length) return
818

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

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

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

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

XhmikosR's avatar
XhmikosR committed
836
      if (!$parent.hasClass('open')) return
837

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

XhmikosR's avatar
XhmikosR committed
840
      if (e.isDefaultPrevented()) return
841
842

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

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

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

XhmikosR's avatar
XhmikosR committed
855
    var $parent = selector && $(selector)
856

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


XhmikosR's avatar
XhmikosR committed
861
862
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
863

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

XhmikosR's avatar
XhmikosR committed
869
870
871
872
      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
873

XhmikosR's avatar
XhmikosR committed
874
  var old = $.fn.dropdown
875

XhmikosR's avatar
XhmikosR committed
876
877
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
878

879

XhmikosR's avatar
XhmikosR committed
880
881
  // DROPDOWN NO CONFLICT
  // ====================
882

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

888

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

  $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
896
897
898
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
899

XhmikosR's avatar
XhmikosR committed
900
}(jQuery);
901

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


XhmikosR's avatar
XhmikosR committed
911
912
+function ($) {
  'use strict';
913

XhmikosR's avatar
XhmikosR committed
914
915
  // MODAL CLASS DEFINITION
  // ======================
916

XhmikosR's avatar
XhmikosR committed
917
918
919
920
921
922
923
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
924

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

Mark Otto's avatar
Mark Otto committed
934
  Modal.VERSION  = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
935

936
937
938
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
939
940
941
942
943
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
948

XhmikosR's avatar
XhmikosR committed
949
950
951
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
952

XhmikosR's avatar
XhmikosR committed
953
    this.$element.trigger(e)
954

XhmikosR's avatar
XhmikosR committed
955
    if (this.isShown || e.isDefaultPrevented()) return
956

XhmikosR's avatar
XhmikosR committed
957
    this.isShown = true
fat's avatar
build    
fat committed
958

XhmikosR's avatar
XhmikosR committed
959
    this.checkScrollbar()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
960
    this.setScrollbar()
XhmikosR's avatar
XhmikosR committed
961
    this.$body.addClass('modal-open')
962

XhmikosR's avatar
XhmikosR committed
963
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
964
    this.resize()
fat's avatar
rebuild    
fat committed
965

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

XhmikosR's avatar
XhmikosR committed
968
969
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
970

XhmikosR's avatar
XhmikosR committed
971
972
973
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
974

XhmikosR's avatar
XhmikosR committed
975
976
977
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
978

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
979
980
      if (that.options.backdrop) that.adjustBackdrop()
      that.adjustDialog()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
981

XhmikosR's avatar
XhmikosR committed
982
983
984
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
985

XhmikosR's avatar
XhmikosR committed
986
987
988
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
989

XhmikosR's avatar
XhmikosR committed
990
      that.enforceFocus()
991

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

XhmikosR's avatar
XhmikosR committed
994
995
996
997
998
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
999
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1000
1001
1002
        that.$element.trigger('focus').trigger(e)
    })
  }
1003

XhmikosR's avatar
XhmikosR committed
1004
1005
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
1006

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

XhmikosR's avatar
XhmikosR committed
1009
    this.$element.trigger(e)
1010

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

XhmikosR's avatar
XhmikosR committed
1013
    this.isShown = false
1014

XhmikosR's avatar
XhmikosR committed
1015
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1016
    this.resize()
Chris Rebert's avatar
Chris Rebert committed
1017

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

XhmikosR's avatar
XhmikosR committed
1020
1021
1022
1023
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
1024

XhmikosR's avatar
XhmikosR committed
1025
1026
1027
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1028
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1029
1030
      this.hideModal()
  }
1031

XhmikosR's avatar
XhmikosR committed
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
  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
1044
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1045
1046
1047
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
1048
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
1049
1050
1051
    }
  }

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1052
1053
  Modal.prototype.resize = function () {
    if (this.isShown) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1054
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1055
1056
1057
1058
1059
    } else {
      $(window).off('resize.bs.modal')
    }
  }

XhmikosR's avatar
XhmikosR committed
1060
1061
1062
1063
  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1064
      that.$body.removeClass('modal-open')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1065
      that.resetAdjustments()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1066
      that.resetScrollbar()
XhmikosR's avatar
XhmikosR committed
1067
1068
1069
      that.$element.trigger('hidden.bs.modal')
    })
  }
1070

XhmikosR's avatar
XhmikosR committed
1071
1072
1073
1074
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
1075

XhmikosR's avatar
XhmikosR committed
1076
1077
1078
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
1079

XhmikosR's avatar
XhmikosR committed
1080
1081
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
1082

XhmikosR's avatar
XhmikosR committed
1083
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1084
1085
1086
1087
1088
1089
1090
        .prependTo(this.$element)
        .on('click.dismiss.bs.modal', $.proxy(function (e) {
          if (e.target !== e.currentTarget) return
          this.options.backdrop == 'static'
            ? this.$element[0].focus.call(this.$element[0])
            : this.hide.call(this)
        }, this))
1091

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

XhmikosR's avatar
XhmikosR committed
1094
      this.$backdrop.addClass('in')
1095

XhmikosR's avatar
XhmikosR committed
1096
      if (!callback) return
1097

XhmikosR's avatar
XhmikosR committed
1098
1099
1100
      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
1101
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1102
        callback()
1103

XhmikosR's avatar
XhmikosR committed
1104
1105
    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')
Chris Rebert's avatar
Chris Rebert committed
1106

XhmikosR's avatar
XhmikosR committed
1107
1108
1109
      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
Chris Rebert's avatar
Chris Rebert committed
1110
      }
XhmikosR's avatar
XhmikosR committed
1111
1112
1113
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
1114
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1115
        callbackRemove()
1116

XhmikosR's avatar
XhmikosR committed
1117
1118
    } else if (callback) {
      callback()
Chris Rebert's avatar
Chris Rebert committed
1119
    }
XhmikosR's avatar
XhmikosR committed
1120
  }
1121

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1122
1123
1124
1125
1126
1127
1128
1129
  // these following methods are used to handle overflowing modals

  Modal.prototype.handleUpdate = function () {
    if (this.options.backdrop) this.adjustBackdrop()
    this.adjustDialog()
  }

  Modal.prototype.adjustBackdrop = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1130
1131
1132
1133
1134
    this.$backdrop
      .css('height', 0)
      .css('height', this.$element[0].scrollHeight)
  }

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
  Modal.prototype.adjustDialog = function () {
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight

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

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

XhmikosR's avatar
XhmikosR committed
1151
  Modal.prototype.checkScrollbar = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1152
    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
Mark Otto's avatar
grunt    
Mark Otto committed
1153
    this.scrollbarWidth = this.measureScrollbar()
XhmikosR's avatar
XhmikosR committed
1154
  }
fat's avatar
build    
fat committed
1155

XhmikosR's avatar
XhmikosR committed
1156
1157
  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1158
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
XhmikosR's avatar
XhmikosR committed
1159
  }
fat's avatar
build    
fat committed
1160

XhmikosR's avatar
XhmikosR committed
1161
1162
1163
  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', '')
  }
fat's avatar
build    
fat committed
1164

XhmikosR's avatar
XhmikosR committed
1165
1166
1167
1168
1169
1170
1171
1172
  Modal.prototype.measureScrollbar = function () { // thx walsh
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }
1173
1174


XhmikosR's avatar
XhmikosR committed
1175
1176
  // MODAL PLUGIN DEFINITION
  // =======================
fat's avatar
fat committed
1177

XhmikosR's avatar
XhmikosR committed
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
  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)
    })
  }
1189

XhmikosR's avatar
XhmikosR committed
1190
  var old = $.fn.modal
Mark Otto's avatar
Mark Otto committed
1191

XhmikosR's avatar
XhmikosR committed
1192
1193
  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal
1194
1195


XhmikosR's avatar
XhmikosR committed
1196
1197
  // MODAL NO CONFLICT
  // =================
1198

XhmikosR's avatar
XhmikosR committed
1199
1200
1201
1202
  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }
1203
1204


XhmikosR's avatar
XhmikosR committed
1205
1206
  // MODAL DATA-API
  // ==============
1207

XhmikosR's avatar
XhmikosR committed
1208
1209
1210
1211
1212
  $(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())
1213

XhmikosR's avatar
XhmikosR committed
1214
    if ($this.is('a')) e.preventDefault()
1215

XhmikosR's avatar
XhmikosR committed
1216
1217
1218
1219
    $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
1220
      })
Mark Otto's avatar
Mark Otto committed
1221
    })
XhmikosR's avatar
XhmikosR committed
1222
    Plugin.call($target, option, this)
Jacob Thornton's avatar
Jacob Thornton committed
1223
  })
1224

XhmikosR's avatar
XhmikosR committed
1225
}(jQuery);
1226

1227
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1228
 * Bootstrap: tooltip.js v3.3.1
Mark Otto's avatar
Mark Otto committed
1229
 * http://getbootstrap.com/javascript/#tooltip
1230
 * Inspired by the original jQuery.tipsy by Jason Frame
1231
 * ========================================================================
1232
 * Copyright 2011-2014 Twitter, Inc.
1233
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1234
 * ======================================================================== */
1235
1236


XhmikosR's avatar
XhmikosR committed
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
+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
1254
  Tooltip.VERSION  = '3.3.1'
XhmikosR's avatar
XhmikosR committed
1255

1256
1257
  Tooltip.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
  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))
      }
    }
1296

XhmikosR's avatar
XhmikosR committed
1297
1298
1299
1300
    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }
1301

XhmikosR's avatar
XhmikosR committed
1302
1303
1304
  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }
1305

XhmikosR's avatar
XhmikosR committed
1306
1307
  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1308

XhmikosR's avatar
XhmikosR committed
1309
1310
1311
1312
    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
1313
1314
      }
    }
1315

XhmikosR's avatar
XhmikosR committed
1316
1317
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1318

XhmikosR's avatar
XhmikosR committed
1319
1320
1321
  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()
1322

XhmikosR's avatar
XhmikosR committed
1323
1324
1325
    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })
fat's avatar
rebuild    
fat committed
1326

XhmikosR's avatar
XhmikosR committed
1327
1328
    return options
  }
Jacob Thornton's avatar
Jacob Thornton committed
1329

XhmikosR's avatar
XhmikosR committed
1330
1331
1332
  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
1333

XhmikosR's avatar
XhmikosR committed
1334
1335
1336
1337
1338
    if (self && self.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

XhmikosR's avatar
XhmikosR committed
1339
1340
1341
    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
Mark Otto's avatar
Mark Otto committed
1342
    }
1343

XhmikosR's avatar
XhmikosR committed
1344
    clearTimeout(self.timeout)
1345

XhmikosR's avatar
XhmikosR committed
1346
    self.hoverState = 'in'
1347

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

XhmikosR's avatar
XhmikosR committed
1350
1351
1352
1353
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }
1354

XhmikosR's avatar
XhmikosR committed
1355
1356
1357
  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
1358

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

XhmikosR's avatar
XhmikosR committed
1364
    clearTimeout(self.timeout)
fat's avatar
fat committed
1365

XhmikosR's avatar
XhmikosR committed
1366
    self.hoverState = 'out'
1367

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

XhmikosR's avatar
XhmikosR committed
1370
1371
1372
1373
    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }
1374

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

XhmikosR's avatar
XhmikosR committed
1378
1379
    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)
fat's avatar
fat committed
1380

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1381
      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
XhmikosR's avatar
XhmikosR committed
1382
1383
      if (e.isDefaultPrevented() || !inDom) return
      var that = this
1384

XhmikosR's avatar
XhmikosR committed
1385
      var $tip = this.tip()
fat's avatar
fat committed
1386

XhmikosR's avatar
XhmikosR committed
1387
      var tipId = this.getUID(this.type)
fat's avatar
fat committed
1388

XhmikosR's avatar
XhmikosR committed
1389
1390
1391
      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)
1392

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

XhmikosR's avatar
XhmikosR committed
1395
1396
1397
      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement
1398

XhmikosR's avatar
XhmikosR committed
1399
1400
1401
      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1402

XhmikosR's avatar
XhmikosR committed
1403
1404
1405
1406
1407
      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)
fat's avatar
fat committed
1408

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

XhmikosR's avatar
XhmikosR committed
1411
1412
1413
      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight
Chris Rebert's avatar
Chris Rebert committed
1414

XhmikosR's avatar
XhmikosR committed
1415
1416
      if (autoPlace) {
        var orgPlacement = placement
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1417
1418
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)
Chris Rebert's avatar
Chris Rebert committed
1419

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1420
1421
1422
1423
        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
XhmikosR's avatar
XhmikosR committed
1424
                    placement
fat's avatar
fat committed
1425

1426
        $tip
XhmikosR's avatar
XhmikosR committed
1427
          .removeClass(orgPlacement)
1428
          .addClass(placement)
XhmikosR's avatar
XhmikosR committed
1429
      }
1430

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

XhmikosR's avatar
XhmikosR committed
1433
      this.applyPlacement(calculatedOffset, placement)
fat's avatar
fat committed
1434

XhmikosR's avatar
XhmikosR committed
1435
      var complete = function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1436
        var prevHoverState = that.hoverState
XhmikosR's avatar
XhmikosR committed
1437
1438
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1439
1440

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

XhmikosR's avatar
XhmikosR committed
1443
1444
1445
      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
1446
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1447
1448
1449
        complete()
    }
  }
fat's avatar
fat committed
1450

XhmikosR's avatar
XhmikosR committed
1451
1452
1453
1454
  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
1455

XhmikosR's avatar
XhmikosR committed
1456
1457
1458
    // 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
1459

XhmikosR's avatar
XhmikosR committed
1460
1461
1462
    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0
fat's avatar
fat committed
1463

XhmikosR's avatar
XhmikosR committed
1464
1465
    offset.top  = offset.top  + marginTop
    offset.left = offset.left + marginLeft
fat's avatar
fat committed
1466

XhmikosR's avatar
XhmikosR committed
1467
1468
1469
1470
1471
1472
1473
1474
    // $.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)
        })
1475
      }
XhmikosR's avatar
XhmikosR committed
1476
    }, offset), 0)
1477

XhmikosR's avatar
XhmikosR committed
1478
    $tip.addClass('in')
fat's avatar
fat committed
1479

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

XhmikosR's avatar
XhmikosR committed
1484
1485
1486
    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }
fat's avatar
fat committed
1487

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

XhmikosR's avatar
XhmikosR committed
1490
1491
    if (delta.left) offset.left += delta.left
    else offset.top += delta.top
1492

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

XhmikosR's avatar
XhmikosR committed
1497
    $tip.offset(offset)
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1498
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
XhmikosR's avatar
XhmikosR committed
1499
  }
1500

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1501
1502
1503
1504
  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
    this.arrow()
      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isHorizontal ? 'top' : 'left', '')
XhmikosR's avatar
XhmikosR committed
1505
  }
1506

XhmikosR's avatar
XhmikosR committed
1507
1508
1509
  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()
1510

XhmikosR's avatar
XhmikosR committed
1511
1512
1513
    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }
1514

Heinrich Fenkart's avatar
Heinrich Fenkart committed
1515
  Tooltip.prototype.hide = function (callback) {
XhmikosR's avatar
XhmikosR committed
1516
1517
1518
    var that = this
    var $tip = this.tip()
    var e    = $.Event('hide.bs.' + this.type)
1519

XhmikosR's avatar
XhmikosR committed
1520
1521
    function complete() {
      if (that.hoverState != 'in') $tip.detach()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1522
1523
1524
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1525
      callback && callback()
XhmikosR's avatar
XhmikosR committed
1526
    }
Jacob Thornton's avatar
Jacob Thornton committed
1527

XhmikosR's avatar
XhmikosR committed
1528
    this.$element.trigger(e)
1529

XhmikosR's avatar
XhmikosR committed
1530
    if (e.isDefaultPrevented()) return
1531

XhmikosR's avatar
XhmikosR committed
1532
    $tip.removeClass('in')
1533

XhmikosR's avatar
XhmikosR committed
1534
1535
1536
    $.support.transition && this.$tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
1537
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
1538
      complete()
1539

XhmikosR's avatar
XhmikosR committed
1540
    this.hoverState = null
1541

XhmikosR's avatar
XhmikosR committed
1542
1543
    return this
  }
1544

XhmikosR's avatar
XhmikosR committed
1545
1546
1547
1548
  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', '')
1549
    }
XhmikosR's avatar
XhmikosR committed
1550
  }
1551

XhmikosR's avatar
XhmikosR committed
1552
1553
1554
  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }
1555

XhmikosR's avatar
XhmikosR committed
1556
1557
  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element
Mark Otto's avatar
grunt    
Mark Otto committed
1558

XhmikosR's avatar
XhmikosR committed
1559
1560
    var el     = $element[0]
    var isBody = el.tagName == 'BODY'
Mark Otto's avatar
grunt    
Mark Otto committed
1561

Mark Otto's avatar
grunt    
Mark Otto committed
1562
    var elRect    = el.getBoundingClientRect()
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1563
1564
1565
1566
    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
1567
1568
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1569
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
Mark Otto's avatar
grunt    
Mark Otto committed
1570
1571

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

XhmikosR's avatar
XhmikosR committed
1574
1575
1576
1577
1578
  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   }
1579

XhmikosR's avatar
XhmikosR committed
1580
  }
1581

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

XhmikosR's avatar
XhmikosR committed
1586
1587
    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)
1588

XhmikosR's avatar
XhmikosR committed
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
    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
1604
      }
Chris Rebert's avatar
Chris Rebert committed
1605
    }
fat's avatar
fat committed
1606

XhmikosR's avatar
XhmikosR committed
1607
1608
    return delta
  }
1609

XhmikosR's avatar
XhmikosR committed
1610
1611
1612
1613
  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options
1614

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

XhmikosR's avatar
XhmikosR committed
1618
1619
    return title
  }
1620

XhmikosR's avatar
XhmikosR committed
1621
1622
1623
1624
1625
  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }
1626

XhmikosR's avatar
XhmikosR committed
1627
1628
1629
  Tooltip.prototype.tip = function () {
    return (this.$tip = this.$tip || $(this.options.template))
  }
1630

XhmikosR's avatar
XhmikosR committed
1631
1632
1633
  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }
1634

XhmikosR's avatar
XhmikosR committed
1635
1636
1637
  Tooltip.prototype.enable = function () {
    this.enabled = true
  }
1638

XhmikosR's avatar
XhmikosR committed
1639
1640
1641
  Tooltip.prototype.disable = function () {
    this.enabled = false
  }
Mark Otto's avatar
Mark Otto committed
1642

XhmikosR's avatar
XhmikosR committed
1643
1644
1645
  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }
Chris Rebert's avatar
Chris Rebert committed
1646

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

XhmikosR's avatar
XhmikosR committed
1657
1658
    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
  }
1659

XhmikosR's avatar
XhmikosR committed
1660
  Tooltip.prototype.destroy = function () {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1661
    var that = this
XhmikosR's avatar
XhmikosR committed
1662
    clearTimeout(this.timeout)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
1663
1664
1665
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
    })
XhmikosR's avatar
XhmikosR committed
1666
  }
1667
1668


XhmikosR's avatar
XhmikosR committed
1669
1670
  // TOOLTIP PLUGIN DEFINITION
  // =========================
1671

XhmikosR's avatar
XhmikosR committed
1672
1673
  function Plugin(option) {
    return this.each(function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1674
1675
1676
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option
fat's avatar
fat committed
1677

XhmikosR's avatar
XhmikosR committed
1678
      if (!data && option == 'destroy') return
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1679
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
XhmikosR's avatar
XhmikosR committed
1680
1681
1682
      if (typeof option == 'string') data[option]()
    })
  }
1683

XhmikosR's avatar
XhmikosR committed
1684
  var old = $.fn.tooltip
Mark Otto's avatar
Mark Otto committed
1685

XhmikosR's avatar
XhmikosR committed
1686
1687
  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip
1688

1689

XhmikosR's avatar
XhmikosR committed
1690
1691
  // TOOLTIP NO CONFLICT
  // ===================
1692

XhmikosR's avatar
XhmikosR committed
1693
1694
1695
1696
  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }
1697

XhmikosR's avatar
XhmikosR committed
1698
}(jQuery);
1699

1700
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1701
 * Bootstrap: popover.js v3.3.1
Mark Otto's avatar
Mark Otto committed
1702
 * http://getbootstrap.com/javascript/#popovers
1703
 * ========================================================================
1704
 * Copyright 2011-2014 Twitter, Inc.
1705
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1706
 * ======================================================================== */
1707
1708


XhmikosR's avatar
XhmikosR committed
1709
1710
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
1711

XhmikosR's avatar
XhmikosR committed
1712
1713
  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================
1714

XhmikosR's avatar
XhmikosR committed
1715
1716
1717
  var Popover = function (element, options) {
    this.init('popover', element, options)
  }
fat's avatar
fat committed
1718

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

Mark Otto's avatar
Mark Otto committed
1721
  Popover.VERSION  = '3.3.1'
1722

XhmikosR's avatar
XhmikosR committed
1723
1724
1725
1726
1727
1728
  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
1729
1730


XhmikosR's avatar
XhmikosR committed
1731
1732
  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================
1733

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

XhmikosR's avatar
XhmikosR committed
1736
  Popover.prototype.constructor = Popover
1737

XhmikosR's avatar
XhmikosR committed
1738
1739
1740
  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }
1741

XhmikosR's avatar
XhmikosR committed
1742
1743
1744
1745
  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()
1746

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

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

XhmikosR's avatar
XhmikosR committed
1754
1755
1756
1757
    // 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()
  }
1758

XhmikosR's avatar
XhmikosR committed
1759
1760
1761
  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }
1762

XhmikosR's avatar
XhmikosR committed
1763
1764
1765
  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options
1766

XhmikosR's avatar
XhmikosR committed
1767
1768
1769
1770
1771
    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }
fat's avatar
fat committed
1772

XhmikosR's avatar
XhmikosR committed
1773
1774
1775
  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }
1776

XhmikosR's avatar
XhmikosR committed
1777
1778
1779
1780
  Popover.prototype.tip = function () {
    if (!this.$tip) this.$tip = $(this.options.template)
    return this.$tip
  }
1781

1782

XhmikosR's avatar
XhmikosR committed
1783
1784
  // POPOVER PLUGIN DEFINITION
  // =========================
1785

XhmikosR's avatar
XhmikosR committed
1786
1787
  function Plugin(option) {
    return this.each(function () {
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1788
1789
1790
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option
Chris Rebert's avatar
Chris Rebert committed
1791

XhmikosR's avatar
XhmikosR committed
1792
      if (!data && option == 'destroy') return
Bootstrap's Grunt bot's avatar
Bootstrap's Grunt bot committed
1793
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
XhmikosR's avatar
XhmikosR committed
1794
1795
1796
      if (typeof option == 'string') data[option]()
    })
  }
1797

XhmikosR's avatar
XhmikosR committed
1798
  var old = $.fn.popover
Mark Otto's avatar
Mark Otto committed
1799

XhmikosR's avatar
XhmikosR committed
1800
1801
  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover
fat's avatar
fat committed
1802

1803

XhmikosR's avatar
XhmikosR committed
1804
1805
  // POPOVER NO CONFLICT
  // ===================
1806

XhmikosR's avatar
XhmikosR committed
1807
1808
1809
1810
  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }
1811

XhmikosR's avatar
XhmikosR committed
1812
}(jQuery);
1813

1814
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1815
 * Bootstrap: scrollspy.js v3.3.1
Mark Otto's avatar
Mark Otto committed
1816
 * http://getbootstrap.com/javascript/#scrollspy
1817
 * ========================================================================
1818
 * Copyright 2011-2014 Twitter, Inc.
1819
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1820
 * ======================================================================== */
1821
1822


XhmikosR's avatar
XhmikosR committed
1823
1824
+function ($) {
  'use strict';
1825

XhmikosR's avatar
XhmikosR committed
1826
1827
  // SCROLLSPY CLASS DEFINITION
  // ==========================
1828

XhmikosR's avatar
XhmikosR committed
1829
1830
  function ScrollSpy(element, options) {
    var process  = $.proxy(this.process, this)
1831

XhmikosR's avatar
XhmikosR committed
1832
1833
1834
1835
1836
1837
1838
1839
    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
1840

XhmikosR's avatar
XhmikosR committed
1841
1842
1843
1844
    this.$scrollElement.on('scroll.bs.scrollspy', process)
    this.refresh()
    this.process()
  }
1845

Mark Otto's avatar
Mark Otto committed
1846
  ScrollSpy.VERSION  = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
1847

XhmikosR's avatar
XhmikosR committed
1848
1849
1850
  ScrollSpy.DEFAULTS = {
    offset: 10
  }
1851

XhmikosR's avatar
XhmikosR committed
1852
1853
1854
  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
1855

XhmikosR's avatar
XhmikosR committed
1856
1857
1858
  ScrollSpy.prototype.refresh = function () {
    var offsetMethod = 'offset'
    var offsetBase   = 0
Mark Otto's avatar
grunt    
Mark Otto committed
1859

XhmikosR's avatar
XhmikosR committed
1860
1861
1862
1863
    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }
Mark Otto's avatar
grunt    
Mark Otto committed
1864

XhmikosR's avatar
XhmikosR committed
1865
1866
1867
    this.offsets = []
    this.targets = []
    this.scrollHeight = this.getScrollHeight()
fat's avatar
fat committed
1868

XhmikosR's avatar
XhmikosR committed
1869
    var self     = this
XhmikosR's avatar
XhmikosR committed
1870

XhmikosR's avatar
XhmikosR committed
1871
1872
1873
1874
1875
1876
    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)
1877

XhmikosR's avatar
XhmikosR committed
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        self.offsets.push(this[0])
        self.targets.push(this[1])
      })
  }

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

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

XhmikosR's avatar
XhmikosR committed
1903
1904
1905
    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }
1906

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1907
1908
1909
    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
Chris Rebert's avatar
Chris Rebert committed
1910
    }
1911

XhmikosR's avatar
XhmikosR committed
1912
1913
1914
1915
1916
1917
1918
    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
        && this.activate(targets[i])
    }
  }
1919

XhmikosR's avatar
XhmikosR committed
1920
1921
  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target
1922

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1923
    this.clear()
1924

XhmikosR's avatar
XhmikosR committed
1925
1926
1927
    var selector = this.selector +
        '[data-target="' + target + '"],' +
        this.selector + '[href="' + target + '"]'
1928

XhmikosR's avatar
XhmikosR committed
1929
1930
1931
    var active = $(selector)
      .parents('li')
      .addClass('active')
1932

XhmikosR's avatar
XhmikosR committed
1933
1934
1935
1936
    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
Chris Rebert's avatar
Chris Rebert committed
1937
    }
1938

XhmikosR's avatar
XhmikosR committed
1939
1940
    active.trigger('activate.bs.scrollspy')
  }
1941

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
1942
1943
1944
1945
1946
1947
  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }

1948

XhmikosR's avatar
XhmikosR committed
1949
1950
  // SCROLLSPY PLUGIN DEFINITION
  // ===========================
1951

XhmikosR's avatar
XhmikosR committed
1952
1953
1954
1955
1956
  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
1957

XhmikosR's avatar
XhmikosR committed
1958
1959
1960
1961
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
1962

XhmikosR's avatar
XhmikosR committed
1963
  var old = $.fn.scrollspy
1964

XhmikosR's avatar
XhmikosR committed
1965
1966
  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy
1967

1968

XhmikosR's avatar
XhmikosR committed
1969
1970
  // SCROLLSPY NO CONFLICT
  // =====================
1971

XhmikosR's avatar
XhmikosR committed
1972
1973
1974
1975
  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }
1976

Chris Rebert's avatar
Chris Rebert committed
1977

XhmikosR's avatar
XhmikosR committed
1978
1979
  // SCROLLSPY DATA-API
  // ==================
Chris Rebert's avatar
Chris Rebert committed
1980

XhmikosR's avatar
XhmikosR committed
1981
1982
1983
1984
1985
  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
1986
  })
1987

XhmikosR's avatar
XhmikosR committed
1988
}(jQuery);
1989

1990
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
1991
 * Bootstrap: tab.js v3.3.1
Mark Otto's avatar
Mark Otto committed
1992
 * http://getbootstrap.com/javascript/#tabs
1993
 * ========================================================================
1994
 * Copyright 2011-2014 Twitter, Inc.
1995
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1996
 * ======================================================================== */
1997

1998

XhmikosR's avatar
XhmikosR committed
1999
2000
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2001

XhmikosR's avatar
XhmikosR committed
2002
2003
  // TAB CLASS DEFINITION
  // ====================
2004

XhmikosR's avatar
XhmikosR committed
2005
2006
2007
  var Tab = function (element) {
    this.element = $(element)
  }
2008

Mark Otto's avatar
Mark Otto committed
2009
  Tab.VERSION = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
2010

2011
2012
  Tab.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
2013
2014
2015
2016
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
2017

XhmikosR's avatar
XhmikosR committed
2018
2019
2020
2021
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
2022

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2025
2026
2027
2028
2029
2030
    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
XhmikosR's avatar
XhmikosR committed
2031
    })
2032

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2033
2034
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
2035

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

XhmikosR's avatar
XhmikosR committed
2038
    var $target = $(selector)
2039

XhmikosR's avatar
XhmikosR committed
2040
2041
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2042
2043
2044
2045
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
XhmikosR's avatar
XhmikosR committed
2046
2047
      $this.trigger({
        type: 'shown.bs.tab',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2048
        relatedTarget: $previous[0]
2049
      })
XhmikosR's avatar
XhmikosR committed
2050
2051
    })
  }
2052

XhmikosR's avatar
XhmikosR committed
2053
2054
2055
2056
  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
2057
      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
2058

XhmikosR's avatar
XhmikosR committed
2059
2060
2061
2062
    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Mark Otto's avatar
grunt    
Mark Otto committed
2063
2064
2065
2066
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
2067

Mark Otto's avatar
grunt    
Mark Otto committed
2068
2069
2070
2071
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2072
2073
2074
2075
2076
2077

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

XhmikosR's avatar
XhmikosR committed
2080
      if (element.parent('.dropdown-menu')) {
Mark Otto's avatar
grunt    
Mark Otto committed
2081
2082
2083
2084
2085
2086
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
2087
      }
fat's avatar
fat committed
2088

XhmikosR's avatar
XhmikosR committed
2089
      callback && callback()
2090
    }
fat's avatar
fat committed
2091

Mark Otto's avatar
grunt    
Mark Otto committed
2092
    $active.length && transition ?
XhmikosR's avatar
XhmikosR committed
2093
2094
      $active
        .one('bsTransitionEnd', next)
2095
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
2096
      next()
2097

XhmikosR's avatar
XhmikosR committed
2098
2099
    $active.removeClass('in')
  }
2100
2101


XhmikosR's avatar
XhmikosR committed
2102
2103
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
2104

XhmikosR's avatar
XhmikosR committed
2105
2106
2107
2108
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
2109

XhmikosR's avatar
XhmikosR committed
2110
2111
2112
2113
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
Mark Otto's avatar
Mark Otto committed
2114

XhmikosR's avatar
XhmikosR committed
2115
  var old = $.fn.tab
2116

XhmikosR's avatar
XhmikosR committed
2117
2118
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
2119

2120

XhmikosR's avatar
XhmikosR committed
2121
2122
  // TAB NO CONFLICT
  // ===============
2123

XhmikosR's avatar
XhmikosR committed
2124
2125
2126
2127
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
2128
2129


XhmikosR's avatar
XhmikosR committed
2130
2131
2132
  // TAB DATA-API
  // ============

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2133
  var clickHandler = function (e) {
XhmikosR's avatar
XhmikosR committed
2134
2135
    e.preventDefault()
    Plugin.call($(this), 'show')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
2136
2137
2138
2139
2140
  }

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

XhmikosR's avatar
XhmikosR committed
2142
}(jQuery);
2143

2144
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2145
 * Bootstrap: affix.js v3.3.1
Mark Otto's avatar
Mark Otto committed
2146
 * http://getbootstrap.com/javascript/#affix
2147
 * ========================================================================
2148
 * Copyright 2011-2014 Twitter, Inc.
2149
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2150
 * ======================================================================== */
Mark Otto's avatar
Mark Otto committed
2151
2152


XhmikosR's avatar
XhmikosR committed
2153
2154
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
2155

XhmikosR's avatar
XhmikosR committed
2156
2157
  // AFFIX CLASS DEFINITION
  // ======================
Mark Otto's avatar
Mark Otto committed
2158

XhmikosR's avatar
XhmikosR committed
2159
2160
  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)
Mark Otto's avatar
Mark Otto committed
2161

XhmikosR's avatar
XhmikosR committed
2162
2163
2164
    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
2165

XhmikosR's avatar
XhmikosR committed
2166
2167
2168
2169
    this.$element     = $(element)
    this.affixed      =
    this.unpin        =
    this.pinnedOffset = null
fat's avatar
fat committed
2170

XhmikosR's avatar
XhmikosR committed
2171
2172
    this.checkPosition()
  }
fat's avatar
fat committed
2173

Mark Otto's avatar
Mark Otto committed
2174
  Affix.VERSION  = '3.3.1'
2175

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

XhmikosR's avatar
XhmikosR committed
2178
2179
2180
2181
  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }
2182

2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

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

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

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

Chris Rebert's avatar
Chris Rebert committed
2199
    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2200
2201
2202
2203
2204
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

XhmikosR's avatar
XhmikosR committed
2205
2206
2207
2208
2209
2210
2211
  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)
  }
2212

XhmikosR's avatar
XhmikosR committed
2213
2214
2215
  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }
fat's avatar
fat committed
2216

XhmikosR's avatar
XhmikosR committed
2217
2218
  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return
2219

2220
    var height       = this.$element.height()
XhmikosR's avatar
XhmikosR committed
2221
2222
2223
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
2224
    var scrollHeight = $('body').height()
2225

XhmikosR's avatar
XhmikosR committed
2226
2227
2228
    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)
2229

2230
    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2231

2232
2233
    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')
2234

2235
2236
      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')
2237

2238
      this.$element.trigger(e)
2239

2240
      if (e.isDefaultPrevented()) return
2241

2242
2243
      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2244

2245
2246
2247
2248
2249
      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }
2250

XhmikosR's avatar
XhmikosR committed
2251
2252
    if (affix == 'bottom') {
      this.$element.offset({
2253
        top: scrollHeight - height - offsetBottom
XhmikosR's avatar
XhmikosR committed
2254
      })
2255
    }
XhmikosR's avatar
XhmikosR committed
2256
  }
Mark Otto's avatar
Mark Otto committed
2257

2258

XhmikosR's avatar
XhmikosR committed
2259
2260
  // AFFIX PLUGIN DEFINITION
  // =======================
2261

XhmikosR's avatar
XhmikosR committed
2262
2263
2264
2265
2266
  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option
2267

XhmikosR's avatar
XhmikosR committed
2268
2269
2270
2271
      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
2272

XhmikosR's avatar
XhmikosR committed
2273
  var old = $.fn.affix
Mark Otto's avatar
Mark Otto committed
2274

XhmikosR's avatar
XhmikosR committed
2275
2276
  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix
2277
2278


XhmikosR's avatar
XhmikosR committed
2279
2280
  // AFFIX NO CONFLICT
  // =================
2281

XhmikosR's avatar
XhmikosR committed
2282
2283
2284
2285
  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }
2286
2287


XhmikosR's avatar
XhmikosR committed
2288
2289
  // AFFIX DATA-API
  // ==============
2290

XhmikosR's avatar
XhmikosR committed
2291
2292
2293
2294
  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()
2295

XhmikosR's avatar
XhmikosR committed
2296
      data.offset = data.offset || {}
2297

Heinrich Fenkart's avatar
Heinrich Fenkart committed
2298
2299
      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
2300

XhmikosR's avatar
XhmikosR committed
2301
      Plugin.call($spy, data)
2302
    })
Mark Otto's avatar
Mark Otto committed
2303
2304
  })

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