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


Mark Otto's avatar
grunt    
Mark Otto committed
261
262
263
264
265
266
267
268
269
  // FOCUS SHIM (FOR BUTTON GROUPS)
  // ==============================

  function getBtnTarget(target) {
    var $target = $(target)
    return $target.hasClass('btn') ? $target : $target.parent('.btn')
  }


XhmikosR's avatar
XhmikosR committed
270
271
  // BUTTON DATA-API
  // ===============
272

Mark Otto's avatar
grunt    
Mark Otto committed
273
274
275
276
277
278
279
280
281
282
283
284
285
  $(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()
    })
    .on('focus.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      getBtnTarget(e.target).addClass('focus')
    })
    .on('blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      getBtnTarget(e.target).removeClass('focus')
    })
286

XhmikosR's avatar
XhmikosR committed
287
}(jQuery);
288

289
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
290
 * Bootstrap: carousel.js v3.2.0
Mark Otto's avatar
Mark Otto committed
291
 * http://getbootstrap.com/javascript/#carousel
292
 * ========================================================================
293
 * Copyright 2011-2014 Twitter, Inc.
294
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
295
 * ======================================================================== */
296
297


XhmikosR's avatar
XhmikosR committed
298
299
+function ($) {
  'use strict';
300

XhmikosR's avatar
XhmikosR committed
301
302
  // CAROUSEL CLASS DEFINITION
  // =========================
303

XhmikosR's avatar
XhmikosR committed
304
305
306
307
308
309
310
311
312
  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
313

XhmikosR's avatar
XhmikosR committed
314
315
316
317
    this.options.pause == 'hover' && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
318

Mark Otto's avatar
Mark Otto committed
319
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
320

XhmikosR's avatar
XhmikosR committed
321
322
323
324
325
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true
  }
326

XhmikosR's avatar
XhmikosR committed
327
328
329
330
331
  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
332
333
    }

XhmikosR's avatar
XhmikosR committed
334
335
    e.preventDefault()
  }
336

XhmikosR's avatar
XhmikosR committed
337
338
  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)
fat's avatar
fat committed
339

XhmikosR's avatar
XhmikosR committed
340
    this.interval && clearInterval(this.interval)
341

XhmikosR's avatar
XhmikosR committed
342
343
344
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
345

XhmikosR's avatar
XhmikosR committed
346
347
    return this
  }
348

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

XhmikosR's avatar
XhmikosR committed
354
355
356
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
357

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

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

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

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

XhmikosR's avatar
XhmikosR committed
374
    this.interval = clearInterval(this.interval)
375

XhmikosR's avatar
XhmikosR committed
376
377
    return this
  }
378

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

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

XhmikosR's avatar
XhmikosR committed
389
390
391
392
393
394
395
  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
396

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

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

XhmikosR's avatar
XhmikosR committed
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
439
440
441
442
443
    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
444

XhmikosR's avatar
XhmikosR committed
445
    isCycling && this.cycle()
446

XhmikosR's avatar
XhmikosR committed
447
448
    return this
  }
449
450


XhmikosR's avatar
XhmikosR committed
451
452
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
453

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

XhmikosR's avatar
XhmikosR committed
468
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
469

XhmikosR's avatar
XhmikosR committed
470
471
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
472
473


XhmikosR's avatar
XhmikosR committed
474
475
  // CAROUSEL NO CONFLICT
  // ====================
476

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

fat's avatar
fat committed
482

XhmikosR's avatar
XhmikosR committed
483
484
  // CAROUSEL DATA-API
  // =================
485

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

XhmikosR's avatar
XhmikosR committed
495
    Plugin.call($target, options)
496

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

XhmikosR's avatar
XhmikosR committed
501
502
    e.preventDefault()
  })
503

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

XhmikosR's avatar
XhmikosR committed
511
}(jQuery);
512

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


