carousel.js 5.88 KB
Newer Older
1
/* ========================================================================
2
 * Bootstrap: carousel.js v3.0.3
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


XhmikosR's avatar
XhmikosR committed
10
+function ($) { 'use strict';
fat's avatar
fat committed
11
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))
  }

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

  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')
    this.$items  = this.$active.parent().children()

    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

61
    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
fat's avatar
fat committed
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
    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)

    if (this.$element.find('.next, .prev').length && $.support.transition.end) {
      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
98
99
100
101
102
    if (!$next.length) {
      if (!this.options.wrap) return
      $next = this.$element.find('.item')[fallback]()
    }

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

105
    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
106
107
    this.$element.trigger(e)
    if (e.isDefaultPrevented()) return
fat's avatar
fat committed
108

109
110
111
    this.sliding = true

    isCycling && this.pause()
fat's avatar
fat committed
112
113
114

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

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

    isCycling && this.cycle()

    return this
  }


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

  var old = $.fn.carousel

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

159
      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
fat's avatar
fat committed
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

  $.fn.carousel.Constructor = Carousel


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

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

fat's avatar
fat committed
177

fat's avatar
fat committed
178
179
180
  // CAROUSEL DATA-API
  // =================

181
  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
182
    var $this   = $(this), href
fat's avatar
fat committed
183
184
    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
185
186
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false
fat's avatar
fat committed
187
188
189
190

    $target.carousel(options)

    if (slideIndex = $this.attr('data-slide-to')) {
fat's avatar
fat committed
191
      $target.data('bs.carousel').to(slideIndex)
fat's avatar
fat committed
192
193
194
195
196
    }

    e.preventDefault()
  })

197
198
199
200
201
202
203
  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      $carousel.carousel($carousel.data())
    })
  })

204
}(jQuery);