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

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

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

XhmikosR's avatar
XhmikosR committed
100
    var $parent = $(selector)
101

XhmikosR's avatar
XhmikosR committed
102
    if (e) e.preventDefault()
103

XhmikosR's avatar
XhmikosR committed
104
105
106
    if (!$parent.length) {
      $parent = $this.hasClass('alert') ? $this : $this.parent()
    }
107

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

XhmikosR's avatar
XhmikosR committed
110
    if (e.isDefaultPrevented()) return
111

XhmikosR's avatar
XhmikosR committed
112
    $parent.removeClass('in')
113

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

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


XhmikosR's avatar
XhmikosR committed
127
128
  // ALERT PLUGIN DEFINITION
  // =======================
129

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

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

XhmikosR's avatar
XhmikosR committed
140
  var old = $.fn.alert
Mark Otto's avatar
Mark Otto committed
141

XhmikosR's avatar
XhmikosR committed
142
143
  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert
144
145


XhmikosR's avatar
XhmikosR committed
146
147
  // ALERT NO CONFLICT
  // =================
148

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


XhmikosR's avatar
XhmikosR committed
155
156
  // ALERT DATA-API
  // ==============
157

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

XhmikosR's avatar
XhmikosR committed
160
}(jQuery);
161

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


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

XhmikosR's avatar
XhmikosR committed
174
175
  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================
Mark Otto's avatar
grunt    
Mark Otto committed
176

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

Mark Otto's avatar
Mark Otto committed
183
  Button.VERSION  = '3.2.0'
184

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

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

XhmikosR's avatar
XhmikosR committed
195
    state = state + 'Text'
196

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

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

XhmikosR's avatar
XhmikosR committed
201
202
203
204
205
206
207
208
    // 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)
209
      }
XhmikosR's avatar
XhmikosR committed
210
211
212
213
214
215
216
217
218
219
220
221
222
223
    }, 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
224
    }
225

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


XhmikosR's avatar
XhmikosR committed
230
231
  // BUTTON PLUGIN DEFINITION
  // ========================
232

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

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

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

XhmikosR's avatar
XhmikosR committed
246
  var old = $.fn.button
Mark Otto's avatar
Mark Otto committed
247

XhmikosR's avatar
XhmikosR committed
248
249
  $.fn.button             = Plugin
  $.fn.button.Constructor = Button
250
251


XhmikosR's avatar
XhmikosR committed
252
253
  // BUTTON NO CONFLICT
  // ==================
254

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


XhmikosR's avatar
XhmikosR committed
261
262
  // BUTTON DATA-API
  // ===============
263

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

XhmikosR's avatar
XhmikosR committed
275
}(jQuery);
276

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


XhmikosR's avatar
XhmikosR committed
286
287
+function ($) {
  'use strict';
288

XhmikosR's avatar
XhmikosR committed
289
290
  // CAROUSEL CLASS DEFINITION
  // =========================
291

XhmikosR's avatar
XhmikosR committed
292
293
294
295
296
297
298
299
300
  var Carousel = function (element, options) {
    this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
    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
301

XhmikosR's avatar
XhmikosR committed
302
303
304
305
    this.options.pause == 'hover' && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
306

Mark Otto's avatar
Mark Otto committed
307
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
308

XhmikosR's avatar
XhmikosR committed
309
310
311
312
313
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true
  }
314

XhmikosR's avatar
XhmikosR committed
315
316
317
318
319
  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
320
321
    }

XhmikosR's avatar
XhmikosR committed
322
323
    e.preventDefault()
  }
324

XhmikosR's avatar
XhmikosR committed
325
326
  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)
fat's avatar
fat committed
327

XhmikosR's avatar
XhmikosR committed
328
    this.interval && clearInterval(this.interval)
329

XhmikosR's avatar
XhmikosR committed
330
331
332
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
333

XhmikosR's avatar
XhmikosR committed
334
335
    return this
  }
336

XhmikosR's avatar
XhmikosR committed
337
338
339
340
  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }
341

XhmikosR's avatar
XhmikosR committed
342
343
344
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
345

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

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

XhmikosR's avatar
XhmikosR committed
351
352
    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
  }
fat's avatar
fat committed
353

XhmikosR's avatar
XhmikosR committed
354
355
356
357
358
359
  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)
360
361
    }

XhmikosR's avatar
XhmikosR committed
362
    this.interval = clearInterval(this.interval)
363

XhmikosR's avatar
XhmikosR committed
364
365
    return this
  }
366