XhmikosR's avatar
XhmikosR committed
522
523
+function ($) {
  'use strict';
524

XhmikosR's avatar
XhmikosR committed
525
526
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
527

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

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

Mark Otto's avatar
Mark Otto committed
537
  Collapse.VERSION  = '3.2.0'
538

XhmikosR's avatar
XhmikosR committed
539
540
541
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
542

XhmikosR's avatar
XhmikosR committed
543
544
545
546
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
547

XhmikosR's avatar
XhmikosR committed
548
549
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
550

XhmikosR's avatar
XhmikosR committed
551
552
553
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
554

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

XhmikosR's avatar
XhmikosR committed
557
558
559
560
561
562
    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)
    }
563

XhmikosR's avatar
XhmikosR committed
564
    var dimension = this.dimension()
565

XhmikosR's avatar
XhmikosR committed
566
567
568
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
569

XhmikosR's avatar
XhmikosR committed
570
    this.transitioning = 1
571

XhmikosR's avatar
XhmikosR committed
572
573
574
575
576
    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
577
      this.$element
XhmikosR's avatar
XhmikosR committed
578
        .trigger('shown.bs.collapse')
Chris Rebert's avatar
Chris Rebert committed
579
    }
580

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

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

XhmikosR's avatar
XhmikosR committed
585
586
587
588
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
  }
589

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

XhmikosR's avatar
XhmikosR committed
593
594
595
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
596

XhmikosR's avatar
XhmikosR committed
597
    var dimension = this.dimension()
598

XhmikosR's avatar
XhmikosR committed
599
600
601
602
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

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

XhmikosR's avatar
XhmikosR committed
605
    this.transitioning = 1
606

XhmikosR's avatar
XhmikosR committed
607
608
    var complete = function () {
      this.transitioning = 0
Chris Rebert's avatar
Chris Rebert committed
609
      this.$element
XhmikosR's avatar
XhmikosR committed
610
611
612
        .trigger('hidden.bs.collapse')
        .removeClass('collapsing')
        .addClass('collapse')
Chris Rebert's avatar
Chris Rebert committed
613
    }
614

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

XhmikosR's avatar
XhmikosR committed
617
618
619
620
621
    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)
  }
622

XhmikosR's avatar
XhmikosR committed
623
624
625
  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }
626

627

XhmikosR's avatar
XhmikosR committed
628
629
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
630

XhmikosR's avatar
XhmikosR committed
631
632
633
634
635
  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
636

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

XhmikosR's avatar
XhmikosR committed
643
  var old = $.fn.collapse
644

XhmikosR's avatar
XhmikosR committed
645
646
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
647

648

XhmikosR's avatar
XhmikosR committed
649
650
  // COLLAPSE NO CONFLICT
  // ====================
651

XhmikosR's avatar
XhmikosR committed
652
653
654
655
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
656

657

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

XhmikosR's avatar
XhmikosR committed
678
    Plugin.call($target, option)
679
680
  })

XhmikosR's avatar
XhmikosR committed
681
}(jQuery);
682

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


XhmikosR's avatar
XhmikosR committed
692
693
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
694

XhmikosR's avatar
XhmikosR committed
695
696
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
697

XhmikosR's avatar
XhmikosR committed
698
699
700
701
702
  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }
703

Mark Otto's avatar
Mark Otto committed
704
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
705

XhmikosR's avatar
XhmikosR committed
706
707
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
708

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

XhmikosR's avatar
XhmikosR committed
711
712
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
713

XhmikosR's avatar
XhmikosR committed
714
    clearMenus()
fat's avatar
fat committed
715

XhmikosR's avatar
XhmikosR committed
716
717
718
719
720
    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)
      }
721

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

XhmikosR's avatar
XhmikosR committed
725
      if (e.isDefaultPrevented()) return
726

XhmikosR's avatar
XhmikosR committed
727
      $this.trigger('focus')
Mark Otto's avatar
Mark Otto committed
728

XhmikosR's avatar
XhmikosR committed
729
730
731
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
732
    }
733

XhmikosR's avatar
XhmikosR committed
734
735
    return false
  }
736

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

XhmikosR's avatar
XhmikosR committed
740
    var $this = $(this)
741

