bootstrap.js 62 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

7
if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
8

9
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
10
 * Bootstrap: transition.js v3.2.0
Mark Otto's avatar
Mark Otto committed
11
 * http://getbootstrap.com/javascript/#transitions
12
 * ========================================================================
13
 * Copyright 2011-2014 Twitter, Inc.
14
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15
 * ======================================================================== */
16
17


XhmikosR's avatar
XhmikosR committed
18
19
+function ($) {
  'use strict';
Mark Otto's avatar
grunt    
Mark Otto committed
20

XhmikosR's avatar
XhmikosR committed
21
22
  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================
23

XhmikosR's avatar
XhmikosR committed
24
25
  function transitionEnd() {
    var el = document.createElement('bootstrap')
26

XhmikosR's avatar
XhmikosR committed
27
28
29
30
31
32
    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }
33

XhmikosR's avatar
XhmikosR committed
34
35
36
    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
37
      }
Chris Rebert's avatar
Chris Rebert committed
38
39
    }

XhmikosR's avatar
XhmikosR committed
40
41
    return false // explicit for ie8 (  ._.)
  }
42

XhmikosR's avatar
XhmikosR committed
43
44
45
46
47
48
49
50
51
  // 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
  }
52

XhmikosR's avatar
XhmikosR committed
53
54
  $(function () {
    $.support.transition = transitionEnd()
Chris Rebert's avatar
Chris Rebert committed
55

XhmikosR's avatar
XhmikosR committed
56
    if (!$.support.transition) return
57

XhmikosR's avatar
XhmikosR committed
58
59
60
61
62
63
64
    $.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
65
  })
66

XhmikosR's avatar
XhmikosR committed
67
}(jQuery);
68

69
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
70
 * Bootstrap: alert.js v3.2.0
Mark Otto's avatar
Mark Otto committed
71
 * http://getbootstrap.com/javascript/#alerts
72
 * ========================================================================
73
 * Copyright 2011-2014 Twitter, Inc.
74
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
75
 * ======================================================================== */
76
77


XhmikosR's avatar
XhmikosR committed
78
79
+function ($) {
  'use strict';
80

XhmikosR's avatar
XhmikosR committed
81
82
  // ALERT CLASS DEFINITION
  // ======================
83

XhmikosR's avatar
XhmikosR committed
84
85
86
87
  var dismiss = '[data-dismiss="alert"]'
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }
Mark Otto's avatar
grunt    
Mark Otto committed
88

Mark Otto's avatar
Mark Otto committed
89
  Alert.VERSION = '3.2.0'
90

91
92
  Alert.TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
93
94
95
  Alert.prototype.close = function (e) {
    var $this    = $(this)
    var selector = $this.attr('data-target')
96

XhmikosR's avatar
XhmikosR committed
97
98
99
100
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }
101

XhmikosR's avatar
XhmikosR committed
102
    var $parent = $(selector)
103

XhmikosR's avatar
XhmikosR committed
104
    if (e) e.preventDefault()
105

XhmikosR's avatar
XhmikosR committed
106
    if (!$parent.length) {
Chris Rebert's avatar
grunt    
Chris Rebert committed
107
      $parent = $this.closest('.alert')
XhmikosR's avatar
XhmikosR committed
108
    }
109

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

XhmikosR's avatar
XhmikosR committed
112
    if (e.isDefaultPrevented()) return
113

XhmikosR's avatar
XhmikosR committed
114
    $parent.removeClass('in')
115

XhmikosR's avatar
XhmikosR committed
116
117
118
    function removeElement() {
      // detach from parent, fire event then clean up data
      $parent.detach().trigger('closed.bs.alert').remove()
119
120
    }

XhmikosR's avatar
XhmikosR committed
121
122
123
    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
124
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
125
126
      removeElement()
  }
127
128


XhmikosR's avatar
XhmikosR committed
129
130
  // ALERT PLUGIN DEFINITION
  // =======================
131

XhmikosR's avatar
XhmikosR committed
132
133
134
135
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')
fat's avatar
fat committed
136

XhmikosR's avatar
XhmikosR committed
137
138
139
140
      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }
141

XhmikosR's avatar
XhmikosR committed
142
  var old = $.fn.alert
Mark Otto's avatar
Mark Otto committed
143

XhmikosR's avatar
XhmikosR committed
144
145
  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert
146
147