XhmikosR's avatar
XhmikosR committed
367
368
369
370
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
371

XhmikosR's avatar
XhmikosR committed
372
373
374
375
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
376

XhmikosR's avatar
XhmikosR committed
377
378
379
380
381
382
383
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
    var $next     = next || $active[type]()
    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
384

XhmikosR's avatar
XhmikosR committed
385
386
387
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
388
389
    }

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

XhmikosR's avatar
XhmikosR committed
392
393
394
395
396
397
398
399
400
401
402
403
404
405
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
    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)
        })
        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }
fat's avatar
fat committed
432

XhmikosR's avatar
XhmikosR committed
433
    isCycling && this.cycle()
434

XhmikosR's avatar
XhmikosR committed
435
436
    return this
  }
437
438


XhmikosR's avatar
XhmikosR committed
439
440
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
441

XhmikosR's avatar
XhmikosR committed
442
443
444
445
446
447
448
449
450
451
452
453
454
  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()
    })
  }
455

XhmikosR's avatar
XhmikosR committed
456
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
457

XhmikosR's avatar
XhmikosR committed
458
459
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
460
461


XhmikosR's avatar
XhmikosR committed
462
463
  // CAROUSEL NO CONFLICT
  // ====================
464

XhmikosR's avatar
XhmikosR committed
465
466
467
468
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
469

fat's avatar
fat committed
470

XhmikosR's avatar
XhmikosR committed
471
472
  // CAROUSEL DATA-API
  // =================
473

XhmikosR's avatar
XhmikosR committed
474
475
476
477
478
479
480
481
  $(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
482

XhmikosR's avatar
XhmikosR committed
483
    Plugin.call($target, options)
484

XhmikosR's avatar
XhmikosR committed
485
486
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
487
488
    }

XhmikosR's avatar
XhmikosR committed
489
490
    e.preventDefault()
  })
491

XhmikosR's avatar
XhmikosR committed
492
493
494
495
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
fat's avatar
fat committed
496
497
498
    })
  })

XhmikosR's avatar
XhmikosR committed
499
}(jQuery);
500

501
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
502
 * Bootstrap: collapse.js v3.2.0
Mark Otto's avatar
Mark Otto committed
503
 * http://getbootstrap.com/javascript/#collapse
504
 * ========================================================================
505
 * Copyright 2011-2014 Twitter, Inc.
506
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
507
 * ======================================================================== */
508
509


XhmikosR's avatar
XhmikosR committed
510
511
+function ($) {
  'use strict';
512

XhmikosR's avatar
XhmikosR committed
513
514
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
515

XhmikosR's avatar
XhmikosR committed
516
517
518
519
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
520

XhmikosR's avatar
XhmikosR committed
521
522
523
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
524

Mark Otto's avatar
Mark Otto committed
525
  Collapse.VERSION  = '3.2.0'
526

XhmikosR's avatar
XhmikosR committed
527
528
529
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
530

XhmikosR's avatar
XhmikosR committed
531
532
533
534
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
535

XhmikosR's avatar
XhmikosR committed
536
537
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
538

XhmikosR's avatar
XhmikosR committed
539
540
541
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
542

XhmikosR's avatar
XhmikosR committed
543
    var actives = this.$parent && this.$parent.find('> .panel > .in')
544

XhmikosR's avatar
XhmikosR committed
545
546
547
548
549
550
    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)
    }
551

XhmikosR's avatar
XhmikosR committed
552
    var dimension = this.dimension()
553

XhmikosR's avatar
XhmikosR committed
554
555
556
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
557

XhmikosR's avatar
XhmikosR committed
558
    this.transitioning = 1
559

XhmikosR's avatar
XhmikosR committed
560
561
562
563
564
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
565
      this.$element
XhmikosR's avatar
XhmikosR committed
566
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
567
    }
568

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

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

XhmikosR's avatar
XhmikosR committed
573
574
575
576
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
  }
577

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

XhmikosR's avatar
XhmikosR committed
581
582
583
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
584

XhmikosR's avatar
XhmikosR committed
585
    var dimension = this.dimension()
586

XhmikosR's avatar
XhmikosR committed
587
588
589
590
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
Mark Otto's avatar
grunt    
Mark Otto committed
591
      .removeClass('collapse in')
592

XhmikosR's avatar
XhmikosR committed
593
    this.transitioning = 1
594

XhmikosR's avatar
XhmikosR committed
595
596
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
597
      this.$element
