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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

100
101
  Alert.TRANSITION_DURATION = 150

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

Mark Otto's avatar
grunt    
Mark Otto committed
277
278
279
280
281
282
283
  $(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target)
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
      Plugin.call($btn, 'toggle')
      e.preventDefault()
    })
Chris Rebert's avatar
Chris Rebert committed
284
    .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.0
Mark Otto's avatar
Mark Otto committed
292
 * http://getbootstrap.com/javascript/#carousel
293
 * ========================================================================
294
 * Copyright 2011-2014 Twitter, Inc.
295
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
296
 * ======================================================================== */
297
298


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

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

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

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

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

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

324
325
  Carousel.TRANSITION_DURATION = 600

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    this.sliding = true

    isCycling && this.pause()

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

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

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

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


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

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

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

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

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


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

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

fat's avatar
fat committed
495

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Mark Otto's avatar
Mark Otto committed
560
  Collapse.VERSION  = '3.3.0'
561

562
563
  Collapse.TRANSITION_DURATION = 350

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

694

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

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

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

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

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

715

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

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

724

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

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

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

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

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

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


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

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

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

Mark Otto's avatar
Mark Otto committed
763
  Dropdown.VERSION = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
764

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

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

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

XhmikosR's avatar
XhmikosR committed
773
    clearMenus()
fat's avatar
fat committed
774

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

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

XhmikosR's avatar
XhmikosR committed
784
      if (e.isDefaultPrevented()) return
785

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

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

XhmikosR's avatar
XhmikosR committed
795
796
    return false
  }
797

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

XhmikosR's avatar
XhmikosR committed
801
    var $this = $(this)
802

XhmikosR's avatar
XhmikosR committed
803
804
    e.preventDefault()
    e.stopPropagation()
805

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

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

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

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

XhmikosR's avatar
XhmikosR committed
819
    if (!$items.length) return
820

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

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

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

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

XhmikosR's avatar
XhmikosR committed
838
      if (!$parent.hasClass('open')) return
839

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

XhmikosR's avatar
XhmikosR committed
842
      if (e.isDefaultPrevented()) return
843
844

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

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

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

XhmikosR's avatar
XhmikosR committed
857
    var $parent = selector && $(selector)
858

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


XhmikosR's avatar
XhmikosR committed
863
864
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
865

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

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

XhmikosR's avatar
XhmikosR committed
876
  var old = $.fn.dropdown
877

XhmikosR's avatar
XhmikosR committed
878
879
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
880

881

XhmikosR's avatar
XhmikosR committed
882
883
  // DROPDOWN NO CONFLICT
  // ====================
884

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

890

XhmikosR's avatar
XhmikosR committed
891
892
893
894
895
896
897
  // 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
898
899
900
    .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)
901

XhmikosR's avatar
XhmikosR committed
902
}(jQuery);
903

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


XhmikosR's avatar
XhmikosR committed
913
914
+function ($) {
  'use strict';
915

XhmikosR's avatar
XhmikosR committed
916
917
  // MODAL CLASS DEFINITION
  // ======================
918

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

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

Mark Otto's avatar
Mark Otto committed
936
  Modal.VERSION  = '3.3.0'
Mark Otto's avatar
grunt    
Mark Otto committed
937

938
939
940
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

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

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

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

XhmikosR's avatar
XhmikosR committed
955
    this.$element.trigger(e)
956

XhmikosR's avatar
XhmikosR committed
957
    if (this.isShown || e.isDefaultPrevented()) return
958

XhmikosR's avatar
XhmikosR committed
959
    this.isShown = true
fat's avatar
build    
fat committed
960

XhmikosR's avatar
XhmikosR committed
961
962
    this.checkScrollbar()
    this.$body.addClass('modal-open')
963

XhmikosR's avatar
XhmikosR committed
964
965
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
966

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
988
      that.enforceFocus()
989

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

XhmikosR's avatar
XhmikosR committed
992
993
994
995
996
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
997
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
998
999
1000
        that.$element.trigger('focus').trigger(e)
    })
  }
For faster browsing, not all history is shown. View entire blame