bootstrap.js 63.2 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
    $el[val](data[state] == null ? this.options[state] : data[state])
Chris Rebert's avatar
Chris Rebert committed
211

XhmikosR's avatar
XhmikosR committed
212
213
214
215
216
217
218
219
    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d)
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
544
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
545

XhmikosR's avatar
XhmikosR committed
546
547
548
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
549

Mark Otto's avatar
Mark Otto committed
550
  Collapse.VERSION  = '3.2.0'
551

552
553
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
554
555
556
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
557

XhmikosR's avatar
XhmikosR committed
558
559
560
561
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
562

XhmikosR's avatar
XhmikosR committed
563
564
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
565

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
566
567
568
569
570
571
572
573
    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
574
575
576
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
577

XhmikosR's avatar
XhmikosR committed
578
579
    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
580
      activesData || actives.data('bs.collapse', null)
XhmikosR's avatar
XhmikosR committed
581
    }
582

XhmikosR's avatar
XhmikosR committed
583
    var dimension = this.dimension()
584

XhmikosR's avatar
XhmikosR committed
585
586
587
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
588
      .attr('aria-expanded', true)
589

XhmikosR's avatar
XhmikosR committed
590
    this.transitioning = 1
591

XhmikosR's avatar
XhmikosR committed
592
593
594
595
596
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
597
      this.$element
XhmikosR's avatar
XhmikosR committed
598
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
599
    }
600

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

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

XhmikosR's avatar
XhmikosR committed
605
606
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
607
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
608
  }
609

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

XhmikosR's avatar
XhmikosR committed
613
614
615
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
616

XhmikosR's avatar
XhmikosR committed
617
    var dimension = this.dimension()
618

XhmikosR's avatar
XhmikosR committed
619
620
621
622
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
626
    this.transitioning = 1
627

XhmikosR's avatar
XhmikosR committed
628
629
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
630
      this.$element
XhmikosR's avatar
XhmikosR committed
631
632
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
633
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
634
    }
635

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

XhmikosR's avatar
XhmikosR committed
638
639
640
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
641
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
642
  }
643

XhmikosR's avatar
XhmikosR committed
644
645
646
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
647

648

XhmikosR's avatar
XhmikosR committed
649
650
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
651

XhmikosR's avatar
XhmikosR committed
652
653
654
655
656
  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
657

Mark Otto's avatar
grunt    
Mark Otto committed
658
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
659
660
661
662
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
663

XhmikosR's avatar
XhmikosR committed
664
  var old = $.fn.collapse
665

XhmikosR's avatar
XhmikosR committed
666
667
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
668

669

XhmikosR's avatar
XhmikosR committed
670
671
  // COLLAPSE NO CONFLICT
  // ====================
672

XhmikosR's avatar
XhmikosR committed
673
674
675
676
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
677

678

XhmikosR's avatar
XhmikosR committed
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
  // COLLAPSE DATA-API
  // =================

  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
    var href
    var $this   = $(this)
    var target  = $this.attr('data-target')
        || e.preventDefault()
        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
    var $target = $(target)
    var data    = $target.data('bs.collapse')
    var option  = data ? 'toggle' : $this.data()
    var parent  = $this.attr('data-parent')
    var $parent = parent && $(parent)

    if (!data || !data.transitioning) {
Heinrich Fenkart's avatar
Heinrich Fenkart committed
695
696
697
      if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed').attr('aria-expanded', false)
      var isCollapsed = $target.hasClass('in')
      $this.toggleClass('collapsed', isCollapsed).attr('aria-expanded', !isCollapsed)
XhmikosR's avatar
XhmikosR committed
698
    }
fat's avatar
fat committed
699

XhmikosR's avatar
XhmikosR committed
700
    Plugin.call($target, option)
701
702
  })

XhmikosR's avatar
XhmikosR committed
703
}(jQuery);
704

705
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
706
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
707
 * http://getbootstrap.com/javascript/#dropdowns
708
 * ========================================================================
709
 * Copyright 2011-2014 Twitter, Inc.
710
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
711
 * ======================================================================== */
712
713


XhmikosR's avatar
XhmikosR committed
714
715
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
716

XhmikosR's avatar
XhmikosR committed
717
718
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
719

XhmikosR's avatar
XhmikosR committed
720
721
722
723
724
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
725

Mark Otto's avatar
Mark Otto committed
726
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
727

XhmikosR's avatar
XhmikosR committed
728
729
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
730

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

XhmikosR's avatar
XhmikosR committed
733
734
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
735

XhmikosR's avatar
XhmikosR committed
736
    clearMenus()
fat's avatar
fat committed
737

XhmikosR's avatar
XhmikosR committed
738
739
740
741
742
    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)
      }
743

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

XhmikosR's avatar
XhmikosR committed
747
      if (e.isDefaultPrevented()) return
748

749
750
751
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
752

XhmikosR's avatar
XhmikosR committed
753
754
755
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
756
    }
757

XhmikosR's avatar
XhmikosR committed
758
759
    return false
  }