XhmikosR's avatar
XhmikosR committed
598
599
600
        .trigger('hidden.bs.collapse')
        .removeClass('collapsing')
        .addClass('collapse')
Chris Rebert's avatar
Chris Rebert committed
601
    }
602

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

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

XhmikosR's avatar
XhmikosR committed
611
612
613
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
614

615

XhmikosR's avatar
XhmikosR committed
616
617
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
618

XhmikosR's avatar
XhmikosR committed
619
620
621
622
623
  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
624

XhmikosR's avatar
XhmikosR committed
625
626
627
628
629
      if (!data && options.toggle && option == 'show') option = !option
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
630

XhmikosR's avatar
XhmikosR committed
631
  var old = $.fn.collapse
632

XhmikosR's avatar
XhmikosR committed
633
634
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
635

636

XhmikosR's avatar
XhmikosR committed
637
638
  // COLLAPSE NO CONFLICT
  // ====================
639

XhmikosR's avatar
XhmikosR committed
640
641
642
643
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
644

645

XhmikosR's avatar
XhmikosR committed
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
  // 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) {
      if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
Mark Otto's avatar
grunt    
Mark Otto committed
663
      $this.toggleClass('collapsed', $target.hasClass('in'))
XhmikosR's avatar
XhmikosR committed
664
    }
fat's avatar
fat committed
665

XhmikosR's avatar
XhmikosR committed
666
    Plugin.call($target, option)
667
668
  })

XhmikosR's avatar
XhmikosR committed
669
}(jQuery);
670

671
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
672
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
673
 * http://getbootstrap.com/javascript/#dropdowns
674
 * ========================================================================
675
 * Copyright 2011-2014 Twitter, Inc.
676
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
677
 * ======================================================================== */
678
679


XhmikosR's avatar
XhmikosR committed
680
681
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
682

XhmikosR's avatar
XhmikosR committed
683
684
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
685

XhmikosR's avatar
XhmikosR committed
686
687
688
689
690
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
691

Mark Otto's avatar
Mark Otto committed
692
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
693

XhmikosR's avatar
XhmikosR committed
694
695
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
696

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

XhmikosR's avatar
XhmikosR committed
699
700
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
701

XhmikosR's avatar
XhmikosR committed
702
    clearMenus()
fat's avatar
fat committed
703

XhmikosR's avatar
XhmikosR committed
704
705
706
707
708
    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)
      }
709

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

XhmikosR's avatar
XhmikosR committed
713
      if (e.isDefaultPrevented()) return
714

715
716
717
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
718

XhmikosR's avatar
XhmikosR committed
719
720
721
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
722
    }
723

XhmikosR's avatar
XhmikosR committed
724
725
    return false
  }
726

XhmikosR's avatar
XhmikosR committed
727
728
  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return
729

XhmikosR's avatar
XhmikosR committed
730
    var $this = $(this)
731

XhmikosR's avatar
XhmikosR committed
732
733
    e.preventDefault()
    e.stopPropagation()
734

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

XhmikosR's avatar
XhmikosR committed
737
738
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
739

XhmikosR's avatar
XhmikosR committed
740
741
742
743
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
744

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

XhmikosR's avatar
XhmikosR committed
748
    if (!$items.length) return
749

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

XhmikosR's avatar
XhmikosR committed
752
753
754
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    if (!~index)                                      index = 0
755

XhmikosR's avatar
XhmikosR committed
756
757
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
758

XhmikosR's avatar
XhmikosR committed
759
760
761
762
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
763
764
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
765
      var relatedTarget = { relatedTarget: this }
766

XhmikosR's avatar
XhmikosR committed
767
      if (!$parent.hasClass('open')) return
768

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

XhmikosR's avatar
XhmikosR committed
771
      if (e.isDefaultPrevented()) return
772
773

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
774
775
776
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
777

XhmikosR's avatar
XhmikosR committed
778
779
  function getParent($this) {
    var selector = $this.attr('data-target')
780

XhmikosR's avatar
XhmikosR committed
781
782
783
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
784
785
    }

XhmikosR's avatar
XhmikosR committed
786
    var $parent = selector && $(selector)
787

XhmikosR's avatar
XhmikosR committed
788
789
    return $parent && $parent.length ? $parent : $this.parent()
  }
790
791


XhmikosR's avatar
XhmikosR committed
792
793
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
794

XhmikosR's avatar
XhmikosR committed
795
796
797
798
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
799

XhmikosR's avatar
XhmikosR committed
800
801
802
803
      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
804

XhmikosR's avatar
XhmikosR committed
805
  var old = $.fn.dropdown
