bootstrap.js 65.6 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
363
364
365
366
367
  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
368
369
370
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
371

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

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

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

XhmikosR's avatar
XhmikosR committed
380
381
382
383
384
385
  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)
386
387
    }

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

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

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

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

XhmikosR's avatar
XhmikosR committed
403
404
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
405
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
406
407
408
409
    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
410

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

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

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

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

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


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

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

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

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


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

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

fat's avatar
fat committed
496

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Mark Otto's avatar
Mark Otto committed
561
  Collapse.VERSION  = '3.3.1'
562

563
564
  Collapse.TRANSITION_DURATION = 350

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

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

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
578
579
580
581
582
583
584
585
    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
586
587
588
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
589

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
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
694
  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)
  }

695

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

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

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

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

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

716

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

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

725

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

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

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

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

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

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


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

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

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

Mark Otto's avatar
Mark Otto committed
764
  Dropdown.VERSION = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
765

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

882

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

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

891

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

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

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


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

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

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

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

Mark Otto's avatar
Mark Otto committed
937
  Modal.VERSION  = '3.3.1'
Mark Otto's avatar
grunt    
Mark Otto committed
938

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

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
962
    this.checkScrollbar()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
963
    this.setScrollbar()
XhmikosR's avatar
XhmikosR committed
964
    this.$body.addClass('modal-open')
965

XhmikosR's avatar
XhmikosR committed
966
    this.escape()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
967
    this.resize()
fat's avatar
rebuild    
fat committed
968

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

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

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

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
982
983
      if (that.options.backdrop) that.adjustBackdrop()
      that.adjustDialog()
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
984

XhmikosR's avatar
XhmikosR committed
985
986
987
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
988

XhmikosR's avatar
XhmikosR committed
989
990
991
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
992

XhmikosR's avatar
XhmikosR committed
993
      that.enforceFocus()
994

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

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