bootstrap.js 61.8 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')
fat's avatar
fat committed
226
    }
227

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


XhmikosR's avatar
XhmikosR committed
232
233
  // BUTTON PLUGIN DEFINITION
  // ========================
234

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

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

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

XhmikosR's avatar
XhmikosR committed
248
  var old = $.fn.button
Mark Otto's avatar
Mark Otto committed
249

XhmikosR's avatar
XhmikosR committed
250
251
  $.fn.button             = Plugin
  $.fn.button.Constructor = Button
252
253


XhmikosR's avatar
XhmikosR committed
254
255
  // BUTTON NO CONFLICT
  // ==================
256

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


XhmikosR's avatar
XhmikosR committed
263
264
  // BUTTON DATA-API
  // ===============
265

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

XhmikosR's avatar
XhmikosR committed
277
}(jQuery);
278

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


XhmikosR's avatar
XhmikosR committed
288
289
+function ($) {
  'use strict';
290

XhmikosR's avatar
XhmikosR committed
291
292
  // CAROUSEL CLASS DEFINITION
  // =========================
293

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

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

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

Mark Otto's avatar
Mark Otto committed
311
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
312

313
314
  Carousel.TRANSITION_DURATION = 600

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

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

XhmikosR's avatar
XhmikosR committed
329
330
    e.preventDefault()
  }
331

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

XhmikosR's avatar
XhmikosR committed
335
    this.interval && clearInterval(this.interval)
336

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

XhmikosR's avatar
XhmikosR committed
341
342
    return this
  }
343

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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
376
    this.interval = clearInterval(this.interval)
377

XhmikosR's avatar
XhmikosR committed
378
379
    return this
  }
380

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
406
407
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
    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)
        })
439
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
XhmikosR's avatar
XhmikosR committed
440
441
442
443
444
445
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
446

XhmikosR's avatar
XhmikosR committed
447
    isCycling && this.cycle()
448

XhmikosR's avatar
XhmikosR committed
449
450
    return this
  }
451
452


XhmikosR's avatar
XhmikosR committed
453
454
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
455

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

XhmikosR's avatar
XhmikosR committed
470
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
471

XhmikosR's avatar
XhmikosR committed
472
473
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
474
475


XhmikosR's avatar
XhmikosR committed
476
477
  // CAROUSEL NO CONFLICT
  // ====================
478

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

fat's avatar
fat committed
484

XhmikosR's avatar
XhmikosR committed
485
486
  // CAROUSEL DATA-API
  // =================
487

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

XhmikosR's avatar
XhmikosR committed
497
    Plugin.call($target, options)
498

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

XhmikosR's avatar
XhmikosR committed
503
504
    e.preventDefault()
  })
505

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

XhmikosR's avatar
XhmikosR committed
513
}(jQuery);
514

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


XhmikosR's avatar
XhmikosR committed
524
525
+function ($) {
  'use strict';
526

XhmikosR's avatar
XhmikosR committed
527
528
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
529

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

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

Mark Otto's avatar
Mark Otto committed
539
  Collapse.VERSION  = '3.2.0'
540

541
542
  Collapse.TRANSITION_DURATION = 350

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

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

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

XhmikosR's avatar
XhmikosR committed
555
556
557
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
558

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
559
    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
560

XhmikosR's avatar
XhmikosR committed
561
562
563
564
565
566
    if (actives && actives.length) {
      var hasData = actives.data('bs.collapse')
      if (hasData && hasData.transitioning) return
      Plugin.call(actives, 'hide')
      hasData || actives.data('bs.collapse', null)
    }
567

XhmikosR's avatar
XhmikosR committed
568
    var dimension = this.dimension()
569

XhmikosR's avatar
XhmikosR committed
570
571
572
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
Heinrich Fenkart's avatar
Heinrich Fenkart committed
573
      .attr('aria-expanded', true)
574

XhmikosR's avatar
XhmikosR committed
575
    this.transitioning = 1
576

XhmikosR's avatar
XhmikosR committed
577
578
579
580
581
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
582
      this.$element
XhmikosR's avatar
XhmikosR committed
583
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
584
    }
585

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

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

XhmikosR's avatar
XhmikosR committed
590
591
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
592
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
XhmikosR's avatar
XhmikosR committed
593
  }