XhmikosR's avatar
XhmikosR committed
148
149
  // ALERT NO CONFLICT
  // =================
150

XhmikosR's avatar
XhmikosR committed
151
152
153
154
  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }
155
156


XhmikosR's avatar
XhmikosR committed
157
158
  // ALERT DATA-API
  // ==============
159

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

XhmikosR's avatar
XhmikosR committed
162
}(jQuery);
163

164
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
165
 * Bootstrap: button.js v3.2.0
Mark Otto's avatar
Mark Otto committed
166
 * http://getbootstrap.com/javascript/#buttons
167
 * ========================================================================
168
 * Copyright 2011-2014 Twitter, Inc.
169
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
170
 * ======================================================================== */
171
172


XhmikosR's avatar
XhmikosR committed
173
174
+function ($) {
  'use strict';
fat's avatar
fat committed
175

XhmikosR's avatar
XhmikosR committed
176
177
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
Mark Otto's avatar
grunt    
Mark Otto committed
178

XhmikosR's avatar
XhmikosR committed
179
180
181
182
183
  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }
184

Mark Otto's avatar
Mark Otto committed
185
  Button.VERSION  = '3.2.0'
186

XhmikosR's avatar
XhmikosR committed
187
188
189
  Button.DEFAULTS = {
    loadingText: 'loading...'
  }
fat's avatar
fat committed
190

XhmikosR's avatar
XhmikosR committed
191
192
193
194
195
  Button.prototype.setState = function (state) {
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()
196

XhmikosR's avatar
XhmikosR committed
197
    state = state + 'Text'
198

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

XhmikosR's avatar
XhmikosR committed
201
    $el[val](data[state] == null ? this.options[state] : data[state])
Chris Rebert's avatar
Chris Rebert committed
202

XhmikosR's avatar
XhmikosR committed
203
204
205
206
207
208
209
210
    // 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)
211
      }
XhmikosR's avatar
XhmikosR committed
212
213
214
215
216
217
218
219
220
221
222
223
224
225
    }, 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
226
227
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
fat's avatar
fat committed
228
    }
229

XhmikosR's avatar
XhmikosR committed
230
231
    if (changed) this.$element.toggleClass('active')
  }
232
233


XhmikosR's avatar
XhmikosR committed
234
235
  // BUTTON PLUGIN DEFINITION
  // ========================
236

XhmikosR's avatar
XhmikosR committed
237
238
239
240
241
  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
242

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

XhmikosR's avatar
XhmikosR committed
245
246
247
248
      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }
249

XhmikosR's avatar
XhmikosR committed
250
  var old = $.fn.button
Mark Otto's avatar
Mark Otto committed
251

XhmikosR's avatar
XhmikosR committed
252
253
  $.fn.button             = Plugin
  $.fn.button.Constructor = Button
254
255


XhmikosR's avatar
XhmikosR committed
256
257
  // BUTTON NO CONFLICT
  // ==================
258

XhmikosR's avatar
XhmikosR committed
259
260
261
262
  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }
263
264


XhmikosR's avatar
XhmikosR committed
265
266
  // BUTTON DATA-API
  // ===============
267

Mark Otto's avatar
grunt    
Mark Otto committed
268
269
270
271
272
273
274
  $(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
275
276
    .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
277
    })
278

XhmikosR's avatar
XhmikosR committed
279
}(jQuery);
280

281
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
282
 * Bootstrap: carousel.js v3.2.0
Mark Otto's avatar
Mark Otto committed
283
 * http://getbootstrap.com/javascript/#carousel
284
 * ========================================================================
285
 * Copyright 2011-2014 Twitter, Inc.
286
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
287
 * ======================================================================== */
288
289


XhmikosR's avatar
XhmikosR committed
290
291
+function ($) {
  'use strict';
292

XhmikosR's avatar
XhmikosR committed
293
294
  // CAROUSEL CLASS DEFINITION
  // =========================
295

XhmikosR's avatar
XhmikosR committed
296
  var Carousel = function (element, options) {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
297
    this.$element    = $(element)
XhmikosR's avatar
XhmikosR committed
298
299
300
301
302
303
304
    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
305

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

308
    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
XhmikosR's avatar
XhmikosR committed
309
310
311
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
312

Mark Otto's avatar
Mark Otto committed
313
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
314

315
316
  Carousel.TRANSITION_DURATION = 600

XhmikosR's avatar
XhmikosR committed
317
318
319
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
320
321
    wrap: true,
    keyboard: true
XhmikosR's avatar
XhmikosR committed
322
  }
323

XhmikosR's avatar
XhmikosR committed
324
325
326
327
328
  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
329
330
    }

