genus 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +29 -0
  4. data/Rakefile +2 -0
  5. data/app/assets/fonts/FontAwesome.otf +0 -0
  6. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  7. data/app/assets/fonts/fontawesome-webfont.svg +520 -0
  8. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  9. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  10. data/app/assets/javascripts/bootstrap/affix.js +142 -0
  11. data/app/assets/javascripts/bootstrap/alert.js +92 -0
  12. data/app/assets/javascripts/bootstrap/button.js +110 -0
  13. data/app/assets/javascripts/bootstrap/carousel.js +223 -0
  14. data/app/assets/javascripts/bootstrap/collapse.js +170 -0
  15. data/app/assets/javascripts/bootstrap/dropdown.js +151 -0
  16. data/app/assets/javascripts/bootstrap/modal.js +280 -0
  17. data/app/assets/javascripts/bootstrap/popover.js +113 -0
  18. data/app/assets/javascripts/bootstrap/scrollspy.js +170 -0
  19. data/app/assets/javascripts/bootstrap/tab.js +128 -0
  20. data/app/assets/javascripts/bootstrap/tooltip.js +457 -0
  21. data/app/assets/javascripts/bootstrap/transition.js +59 -0
  22. data/app/assets/javascripts/bootstrap.js +12 -0
  23. data/app/assets/javascripts/genus.js.coffee +4 -0
  24. data/app/assets/stylesheets/bootstrap/_alerts.scss +68 -0
  25. data/app/assets/stylesheets/bootstrap/_badges.scss +57 -0
  26. data/app/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  27. data/app/assets/stylesheets/bootstrap/_button-groups.scss +240 -0
  28. data/app/assets/stylesheets/bootstrap/_buttons.scss +157 -0
  29. data/app/assets/stylesheets/bootstrap/_carousel.scss +243 -0
  30. data/app/assets/stylesheets/bootstrap/_close.scss +35 -0
  31. data/app/assets/stylesheets/bootstrap/_code.scss +68 -0
  32. data/app/assets/stylesheets/bootstrap/_component-animations.scss +35 -0
  33. data/app/assets/stylesheets/bootstrap/_dropdowns.scss +215 -0
  34. data/app/assets/stylesheets/bootstrap/_forms.scss +538 -0
  35. data/app/assets/stylesheets/bootstrap/_glyphicons.scss +237 -0
  36. data/app/assets/stylesheets/bootstrap/_grid.scss +84 -0
  37. data/app/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
  38. data/app/assets/stylesheets/bootstrap/_jumbotron.scss +48 -0
  39. data/app/assets/stylesheets/bootstrap/_labels.scss +66 -0
  40. data/app/assets/stylesheets/bootstrap/_list-group.scss +131 -0
  41. data/app/assets/stylesheets/bootstrap/_media.scss +56 -0
  42. data/app/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  43. data/app/assets/stylesheets/bootstrap/_modals.scss +150 -0
  44. data/app/assets/stylesheets/bootstrap/_navbar.scss +659 -0
  45. data/app/assets/stylesheets/bootstrap/_navs.scss +242 -0
  46. data/app/assets/stylesheets/bootstrap/_normalize.scss +425 -0
  47. data/app/assets/stylesheets/bootstrap/_pager.scss +55 -0
  48. data/app/assets/stylesheets/bootstrap/_pagination.scss +88 -0
  49. data/app/assets/stylesheets/bootstrap/_panels.scss +243 -0
  50. data/app/assets/stylesheets/bootstrap/_popovers.scss +133 -0
  51. data/app/assets/stylesheets/bootstrap/_print.scss +101 -0
  52. data/app/assets/stylesheets/bootstrap/_progress-bars.scss +105 -0
  53. data/app/assets/stylesheets/bootstrap/_responsive-embed.scss +34 -0
  54. data/app/assets/stylesheets/bootstrap/_responsive-utilities.scss +174 -0
  55. data/app/assets/stylesheets/bootstrap/_scaffolding.scss +150 -0
  56. data/app/assets/stylesheets/bootstrap/_tables.scss +233 -0
  57. data/app/assets/stylesheets/bootstrap/_theme.scss +258 -0
  58. data/app/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  59. data/app/assets/stylesheets/bootstrap/_tooltip.scss +95 -0
  60. data/app/assets/stylesheets/bootstrap/_type.scss +304 -0
  61. data/app/assets/stylesheets/bootstrap/_utilities.scss +57 -0
  62. data/app/assets/stylesheets/bootstrap/_variables.scss +850 -0
  63. data/app/assets/stylesheets/bootstrap/_wells.scss +29 -0
  64. data/app/assets/stylesheets/bootstrap/bootstrap.scss +50 -0
  65. data/app/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  66. data/app/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  67. data/app/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  68. data/app/assets/stylesheets/bootstrap/mixins/_buttons.scss +50 -0
  69. data/app/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  70. data/app/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  71. data/app/assets/stylesheets/bootstrap/mixins/_forms.scss +84 -0
  72. data/app/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  73. data/app/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  74. data/app/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  75. data/app/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  76. data/app/assets/stylesheets/bootstrap/mixins/_image.scss +34 -0
  77. data/app/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  78. data/app/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  79. data/app/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  80. data/app/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  81. data/app/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  82. data/app/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  83. data/app/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  84. data/app/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  85. data/app/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  86. data/app/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  87. data/app/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  88. data/app/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  89. data/app/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  90. data/app/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  91. data/app/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  92. data/app/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  93. data/app/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +219 -0
  94. data/app/assets/stylesheets/bootstrap.scss +50 -0
  95. data/app/assets/stylesheets/font-awesome.css.erb +1677 -0
  96. data/app/assets/stylesheets/genus.css.scss +15 -0
  97. data/lib/genus/version.rb +3 -0
  98. data/lib/genus.rb +6 -0
  99. metadata +211 -0