594

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

XhmikosR's avatar
XhmikosR committed
598
599
600
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
601

XhmikosR's avatar
XhmikosR committed
602
    var dimension = this.dimension()
603

XhmikosR's avatar
XhmikosR committed
604
605
606
607
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
611
    this.transitioning = 1
612

XhmikosR's avatar
XhmikosR committed
613
614
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
615
      this.$element
XhmikosR's avatar
XhmikosR committed
616
617
        .removeClass('collapsing')
        .addClass('collapse')
Heinrich Fenkart's avatar
Heinrich Fenkart committed
618
        .trigger('hidden.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
619
    }
620

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

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

XhmikosR's avatar
XhmikosR committed
629
630
631
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
632

633

XhmikosR's avatar
XhmikosR committed
634
635
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
636

XhmikosR's avatar
XhmikosR committed
637
638
639
640
641
  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
642

Mark Otto's avatar
grunt    
Mark Otto committed
643
      if (!data && options.toggle && option == 'show') options.toggle = false
XhmikosR's avatar
XhmikosR committed
644
645
646
647
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
648

XhmikosR's avatar
XhmikosR committed
649
  var old = $.fn.collapse
650

XhmikosR's avatar
XhmikosR committed
651
652
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
653

654

XhmikosR's avatar
XhmikosR committed
655
656
  // COLLAPSE NO CONFLICT
  // ====================
657

XhmikosR's avatar
XhmikosR committed
658
659
660
661
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
662

663

XhmikosR's avatar
XhmikosR committed
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
  // 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
680
681
682
      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
683
    }
fat's avatar
fat committed
684

XhmikosR's avatar
XhmikosR committed
685
    Plugin.call($target, option)
686
687
  })

XhmikosR's avatar
XhmikosR committed
688
}(jQuery);
689

690
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
691
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
692
 * http://getbootstrap.com/javascript/#dropdowns
693
 * ========================================================================
694
 * Copyright 2011-2014 Twitter, Inc.
695
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
696
 * ======================================================================== */
697
698


XhmikosR's avatar
XhmikosR committed
699
700
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
701

XhmikosR's avatar
XhmikosR committed
702
703
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
704

XhmikosR's avatar
XhmikosR committed
705
706
707
708
709
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
710

Mark Otto's avatar
Mark Otto committed
711
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
712

XhmikosR's avatar
XhmikosR committed
713
714
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
715

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

XhmikosR's avatar
XhmikosR committed
718
719
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
720

XhmikosR's avatar
XhmikosR committed
721
    clearMenus()
fat's avatar
fat committed
722

XhmikosR's avatar
XhmikosR committed
723
724
725
726
727
    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)
      }
728

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

XhmikosR's avatar
XhmikosR committed
732
      if (e.isDefaultPrevented()) return
733

734
735
736
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
737

XhmikosR's avatar
XhmikosR committed
738
739
740
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
741
    }
742

XhmikosR's avatar
XhmikosR committed
743
744
    return false
  }
745

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

XhmikosR's avatar
XhmikosR committed
749
    var $this = $(this)
750

XhmikosR's avatar
XhmikosR committed
751
752
    e.preventDefault()
    e.stopPropagation()
753

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

XhmikosR's avatar
XhmikosR committed
756
757
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
758

Mark Otto's avatar
grunt    
Mark Otto committed
759
    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
XhmikosR's avatar
XhmikosR committed
760
761
762
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
763

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

XhmikosR's avatar
XhmikosR committed
767
    if (!$items.length) return
768

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

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

XhmikosR's avatar
XhmikosR committed
775
776
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
777

XhmikosR's avatar
XhmikosR committed
778
779
780
781
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
782
783
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
784
      var relatedTarget = { relatedTarget: this }
785

XhmikosR's avatar
XhmikosR committed
786
      if (!$parent.hasClass('open')) return
787

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

XhmikosR's avatar
XhmikosR committed
790
      if (e.isDefaultPrevented()) return
791
792

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
793
794
795
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
796

XhmikosR's avatar
XhmikosR committed
797
798
  function getParent($this) {
    var selector = $this.attr('data-target')
799

XhmikosR's avatar
XhmikosR committed
800
801
802
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
803
804
    }

