bootstrap.js 60.7 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
345
346
347
348
  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
349
350
351
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
352

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

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

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

XhmikosR's avatar
XhmikosR committed
361
362
363
364
365
366
  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)
367
368
    }

XhmikosR's avatar
XhmikosR committed
369
    this.interval = clearInterval(this.interval)
370

XhmikosR's avatar
XhmikosR committed
371
372
    return this
  }
373

XhmikosR's avatar
XhmikosR committed
374
375
376
377
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
378

XhmikosR's avatar
XhmikosR committed
379
380
381
382
  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }
383

XhmikosR's avatar
XhmikosR committed
384
385
  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
XhmikosR's avatar
XhmikosR committed
386
    var $next     = next || this.getItemForDirection(type, $active)
XhmikosR's avatar
XhmikosR committed
387
388
389
390
    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
391

XhmikosR's avatar
XhmikosR committed
392
393
394
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
395
396
    }

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

XhmikosR's avatar
XhmikosR committed
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
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)
        })
        .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
439

XhmikosR's avatar
XhmikosR committed
440
    isCycling && this.cycle()
441

XhmikosR's avatar
XhmikosR committed
442
443
    return this
  }
444
445


XhmikosR's avatar
XhmikosR committed
446
447
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
448

XhmikosR's avatar
XhmikosR committed
449
450
451
452
453
454
455
456
457
458
459
460
461
  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()
    })
  }
462

XhmikosR's avatar
XhmikosR committed
463
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
464

XhmikosR's avatar
XhmikosR committed
465
466
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
467
468


XhmikosR's avatar
XhmikosR committed
469
470
  // CAROUSEL NO CONFLICT
  // ====================
471

XhmikosR's avatar
XhmikosR committed
472
473
474
475
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
476

fat's avatar
fat committed
477

XhmikosR's avatar
XhmikosR committed
478
479
  // CAROUSEL DATA-API
  // =================
480

XhmikosR's avatar
XhmikosR committed
481
482
483
484
485
486
487
488
  $(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
489

XhmikosR's avatar
XhmikosR committed
490
    Plugin.call($target, options)
491

XhmikosR's avatar
XhmikosR committed
492
493
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
494
495
    }

XhmikosR's avatar
XhmikosR committed
496
497
    e.preventDefault()
  })
498

XhmikosR's avatar
XhmikosR committed
499
500
501
502
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
fat's avatar
fat committed
503
504
505
    })
  })

XhmikosR's avatar
XhmikosR committed
506
}(jQuery);
507

508
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
509
 * Bootstrap: collapse.js v3.2.0
Mark Otto's avatar
Mark Otto committed
510
 * http://getbootstrap.com/javascript/#collapse
511
 * ========================================================================
512
 * Copyright 2011-2014 Twitter, Inc.
513
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
514
 * ======================================================================== */
515
516


XhmikosR's avatar
XhmikosR committed
517
518
+function ($) {
  'use strict';
519

XhmikosR's avatar
XhmikosR committed
520
521
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
522

XhmikosR's avatar
XhmikosR committed
523
524
525
526
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
527

XhmikosR's avatar
XhmikosR committed
528
529
530
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
531

Mark Otto's avatar
Mark Otto committed
532
  Collapse.VERSION  = '3.2.0'
533

XhmikosR's avatar
XhmikosR committed
534
535
536
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
537

XhmikosR's avatar
XhmikosR committed
538
539
540
541
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
542

XhmikosR's avatar
XhmikosR committed
543
544
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
545

XhmikosR's avatar
XhmikosR committed
546
547
548
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
549

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

XhmikosR's avatar
XhmikosR committed
552
553
554
555
556
557
    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)
    }
558

XhmikosR's avatar
XhmikosR committed
559
    var dimension = this.dimension()
560

XhmikosR's avatar
XhmikosR committed
561
562
563
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
564

XhmikosR's avatar
XhmikosR committed
565
    this.transitioning = 1
566

XhmikosR's avatar
XhmikosR committed
567
568
569
570
571
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
572
      this.$element
XhmikosR's avatar
XhmikosR committed
573
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
574
    }
575

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

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

XhmikosR's avatar
XhmikosR committed
580
581
582
583
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
  }
584

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

XhmikosR's avatar
XhmikosR committed
588
589
590
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
591

