carousel.js 6.14 KB
Newer Older
1
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2
 * Bootstrap: carousel.js v3.1.1
3
 * http://getbootstrap.com/javascript/#carousel
4
 * ========================================================================
5
 * Copyright 2011-2014 Twitter, Inc.
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
 * ======================================================================== */
fat's avatar
fat committed
8
9


Zlatan Vasović's avatar
Zlatan Vasović committed
10
11
+function ($) {
  'use strict';
fat's avatar
fat committed
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

  // CAROUSEL CLASS DEFINITION
  // =========================

  var Carousel = function (element, options) {
    this.$element    = $(element)
    this.$indicators = this.$element.find('.carousel-indicators')
    this.options     = options
    this.paused      =
    this.sliding     =
    this.interval    =
    this.$active     =
    this.$items      = null

    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
      .on('mouseleave', $.proxy(this.cycle, this))
  }

fat's avatar
fat committed
31
32
  Carousel.VERSION  = '3.1.1'

fat's avatar
fat committed
33
  Carousel.DEFAULTS = {
Zlatan Vasović's avatar
Zlatan Vasović committed
34
35
36
    interval: 5000,
    pause: 'hover',
    wrap: true
fat's avatar
fat committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  }

  Carousel.prototype.cycle =  function (e) {
    e || (this.paused = false)

    this.interval && clearInterval(this.interval)

    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))

    return this
  }

  Carousel.prototype.getActiveIndex = function () {
    this.$active = this.$element.find('.item.active')
53
    this.$items  = this.$active.parent().children('.item')
fat's avatar
fat committed
54
55
56
57
58
59
60
61
62
63

    return this.$items.index(this.$active)
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getActiveIndex()

    if (pos > (this.$items.length - 1) || pos < 0) return

64
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
fat's avatar
fat committed
65
66
67
68
69
70
71
72
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
  }

  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

73
    if (this.$element.find('.next, .prev').length && $.support.transition) {
fat's avatar
fat committed
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
    }

    this.interval = clearInterval(this.interval)

    return this
  }

  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }

  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }

  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
101
102
103
104
105
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
    }

106
    if ($next.hasClass('active')) return this.sliding = false
fat's avatar
fat committed
107

108
    var relatedTarget = $next[0]
109
110
111
    var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return
fat's avatar
fat committed
112

113
114
115
    this.sliding = true

    isCycling && this.pause()
fat's avatar
fat committed
116
117
118

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
119
      this.$element.one('slid.bs.carousel', function () { // yes, "slid"
fat's avatar
fat committed
120
121
122
123
124
        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
        $nextIndicator && $nextIndicator.addClass('active')
      })
    }

125
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
fat's avatar
fat committed
126
127
128
129
130
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
Jacob Thornton's avatar
Jacob Thornton committed
131
      $active
132
133
134
135
        .one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
136
          setTimeout(function () { that.$element.trigger(slidEvent) }, 0)
137
        })
138
        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
fat's avatar
fat committed
139
140
141
142
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
143
      this.$element.trigger(slidEvent)
fat's avatar
fat committed
144
145
146
147
148
149
150
151
152
153
154
    }

    isCycling && this.cycle()

    return this
  }


  // CAROUSEL PLUGIN DEFINITION
  // ==========================

155
  function Plugin(option) {
fat's avatar
fat committed
156
157
    return this.each(function () {
      var $this   = $(this)
158
      var data    = $this.data('bs.carousel')
Jacob Thornton's avatar
Jacob Thornton committed
159
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
fat's avatar
fat committed
160
161
      var action  = typeof option == 'string' ? option : options.slide

162
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
fat's avatar
fat committed
163
164
165
166
167
168
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

169
170
171
  var old = $.fn.carousel

  $.fn.carousel             = Plugin
fat's avatar
fat committed
172
173
174
175
176
177
178
179
180
181
182
  $.fn.carousel.Constructor = Carousel


  // CAROUSEL NO CONFLICT
  // ====================

  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }

fat's avatar
fat committed
183

fat's avatar
fat committed
184
185
186
  // CAROUSEL DATA-API
  // =================

187
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
188
    var $this   = $(this), href
fat's avatar
fat committed
189
190
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
    var options = $.extend({}, $target.data(), $this.data())
fat's avatar
fat committed
191
192
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
fat's avatar
fat committed
193

194
    Plugin.call($target, options)
fat's avatar
fat committed
195
196

    if (slideIndex = $this.attr('data-slide-to')) {
fat's avatar
fat committed
197
      $target.data('bs.carousel').to(slideIndex)
fat's avatar
fat committed
198
199
200
201
202
    }

    e.preventDefault()
  })

203
204
205
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
206
      Plugin.call($carousel, $carousel.data())
207
208
209
    })
  })

210
}(jQuery);