XhmikosR's avatar
XhmikosR committed
331
332
    e.preventDefault()
  }
333

XhmikosR's avatar
XhmikosR committed
334
335
  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)
fat's avatar
fat committed
336

XhmikosR's avatar
XhmikosR committed
337
    this.interval && clearInterval(this.interval)
338

XhmikosR's avatar
XhmikosR committed
339
340
341
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
342

XhmikosR's avatar
XhmikosR committed
343
344
    return this
  }
345

XhmikosR's avatar
XhmikosR committed
346
347
348
349
  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }
350

XhmikosR's avatar
XhmikosR committed
351
352
353
354
355
356
357
  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
358
359
360
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
361

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

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

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

XhmikosR's avatar
XhmikosR committed
370
371
372
373
374
375
  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)
376
377
    }

XhmikosR's avatar
XhmikosR committed
378
    this.interval = clearInterval(this.interval)
379

XhmikosR's avatar
XhmikosR committed
380
381
    return this
  }
382

XhmikosR's avatar
XhmikosR committed
383
384
385
386
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
387

XhmikosR's avatar
XhmikosR committed
388
389
390
391
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
392

XhmikosR's avatar
XhmikosR committed
393
394
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
395
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
396
397
398
399
    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
400

XhmikosR's avatar
XhmikosR committed
401
402
403
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
404
405
    }

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

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

XhmikosR's avatar
XhmikosR committed
449
    isCycling && this.cycle()
450

XhmikosR's avatar
XhmikosR committed
451
452
    return this
  }
453
454


XhmikosR's avatar
XhmikosR committed
455
456
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
457

XhmikosR's avatar
XhmikosR committed
458
459
460
461
462
463
464
465
466
467
468
469
470
  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()
    })
  }
471

XhmikosR's avatar
XhmikosR committed
472
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
473

XhmikosR's avatar
XhmikosR committed
474
475
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
476
477


XhmikosR's avatar
XhmikosR committed
478
479
  // CAROUSEL NO CONFLICT
  // ====================
480

XhmikosR's avatar
XhmikosR committed
481
482
483
484
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
485

fat's avatar
fat committed
486

XhmikosR's avatar
XhmikosR committed
487
488
  // CAROUSEL DATA-API
  // =================
489

XhmikosR's avatar
XhmikosR committed
490
491
492
493
494
495
496
497
  $(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
498

XhmikosR's avatar
XhmikosR committed
499
    Plugin.call($target, options)
500

XhmikosR's avatar
XhmikosR committed
501
502
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
503
504
    }

XhmikosR's avatar
XhmikosR committed
505
506
    e.preventDefault()
  })
507

XhmikosR's avatar
XhmikosR committed
508
509
510
511
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
fat's avatar
fat committed
512
513
514
    })
  })

XhmikosR's avatar
XhmikosR committed
515
}(jQuery);
516

517
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
518
 * Bootstrap: collapse.js v3.2.0
Mark Otto's avatar
Mark Otto committed
519
 * http://getbootstrap.com/javascript/#collapse
520
 * ========================================================================
521
 * Copyright 2011-2014 Twitter, Inc.
522
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
523
 * ======================================================================== */
524
525


XhmikosR's avatar
XhmikosR committed
526
527
+function ($) {
  'use strict';
528

XhmikosR's avatar
XhmikosR committed
529
530
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
531

XhmikosR's avatar
XhmikosR committed
532
533
534
535
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
536

XhmikosR's avatar
XhmikosR committed
537
538
539
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
540

Mark Otto's avatar
Mark Otto committed
541
  Collapse.VERSION  = '3.2.0'
542

543
544
  Collapse.TRANSITION_DURATION = 350

XhmikosR's avatar
XhmikosR committed
545
546
547
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
548

XhmikosR's avatar
XhmikosR committed
549
550
551
552
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
553

XhmikosR's avatar
XhmikosR committed
554
555
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
556

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
557
558
559
560
561
562
563
564
    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
565
566
567
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
568

XhmikosR's avatar
XhmikosR committed
569
570
    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
571
      activesData || actives.data('bs.collapse', null)
XhmikosR's avatar
XhmikosR committed
572
    }