XhmikosR's avatar
XhmikosR committed
592
    var dimension = this.dimension()
593

XhmikosR's avatar
XhmikosR committed
594
595
596
597
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

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

XhmikosR's avatar
XhmikosR committed
602
603
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
604
      this.$element
XhmikosR's avatar
XhmikosR committed
605
606
607
        .trigger('hidden.bs.collapse')
        .removeClass('collapsing')
        .addClass('collapse')
Chris Rebert's avatar
Chris Rebert committed
608
    }
609

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

XhmikosR's avatar
XhmikosR committed
612
613
614
615
616
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)
  }
617

XhmikosR's avatar
XhmikosR committed
618
619
620
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
621

622

XhmikosR's avatar
XhmikosR committed
623
624
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
625

XhmikosR's avatar
XhmikosR committed
626
627
628
629
630
  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
631

XhmikosR's avatar
XhmikosR committed
632
633
634
635
636
      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]()
    })
  }
637

XhmikosR's avatar
XhmikosR committed
638
  var old = $.fn.collapse
639

XhmikosR's avatar
XhmikosR committed
640
641
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
642

643

XhmikosR's avatar
XhmikosR committed
644
645
  // COLLAPSE NO CONFLICT
  // ====================
646

XhmikosR's avatar
XhmikosR committed
647
648
649
650
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
651

652

XhmikosR's avatar
XhmikosR committed
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
  // 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
670
      $this.toggleClass('collapsed', $target.hasClass('in'))
XhmikosR's avatar
XhmikosR committed
671
    }
fat's avatar
fat committed
672

XhmikosR's avatar
XhmikosR committed
673
    Plugin.call($target, option)
674
675
  })

XhmikosR's avatar
XhmikosR committed
676
}(jQuery);
677

678
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
679
 * Bootstrap: dropdown.js v3.2.0
Mark Otto's avatar
Mark Otto committed
680
 * http://getbootstrap.com/javascript/#dropdowns
681
 * ========================================================================
682
 * Copyright 2011-2014 Twitter, Inc.
683
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
684
 * ======================================================================== */
685
686


XhmikosR's avatar
XhmikosR committed
687
688
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
689

XhmikosR's avatar
XhmikosR committed
690
691
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
692

XhmikosR's avatar
XhmikosR committed
693
694
695
696
697
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
698

Mark Otto's avatar
Mark Otto committed
699
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
700

XhmikosR's avatar
XhmikosR committed
701
702
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
703

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

XhmikosR's avatar
XhmikosR committed
706
707
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
708

XhmikosR's avatar
XhmikosR committed
709
    clearMenus()
fat's avatar
fat committed
710

XhmikosR's avatar
XhmikosR committed
711
712
713
714
715
    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)
      }
716

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

XhmikosR's avatar
XhmikosR committed
720
      if (e.isDefaultPrevented()) return
721

722
723
724
      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')
Mark Otto's avatar
Mark Otto committed
725

XhmikosR's avatar
XhmikosR committed
726
727
728
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
729
    }
730

XhmikosR's avatar
XhmikosR committed
731
732
    return false
  }
733

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

XhmikosR's avatar
XhmikosR committed
737
    var $this = $(this)
738

XhmikosR's avatar
XhmikosR committed
739
740
    e.preventDefault()
    e.stopPropagation()
741

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

XhmikosR's avatar
XhmikosR committed
744
745
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
746

XhmikosR's avatar
XhmikosR committed
747
748
749
750
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
751

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

XhmikosR's avatar
XhmikosR committed
755
    if (!$items.length) return
756

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

XhmikosR's avatar
XhmikosR committed
759
760
761
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    if (!~index)                                      index = 0
762

XhmikosR's avatar
XhmikosR committed
763
764
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
765

XhmikosR's avatar
XhmikosR committed
766
767
768
769
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
770
771
      var $this         = $(this)
      var $parent       = getParent($this)
XhmikosR's avatar
XhmikosR committed
772
      var relatedTarget = { relatedTarget: this }
773

XhmikosR's avatar
XhmikosR committed
774
      if (!$parent.hasClass('open')) return
775

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

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

      $this.attr('aria-expanded', 'false')
XhmikosR's avatar
XhmikosR committed
781
782
783
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
784

