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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

100
101
  Alert.TRANSITION_DURATION = 150

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

324
325
  Carousel.TRANSITION_DURATION = 600

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    this.sliding = true

    isCycling && this.pause()

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

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

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

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


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

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

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

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

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


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

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

fat's avatar
fat committed
495

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

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

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

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

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

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

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

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


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

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

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

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

XhmikosR's avatar
XhmikosR committed
553
554
    if (this.options.toggle) this.toggle()
  }
555

Mark Otto's avatar
Mark Otto committed
556
  Collapse.VERSION  = '3.2.0'
557

558
559
  Collapse.TRANSITION_DURATION = 350

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

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

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

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
573
574
575
576
577
578
579
580
    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
581
582
583
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
584

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

XhmikosR's avatar
XhmikosR committed
590
    var dimension = this.dimension()
591

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

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

XhmikosR's avatar
XhmikosR committed
601
    this.transitioning = 1
602

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
628
    var dimension = this.dimension()
629

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

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

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

XhmikosR's avatar
XhmikosR committed
641
    this.transitioning = 1
642

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

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

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

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

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

690

XhmikosR's avatar
XhmikosR committed
691
692
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
693

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

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

XhmikosR's avatar
XhmikosR committed
706
  var old = $.fn.collapse
707

XhmikosR's avatar
XhmikosR committed
708
709
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
710

711

XhmikosR's avatar
XhmikosR committed
712
713
  // COLLAPSE NO CONFLICT
  // ====================
714

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

720

XhmikosR's avatar
XhmikosR committed
721
722
723
724
725
  // 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
726
727
728
729

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

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

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

XhmikosR's avatar
XhmikosR committed
736
}(jQuery);
737

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


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

XhmikosR's avatar
XhmikosR committed
750
751
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
752

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

Mark Otto's avatar
Mark Otto committed
759
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
760

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

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

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

XhmikosR's avatar
XhmikosR committed
769
    clearMenus()
fat's avatar
fat committed
770

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

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

XhmikosR's avatar
XhmikosR committed
780
      if (e.isDefaultPrevented()) return
781

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

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

XhmikosR's avatar
XhmikosR committed
791
792
    return false
  }
793

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

XhmikosR's avatar
XhmikosR committed
797
    var $this = $(this)
798

XhmikosR's avatar
XhmikosR committed
799
800
    e.preventDefault()
    e.stopPropagation()
801

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

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

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

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

XhmikosR's avatar
XhmikosR committed
815
    if (!$items.length) return
816

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

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

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

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

XhmikosR's avatar
XhmikosR committed
834
      if (!$parent.hasClass('open')) return
835

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

XhmikosR's avatar
XhmikosR committed
838
      if (e.isDefaultPrevented()) return
839
840

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

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

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

XhmikosR's avatar
XhmikosR committed
853
    var $parent = selector && $(selector)
854

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


XhmikosR's avatar
XhmikosR committed
859
860
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
861

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

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

XhmikosR's avatar
XhmikosR committed
872
  var old = $.fn.dropdown
873

XhmikosR's avatar
XhmikosR committed
874
875
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
876

877

XhmikosR's avatar
XhmikosR committed
878
879
  // DROPDOWN NO CONFLICT
  // ====================
880

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

886

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

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

XhmikosR's avatar
XhmikosR committed
896
}(jQuery);
897

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


XhmikosR's avatar
XhmikosR committed
907
908
+function ($) {
  'use strict';
909

XhmikosR's avatar
XhmikosR committed
910
911
  // MODAL CLASS DEFINITION
  // ======================
912

XhmikosR's avatar
XhmikosR committed
913
914
915
916
917
918
919
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
920

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

Mark Otto's avatar
Mark Otto committed
930
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
931

932
933
934
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
935
936
937
938
939
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
940

XhmikosR's avatar
XhmikosR committed
941
942
943
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
948

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

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

XhmikosR's avatar
XhmikosR committed
953
    this.isShown = true
fat's avatar
build    
fat committed
954

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

XhmikosR's avatar
XhmikosR committed
958
959
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
960

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

XhmikosR's avatar
XhmikosR committed
963
964
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
965

XhmikosR's avatar
XhmikosR committed
966
967
968
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
969

XhmikosR's avatar
XhmikosR committed
970
971
972
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
973

XhmikosR's avatar
XhmikosR committed
974
975
976
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
977

XhmikosR's avatar
XhmikosR committed
978
979
980
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
981

XhmikosR's avatar
XhmikosR committed
982
      that.enforceFocus()
983

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

XhmikosR's avatar
XhmikosR committed
986
987
988
989
990
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
991
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
992
993
994
        that.$element.trigger('focus').trigger(e)
    })
  }
995

XhmikosR's avatar
XhmikosR committed
996
997
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
998

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

For faster browsing, not all history is shown. View entire blame