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

XhmikosR's avatar
XhmikosR committed
264
265
266
267
268
  $(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()
269
270
  })

XhmikosR's avatar
XhmikosR committed
271
}(jQuery);
272

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


XhmikosR's avatar
XhmikosR committed
282
283
+function ($) {
  'use strict';
284

XhmikosR's avatar
XhmikosR committed
285
286
  // CAROUSEL CLASS DEFINITION
  // =========================
287

XhmikosR's avatar
XhmikosR committed
288
289
290
291
292
293
294
295
296
  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
297

XhmikosR's avatar
XhmikosR committed
298
299
300
301
    this.options.pause == 'hover' && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }
302

Mark Otto's avatar
Mark Otto committed
303
  Carousel.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
304

XhmikosR's avatar
XhmikosR committed
305
306
307
308
309
  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true
  }
310

XhmikosR's avatar
XhmikosR committed
311
312
313
314
315
  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
316
317
    }

XhmikosR's avatar
XhmikosR committed
318
319
    e.preventDefault()
  }
320

XhmikosR's avatar
XhmikosR committed
321
322
  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)
fat's avatar
fat committed
323

XhmikosR's avatar
XhmikosR committed
324
    this.interval && clearInterval(this.interval)
325

XhmikosR's avatar
XhmikosR committed
326
327
328
    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
329

XhmikosR's avatar
XhmikosR committed
330
331
    return this
  }
332

XhmikosR's avatar
XhmikosR committed
333
334
335
336
  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }
337

XhmikosR's avatar
XhmikosR committed
338
339
340
  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
341

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

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

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

XhmikosR's avatar
XhmikosR committed
350
351
352
353
354
355
  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)
356
357
    }

XhmikosR's avatar
XhmikosR committed
358
    this.interval = clearInterval(this.interval)
359

XhmikosR's avatar
XhmikosR committed
360
361
    return this
  }
362

XhmikosR's avatar
XhmikosR committed
363
364
365
366
  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }
367

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

XhmikosR's avatar
XhmikosR committed
373
374
375
376
377
378
379
  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
380

XhmikosR's avatar
XhmikosR committed
381
382
383
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
Jacob Thornton's avatar
Jacob Thornton committed
384
385
    }

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

XhmikosR's avatar
XhmikosR committed
388
389
390
391
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
    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
428

XhmikosR's avatar
XhmikosR committed
429
    isCycling && this.cycle()
430

XhmikosR's avatar
XhmikosR committed
431
432
    return this
  }
433
434


XhmikosR's avatar
XhmikosR committed
435
436
  // CAROUSEL PLUGIN DEFINITION
  // ==========================
Chris Rebert's avatar
Chris Rebert committed
437

XhmikosR's avatar
XhmikosR committed
438
439
440
441
442
443
444
445
446
447
448
449
450
  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()
    })
  }
451

XhmikosR's avatar
XhmikosR committed
452
  var old = $.fn.carousel
Mark Otto's avatar
Mark Otto committed
453

XhmikosR's avatar
XhmikosR committed
454
455
  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel
456
457


XhmikosR's avatar
XhmikosR committed
458
459
  // CAROUSEL NO CONFLICT
  // ====================
460

XhmikosR's avatar
XhmikosR committed
461
462
463
464
  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }
465

fat's avatar
fat committed
466

XhmikosR's avatar
XhmikosR committed
467
468
  // CAROUSEL DATA-API
  // =================
469

XhmikosR's avatar
XhmikosR committed
470
471
472
473
474
475
476
477
  $(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
478

XhmikosR's avatar
XhmikosR committed
479
    Plugin.call($target, options)
480

XhmikosR's avatar
XhmikosR committed
481
482
    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
483
484
    }

XhmikosR's avatar
XhmikosR committed
485
486
    e.preventDefault()
  })
487

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

XhmikosR's avatar
XhmikosR committed
495
}(jQuery);
496

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


XhmikosR's avatar
XhmikosR committed
506
507
+function ($) {
  'use strict';
508

XhmikosR's avatar
XhmikosR committed
509
510
  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================
Mark Otto's avatar
grunt    
Mark Otto committed
511

XhmikosR's avatar
XhmikosR committed
512
513
514
515
  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.transitioning = null
516

XhmikosR's avatar
XhmikosR committed
517
518
519
    if (this.options.parent) this.$parent = $(this.options.parent)
    if (this.options.toggle) this.toggle()
  }
520

Mark Otto's avatar
Mark Otto committed
521
  Collapse.VERSION  = '3.2.0'
522

XhmikosR's avatar
XhmikosR committed
523
524
525
  Collapse.DEFAULTS = {
    toggle: true
  }
fat's avatar
fat committed
526

XhmikosR's avatar
XhmikosR committed
527
528
529
530
  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }
531

XhmikosR's avatar
XhmikosR committed
532
533
  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return
534

XhmikosR's avatar
XhmikosR committed
535
536
537
    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
538

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

XhmikosR's avatar
XhmikosR committed
541
542
543
544
545
546
    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)
    }