XhmikosR's avatar
XhmikosR committed
742
743
    e.preventDefault()
    e.stopPropagation()
744

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

XhmikosR's avatar
XhmikosR committed
747
748
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
749

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

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

XhmikosR's avatar
XhmikosR committed
758
    if (!$items.length) return
759

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

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

XhmikosR's avatar
XhmikosR committed
766
767
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
768

XhmikosR's avatar
XhmikosR committed
769
770
771
772
773
774
775
776
777
778
779
780
  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
      var $parent = getParent($(this))
      var relatedTarget = { relatedTarget: this }
      if (!$parent.hasClass('open')) return
      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
      if (e.isDefaultPrevented()) return
      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    })
  }
781

XhmikosR's avatar
XhmikosR committed
782
783
  function getParent($this) {
    var selector = $this.attr('data-target')
784

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

XhmikosR's avatar
XhmikosR committed
790
    var $parent = selector && $(selector)
791

XhmikosR's avatar
XhmikosR committed
792
793
    return $parent && $parent.length ? $parent : $this.parent()
  }
794
795


XhmikosR's avatar
XhmikosR committed
796
797
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
798

XhmikosR's avatar
XhmikosR committed
799
800
801
802
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
803

XhmikosR's avatar
XhmikosR committed
804
805
806
807
      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
808

XhmikosR's avatar
XhmikosR committed
809
  var old = $.fn.dropdown
810

XhmikosR's avatar
XhmikosR committed
811
812
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
813

814

XhmikosR's avatar
XhmikosR committed
815
816
  // DROPDOWN NO CONFLICT
  // ====================
817

XhmikosR's avatar
XhmikosR committed
818
819
820
821
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
822

823

XhmikosR's avatar
XhmikosR committed
824
825
826
827
828
829
830
831
  // 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)
832

XhmikosR's avatar
XhmikosR committed
833
}(jQuery);
834

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


XhmikosR's avatar
XhmikosR committed
844
845
+function ($) {
  'use strict';
846

XhmikosR's avatar
XhmikosR committed
847
848
  // MODAL CLASS DEFINITION
  // ======================
849

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

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

Mark Otto's avatar
Mark Otto committed
867
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
868

XhmikosR's avatar
XhmikosR committed
869
870
871
872
873
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
874

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

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

XhmikosR's avatar
XhmikosR committed
883
    this.$element.trigger(e)
884

XhmikosR's avatar
XhmikosR committed
885
    if (this.isShown || e.isDefaultPrevented()) return
886

XhmikosR's avatar
XhmikosR committed
887
    this.isShown = true
fat's avatar
build    
fat committed
888

XhmikosR's avatar
XhmikosR committed
889
890
    this.checkScrollbar()
    this.$body.addClass('modal-open')
891

XhmikosR's avatar
XhmikosR committed
892
893
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
894

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

XhmikosR's avatar
XhmikosR committed
897
898
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
899

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

XhmikosR's avatar
XhmikosR committed
904
905
906
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
907

XhmikosR's avatar
XhmikosR committed
908
909
910
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
911

XhmikosR's avatar
XhmikosR committed
912
913
914
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
915

XhmikosR's avatar
XhmikosR committed
916
      that.enforceFocus()
917

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

XhmikosR's avatar
XhmikosR committed
920
921
922
923
924
925
926
927
928
      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)
    })
  }
929

XhmikosR's avatar
XhmikosR committed
930
931
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
932

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

XhmikosR's avatar
XhmikosR committed
935
    this.$element.trigger(e)
936

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

XhmikosR's avatar
XhmikosR committed
939
    this.isShown = false
940

XhmikosR's avatar
XhmikosR committed
941
    this.$body.removeClass('modal-open')
942

XhmikosR's avatar
XhmikosR committed
943
944
    this.resetScrollbar()
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
945

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
988
989
990
991
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
992

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

XhmikosR's avatar
XhmikosR committed
997
998
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
999

XhmikosR's avatar
XhmikosR committed
1000
      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
For faster browsing, not all history is shown. View entire blame