806

XhmikosR's avatar
XhmikosR committed
807
808
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
809

810

XhmikosR's avatar
XhmikosR committed
811
812
  // DROPDOWN NO CONFLICT
  // ====================
813

XhmikosR's avatar
XhmikosR committed
814
815
816
817
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
818

819

XhmikosR's avatar
XhmikosR committed
820
821
822
823
824
825
826
827
  // 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)
828

XhmikosR's avatar
XhmikosR committed
829
}(jQuery);
830

831
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
832
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
833
 * http://getbootstrap.com/javascript/#modals
834
 * ========================================================================
835
 * Copyright 2011-2014 Twitter, Inc.
836
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
837
 * ======================================================================== */
838
839


XhmikosR's avatar
XhmikosR committed
840
841
+function ($) {
  'use strict';
842

XhmikosR's avatar
XhmikosR committed
843
844
  // MODAL CLASS DEFINITION
  // ======================
845

XhmikosR's avatar
XhmikosR committed
846
847
848
849
850
851
852
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
853

XhmikosR's avatar
XhmikosR committed
854
855
856
857
858
859
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
860
    }
XhmikosR's avatar
XhmikosR committed
861
  }
862

Mark Otto's avatar
Mark Otto committed
863
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
864

XhmikosR's avatar
XhmikosR committed
865
866
867
868
869
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
870

XhmikosR's avatar
XhmikosR committed
871
872
873
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
874

XhmikosR's avatar
XhmikosR committed
875
876
877
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
878

XhmikosR's avatar
XhmikosR committed
879
    this.$element.trigger(e)
880

XhmikosR's avatar
XhmikosR committed
881
    if (this.isShown || e.isDefaultPrevented()) return
882

XhmikosR's avatar
XhmikosR committed
883
    this.isShown = true
fat's avatar
build    
fat committed
884

XhmikosR's avatar
XhmikosR committed
885
886
    this.checkScrollbar()
    this.$body.addClass('modal-open')
887

XhmikosR's avatar
XhmikosR committed
888
889
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
890

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

XhmikosR's avatar
XhmikosR committed
893
894
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
895

XhmikosR's avatar
XhmikosR committed
896
897
898
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
899

XhmikosR's avatar
XhmikosR committed
900
901
902
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
903

XhmikosR's avatar
XhmikosR committed
904
905
906
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
907

XhmikosR's avatar
XhmikosR committed
908
909
910
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
911

XhmikosR's avatar
XhmikosR committed
912
      that.enforceFocus()
913

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

XhmikosR's avatar
XhmikosR committed
916
917
918
919
920
921
922
923
924
      transition ?
        that.$element.find('.modal-dialog') // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
          .emulateTransitionEnd(300) :
        that.$element.trigger('focus').trigger(e)
    })
  }
925

XhmikosR's avatar
XhmikosR committed
926
927
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
928

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

XhmikosR's avatar
XhmikosR committed
931
    this.$element.trigger(e)
932

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

XhmikosR's avatar
XhmikosR committed
935
    this.isShown = false
936

XhmikosR's avatar
XhmikosR committed
937
    this.$body.removeClass('modal-open')
938

XhmikosR's avatar
XhmikosR committed
939
940
    this.resetScrollbar()
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
941

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

XhmikosR's avatar
XhmikosR committed
944
945
946
947
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
948

XhmikosR's avatar
XhmikosR committed
949
950
951
952
953
954
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(300) :
      this.hideModal()
  }
955

XhmikosR's avatar
XhmikosR committed
956
957
958
959
960
961
962
963
964
965
966
967
  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
968
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
969
970
971
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
972
      this.$element.off('keydown.dismiss.bs.modal')
XhmikosR's avatar
XhmikosR committed
973
974
975
976
977
978
979
980
981
982
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.$element.trigger('hidden.bs.modal')
    })
  }
983

XhmikosR's avatar
XhmikosR committed
984
985
986
987
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
988

XhmikosR's avatar
XhmikosR committed
989
990
991
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
992

XhmikosR's avatar
XhmikosR committed
993
994
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
995

XhmikosR's avatar
XhmikosR committed
996
997
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
        .appendTo(this.$body)
998

Mark Otto's avatar
grunt    
Mark Otto committed
999
      this.$element.on('mousedown.dismiss.bs.modal', $.proxy(function (e) {
XhmikosR's avatar
XhmikosR committed
1000
        if (e.target !== e.currentTarget) return
For faster browsing, not all history is shown. View entire blame