547

XhmikosR's avatar
XhmikosR committed
548
    var dimension = this.dimension()
549

XhmikosR's avatar
XhmikosR committed
550
551
552
    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
553

XhmikosR's avatar
XhmikosR committed
554
    this.transitioning = 1
555

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

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

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

XhmikosR's avatar
XhmikosR committed
569
570
571
572
    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
  }
573

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

XhmikosR's avatar
XhmikosR committed
577
578
579
    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return
580

XhmikosR's avatar
XhmikosR committed
581
    var dimension = this.dimension()
582

XhmikosR's avatar
XhmikosR committed
583
584
585
586
587
588
    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
      .removeClass('collapse')
      .removeClass('in')
589

XhmikosR's avatar
XhmikosR committed
590
    this.transitioning = 1
591

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

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

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

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

612

XhmikosR's avatar
XhmikosR committed
613
614
  // COLLAPSE PLUGIN DEFINITION
  // ==========================
615

XhmikosR's avatar
XhmikosR committed
616
617
618
619
620
  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
621

XhmikosR's avatar
XhmikosR committed
622
623
624
625
626
      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]()
    })
  }
627

XhmikosR's avatar
XhmikosR committed
628
  var old = $.fn.collapse
629

XhmikosR's avatar
XhmikosR committed
630
631
  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse
632

633

XhmikosR's avatar
XhmikosR committed
634
635
  // COLLAPSE NO CONFLICT
  // ====================
636

XhmikosR's avatar
XhmikosR committed
637
638
639
640
  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }
641

642

XhmikosR's avatar
XhmikosR committed
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  // 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')
      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
    }
fat's avatar
fat committed
662

XhmikosR's avatar
XhmikosR committed
663
    Plugin.call($target, option)
664
665
  })

XhmikosR's avatar
XhmikosR committed
666
}(jQuery);
667

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


XhmikosR's avatar
XhmikosR committed
677
678
+function ($) {
  'use strict';
Chris Rebert's avatar
Chris Rebert committed
679

XhmikosR's avatar
XhmikosR committed
680
681
  // DROPDOWN CLASS DEFINITION
  // =========================
Mark Otto's avatar
grunt    
Mark Otto committed
682

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

Mark Otto's avatar
Mark Otto committed
689
  Dropdown.VERSION = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
690

XhmikosR's avatar
XhmikosR committed
691
692
  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
693

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

XhmikosR's avatar
XhmikosR committed
696
697
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
698

XhmikosR's avatar
XhmikosR committed
699
    clearMenus()
fat's avatar
fat committed
700

XhmikosR's avatar
XhmikosR committed
701
702
703
704
705
    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)
      }
706

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

XhmikosR's avatar
XhmikosR committed
710
      if (e.isDefaultPrevented()) return
711

XhmikosR's avatar
XhmikosR committed
712
      $this.trigger('focus')
Mark Otto's avatar
Mark Otto committed
713

XhmikosR's avatar
XhmikosR committed
714
715
716
      $parent
        .toggleClass('open')
        .trigger('shown.bs.dropdown', relatedTarget)
fat's avatar
rebuild    
fat committed
717
    }
718

XhmikosR's avatar
XhmikosR committed
719
720
    return false
  }
721

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

XhmikosR's avatar
XhmikosR committed
725
    var $this = $(this)
726

XhmikosR's avatar
XhmikosR committed
727
728
    e.preventDefault()
    e.stopPropagation()
729

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

XhmikosR's avatar
XhmikosR committed
732
733
    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')
734

XhmikosR's avatar
XhmikosR committed
735
736
737
738
    if (!isActive || (isActive && e.keyCode == 27)) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }
739

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

XhmikosR's avatar
XhmikosR committed
743
    if (!$items.length) return
744

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

XhmikosR's avatar
XhmikosR committed
747
748
749
    if (e.keyCode == 38 && index > 0)                 index--                        // up
    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
    if (!~index)                                      index = 0
750

XhmikosR's avatar
XhmikosR committed
751
752
    $items.eq(index).trigger('focus')
  }
Chris Rebert's avatar
Chris Rebert committed
753

XhmikosR's avatar
XhmikosR committed
754
755
756
757
758
759
760
761
762
763
764
765
  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)
    })
  }
766

XhmikosR's avatar
XhmikosR committed
767
768
  function getParent($this) {
    var selector = $this.attr('data-target')
769

XhmikosR's avatar
XhmikosR committed
770
771
772
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
773
774
    }

XhmikosR's avatar
XhmikosR committed
775
    var $parent = selector && $(selector)
776

XhmikosR's avatar
XhmikosR committed
777
778
    return $parent && $parent.length ? $parent : $this.parent()
  }
779
780


XhmikosR's avatar
XhmikosR committed
781
782
  // DROPDOWN PLUGIN DEFINITION
  // ==========================
783

XhmikosR's avatar
XhmikosR committed
784
785
786
787
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')
788

XhmikosR's avatar
XhmikosR committed
789
790
791
792
      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
793