573

XhmikosR's avatar
XhmikosR committed
574
    var dimension = this.dimension()
575

XhmikosR's avatar
XhmikosR committed
576
577
578
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
579
      .attr('aria-expanded', true)
580

XhmikosR's avatar
XhmikosR committed
581
    this.transitioning = 1
582

XhmikosR's avatar
XhmikosR committed
583
584
585
586
587
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
588
      this.$element
XhmikosR's avatar
XhmikosR committed
589
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
590
    }
591

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

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

XhmikosR's avatar
XhmikosR committed
596
597
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
598
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
599
  }
600

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

XhmikosR's avatar
XhmikosR committed
604
605
606
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
607

XhmikosR's avatar
XhmikosR committed
608
    var dimension = this.dimension()
609

XhmikosR's avatar
XhmikosR committed
610
611
612
613
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
617
    this.transitioning = 1
618

XhmikosR's avatar
XhmikosR committed
619
620
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
621
      this.$element
XhmikosR's avatar
XhmikosR committed
622
623
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
624
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
625
    }
626

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

XhmikosR's avatar
XhmikosR committed
629
630
631
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
632
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
633
  }
634

XhmikosR's avatar
XhmikosR committed
635
636
637
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
638

639

XhmikosR's avatar
XhmikosR committed
640
641
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
642

XhmikosR's avatar
XhmikosR committed
643
644
645
646
647
  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
648

Mark Otto's avatar
grunt    
Mark Otto committed
649
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
650
651
652
653
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
654

XhmikosR's avatar
XhmikosR committed
655
  var old = $.fn.collapse
656

XhmikosR's avatar
XhmikosR committed
657
658
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
659

660

XhmikosR's avatar
XhmikosR committed
661
662
  // COLLAPSE NO CONFLICT
  // ====================
663

XhmikosR's avatar
XhmikosR committed
664
665
666
667
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
668

669

XhmikosR's avatar
XhmikosR committed
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
  // 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
686
687
688
      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
689
    }
fat's avatar
fat committed
690

XhmikosR's avatar
XhmikosR committed
691
    Plugin.call($target, option)
692
693
  })

XhmikosR's avatar
XhmikosR committed
694
}(jQuery);
695

696
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
697
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
698
 * http://getbootstrap.com/javascript/#dropdowns
699
 * ========================================================================
700
 * Copyright 2011-2014 Twitter, Inc.
701
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
702
 * ======================================================================== */
703
704


XhmikosR's avatar
XhmikosR committed
705
706
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
707

XhmikosR's avatar
XhmikosR committed
708
709
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
710

XhmikosR's avatar
XhmikosR committed
711
712
713
714
715
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
716

Mark Otto's avatar
Mark Otto committed
717
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
718

XhmikosR's avatar
XhmikosR committed
719
720
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
721

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

XhmikosR's avatar
XhmikosR committed
724
725
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
726

XhmikosR's avatar
XhmikosR committed
727
    clearMenus()
fat's avatar
fat committed
728

XhmikosR's avatar
XhmikosR committed
729
730
731
732
733
    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)
      }
734

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

XhmikosR's avatar
XhmikosR committed
738
      if (e.isDefaultPrevented()) return
739

740
741
742
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
743

XhmikosR's avatar
XhmikosR committed
744
745
746
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
747
    }
748

XhmikosR's avatar
XhmikosR committed
749
750
    return false
  }
751

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

XhmikosR's avatar
XhmikosR committed
755
    var $this = $(this)
756

XhmikosR's avatar
XhmikosR committed
757
758
    e.preventDefault()
    e.stopPropagation()
759

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

XhmikosR's avatar
XhmikosR committed
762
763
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
764

Mark Otto's avatar
grunt    
Mark Otto committed
765
    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
XhmikosR's avatar
XhmikosR committed
766
767
768
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
769

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

XhmikosR's avatar
XhmikosR committed
773
    if (!$items.length) return
774

XhmikosR's avatar
XhmikosR committed
775
    var index = $items.index($items.filter(':focus'))
776

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

XhmikosR's avatar
XhmikosR committed
781
782
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
783

XhmikosR's avatar
XhmikosR committed
784
785
786
787
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
788
789
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
790
      var relatedTarget = { relatedTarget: this }
791

XhmikosR's avatar
XhmikosR committed
792
      if (!$parent.hasClass('open')) return