@@ -0,0 +1,142 @@
1
+ /* ========================================================================
2
+ * Bootstrap: affix.js v3.2.0
3
+ * http://getbootstrap.com/javascript/#affix
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // AFFIX CLASS DEFINITION
14
+ // ======================
15
+
16
+ var Affix = function (element, options) {
17
+ this.options = $.extend({}, Affix.DEFAULTS, options)
18
+
19
+ this.$target = $(this.options.target)
20
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
21
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
22
+
23
+ this.$element = $(element)
24
+ this.affixed =
25
+ this.unpin =
26
+ this.pinnedOffset = null
27
+
28
+ this.checkPosition()
29
+ }
30
+
31
+ Affix.VERSION = '3.2.0'
32
+
33
+ Affix.RESET = 'affix affix-top affix-bottom'
34
+
35
+ Affix.DEFAULTS = {
36
+ offset: 0,
37
+ target: window
38
+ }
39
+
40
+ Affix.prototype.getPinnedOffset = function () {
41
+ if (this.pinnedOffset) return this.pinnedOffset
42
+ this.$element.removeClass(Affix.RESET).addClass('affix')
43
+ var scrollTop = this.$target.scrollTop()
44
+ var position = this.$element.offset()
45
+ return (this.pinnedOffset = position.top - scrollTop)
46
+ }
47
+
48
+ Affix.prototype.checkPositionWithEventLoop = function () {
49
+ setTimeout($.proxy(this.checkPosition, this), 1)
50
+ }
51
+
52
+ Affix.prototype.checkPosition = function () {
53
+ if (!this.$element.is(':visible')) return
54
+
55
+ var scrollHeight = $(document).height()
56
+ var scrollTop = this.$target.scrollTop()
57
+ var position = this.$element.offset()
58
+ var offset = this.options.offset
59
+ var offsetTop = offset.top
60
+ var offsetBottom = offset.bottom
61
+
62
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
63
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
64
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
65
+
66
+ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
67
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
68
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
69
+
70
+ if (this.affixed === affix) return
71
+ if (this.unpin != null) this.$element.css('top', '')
72
+
73
+ var affixType = 'affix' + (affix ? '-' + affix : '')
74
+ var e = $.Event(affixType + '.bs.affix')
75
+
76
+ this.$element.trigger(e)
77
+
78
+ if (e.isDefaultPrevented()) return
79
+
80
+ this.affixed = affix
81
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
82
+
83
+ this.$element
84
+ .removeClass(Affix.RESET)
85
+ .addClass(affixType)
86
+ .trigger($.Event(affixType.replace('affix', 'affixed')))
87
+
88
+ if (affix == 'bottom') {
89
+ this.$element.offset({
90
+ top: scrollHeight - this.$element.height() - offsetBottom
91
+ })
92
+ }
93
+ }
94
+
95
+
96
+ // AFFIX PLUGIN DEFINITION
97
+ // =======================
98
+
99
+ function Plugin(option) {
100
+ return this.each(function () {
101
+ var $this = $(this)
102
+ var data = $this.data('bs.affix')
103
+ var options = typeof option == 'object' && option
104
+
105
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
106
+ if (typeof option == 'string') data[option]()
107
+ })
108
+ }
109
+
110
+ var old = $.fn.affix
111
+
112
+ $.fn.affix = Plugin
113
+ $.fn.affix.Constructor = Affix
114
+
115
+
116
+ // AFFIX NO CONFLICT
117
+ // =================
118
+
119
+ $.fn.affix.noConflict = function () {
120
+ $.fn.affix = old
121
+ return this
122
+ }
123
+
124
+
125
+ // AFFIX DATA-API
126
+ // ==============
127
+
128
+ $(window).on('load', function () {
129
+ $('[data-spy="affix"]').each(function () {
130
+ var $spy = $(this)
131
+ var data = $spy.data()
132
+
133
+ data.offset = data.offset || {}
134
+
135
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
136
+ if (data.offsetTop) data.offset.top = data.offsetTop
137
+
138
+ Plugin.call($spy, data)
139
+ })
140
+ })
141
+
142
+ }(jQuery);
@@ -0,0 +1,92 @@
1
+ /* ========================================================================
2
+ * Bootstrap: alert.js v3.2.0
3
+ * http://getbootstrap.com/javascript/#alerts
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // ALERT CLASS DEFINITION
14
+ // ======================
15
+
16
+ var dismiss = '[data-dismiss="alert"]'
17
+ var Alert = function (el) {
18
+ $(el).on('click', dismiss, this.close)
19
+ }
20
+
21
+ Alert.VERSION = '3.2.0'
22
+
23
+ Alert.prototype.close = function (e) {
24
+ var $this = $(this)
25
+ var selector = $this.attr('data-target')
26
+
27
+ if (!selector) {
28
+ selector = $this.attr('href')
29
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
30
+ }
31
+
32
+ var $parent = $(selector)
33
+
34
+ if (e) e.preventDefault()
35
+
36
+ if (!$parent.length) {
37
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
38
+ }
39
+
40
+ $parent.trigger(e = $.Event('close.bs.alert'))
41
+
42
+ if (e.isDefaultPrevented()) return
43
+
44
+ $parent.removeClass('in')
45
+
46
+ function removeElement() {
47
+ // detach from parent, fire event then clean up data
48
+ $parent.detach().trigger('closed.bs.alert').remove()
49
+ }
50
+
51
+ $.support.transition && $parent.hasClass('fade') ?
52
+ $parent
53
+ .one('bsTransitionEnd', removeElement)
54
+ .emulateTransitionEnd(150) :
55
+ removeElement()
56
+ }
57
+
58
+
59
+ // ALERT PLUGIN DEFINITION
60
+ // =======================
61
+
62
+ function Plugin(option) {
63
+ return this.each(function () {
64
+ var $this = $(this)
65
+ var data = $this.data('bs.alert')
66
+
67
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
68
+ if (typeof option == 'string') data[option].call($this)
69
+ })
70
+ }
71
+
72
+ var old = $.fn.alert
73
+
74
+ $.fn.alert = Plugin
75
+ $.fn.alert.Constructor = Alert
76
+
77
+
78
+ // ALERT NO CONFLICT
79
+ // =================
80
+
81
+ $.fn.alert.noConflict = function () {
82
+ $.fn.alert = old
83
+ return this
84
+ }
85
+
86
+
87
+ // ALERT DATA-API
88
+ // ==============
89
+
90
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
91
+
92
+ }(jQuery);
@@ -0,0 +1,110 @@
1
+ /* ========================================================================
2
+ * Bootstrap: button.js v3.2.0
3
+ * http://getbootstrap.com/javascript/#buttons
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // BUTTON PUBLIC CLASS DEFINITION
14
+ // ==============================
15
+
16
+ var Button = function (element, options) {
17
+ this.$element = $(element)
18
+ this.options = $.extend({}, Button.DEFAULTS, options)
19
+ this.isLoading = false
20
+ }
21
+
22
+ Button.VERSION = '3.2.0'
23
+
24
+ Button.DEFAULTS = {
25
+ loadingText: 'loading...'
26
+ }
27
+
28
+ Button.prototype.setState = function (state) {
29
+ var d = 'disabled'
30
+ var $el = this.$element
31
+ var val = $el.is('input') ? 'val' : 'html'
32
+ var data = $el.data()
33
+
34
+ state = state + 'Text'
35
+
36
+ if (data.resetText == null) $el.data('resetText', $el[val]())
37
+
38
+ $el[val](data[state] == null ? this.options[state] : data[state])
39
+
40
+ // push to event loop to allow forms to submit
41
+ setTimeout($.proxy(function () {
42
+ if (state == 'loadingText') {
43
+ this.isLoading = true
44
+ $el.addClass(d).attr(d, d)
45
+ } else if (this.isLoading) {
46
+ this.isLoading = false
47
+ $el.removeClass(d).removeAttr(d)
48
+ }
49
+ }, this), 0)
50
+ }
51
+
52
+ Button.prototype.toggle = function () {
53
+ var changed = true
54
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
55
+
56
+ if ($parent.length) {
57
+ var $input = this.$element.find('input')
58
+ if ($input.prop('type') == 'radio') {
59
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
60
+ else $parent.find('.active').removeClass('active')
61
+ }
62
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
63
+ }
64
+
65
+ if (changed) this.$element.toggleClass('active')
66
+ }
67
+
68
+
69
+ // BUTTON PLUGIN DEFINITION
70
+ // ========================
71
+
72
+ function Plugin(option) {
73
+ return this.each(function () {
74
+ var $this = $(this)
75
+ var data = $this.data('bs.button')
76
+ var options = typeof option == 'object' && option
77
+
78
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
79
+
80
+ if (option == 'toggle') data.toggle()
81
+ else if (option) data.setState(option)
82
+ })
83
+ }
84
+
85
+ var old = $.fn.button
86
+
87
+ $.fn.button = Plugin
88
+ $.fn.button.Constructor = Button
89
+
90
+
91
+ // BUTTON NO CONFLICT
92
+ // ==================
93
+
94
+ $.fn.button.noConflict = function () {
95
+ $.fn.button = old
96
+ return this
97
+ }
98
+
99
+
100
+ // BUTTON DATA-API
101
+ // ===============
102
+
103
+ $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
104
+ var $btn = $(e.target)
105
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
106
+ Plugin.call($btn, 'toggle')
107
+ e.preventDefault()
108
+ })
109
+
110
+ }(jQuery);
@@ -0,0 +1,223 @@
1
+ /* ========================================================================
2
+ * Bootstrap: carousel.js v3.2.0
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
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // CAROUSEL CLASS DEFINITION
14
+ // =========================
15
+
16
+ var Carousel = function (element, options) {
17
+ this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
18
+ this.$indicators = this.$element.find('.carousel-indicators')
19
+ this.options = options
20
+ this.paused =
21
+ this.sliding =
22
+ this.interval =
23
+ this.$active =
24
+ this.$items = null
25
+
26
+ this.options.pause == 'hover' && this.$element
27
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
28
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
29
+ }
30
+
31
+ Carousel.VERSION = '3.2.0'
32
+
33
+ Carousel.DEFAULTS = {
34
+ interval: 5000,
35
+ pause: 'hover',
36
+ wrap: true
37
+ }
38
+
39
+ Carousel.prototype.keydown = function (e) {
40
+ switch (e.which) {
41
+ case 37: this.prev(); break
42
+ case 39: this.next(); break
43
+ default: return
44
+ }
45
+
46
+ e.preventDefault()
47
+ }
48
+
49
+ Carousel.prototype.cycle = function (e) {
50
+ e || (this.paused = false)
51
+
52
+ this.interval && clearInterval(this.interval)
53
+
54
+ this.options.interval
55
+ && !this.paused
56
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
57
+
58
+ return this
59
+ }
60
+
61
+ Carousel.prototype.getItemIndex = function (item) {
62
+ this.$items = item.parent().children('.item')
63
+ return this.$items.index(item || this.$active)
64
+ }
65
+
66
+ Carousel.prototype.to = function (pos) {
67
+ var that = this
68
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
69
+
70
+ if (pos > (this.$items.length - 1) || pos < 0) return
71
+
72
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
73
+ if (activeIndex == pos) return this.pause().cycle()
74
+
75
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
76
+ }
77
+
78
+ Carousel.prototype.pause = function (e) {
79
+ e || (this.paused = true)
80
+
81
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
82
+ this.$element.trigger($.support.transition.end)
83
+ this.cycle(true)
84
+ }
85
+
86
+ this.interval = clearInterval(this.interval)
87
+
88
+ return this
89
+ }
90
+
91
+ Carousel.prototype.next = function () {
92
+ if (this.sliding) return
93
+ return this.slide('next')
94
+ }
95
+
96
+ Carousel.prototype.prev = function () {
97
+ if (this.sliding) return
98
+ return this.slide('prev')
99
+ }
100
+
101
+ Carousel.prototype.slide = function (type, next) {
102
+ var $active = this.$element.find('.item.active')
103
+ var $next = next || $active[type]()
104
+ var isCycling = this.interval
105
+ var direction = type == 'next' ? 'left' : 'right'
106
+ var fallback = type == 'next' ? 'first' : 'last'
107
+ var that = this
108
+
109
+ if (!$next.length) {
110
+ if (!this.options.wrap) return
111
+ $next = this.$element.find('.item')[fallback]()
112
+ }
113
+
114
+ if ($next.hasClass('active')) return (this.sliding = false)
115
+
116
+ var relatedTarget = $next[0]
117
+ var slideEvent = $.Event('slide.bs.carousel', {
118
+ relatedTarget: relatedTarget,
119
+ direction: direction
120
+ })
121
+ this.$element.trigger(slideEvent)
122
+ if (slideEvent.isDefaultPrevented()) return
123
+
124
+ this.sliding = true
125
+
126
+ isCycling && this.pause()
127
+
128
+ if (this.$indicators.length) {
129
+ this.$indicators.find('.active').removeClass('active')
130
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
131
+ $nextIndicator && $nextIndicator.addClass('active')
132
+ }
133
+
134
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
135
+ if ($.support.transition && this.$element.hasClass('slide')) {
136
+ $next.addClass(type)
137
+ $next[0].offsetWidth // force reflow
138
+ $active.addClass(direction)
139
+ $next.addClass(direction)
140
+ $active
141
+ .one('bsTransitionEnd', function () {
142
+ $next.removeClass([type, direction].join(' ')).addClass('active')
143
+ $active.removeClass(['active', direction].join(' '))
144
+ that.sliding = false
145
+ setTimeout(function () {
146
+ that.$element.trigger(slidEvent)
147
+ }, 0)
148
+ })
149
+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
150
+ } else {
151
+ $active.removeClass('active')
152
+ $next.addClass('active')
153
+ this.sliding = false
154
+ this.$element.trigger(slidEvent)
155
+ }
156
+
157
+ isCycling && this.cycle()
158
+
159
+ return this
160
+ }
161
+
162
+
163
+ // CAROUSEL PLUGIN DEFINITION
164
+ // ==========================
165
+
166
+ function Plugin(option) {
167
+ return this.each(function () {
168
+ var $this = $(this)
169
+ var data = $this.data('bs.carousel')
170
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
171
+ var action = typeof option == 'string' ? option : options.slide
172
+
173
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
174
+ if (typeof option == 'number') data.to(option)
175
+ else if (action) data[action]()
176
+ else if (options.interval) data.pause().cycle()
177
+ })
178
+ }
179
+
180
+ var old = $.fn.carousel
181
+
182
+ $.fn.carousel = Plugin
183
+ $.fn.carousel.Constructor = Carousel
184
+
185
+
186
+ // CAROUSEL NO CONFLICT
187
+ // ====================
188
+
189
+ $.fn.carousel.noConflict = function () {
190
+ $.fn.carousel = old
191
+ return this
192
+ }
193
+
194
+
195
+ // CAROUSEL DATA-API
196
+ // =================
197
+
198
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
199
+ var href
200
+ var $this = $(this)
201
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
202
+ if (!$target.hasClass('carousel')) return
203
+ var options = $.extend({}, $target.data(), $this.data())
204
+ var slideIndex = $this.attr('data-slide-to')
205
+ if (slideIndex) options.interval = false
206
+
207
+ Plugin.call($target, options)
208
+
209
+ if (slideIndex) {
210
+ $target.data('bs.carousel').to(slideIndex)
211
+ }
212
+
213
+ e.preventDefault()
214
+ })
215
+
216
+ $(window).on('load', function () {
217
+ $('[data-ride="carousel"]').each(function () {
218
+ var $carousel = $(this)
219
+ Plugin.call($carousel, $carousel.data())
220
+ })
221
+ })
222
+
223
+ }(jQuery);