carousel.js 6.23 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


Katie Zhu's avatar
Katie Zhu committed
10
11
12
13
14
(function (o_o) {
  typeof define  === 'function' && define.amd ? define(['jquery'], o_o) :
  typeof exports === 'object' ? o_o(require('jquery')) : o_o(this.jQuery)
})(function ($) {

Zlatan Vasović's avatar
Zlatan Vasović committed
15
  'use strict';
fat's avatar
fat committed
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

  // 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
35
36
  Carousel.VERSION  = '3.1.1'

fat's avatar
fat committed
37
  Carousel.DEFAULTS = {
Zlatan Vasović's avatar
Zlatan Vasović committed
38
39
40
    interval: 5000,
    pause: 'hover',
    wrap: true
fat's avatar
fat committed
41
42
  }

XhmikosR's avatar
XhmikosR committed
43
  Carousel.prototype.cycle = function (e) {
fat's avatar
fat committed
44
45
46
47
48
49
50
51
52
53
54
    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
  }

55
56
57
  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
fat's avatar
fat committed
58
59
60
61
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
62
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
fat's avatar
fat committed
63
64
65

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

66
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
fat's avatar
fat committed
67
68
69
70
71
72
73
74
    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)

75
    if (this.$element.find('.next, .prev').length && $.support.transition) {
fat's avatar
fat committed
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
101
102
      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
103
104
105
106
107
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
    }

XhmikosR's avatar
XhmikosR committed
108
    if ($next.hasClass('active')) return (this.sliding = false)
fat's avatar
fat committed
109

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

118
119
120
    this.sliding = true

    isCycling && this.pause()
fat's avatar
fat committed
121
122
123

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
124
125
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
fat's avatar
fat committed
126
127
    }

128
    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
fat's avatar
fat committed
129
130
131
132
133
    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
134
      $active
135
136
137
138
        .one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
XhmikosR's avatar
XhmikosR committed
139
140
141
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
142
        })
143
        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
fat's avatar
fat committed
144
145
146
147
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
148
      this.$element.trigger(slidEvent)
fat's avatar
fat committed
149
150
151
152
153
154
155
156
157
158
159
    }

    isCycling && this.cycle()

    return this
  }


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

160
  function Plugin(option) {
fat's avatar
fat committed
161
162
    return this.each(function () {
      var $this   = $(this)
163
      var data    = $this.data('bs.carousel')
Jacob Thornton's avatar
Jacob Thornton committed
164
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
fat's avatar
fat committed
165
166
      var action  = typeof option == 'string' ? option : options.slide

167
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
fat's avatar
fat committed
168
169
170
171
172
173
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

174
175
176
  var old = $.fn.carousel

  $.fn.carousel             = Plugin
fat's avatar
fat committed
177
178
179
180
181
182
183
184
185
186
187
  $.fn.carousel.Constructor = Carousel


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

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

fat's avatar
fat committed
188

fat's avatar
fat committed
189
190
191
  // CAROUSEL DATA-API
  // =================

192
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
XhmikosR's avatar
XhmikosR committed
193
194
    var href
    var $this   = $(this)
fat's avatar
fat committed
195
196
    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
197
198
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
fat's avatar
fat committed
199

200
    Plugin.call($target, options)
fat's avatar
fat committed
201

202
    if (slideIndex) {
fat's avatar
fat committed
203
      $target.data('bs.carousel').to(slideIndex)
fat's avatar
fat committed
204
205
206
207
208
    }

    e.preventDefault()
  })

209
210
211
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
212
      Plugin.call($carousel, $carousel.data())
213
214
215
    })
  })

Katie Zhu's avatar
Katie Zhu committed
216
});