XhmikosR's avatar
XhmikosR committed
785
786
  function getParent($this) {
    var selector = $this.attr('data-target')
787

XhmikosR's avatar
XhmikosR committed
788
789
790
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
791
792
    }

XhmikosR's avatar
XhmikosR committed
793
    var $parent = selector && $(selector)
794

XhmikosR's avatar
XhmikosR committed
795
796
    return $parent && $parent.length ? $parent : $this.parent()
  }
797
798


XhmikosR's avatar
XhmikosR committed
799
800
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
801

XhmikosR's avatar
XhmikosR committed
802
803
804
805
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
806

XhmikosR's avatar
XhmikosR committed
807
808
809
810
      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
811

XhmikosR's avatar
XhmikosR committed
812
  var old = $.fn.dropdown
813

XhmikosR's avatar
XhmikosR committed
814
815
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
816

817

XhmikosR's avatar
XhmikosR committed
818
819
  // DROPDOWN NO CONFLICT
  // ====================
820

XhmikosR's avatar
XhmikosR committed
821
822
823
824
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
825

826

XhmikosR's avatar
XhmikosR committed
827
828
829
830
831
832
833
834
  // 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)
835

XhmikosR's avatar
XhmikosR committed
836
}(jQuery);
837

838
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
839
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
840
 * http://getbootstrap.com/javascript/#modals
841
 * ========================================================================
842
 * Copyright 2011-2014 Twitter, Inc.
843
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
844
 * ======================================================================== */
845
846


XhmikosR's avatar
XhmikosR committed
847
848
+function ($) {
  'use strict';
849

XhmikosR's avatar
XhmikosR committed
850
851
  // MODAL CLASS DEFINITION
  // ======================
852

XhmikosR's avatar
XhmikosR committed
853
854
855
856
857
858
859
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
860

XhmikosR's avatar
XhmikosR committed
861
862
863
864
865
866
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
867
    }
XhmikosR's avatar
XhmikosR committed
868
  }
869

Mark Otto's avatar
Mark Otto committed
870
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
871

XhmikosR's avatar
XhmikosR committed
872
873
874
875
876
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
877

XhmikosR's avatar
XhmikosR committed
878
879
880
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
881

XhmikosR's avatar
XhmikosR committed
882
883
884
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
885

XhmikosR's avatar
XhmikosR committed
886
    this.$element.trigger(e)
887

XhmikosR's avatar
XhmikosR committed
888
    if (this.isShown || e.isDefaultPrevented()) return
889

XhmikosR's avatar
XhmikosR committed
890
    this.isShown = true
fat's avatar
build    
fat committed
891

XhmikosR's avatar
XhmikosR committed
892
893
    this.checkScrollbar()
    this.$body.addClass('modal-open')
894

XhmikosR's avatar
XhmikosR committed
895
896
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
897

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

XhmikosR's avatar
XhmikosR committed
900
901
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
902

XhmikosR's avatar
XhmikosR committed
903
904
905
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
906

XhmikosR's avatar
XhmikosR committed
907
908
909
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
910

XhmikosR's avatar
XhmikosR committed
911
912
913
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
914

XhmikosR's avatar
XhmikosR committed
915
916
917
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
918

XhmikosR's avatar
XhmikosR committed
919
      that.enforceFocus()
920

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

XhmikosR's avatar
XhmikosR committed
923
924
925
926
927
928
929
930
931
      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)
    })
  }
932

XhmikosR's avatar
XhmikosR committed
933
934
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
935

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

XhmikosR's avatar
XhmikosR committed
938
    this.$element.trigger(e)
939

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

XhmikosR's avatar
XhmikosR committed
942
    this.isShown = false
943

XhmikosR's avatar
XhmikosR committed
944
    this.$body.removeClass('modal-open')
945

XhmikosR's avatar
XhmikosR committed
946
947
    this.resetScrollbar()
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
948

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

XhmikosR's avatar
XhmikosR committed
951
952
953
954
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
955

XhmikosR's avatar
XhmikosR committed
956
957
958
959
960
961
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(300) :
      this.hideModal()
  }
962

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

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

XhmikosR's avatar
XhmikosR committed
991
992
993
994
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
995

XhmikosR's avatar
XhmikosR committed
996
997
998
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
999

XhmikosR's avatar
XhmikosR committed
1000
    if (this.isShown && this.options.backdrop) {
For faster browsing, not all history is shown. View entire blame