XhmikosR's avatar
XhmikosR committed
805
    var $parent = selector && $(selector)
806

XhmikosR's avatar
XhmikosR committed
807
808
    return $parent && $parent.length ? $parent : $this.parent()
  }
809
810


XhmikosR's avatar
XhmikosR committed
811
812
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
813

XhmikosR's avatar
XhmikosR committed
814
815
816
817
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
818

XhmikosR's avatar
XhmikosR committed
819
820
821
822
      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
823

XhmikosR's avatar
XhmikosR committed
824
  var old = $.fn.dropdown
825

XhmikosR's avatar
XhmikosR committed
826
827
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
828

829

XhmikosR's avatar
XhmikosR committed
830
831
  // DROPDOWN NO CONFLICT
  // ====================
832

XhmikosR's avatar
XhmikosR committed
833
834
835
836
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
837

838

XhmikosR's avatar
XhmikosR committed
839
840
841
842
843
844
845
846
  // 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)
847

XhmikosR's avatar
XhmikosR committed
848
}(jQuery);
849

850
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
851
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
852
 * http://getbootstrap.com/javascript/#modals
853
 * ========================================================================
854
 * Copyright 2011-2014 Twitter, Inc.
855
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
856
 * ======================================================================== */
857
858


XhmikosR's avatar
XhmikosR committed
859
860
+function ($) {
  'use strict';
861

XhmikosR's avatar
XhmikosR committed
862
863
  // MODAL CLASS DEFINITION
  // ======================
864

XhmikosR's avatar
XhmikosR committed
865
866
867
868
869
870
871
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
872

XhmikosR's avatar
XhmikosR committed
873
874
875
876
877
878
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
879
    }
XhmikosR's avatar
XhmikosR committed
880
  }
881

Mark Otto's avatar
Mark Otto committed
882
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
883

884
885
886
  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

XhmikosR's avatar
XhmikosR committed
887
888
889
890
891
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
892

XhmikosR's avatar
XhmikosR committed
893
894
895
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
896

XhmikosR's avatar
XhmikosR committed
897
898
899
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
900

XhmikosR's avatar
XhmikosR committed
901
    this.$element.trigger(e)
902

XhmikosR's avatar
XhmikosR committed
903
    if (this.isShown || e.isDefaultPrevented()) return
904

XhmikosR's avatar
XhmikosR committed
905
    this.isShown = true
fat's avatar
build    
fat committed
906

XhmikosR's avatar
XhmikosR committed
907
908
    this.checkScrollbar()
    this.$body.addClass('modal-open')
909

XhmikosR's avatar
XhmikosR committed
910
911
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
912

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

XhmikosR's avatar
XhmikosR committed
915
916
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
917

XhmikosR's avatar
XhmikosR committed
918
919
920
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
921

XhmikosR's avatar
XhmikosR committed
922
923
924
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
925

XhmikosR's avatar
XhmikosR committed
926
927
928
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
929

XhmikosR's avatar
XhmikosR committed
930
931
932
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
933

XhmikosR's avatar
XhmikosR committed
934
      that.enforceFocus()
935

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

XhmikosR's avatar
XhmikosR committed
938
939
940
941
942
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
943
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
944
945
946
        that.$element.trigger('focus').trigger(e)
    })
  }
947

XhmikosR's avatar
XhmikosR committed
948
949
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
950

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

XhmikosR's avatar
XhmikosR committed
953
    this.$element.trigger(e)
954

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

XhmikosR's avatar
XhmikosR committed
957
    this.isShown = false
958

XhmikosR's avatar
XhmikosR committed
959
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
960

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

XhmikosR's avatar
XhmikosR committed
963
964
965
966
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
967

XhmikosR's avatar
XhmikosR committed
968
969
970
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
971
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
XhmikosR's avatar
XhmikosR committed
972
973
      this.hideModal()
  }
974

XhmikosR's avatar
XhmikosR committed
975
976
977
978
979
980
981
982
983
984
985
986
  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
987
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
988
989
990
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
991
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
992
993
994
995
996
997
998
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
999
1000
      that.$body.removeClass('modal-open')
      that.resetScrollbar()
For faster browsing, not all history is shown. View entire blame