XhmikosR's avatar
XhmikosR committed
794
  var old = $.fn.dropdown
795

XhmikosR's avatar
XhmikosR committed
796
797
  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown
798

799

XhmikosR's avatar
XhmikosR committed
800
801
  // DROPDOWN NO CONFLICT
  // ====================
802

XhmikosR's avatar
XhmikosR committed
803
804
805
806
  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }
807

808

XhmikosR's avatar
XhmikosR committed
809
810
811
812
813
814
815
816
  // 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)
817

XhmikosR's avatar
XhmikosR committed
818
}(jQuery);
819

820
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
821
 * Bootstrap: modal.js v3.2.0
Mark Otto's avatar
Mark Otto committed
822
 * http://getbootstrap.com/javascript/#modals
823
 * ========================================================================
824
 * Copyright 2011-2014 Twitter, Inc.
825
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
826
 * ======================================================================== */
827
828


XhmikosR's avatar
XhmikosR committed
829
830
+function ($) {
  'use strict';
831

XhmikosR's avatar
XhmikosR committed
832
833
  // MODAL CLASS DEFINITION
  // ======================
834

XhmikosR's avatar
XhmikosR committed
835
836
837
838
839
840
841
  var Modal = function (element, options) {
    this.options        = options
    this.$body          = $(document.body)
    this.$element       = $(element)
    this.$backdrop      =
    this.isShown        = null
    this.scrollbarWidth = 0
842

XhmikosR's avatar
XhmikosR committed
843
844
845
846
847
848
    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
849
    }
XhmikosR's avatar
XhmikosR committed
850
  }
851

Mark Otto's avatar
Mark Otto committed
852
  Modal.VERSION  = '3.2.0'
Mark Otto's avatar
grunt    
Mark Otto committed
853

XhmikosR's avatar
XhmikosR committed
854
855
856
857
858
  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }
859

XhmikosR's avatar
XhmikosR committed
860
861
862
  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }
863

XhmikosR's avatar
XhmikosR committed
864
865
866
  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
867

XhmikosR's avatar
XhmikosR committed
868
    this.$element.trigger(e)
869

XhmikosR's avatar
XhmikosR committed
870
    if (this.isShown || e.isDefaultPrevented()) return
871

XhmikosR's avatar
XhmikosR committed
872
    this.isShown = true
fat's avatar
build    
fat committed
873

XhmikosR's avatar
XhmikosR committed
874
875
    this.checkScrollbar()
    this.$body.addClass('modal-open')
876

XhmikosR's avatar
XhmikosR committed
877
878
    this.setScrollbar()
    this.escape()
fat's avatar
rebuild    
fat committed
879

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

XhmikosR's avatar
XhmikosR committed
882
883
    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')
884

XhmikosR's avatar
XhmikosR committed
885
886
887
      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }
888

XhmikosR's avatar
XhmikosR committed
889
890
891
      that.$element
        .show()
        .scrollTop(0)
Jacob Thornton's avatar
Jacob Thornton committed
892

XhmikosR's avatar
XhmikosR committed
893
894
895
      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }
896

XhmikosR's avatar
XhmikosR committed
897
898
899
      that.$element
        .addClass('in')
        .attr('aria-hidden', false)
900

XhmikosR's avatar
XhmikosR committed
901
      that.enforceFocus()
902

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

XhmikosR's avatar
XhmikosR committed
905
906
907
908
909
910
911
912
913
      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)
    })
  }
914

XhmikosR's avatar
XhmikosR committed
915
916
  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()
917

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

XhmikosR's avatar
XhmikosR committed
920
    this.$element.trigger(e)
921

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

XhmikosR's avatar
XhmikosR committed
924
    this.isShown = false
925

XhmikosR's avatar
XhmikosR committed
926
    this.$body.removeClass('modal-open')
927

XhmikosR's avatar
XhmikosR committed
928
929
    this.resetScrollbar()
    this.escape()
Chris Rebert's avatar
Chris Rebert committed
930

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

XhmikosR's avatar
XhmikosR committed
933
934
935
936
    this.$element
      .removeClass('in')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
937

XhmikosR's avatar
XhmikosR committed
938
939
940
941
942
943
    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(300) :
      this.hideModal()
  }
944

XhmikosR's avatar
XhmikosR committed
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
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) {
      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
      this.$element.off('keyup.dismiss.bs.modal')
    }
  }

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

XhmikosR's avatar
XhmikosR committed
973
974
975
976
  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }
977

XhmikosR's avatar
XhmikosR committed
978
979
980
  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''
981

XhmikosR's avatar
XhmikosR committed
982
983
    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate
984

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

XhmikosR's avatar
XhmikosR committed
988
989
990
991
992
993
      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus.call(this.$element[0])
          : this.hide.call(this)
      }, this))
994

XhmikosR's avatar
XhmikosR committed
995
      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
996

XhmikosR's avatar
XhmikosR committed
997
      this.$backdrop.addClass('in')
998

XhmikosR's avatar
XhmikosR committed
999
      if (!callback) return
1000

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