760

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

XhmikosR's avatar
XhmikosR committed
764
    var $this = $(this)
765

XhmikosR's avatar
XhmikosR committed
766
767
    e.preventDefault()
    e.stopPropagation()
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

Mark Otto's avatar
grunt    
Mark Otto committed
774
    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
XhmikosR's avatar
XhmikosR committed
775
776
777
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
778

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

XhmikosR's avatar
XhmikosR committed
782
    if (!$items.length) return
783

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

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

XhmikosR's avatar
XhmikosR committed
790
791
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
792

XhmikosR's avatar
XhmikosR committed
793
794
795
796
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
797
798
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
799
      var relatedTarget = { relatedTarget: this }
800

XhmikosR's avatar
XhmikosR committed
801
      if (!$parent.hasClass('open')) return
802

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

XhmikosR's avatar
XhmikosR committed
805
      if (e.isDefaultPrevented()) return
806
807

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
808
809
810
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
811

XhmikosR's avatar
XhmikosR committed
812
813
  function getParent($this) {
    var selector = $this.attr('data-target')
814

XhmikosR's avatar
XhmikosR committed
815
816
817
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
818
819
    }

XhmikosR's avatar
XhmikosR committed
820
    var $parent = selector && $(selector)
821

XhmikosR's avatar
XhmikosR committed
822
823
    return $parent && $parent.length ? $parent : $this.parent()
  }
824
825


XhmikosR's avatar
XhmikosR committed
826
827
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
828

XhmikosR's avatar
XhmikosR committed
829
830
831
832
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
833

XhmikosR's avatar
XhmikosR committed
834
835
836
837
      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
838

XhmikosR's avatar
XhmikosR committed
839
  var old = $.fn.dropdown
840

XhmikosR's avatar
XhmikosR committed
841
842
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
843

844

XhmikosR's avatar
XhmikosR committed
845
846
  // DROPDOWN NO CONFLICT
  // ====================
847

XhmikosR's avatar
XhmikosR committed
848
849
850
851
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
852

853

XhmikosR's avatar
XhmikosR committed
854
855
856
857
858
859
860
861
  // 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)
862

XhmikosR's avatar
XhmikosR committed
863
}(jQuery);
864

865
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
866
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
867
 * http://getbootstrap.com/javascript/#modals
868
 * ========================================================================
869
 * Copyright 2011-2014 Twitter, Inc.
870
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
871
 * ======================================================================== */
872
873


XhmikosR's avatar
XhmikosR committed
874
875
+function ($) {
  'use strict';
876

XhmikosR's avatar
XhmikosR committed
877
878
  // MODAL CLASS DEFINITION
  // ======================
879

XhmikosR's avatar
XhmikosR committed
880
881
882
883
884
885
886
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
887

XhmikosR's avatar
XhmikosR committed
888
889
890
891
892
893
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
894
    }
XhmikosR's avatar
XhmikosR committed
895
  }
896

Mark Otto's avatar
Mark Otto committed
897
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
898

899
900
901
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
902
903
904
905
906
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
907

XhmikosR's avatar
XhmikosR committed
908
909
910
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
911

XhmikosR's avatar
XhmikosR committed
912
913
914
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
915

XhmikosR's avatar
XhmikosR committed
916
    this.$element.trigger(e)
917

XhmikosR's avatar
XhmikosR committed
918
    if (this.isShown || e.isDefaultPrevented()) return
919

XhmikosR's avatar
XhmikosR committed
920
    this.isShown = true
fat's avatar
build    
fat committed
921

XhmikosR's avatar
XhmikosR committed
922
923
    this.checkScrollbar()
    this.$body.addClass('modal-open')
924

XhmikosR's avatar
XhmikosR committed
925
926
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
927

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

XhmikosR's avatar
XhmikosR committed
930
931
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
932

XhmikosR's avatar
XhmikosR committed
933
934
935
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
936

XhmikosR's avatar
XhmikosR committed
937
938
939
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
940

XhmikosR's avatar
XhmikosR committed
941
942
943
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
948

XhmikosR's avatar
XhmikosR committed
949
      that.enforceFocus()
950

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

XhmikosR's avatar
XhmikosR committed
953
954
955
956
957
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
958
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
959
960
961
        that.$element.trigger('focus').trigger(e)
    })
  }
962

XhmikosR's avatar
XhmikosR committed
963
964
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
965

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

XhmikosR's avatar
XhmikosR committed
968
    this.$element.trigger(e)
969

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

XhmikosR's avatar
XhmikosR committed
972
    this.isShown = false
973

XhmikosR's avatar
XhmikosR committed
974
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
975

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

XhmikosR's avatar
XhmikosR committed
978
979
980
981
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
982

XhmikosR's avatar
XhmikosR committed
983
984
985
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
986
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
987
988
      this.hideModal()
  }
989

XhmikosR's avatar
XhmikosR committed
990
991
992
993
994
995
996
997
998
999
1000
  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
For faster browsing, not all history is shown. View entire blame