793

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

XhmikosR's avatar
XhmikosR committed
796
      if (e.isDefaultPrevented()) return
797
798

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
799
800
801
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
802

XhmikosR's avatar
XhmikosR committed
803
804
  function getParent($this) {
    var selector = $this.attr('data-target')
805

XhmikosR's avatar
XhmikosR committed
806
807
808
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
809
810
    }

XhmikosR's avatar
XhmikosR committed
811
    var $parent = selector && $(selector)
812

XhmikosR's avatar
XhmikosR committed
813
814
    return $parent && $parent.length ? $parent : $this.parent()
  }
815
816


XhmikosR's avatar
XhmikosR committed
817
818
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
819

XhmikosR's avatar
XhmikosR committed
820
821
822
823
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
824

XhmikosR's avatar
XhmikosR committed
825
826
827
828
      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
829

XhmikosR's avatar
XhmikosR committed
830
  var old = $.fn.dropdown
831

XhmikosR's avatar
XhmikosR committed
832
833
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
834

835

XhmikosR's avatar
XhmikosR committed
836
837
  // DROPDOWN NO CONFLICT
  // ====================
838

XhmikosR's avatar
XhmikosR committed
839
840
841
842
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
843

844

XhmikosR's avatar
XhmikosR committed
845
846
847
848
849
850
851
852
  // 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)
853

XhmikosR's avatar
XhmikosR committed
854
}(jQuery);
855

856
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
857
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
858
 * http://getbootstrap.com/javascript/#modals
859
 * ========================================================================
860
 * Copyright 2011-2014 Twitter, Inc.
861
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
862
 * ======================================================================== */
863
864


XhmikosR's avatar
XhmikosR committed
865
866
+function ($) {
  'use strict';
867

XhmikosR's avatar
XhmikosR committed
868
869
  // MODAL CLASS DEFINITION
  // ======================
870

XhmikosR's avatar
XhmikosR committed
871
872
873
874
875
876
877
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
878

XhmikosR's avatar
XhmikosR committed
879
880
881
882
883
884
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
885
    }
XhmikosR's avatar
XhmikosR committed
886
  }
887

Mark Otto's avatar
Mark Otto committed
888
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
889

890
891
892
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
893
894
895
896
897
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
898

XhmikosR's avatar
XhmikosR committed
899
900
901
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
902

XhmikosR's avatar
XhmikosR committed
903
904
905
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
906

XhmikosR's avatar
XhmikosR committed
907
    this.$element.trigger(e)
908

XhmikosR's avatar
XhmikosR committed
909
    if (this.isShown || e.isDefaultPrevented()) return
910

XhmikosR's avatar
XhmikosR committed
911
    this.isShown = true
fat's avatar
build    
fat committed
912

XhmikosR's avatar
XhmikosR committed
913
914
    this.checkScrollbar()
    this.$body.addClass('modal-open')
915

XhmikosR's avatar
XhmikosR committed
916
917
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
918

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

XhmikosR's avatar
XhmikosR committed
921
922
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
923

XhmikosR's avatar
XhmikosR committed
924
925
926
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
927

XhmikosR's avatar
XhmikosR committed
928
929
930
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
931

XhmikosR's avatar
XhmikosR committed
932
933
934
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
935

XhmikosR's avatar
XhmikosR committed
936
937
938
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
939

XhmikosR's avatar
XhmikosR committed
940
      that.enforceFocus()
941

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

XhmikosR's avatar
XhmikosR committed
944
945
946
947
948
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
949
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
950
951
952
        that.$element.trigger('focus').trigger(e)
    })
  }
953

XhmikosR's avatar
XhmikosR committed
954
955
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
956

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

XhmikosR's avatar
XhmikosR committed
959
    this.$element.trigger(e)
960

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

XhmikosR's avatar
XhmikosR committed
963
    this.isShown = false
964

XhmikosR's avatar
XhmikosR committed
965
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
966

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

XhmikosR's avatar
XhmikosR committed
969
970
971
972
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
973

XhmikosR's avatar
XhmikosR committed
974
975
976
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
977
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
978
979
      this.hideModal()
  }
980

XhmikosR's avatar
XhmikosR committed
981
982
983
984
985
986
987
988
989
990
991
992
  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
Mark Otto's avatar
grunt    
Mark Otto committed
993
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
994
995
996
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
997
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
998
999
1000
    }
  }

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