spree_showcase 0.5.3 → 0.6.0
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.
- data/app/models/spree/slide.rb +36 -10
- data/app/overrides/{add_showcase_to_admin_configuration_menu.rb → showcase/add_showcase_to_admin_configuration_menu.rb} +0 -0
- data/app/overrides/{add_showcase_to_admin_configurations_side_menu.rb → showcase/add_showcase_to_admin_configurations_side_menu.rb} +0 -0
- data/app/overrides/showcase/add_showcase_to_home_layout.rb +12 -0
- data/app/views/spree/admin/shared/_showcase_submenu.html.erb +1 -1
- data/app/views/spree/admin/showcase_settings/edit.html.erb +4 -1
- data/app/views/spree/admin/showcase_settings/show.html.erb +17 -6
- data/app/views/spree/admin/slides/edit.html.erb +4 -1
- data/app/views/spree/admin/slides/index.html.erb +13 -9
- data/app/views/spree/admin/slides/new.html.erb +3 -1
- data/app/views/spree/slides/_showcase.html.erb +63 -28
- data/config/locales/en.yml +16 -1
- data/lib/generators/spree_showcase/install/assets/overrides/showcase/add_showcase_to_home_layout.rb +12 -0
- data/lib/generators/spree_showcase/install/assets/partials/_showcase.html.erb +32 -0
- data/lib/generators/spree_showcase/install/assets/stylesheets/store/showcase.css.scss +1 -1
- data/lib/generators/spree_showcase/install/assets/vendor/javascripts/jquery.flexslider.js +903 -0
- data/lib/generators/spree_showcase/install/assets/vendor/stylesheets/jquery.flexslider.css +76 -0
- data/lib/generators/spree_showcase/install/install_generator.rb +47 -22
- data/lib/spree/showcase_configuration.rb +1 -0
- data/spree_showcase-0.5.3.gem +0 -0
- data/spree_showcase.gemspec +3 -3
- data/vendor/assets/javascripts/jquery.flexslider.js +903 -0
- data/vendor/assets/stylesheets/jquery.flexslider.css +76 -0
- metadata +16 -14
- data/app/overrides/add_showcase_to_home_layout.rb +0 -8
- data/app/overrides/insert_slider_into_spree_application.rb +0 -10
- data/lib/generators/spree_showcase/install/assets/javascripts/store/jquery.flexslider.js +0 -563
- data/lib/generators/spree_showcase/install/assets/javascripts/store/showcase.js.erb +0 -32
- data/lib/generators/spree_showcase/install/assets/stylesheets/store/flexslider.css +0 -64
@@ -0,0 +1,76 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery FlexSlider v2.0
|
3
|
+
* http://www.woothemes.com/flexslider/
|
4
|
+
*
|
5
|
+
* Copyright 2012 WooThemes
|
6
|
+
* Free to use under the GPLv2 license.
|
7
|
+
* http://www.gnu.org/licenses/gpl-2.0.html
|
8
|
+
*
|
9
|
+
* Contributing author: Tyler Smith (@mbmufffin)
|
10
|
+
*/
|
11
|
+
|
12
|
+
|
13
|
+
/* Browser Resets */
|
14
|
+
.flex-container a:active,
|
15
|
+
.flexslider a:active,
|
16
|
+
.flex-container a:focus,
|
17
|
+
.flexslider a:focus {outline: none;}
|
18
|
+
.slides,
|
19
|
+
.flex-control-nav,
|
20
|
+
.flex-direction-nav {margin: 0; padding: 0; list-style: none;}
|
21
|
+
|
22
|
+
/* FlexSlider Necessary Styles
|
23
|
+
*********************************/
|
24
|
+
.flexslider {margin: 0; padding: 0;}
|
25
|
+
.flexslider .slides > li {display: none; -webkit-backface-visibility: hidden;} /* Hide the slides before the JS is loaded. Avoids image jumping */
|
26
|
+
.flexslider .slides img {width: 100%; display: block;}
|
27
|
+
.flex-pauseplay span {text-transform: capitalize;}
|
28
|
+
|
29
|
+
/* Clearfix for the .slides element */
|
30
|
+
.slides:after {content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
|
31
|
+
html[xmlns] .slides {display: block;}
|
32
|
+
* html .slides {height: 1%;}
|
33
|
+
|
34
|
+
/* No JavaScript Fallback */
|
35
|
+
/* If you are not using another script, such as Modernizr, make sure you
|
36
|
+
* include js that eliminates this class on page load */
|
37
|
+
.no-js .slides > li:first-child {display: block;}
|
38
|
+
|
39
|
+
|
40
|
+
/* FlexSlider Default Theme
|
41
|
+
*********************************/
|
42
|
+
.flexslider {margin: 0 0 60px; background: #fff; border: 4px solid #fff; position: relative; -webkit-border-radius: 4px; -moz-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; box-shadow: 0 1px 4px rgba(0,0,0,.2); -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.2); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.2); -o-box-shadow: 0 1px 4px rgba(0,0,0,.2); zoom: 1;}
|
43
|
+
.flex-viewport {max-height: 2000px; -webkit-transition: all 1s ease; -moz-transition: all 1s ease; transition: all 1s ease;}
|
44
|
+
.loading .flex-viewport {max-height: 300px;}
|
45
|
+
.flexslider .slides {zoom: 1;}
|
46
|
+
|
47
|
+
.carousel li {margin-right: 5px}
|
48
|
+
|
49
|
+
|
50
|
+
/* Direction Nav */
|
51
|
+
.flex-direction-nav {*height: 0;}
|
52
|
+
.flex-direction-nav a {width: 30px; height: 30px; margin: -20px 0 0; display: block; background: url(images/bg_direction_nav.png) no-repeat 0 0; position: absolute; top: 50%; z-index: 10; cursor: pointer; text-indent: -9999px; opacity: 0; -webkit-transition: all .3s ease;}
|
53
|
+
.flex-direction-nav .flex-next {background-position: 100% 0; right: -36px; }
|
54
|
+
.flex-direction-nav .flex-prev {left: -36px;}
|
55
|
+
.flexslider:hover .flex-next {opacity: 0.8; right: 5px;}
|
56
|
+
.flexslider:hover .flex-prev {opacity: 0.8; left: 5px;}
|
57
|
+
.flexslider:hover .flex-next:hover, .flexslider:hover .flex-prev:hover {opacity: 1;}
|
58
|
+
.flex-direction-nav .flex-disabled {opacity: .3!important; filter:alpha(opacity=30); cursor: default;}
|
59
|
+
|
60
|
+
/* Control Nav */
|
61
|
+
.flex-control-nav {width: 100%; position: absolute; bottom: -40px; text-align: center;}
|
62
|
+
.flex-control-nav li {margin: 0 6px; display: inline-block; zoom: 1; *display: inline;}
|
63
|
+
.flex-control-paging li a {width: 11px; height: 11px; display: block; background: #666; background: rgba(0,0,0,0.5); cursor: pointer; text-indent: -9999px; -webkit-border-radius: 20px; -moz-border-radius: 20px; -o-border-radius: 20px; border-radius: 20px; box-shadow: inset 0 0 3px rgba(0,0,0,0.3);}
|
64
|
+
.flex-control-paging li a:hover { background: #333; background: rgba(0,0,0,0.7); }
|
65
|
+
.flex-control-paging li a.flex-active { background: #000; background: rgba(0,0,0,0.9); cursor: default; }
|
66
|
+
|
67
|
+
.flex-control-thumbs {margin: 5px 0 0; position: static; overflow: hidden;}
|
68
|
+
.flex-control-thumbs li {width: 25%; float: left; margin: 0;}
|
69
|
+
.flex-control-thumbs img {width: 100%; display: block; opacity: .7; cursor: pointer;}
|
70
|
+
.flex-control-thumbs img:hover {opacity: 1;}
|
71
|
+
.flex-control-thumbs .flex-active {opacity: 1; cursor: default;}
|
72
|
+
|
73
|
+
@media screen and (max-width: 860px) {
|
74
|
+
.flex-direction-nav .flex-prev {opacity: 1; left: 0;}
|
75
|
+
.flex-direction-nav .flex-next {opacity: 1; right: 0;}
|
76
|
+
}
|
@@ -3,44 +3,66 @@ module SpreeShowcase
|
|
3
3
|
class InstallGenerator < Rails::Generators::Base
|
4
4
|
source_root File.expand_path("../assets", __FILE__)
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def messages
|
7
|
+
@messages||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def copy_message
|
11
|
+
status = status.to_s.capitalize
|
12
|
+
"Copy #{@source} into #{@dest}..."
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_overrides
|
16
|
+
@source = "overrides/showcase/add_showcase_to_home_layout.rb"
|
17
|
+
@dest = "app/overrides/showcase/add_showcase_to_home_layout.rb"
|
18
|
+
if copy_file(@source, @dest)
|
19
|
+
messages << copy_message
|
10
20
|
else
|
11
|
-
|
21
|
+
messages << copy_message
|
12
22
|
end
|
13
|
-
|
14
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_javascripts
|
26
|
+
append_file 'app/assets/javascripts/store/all.js', "//= require jquery.flexslider\n"
|
27
|
+
@source = "vendor/javascripts/jquery.flexslider.js"
|
28
|
+
@dest = "vendor/assets/javascripts/store/jquery.flexslider.js"
|
29
|
+
if copy_file(@source, @dest)
|
30
|
+
messages << copy_message
|
15
31
|
else
|
16
|
-
|
32
|
+
messages << copy_message
|
17
33
|
end
|
18
|
-
puts "Copying JS assets into your app's javascripts/store directory. The file showcase.js.erb is required by the extension and is used to activate slideshow.\n"
|
19
34
|
end
|
20
35
|
|
21
36
|
def add_stylesheets
|
22
37
|
inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_showcase\n", :before => /\*\//, :verbose => true
|
23
|
-
|
24
|
-
|
38
|
+
|
39
|
+
@source = "stylesheets/store/showcase.css.scss"
|
40
|
+
@dest = "app/assets/stylesheets/store/showcase.css.scss"
|
41
|
+
if copy_file(@source, @dest)
|
42
|
+
messages << self.copy_message
|
25
43
|
else
|
26
|
-
|
44
|
+
messages << self.copy_message
|
27
45
|
end
|
28
|
-
|
29
|
-
|
46
|
+
|
47
|
+
@source = "vendor/stylesheets/jquery.flexslider.css"
|
48
|
+
@dest = "vendor/assets/stylesheets/store/jquery.flexslider.css"
|
49
|
+
if copy_file(@source, @dest)
|
50
|
+
messages << copy_message
|
30
51
|
else
|
31
|
-
|
52
|
+
messages << copy_message
|
32
53
|
end
|
33
54
|
puts "showcase.css styles are required by the extension and can be changed in anyway to fit your own _showcase.html.erb\n"
|
34
55
|
end
|
35
|
-
|
36
56
|
|
37
|
-
|
38
57
|
def add_partials
|
39
|
-
puts %q{This partial is the template structure for displaying the slideshow.}
|
40
|
-
|
41
|
-
|
58
|
+
puts %q{This partial is the template structure for displaying the slideshow and also includes the settings for the JavaScript plugin.}
|
59
|
+
|
60
|
+
@source = "partials/_showcase.html.erb"
|
61
|
+
@dest = "app/views/spree/slides/_showcase.html.erb"
|
62
|
+
if copy_file(@source, @dest)
|
63
|
+
messages << copy_message
|
42
64
|
else
|
43
|
-
|
65
|
+
messages << copy_message
|
44
66
|
end
|
45
67
|
end
|
46
68
|
|
@@ -56,8 +78,11 @@ module SpreeShowcase
|
|
56
78
|
puts 'Skiping rake db:migrate, don\'t forget to run it!'
|
57
79
|
end
|
58
80
|
end
|
59
|
-
|
81
|
+
|
60
82
|
def complete
|
83
|
+
puts "\n-------- Files copied --------\n"
|
84
|
+
puts messages.join("\n")
|
85
|
+
puts "\n---------------------------------\n"
|
61
86
|
puts "\nEverything is done! To summarize, _showcase.html.erb => HTML template, showcase.css.scss & showcase.js.erb => assets. Edit these 3 files to fit run the slideshow."
|
62
87
|
puts "\nPlease run rake assets:clean (IMPORTANT) to clear any precompiled assets from fresh install of Spree."
|
63
88
|
end
|
Binary file
|
data/spree_showcase.gemspec
CHANGED
@@ -2,21 +2,21 @@
|
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.platform = Gem::Platform::RUBY
|
4
4
|
s.name = 'spree_showcase'
|
5
|
-
s.version = '0.
|
5
|
+
s.version = '0.6.0'
|
6
6
|
s.summary = 'A Simple Spree Slider'
|
7
7
|
s.description = 'A simple slider accommodator, using Flexslider as default'
|
8
8
|
s.required_ruby_version = '>= 1.8.7'
|
9
9
|
|
10
10
|
s.author = 'Damon Aw'
|
11
11
|
s.email = 'daemonsy@gmail.com'
|
12
|
-
s.homepage = 'http://theidealweb.com'
|
12
|
+
s.homepage = 'http://damon.theidealweb.com'
|
13
13
|
|
14
14
|
s.files = `git ls-files`.split("\n")
|
15
15
|
# s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
16
|
s.require_path = 'lib'
|
17
17
|
s.requirements << 'none'
|
18
18
|
|
19
|
-
s.add_dependency 'spree_core', '
|
19
|
+
s.add_dependency 'spree_core', '>= 1.3.0'
|
20
20
|
|
21
21
|
s.add_development_dependency 'capybara', '1.0.1'
|
22
22
|
s.add_development_dependency 'factory_girl', '~> 2.6.4'
|
@@ -0,0 +1,903 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery FlexSlider v2.1
|
3
|
+
* http://www.woothemes.com/flexslider/
|
4
|
+
*
|
5
|
+
* Copyright 2012 WooThemes
|
6
|
+
* Free to use under the GPLv2 license.
|
7
|
+
* http://www.gnu.org/licenses/gpl-2.0.html
|
8
|
+
*
|
9
|
+
* Contributing author: Tyler Smith (@mbmufffin)
|
10
|
+
*/
|
11
|
+
|
12
|
+
;(function ($) {
|
13
|
+
|
14
|
+
//FlexSlider: Object Instance
|
15
|
+
$.flexslider = function(el, options) {
|
16
|
+
var slider = $(el),
|
17
|
+
vars = $.extend({}, $.flexslider.defaults, options),
|
18
|
+
namespace = vars.namespace,
|
19
|
+
touch = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch,
|
20
|
+
eventType = (touch) ? "touchend" : "click",
|
21
|
+
vertical = vars.direction === "vertical",
|
22
|
+
reverse = vars.reverse,
|
23
|
+
carousel = (vars.itemWidth > 0),
|
24
|
+
fade = vars.animation === "fade",
|
25
|
+
asNav = vars.asNavFor !== "",
|
26
|
+
methods = {};
|
27
|
+
|
28
|
+
// Store a reference to the slider object
|
29
|
+
$.data(el, "flexslider", slider);
|
30
|
+
|
31
|
+
// Privat slider methods
|
32
|
+
methods = {
|
33
|
+
init: function() {
|
34
|
+
slider.animating = false;
|
35
|
+
slider.currentSlide = vars.startAt;
|
36
|
+
slider.animatingTo = slider.currentSlide;
|
37
|
+
slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
|
38
|
+
slider.containerSelector = vars.selector.substr(0,vars.selector.search(' '));
|
39
|
+
slider.slides = $(vars.selector, slider);
|
40
|
+
slider.container = $(slider.containerSelector, slider);
|
41
|
+
slider.count = slider.slides.length;
|
42
|
+
// SYNC:
|
43
|
+
slider.syncExists = $(vars.sync).length > 0;
|
44
|
+
// SLIDE:
|
45
|
+
if (vars.animation === "slide") vars.animation = "swing";
|
46
|
+
slider.prop = (vertical) ? "top" : "marginLeft";
|
47
|
+
slider.args = {};
|
48
|
+
// SLIDESHOW:
|
49
|
+
slider.manualPause = false;
|
50
|
+
// TOUCH/USECSS:
|
51
|
+
slider.transitions = !vars.video && !fade && vars.useCSS && (function() {
|
52
|
+
var obj = document.createElement('div'),
|
53
|
+
props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
|
54
|
+
for (var i in props) {
|
55
|
+
if ( obj.style[ props[i] ] !== undefined ) {
|
56
|
+
slider.pfx = props[i].replace('Perspective','').toLowerCase();
|
57
|
+
slider.prop = "-" + slider.pfx + "-transform";
|
58
|
+
return true;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
return false;
|
62
|
+
}());
|
63
|
+
// CONTROLSCONTAINER:
|
64
|
+
if (vars.controlsContainer !== "") slider.controlsContainer = $(vars.controlsContainer).length > 0 && $(vars.controlsContainer);
|
65
|
+
// MANUAL:
|
66
|
+
if (vars.manualControls !== "") slider.manualControls = $(vars.manualControls).length > 0 && $(vars.manualControls);
|
67
|
+
|
68
|
+
// RANDOMIZE:
|
69
|
+
if (vars.randomize) {
|
70
|
+
slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
|
71
|
+
slider.container.empty().append(slider.slides);
|
72
|
+
}
|
73
|
+
|
74
|
+
slider.doMath();
|
75
|
+
|
76
|
+
// ASNAV:
|
77
|
+
if (asNav) methods.asNav.setup();
|
78
|
+
|
79
|
+
// INIT
|
80
|
+
slider.setup("init");
|
81
|
+
|
82
|
+
// CONTROLNAV:
|
83
|
+
if (vars.controlNav) methods.controlNav.setup();
|
84
|
+
|
85
|
+
// DIRECTIONNAV:
|
86
|
+
if (vars.directionNav) methods.directionNav.setup();
|
87
|
+
|
88
|
+
// KEYBOARD:
|
89
|
+
if (vars.keyboard && ($(slider.containerSelector).length === 1 || vars.multipleKeyboard)) {
|
90
|
+
$(document).bind('keyup', function(event) {
|
91
|
+
var keycode = event.keyCode;
|
92
|
+
if (!slider.animating && (keycode === 39 || keycode === 37)) {
|
93
|
+
var target = (keycode === 39) ? slider.getTarget('next') :
|
94
|
+
(keycode === 37) ? slider.getTarget('prev') : false;
|
95
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
96
|
+
}
|
97
|
+
});
|
98
|
+
}
|
99
|
+
// MOUSEWHEEL:
|
100
|
+
if (vars.mousewheel) {
|
101
|
+
slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
|
102
|
+
event.preventDefault();
|
103
|
+
var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
|
104
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
105
|
+
});
|
106
|
+
}
|
107
|
+
|
108
|
+
// PAUSEPLAY
|
109
|
+
if (vars.pausePlay) methods.pausePlay.setup();
|
110
|
+
|
111
|
+
// SLIDSESHOW
|
112
|
+
if (vars.slideshow) {
|
113
|
+
if (vars.pauseOnHover) {
|
114
|
+
slider.hover(function() {
|
115
|
+
if (!slider.manualPlay && !slider.manualPause) slider.pause();
|
116
|
+
}, function() {
|
117
|
+
if (!slider.manualPause && !slider.manualPlay) slider.play();
|
118
|
+
});
|
119
|
+
}
|
120
|
+
// initialize animation
|
121
|
+
(vars.initDelay > 0) ? setTimeout(slider.play, vars.initDelay) : slider.play();
|
122
|
+
}
|
123
|
+
|
124
|
+
// TOUCH
|
125
|
+
if (touch && vars.touch) methods.touch();
|
126
|
+
|
127
|
+
// FADE&&SMOOTHHEIGHT || SLIDE:
|
128
|
+
if (!fade || (fade && vars.smoothHeight)) $(window).bind("resize focus", methods.resize);
|
129
|
+
|
130
|
+
|
131
|
+
// API: start() Callback
|
132
|
+
setTimeout(function(){
|
133
|
+
vars.start(slider);
|
134
|
+
}, 200);
|
135
|
+
},
|
136
|
+
asNav: {
|
137
|
+
setup: function() {
|
138
|
+
slider.asNav = true;
|
139
|
+
slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
|
140
|
+
slider.currentItem = slider.currentSlide;
|
141
|
+
slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
|
142
|
+
slider.slides.click(function(e){
|
143
|
+
e.preventDefault();
|
144
|
+
var $slide = $(this),
|
145
|
+
target = $slide.index();
|
146
|
+
if (!$(vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
|
147
|
+
slider.direction = (slider.currentItem < target) ? "next" : "prev";
|
148
|
+
slider.flexAnimate(target, vars.pauseOnAction, false, true, true);
|
149
|
+
}
|
150
|
+
});
|
151
|
+
}
|
152
|
+
},
|
153
|
+
controlNav: {
|
154
|
+
setup: function() {
|
155
|
+
if (!slider.manualControls) {
|
156
|
+
methods.controlNav.setupPaging();
|
157
|
+
} else { // MANUALCONTROLS:
|
158
|
+
methods.controlNav.setupManual();
|
159
|
+
}
|
160
|
+
},
|
161
|
+
setupPaging: function() {
|
162
|
+
var type = (vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
|
163
|
+
j = 1,
|
164
|
+
item;
|
165
|
+
|
166
|
+
slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
|
167
|
+
|
168
|
+
if (slider.pagingCount > 1) {
|
169
|
+
for (var i = 0; i < slider.pagingCount; i++) {
|
170
|
+
item = (vars.controlNav === "thumbnails") ? '<img src="' + slider.slides.eq(i).attr("data-thumb") + '"/>' : '<a>' + j + '</a>';
|
171
|
+
slider.controlNavScaffold.append('<li>' + item + '</li>');
|
172
|
+
j++;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
// CONTROLSCONTAINER:
|
177
|
+
(slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
|
178
|
+
methods.controlNav.set();
|
179
|
+
|
180
|
+
methods.controlNav.active();
|
181
|
+
|
182
|
+
slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
|
183
|
+
event.preventDefault();
|
184
|
+
var $this = $(this),
|
185
|
+
target = slider.controlNav.index($this);
|
186
|
+
|
187
|
+
if (!$this.hasClass(namespace + 'active')) {
|
188
|
+
slider.direction = (target > slider.currentSlide) ? "next" : "prev";
|
189
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
190
|
+
}
|
191
|
+
});
|
192
|
+
// Prevent iOS click event bug
|
193
|
+
if (touch) {
|
194
|
+
slider.controlNavScaffold.delegate('a', "click touchstart", function(event) {
|
195
|
+
event.preventDefault();
|
196
|
+
});
|
197
|
+
}
|
198
|
+
},
|
199
|
+
setupManual: function() {
|
200
|
+
slider.controlNav = slider.manualControls;
|
201
|
+
methods.controlNav.active();
|
202
|
+
|
203
|
+
slider.controlNav.live(eventType, function(event) {
|
204
|
+
event.preventDefault();
|
205
|
+
var $this = $(this),
|
206
|
+
target = slider.controlNav.index($this);
|
207
|
+
|
208
|
+
if (!$this.hasClass(namespace + 'active')) {
|
209
|
+
(target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
|
210
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
211
|
+
}
|
212
|
+
});
|
213
|
+
// Prevent iOS click event bug
|
214
|
+
if (touch) {
|
215
|
+
slider.controlNav.live("click touchstart", function(event) {
|
216
|
+
event.preventDefault();
|
217
|
+
});
|
218
|
+
}
|
219
|
+
},
|
220
|
+
set: function() {
|
221
|
+
var selector = (vars.controlNav === "thumbnails") ? 'img' : 'a';
|
222
|
+
slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
|
223
|
+
},
|
224
|
+
active: function() {
|
225
|
+
slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
|
226
|
+
},
|
227
|
+
update: function(action, pos) {
|
228
|
+
if (slider.pagingCount > 1 && action === "add") {
|
229
|
+
slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));
|
230
|
+
} else if (slider.pagingCount === 1) {
|
231
|
+
slider.controlNavScaffold.find('li').remove();
|
232
|
+
} else {
|
233
|
+
slider.controlNav.eq(pos).closest('li').remove();
|
234
|
+
}
|
235
|
+
methods.controlNav.set();
|
236
|
+
(slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
|
237
|
+
}
|
238
|
+
},
|
239
|
+
directionNav: {
|
240
|
+
setup: function() {
|
241
|
+
var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + vars.nextText + '</a></li></ul>');
|
242
|
+
|
243
|
+
// CONTROLSCONTAINER:
|
244
|
+
if (slider.controlsContainer) {
|
245
|
+
$(slider.controlsContainer).append(directionNavScaffold);
|
246
|
+
slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
|
247
|
+
} else {
|
248
|
+
slider.append(directionNavScaffold);
|
249
|
+
slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
|
250
|
+
}
|
251
|
+
|
252
|
+
methods.directionNav.update();
|
253
|
+
|
254
|
+
slider.directionNav.bind(eventType, function(event) {
|
255
|
+
event.preventDefault();
|
256
|
+
var target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
|
257
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
258
|
+
});
|
259
|
+
// Prevent iOS click event bug
|
260
|
+
if (touch) {
|
261
|
+
slider.directionNav.bind("click touchstart", function(event) {
|
262
|
+
event.preventDefault();
|
263
|
+
});
|
264
|
+
}
|
265
|
+
},
|
266
|
+
update: function() {
|
267
|
+
var disabledClass = namespace + 'disabled';
|
268
|
+
if (slider.pagingCount === 1) {
|
269
|
+
slider.directionNav.addClass(disabledClass);
|
270
|
+
} else if (!vars.animationLoop) {
|
271
|
+
if (slider.animatingTo === 0) {
|
272
|
+
slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass);
|
273
|
+
} else if (slider.animatingTo === slider.last) {
|
274
|
+
slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass);
|
275
|
+
} else {
|
276
|
+
slider.directionNav.removeClass(disabledClass);
|
277
|
+
}
|
278
|
+
} else {
|
279
|
+
slider.directionNav.removeClass(disabledClass);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
},
|
283
|
+
pausePlay: {
|
284
|
+
setup: function() {
|
285
|
+
var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');
|
286
|
+
|
287
|
+
// CONTROLSCONTAINER:
|
288
|
+
if (slider.controlsContainer) {
|
289
|
+
slider.controlsContainer.append(pausePlayScaffold);
|
290
|
+
slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
|
291
|
+
} else {
|
292
|
+
slider.append(pausePlayScaffold);
|
293
|
+
slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
|
294
|
+
}
|
295
|
+
|
296
|
+
methods.pausePlay.update((vars.slideshow) ? namespace + 'pause' : namespace + 'play');
|
297
|
+
|
298
|
+
slider.pausePlay.bind(eventType, function(event) {
|
299
|
+
event.preventDefault();
|
300
|
+
if ($(this).hasClass(namespace + 'pause')) {
|
301
|
+
slider.manualPause = true;
|
302
|
+
slider.manualPlay = false;
|
303
|
+
slider.pause();
|
304
|
+
} else {
|
305
|
+
slider.manualPause = false;
|
306
|
+
slider.manualPlay = true;
|
307
|
+
slider.play();
|
308
|
+
}
|
309
|
+
});
|
310
|
+
// Prevent iOS click event bug
|
311
|
+
if (touch) {
|
312
|
+
slider.pausePlay.bind("click touchstart", function(event) {
|
313
|
+
event.preventDefault();
|
314
|
+
});
|
315
|
+
}
|
316
|
+
},
|
317
|
+
update: function(state) {
|
318
|
+
(state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').text(vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').text(vars.pauseText);
|
319
|
+
}
|
320
|
+
},
|
321
|
+
touch: function() {
|
322
|
+
var startX,
|
323
|
+
startY,
|
324
|
+
offset,
|
325
|
+
cwidth,
|
326
|
+
dx,
|
327
|
+
startT,
|
328
|
+
scrolling = false;
|
329
|
+
|
330
|
+
el.addEventListener('touchstart', onTouchStart, false);
|
331
|
+
function onTouchStart(e) {
|
332
|
+
if (slider.animating) {
|
333
|
+
e.preventDefault();
|
334
|
+
} else if (e.touches.length === 1) {
|
335
|
+
slider.pause();
|
336
|
+
// CAROUSEL:
|
337
|
+
cwidth = (vertical) ? slider.h : slider. w;
|
338
|
+
startT = Number(new Date());
|
339
|
+
// CAROUSEL:
|
340
|
+
offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
|
341
|
+
(carousel && reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
|
342
|
+
(carousel && slider.currentSlide === slider.last) ? slider.limit :
|
343
|
+
(carousel) ? ((slider.itemW + vars.itemMargin) * slider.move) * slider.currentSlide :
|
344
|
+
(reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
|
345
|
+
startX = (vertical) ? e.touches[0].pageY : e.touches[0].pageX;
|
346
|
+
startY = (vertical) ? e.touches[0].pageX : e.touches[0].pageY;
|
347
|
+
|
348
|
+
el.addEventListener('touchmove', onTouchMove, false);
|
349
|
+
el.addEventListener('touchend', onTouchEnd, false);
|
350
|
+
}
|
351
|
+
}
|
352
|
+
|
353
|
+
function onTouchMove(e) {
|
354
|
+
dx = (vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX;
|
355
|
+
scrolling = (vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY));
|
356
|
+
|
357
|
+
if (!scrolling || Number(new Date()) - startT > 500) {
|
358
|
+
e.preventDefault();
|
359
|
+
if (!fade && slider.transitions) {
|
360
|
+
if (!vars.animationLoop) {
|
361
|
+
dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
|
362
|
+
}
|
363
|
+
slider.setProps(offset + dx, "setTouch");
|
364
|
+
}
|
365
|
+
}
|
366
|
+
}
|
367
|
+
|
368
|
+
function onTouchEnd(e) {
|
369
|
+
// finish the touch by undoing the touch session
|
370
|
+
el.removeEventListener('touchmove', onTouchMove, false);
|
371
|
+
|
372
|
+
if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
|
373
|
+
var updateDx = (reverse) ? -dx : dx,
|
374
|
+
target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
|
375
|
+
|
376
|
+
if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
|
377
|
+
slider.flexAnimate(target, vars.pauseOnAction);
|
378
|
+
} else {
|
379
|
+
if (!fade) slider.flexAnimate(slider.currentSlide, vars.pauseOnAction, true);
|
380
|
+
}
|
381
|
+
}
|
382
|
+
el.removeEventListener('touchend', onTouchEnd, false);
|
383
|
+
startX = null;
|
384
|
+
startY = null;
|
385
|
+
dx = null;
|
386
|
+
offset = null;
|
387
|
+
}
|
388
|
+
},
|
389
|
+
resize: function() {
|
390
|
+
if (!slider.animating && slider.is(':visible')) {
|
391
|
+
if (!carousel) slider.doMath();
|
392
|
+
|
393
|
+
if (fade) {
|
394
|
+
// SMOOTH HEIGHT:
|
395
|
+
methods.smoothHeight();
|
396
|
+
} else if (carousel) { //CAROUSEL:
|
397
|
+
slider.slides.width(slider.computedW);
|
398
|
+
slider.update(slider.pagingCount);
|
399
|
+
slider.setProps();
|
400
|
+
}
|
401
|
+
else if (vertical) { //VERTICAL:
|
402
|
+
slider.viewport.height(slider.h);
|
403
|
+
slider.setProps(slider.h, "setTotal");
|
404
|
+
} else {
|
405
|
+
// SMOOTH HEIGHT:
|
406
|
+
if (vars.smoothHeight) methods.smoothHeight();
|
407
|
+
slider.newSlides.width(slider.computedW);
|
408
|
+
slider.setProps(slider.computedW, "setTotal");
|
409
|
+
}
|
410
|
+
}
|
411
|
+
},
|
412
|
+
smoothHeight: function(dur) {
|
413
|
+
if (!vertical || fade) {
|
414
|
+
var $obj = (fade) ? slider : slider.viewport;
|
415
|
+
(dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());
|
416
|
+
}
|
417
|
+
},
|
418
|
+
sync: function(action) {
|
419
|
+
var $obj = $(vars.sync).data("flexslider"),
|
420
|
+
target = slider.animatingTo;
|
421
|
+
|
422
|
+
switch (action) {
|
423
|
+
case "animate": $obj.flexAnimate(target, vars.pauseOnAction, false, true); break;
|
424
|
+
case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
|
425
|
+
case "pause": $obj.pause(); break;
|
426
|
+
}
|
427
|
+
}
|
428
|
+
}
|
429
|
+
|
430
|
+
// public methods
|
431
|
+
slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
|
432
|
+
if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
|
433
|
+
|
434
|
+
if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
|
435
|
+
if (asNav && withSync) {
|
436
|
+
var master = $(vars.asNavFor).data('flexslider');
|
437
|
+
slider.atEnd = target === 0 || target === slider.count - 1;
|
438
|
+
master.flexAnimate(target, true, false, true, fromNav);
|
439
|
+
slider.direction = (slider.currentItem < target) ? "next" : "prev";
|
440
|
+
master.direction = slider.direction;
|
441
|
+
|
442
|
+
if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
|
443
|
+
slider.currentItem = target;
|
444
|
+
slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
|
445
|
+
target = Math.floor(target/slider.visible);
|
446
|
+
} else {
|
447
|
+
slider.currentItem = target;
|
448
|
+
slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
|
449
|
+
return false;
|
450
|
+
}
|
451
|
+
}
|
452
|
+
|
453
|
+
slider.animating = true;
|
454
|
+
slider.animatingTo = target;
|
455
|
+
// API: before() animation Callback
|
456
|
+
vars.before(slider);
|
457
|
+
|
458
|
+
// SLIDESHOW:
|
459
|
+
if (pause) slider.pause();
|
460
|
+
|
461
|
+
// SYNC:
|
462
|
+
if (slider.syncExists && !fromNav) methods.sync("animate");
|
463
|
+
|
464
|
+
// CONTROLNAV
|
465
|
+
if (vars.controlNav) methods.controlNav.active();
|
466
|
+
|
467
|
+
// !CAROUSEL:
|
468
|
+
// CANDIDATE: slide active class (for add/remove slide)
|
469
|
+
if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');
|
470
|
+
|
471
|
+
// INFINITE LOOP:
|
472
|
+
// CANDIDATE: atEnd
|
473
|
+
slider.atEnd = target === 0 || target === slider.last;
|
474
|
+
|
475
|
+
// DIRECTIONNAV:
|
476
|
+
if (vars.directionNav) methods.directionNav.update();
|
477
|
+
|
478
|
+
if (target === slider.last) {
|
479
|
+
// API: end() of cycle Callback
|
480
|
+
vars.end(slider);
|
481
|
+
// SLIDESHOW && !INFINITE LOOP:
|
482
|
+
if (!vars.animationLoop) slider.pause();
|
483
|
+
}
|
484
|
+
|
485
|
+
// SLIDE:
|
486
|
+
if (!fade) {
|
487
|
+
var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
|
488
|
+
margin, slideString, calcNext;
|
489
|
+
|
490
|
+
// INFINITE LOOP / REVERSE:
|
491
|
+
if (carousel) {
|
492
|
+
margin = (vars.itemWidth > slider.w) ? vars.itemMargin * 2 : vars.itemMargin;
|
493
|
+
calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
|
494
|
+
slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
|
495
|
+
} else if (slider.currentSlide === 0 && target === slider.count - 1 && vars.animationLoop && slider.direction !== "next") {
|
496
|
+
slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
|
497
|
+
} else if (slider.currentSlide === slider.last && target === 0 && vars.animationLoop && slider.direction !== "prev") {
|
498
|
+
slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
|
499
|
+
} else {
|
500
|
+
slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
|
501
|
+
}
|
502
|
+
slider.setProps(slideString, "", vars.animationSpeed);
|
503
|
+
if (slider.transitions) {
|
504
|
+
if (!vars.animationLoop || !slider.atEnd) {
|
505
|
+
slider.animating = false;
|
506
|
+
slider.currentSlide = slider.animatingTo;
|
507
|
+
}
|
508
|
+
slider.container.unbind("webkitTransitionEnd transitionend");
|
509
|
+
slider.container.bind("webkitTransitionEnd transitionend", function() {
|
510
|
+
slider.wrapup(dimension);
|
511
|
+
});
|
512
|
+
} else {
|
513
|
+
slider.container.animate(slider.args, vars.animationSpeed, vars.easing, function(){
|
514
|
+
slider.wrapup(dimension);
|
515
|
+
});
|
516
|
+
}
|
517
|
+
} else { // FADE:
|
518
|
+
if (!touch) {
|
519
|
+
slider.slides.eq(slider.currentSlide).fadeOut(vars.animationSpeed, vars.easing);
|
520
|
+
slider.slides.eq(target).fadeIn(vars.animationSpeed, vars.easing, slider.wrapup);
|
521
|
+
} else {
|
522
|
+
slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
|
523
|
+
slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
|
524
|
+
|
525
|
+
slider.slides.unbind("webkitTransitionEnd transitionend");
|
526
|
+
slider.slides.eq(slider.currentSlide).bind("webkitTransitionEnd transitionend", function() {
|
527
|
+
// API: after() animation Callback
|
528
|
+
vars.after(slider);
|
529
|
+
});
|
530
|
+
|
531
|
+
slider.animating = false;
|
532
|
+
slider.currentSlide = slider.animatingTo;
|
533
|
+
}
|
534
|
+
}
|
535
|
+
// SMOOTH HEIGHT:
|
536
|
+
if (vars.smoothHeight) methods.smoothHeight(vars.animationSpeed);
|
537
|
+
}
|
538
|
+
}
|
539
|
+
slider.wrapup = function(dimension) {
|
540
|
+
// SLIDE:
|
541
|
+
if (!fade && !carousel) {
|
542
|
+
if (slider.currentSlide === 0 && slider.animatingTo === slider.last && vars.animationLoop) {
|
543
|
+
slider.setProps(dimension, "jumpEnd");
|
544
|
+
} else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && vars.animationLoop) {
|
545
|
+
slider.setProps(dimension, "jumpStart");
|
546
|
+
}
|
547
|
+
}
|
548
|
+
slider.animating = false;
|
549
|
+
slider.currentSlide = slider.animatingTo;
|
550
|
+
// API: after() animation Callback
|
551
|
+
vars.after(slider);
|
552
|
+
}
|
553
|
+
|
554
|
+
// SLIDESHOW:
|
555
|
+
slider.animateSlides = function() {
|
556
|
+
if (!slider.animating) slider.flexAnimate(slider.getTarget("next"));
|
557
|
+
}
|
558
|
+
// SLIDESHOW:
|
559
|
+
slider.pause = function() {
|
560
|
+
clearInterval(slider.animatedSlides);
|
561
|
+
slider.playing = false;
|
562
|
+
// PAUSEPLAY:
|
563
|
+
if (vars.pausePlay) methods.pausePlay.update("play");
|
564
|
+
// SYNC:
|
565
|
+
if (slider.syncExists) methods.sync("pause");
|
566
|
+
}
|
567
|
+
// SLIDESHOW:
|
568
|
+
slider.play = function() {
|
569
|
+
slider.animatedSlides = setInterval(slider.animateSlides, vars.slideshowSpeed);
|
570
|
+
slider.playing = true;
|
571
|
+
// PAUSEPLAY:
|
572
|
+
if (vars.pausePlay) methods.pausePlay.update("pause");
|
573
|
+
// SYNC:
|
574
|
+
if (slider.syncExists) methods.sync("play");
|
575
|
+
}
|
576
|
+
slider.canAdvance = function(target, fromNav) {
|
577
|
+
// ASNAV:
|
578
|
+
var last = (asNav) ? slider.pagingCount - 1 : slider.last;
|
579
|
+
return (fromNav) ? true :
|
580
|
+
(asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
|
581
|
+
(asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
|
582
|
+
(target === slider.currentSlide && !asNav) ? false :
|
583
|
+
(vars.animationLoop) ? true :
|
584
|
+
(slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
|
585
|
+
(slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
|
586
|
+
true;
|
587
|
+
}
|
588
|
+
slider.getTarget = function(dir) {
|
589
|
+
slider.direction = dir;
|
590
|
+
if (dir === "next") {
|
591
|
+
return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
|
592
|
+
} else {
|
593
|
+
return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
|
594
|
+
}
|
595
|
+
}
|
596
|
+
|
597
|
+
// SLIDE:
|
598
|
+
slider.setProps = function(pos, special, dur) {
|
599
|
+
var target = (function() {
|
600
|
+
var posCheck = (pos) ? pos : ((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo,
|
601
|
+
posCalc = (function() {
|
602
|
+
if (carousel) {
|
603
|
+
return (special === "setTouch") ? pos :
|
604
|
+
(reverse && slider.animatingTo === slider.last) ? 0 :
|
605
|
+
(reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
|
606
|
+
(slider.animatingTo === slider.last) ? slider.limit : posCheck;
|
607
|
+
} else {
|
608
|
+
switch (special) {
|
609
|
+
case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
|
610
|
+
case "setTouch": return (reverse) ? pos : pos;
|
611
|
+
case "jumpEnd": return (reverse) ? pos : slider.count * pos;
|
612
|
+
case "jumpStart": return (reverse) ? slider.count * pos : pos;
|
613
|
+
default: return pos;
|
614
|
+
}
|
615
|
+
}
|
616
|
+
}());
|
617
|
+
return (posCalc * -1) + "px";
|
618
|
+
}());
|
619
|
+
|
620
|
+
if (slider.transitions) {
|
621
|
+
target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
|
622
|
+
dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
|
623
|
+
slider.container.css("-" + slider.pfx + "-transition-duration", dur);
|
624
|
+
}
|
625
|
+
|
626
|
+
slider.args[slider.prop] = target;
|
627
|
+
if (slider.transitions || dur === undefined) slider.container.css(slider.args);
|
628
|
+
}
|
629
|
+
|
630
|
+
slider.setup = function(type) {
|
631
|
+
// SLIDE:
|
632
|
+
if (!fade) {
|
633
|
+
var sliderOffset, arr;
|
634
|
+
|
635
|
+
if (type === "init") {
|
636
|
+
slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
|
637
|
+
// INFINITE LOOP:
|
638
|
+
slider.cloneCount = 0;
|
639
|
+
slider.cloneOffset = 0;
|
640
|
+
// REVERSE:
|
641
|
+
if (reverse) {
|
642
|
+
arr = $.makeArray(slider.slides).reverse();
|
643
|
+
slider.slides = $(arr);
|
644
|
+
slider.container.empty().append(slider.slides);
|
645
|
+
}
|
646
|
+
}
|
647
|
+
// INFINITE LOOP && !CAROUSEL:
|
648
|
+
if (vars.animationLoop && !carousel) {
|
649
|
+
slider.cloneCount = 2;
|
650
|
+
slider.cloneOffset = 1;
|
651
|
+
// clear out old clones
|
652
|
+
if (type !== "init") slider.container.find('.clone').remove();
|
653
|
+
slider.container.append(slider.slides.first().clone().addClass('clone')).prepend(slider.slides.last().clone().addClass('clone'));
|
654
|
+
}
|
655
|
+
slider.newSlides = $(vars.selector, slider);
|
656
|
+
|
657
|
+
sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
|
658
|
+
// VERTICAL:
|
659
|
+
if (vertical && !carousel) {
|
660
|
+
slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
|
661
|
+
setTimeout(function(){
|
662
|
+
slider.newSlides.css({"display": "block"});
|
663
|
+
slider.doMath();
|
664
|
+
slider.viewport.height(slider.h);
|
665
|
+
slider.setProps(sliderOffset * slider.h, "init");
|
666
|
+
}, (type === "init") ? 100 : 0);
|
667
|
+
} else {
|
668
|
+
slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
|
669
|
+
slider.setProps(sliderOffset * slider.computedW, "init");
|
670
|
+
setTimeout(function(){
|
671
|
+
slider.doMath();
|
672
|
+
slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
|
673
|
+
// SMOOTH HEIGHT:
|
674
|
+
if (vars.smoothHeight) methods.smoothHeight();
|
675
|
+
}, (type === "init") ? 100 : 0);
|
676
|
+
}
|
677
|
+
} else { // FADE:
|
678
|
+
slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
|
679
|
+
if (type === "init") {
|
680
|
+
if (!touch) {
|
681
|
+
slider.slides.eq(slider.currentSlide).fadeIn(vars.animationSpeed, vars.easing);
|
682
|
+
} else {
|
683
|
+
slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
|
684
|
+
}
|
685
|
+
}
|
686
|
+
// SMOOTH HEIGHT:
|
687
|
+
if (vars.smoothHeight) methods.smoothHeight();
|
688
|
+
}
|
689
|
+
// !CAROUSEL:
|
690
|
+
// CANDIDATE: active slide
|
691
|
+
if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");
|
692
|
+
}
|
693
|
+
|
694
|
+
slider.doMath = function() {
|
695
|
+
var slide = slider.slides.first(),
|
696
|
+
slideMargin = vars.itemMargin,
|
697
|
+
minItems = vars.minItems,
|
698
|
+
maxItems = vars.maxItems;
|
699
|
+
|
700
|
+
slider.w = slider.width();
|
701
|
+
slider.h = slide.height();
|
702
|
+
slider.boxPadding = slide.outerWidth() - slide.width();
|
703
|
+
|
704
|
+
// CAROUSEL:
|
705
|
+
if (carousel) {
|
706
|
+
slider.itemT = vars.itemWidth + slideMargin;
|
707
|
+
slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
|
708
|
+
slider.maxW = (maxItems) ? maxItems * slider.itemT : slider.w;
|
709
|
+
slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * minItems))/minItems :
|
710
|
+
(slider.maxW < slider.w) ? (slider.w - (slideMargin * maxItems))/maxItems :
|
711
|
+
(vars.itemWidth > slider.w) ? slider.w : vars.itemWidth;
|
712
|
+
slider.visible = Math.floor(slider.w/(slider.itemW + slideMargin));
|
713
|
+
slider.move = (vars.move > 0 && vars.move < slider.visible ) ? vars.move : slider.visible;
|
714
|
+
slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
|
715
|
+
slider.last = slider.pagingCount - 1;
|
716
|
+
slider.limit = (slider.pagingCount === 1) ? 0 :
|
717
|
+
(vars.itemWidth > slider.w) ? ((slider.itemW + (slideMargin * 2)) * slider.count) - slider.w - slideMargin : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
|
718
|
+
} else {
|
719
|
+
slider.itemW = slider.w;
|
720
|
+
slider.pagingCount = slider.count;
|
721
|
+
slider.last = slider.count - 1;
|
722
|
+
}
|
723
|
+
slider.computedW = slider.itemW - slider.boxPadding;
|
724
|
+
}
|
725
|
+
|
726
|
+
slider.update = function(pos, action) {
|
727
|
+
slider.doMath();
|
728
|
+
|
729
|
+
// update currentSlide and slider.animatingTo if necessary
|
730
|
+
if (!carousel) {
|
731
|
+
if (pos < slider.currentSlide) {
|
732
|
+
slider.currentSlide += 1;
|
733
|
+
} else if (pos <= slider.currentSlide && pos !== 0) {
|
734
|
+
slider.currentSlide -= 1;
|
735
|
+
}
|
736
|
+
slider.animatingTo = slider.currentSlide;
|
737
|
+
}
|
738
|
+
|
739
|
+
// update controlNav
|
740
|
+
if (vars.controlNav && !slider.manualControls) {
|
741
|
+
if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
|
742
|
+
methods.controlNav.update("add");
|
743
|
+
} else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
|
744
|
+
if (carousel && slider.currentSlide > slider.last) {
|
745
|
+
slider.currentSlide -= 1;
|
746
|
+
slider.animatingTo -= 1;
|
747
|
+
}
|
748
|
+
methods.controlNav.update("remove", slider.last);
|
749
|
+
}
|
750
|
+
}
|
751
|
+
// update directionNav
|
752
|
+
if (vars.directionNav) methods.directionNav.update();
|
753
|
+
|
754
|
+
}
|
755
|
+
|
756
|
+
slider.addSlide = function(obj, pos) {
|
757
|
+
var $obj = $(obj);
|
758
|
+
|
759
|
+
slider.count += 1;
|
760
|
+
slider.last = slider.count - 1;
|
761
|
+
|
762
|
+
// append new slide
|
763
|
+
if (vertical && reverse) {
|
764
|
+
(pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
|
765
|
+
} else {
|
766
|
+
(pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
|
767
|
+
}
|
768
|
+
|
769
|
+
// update currentSlide, animatingTo, controlNav, and directionNav
|
770
|
+
slider.update(pos, "add");
|
771
|
+
|
772
|
+
// update slider.slides
|
773
|
+
slider.slides = $(vars.selector + ':not(.clone)', slider);
|
774
|
+
// re-setup the slider to accomdate new slide
|
775
|
+
slider.setup();
|
776
|
+
|
777
|
+
//FlexSlider: added() Callback
|
778
|
+
vars.added(slider);
|
779
|
+
}
|
780
|
+
slider.removeSlide = function(obj) {
|
781
|
+
var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
|
782
|
+
|
783
|
+
// update count
|
784
|
+
slider.count -= 1;
|
785
|
+
slider.last = slider.count - 1;
|
786
|
+
|
787
|
+
// remove slide
|
788
|
+
if (isNaN(obj)) {
|
789
|
+
$(obj, slider.slides).remove();
|
790
|
+
} else {
|
791
|
+
(vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
|
792
|
+
}
|
793
|
+
|
794
|
+
// update currentSlide, animatingTo, controlNav, and directionNav
|
795
|
+
slider.doMath();
|
796
|
+
slider.update(pos, "remove");
|
797
|
+
|
798
|
+
// update slider.slides
|
799
|
+
slider.slides = $(vars.selector + ':not(.clone)', slider);
|
800
|
+
// re-setup the slider to accomdate new slide
|
801
|
+
slider.setup();
|
802
|
+
|
803
|
+
// FlexSlider: removed() Callback
|
804
|
+
vars.removed(slider);
|
805
|
+
}
|
806
|
+
|
807
|
+
//FlexSlider: Initialize
|
808
|
+
methods.init();
|
809
|
+
}
|
810
|
+
|
811
|
+
//FlexSlider: Default Settings
|
812
|
+
$.flexslider.defaults = {
|
813
|
+
namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
|
814
|
+
selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
|
815
|
+
animation: "fade", //String: Select your animation type, "fade" or "slide"
|
816
|
+
easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
|
817
|
+
direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
|
818
|
+
reverse: false, //{NEW} Boolean: Reverse the animation direction
|
819
|
+
animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
|
820
|
+
smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
|
821
|
+
startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
|
822
|
+
slideshow: true, //Boolean: Animate slider automatically
|
823
|
+
slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
|
824
|
+
animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
|
825
|
+
initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
|
826
|
+
randomize: false, //Boolean: Randomize slide order
|
827
|
+
|
828
|
+
// Usability features
|
829
|
+
pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
|
830
|
+
pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
|
831
|
+
useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available
|
832
|
+
touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
|
833
|
+
video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
|
834
|
+
|
835
|
+
// Primary Controls
|
836
|
+
controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
|
837
|
+
directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
|
838
|
+
prevText: "Previous", //String: Set the text for the "previous" directionNav item
|
839
|
+
nextText: "Next", //String: Set the text for the "next" directionNav item
|
840
|
+
|
841
|
+
// Secondary Navigation
|
842
|
+
keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
|
843
|
+
multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
|
844
|
+
mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
|
845
|
+
pausePlay: false, //Boolean: Create pause/play dynamic element
|
846
|
+
pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
|
847
|
+
playText: "Play", //String: Set the text for the "play" pausePlay item
|
848
|
+
|
849
|
+
// Special properties
|
850
|
+
controlsContainer: "", //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found.
|
851
|
+
manualControls: "", //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
|
852
|
+
sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
|
853
|
+
asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
|
854
|
+
|
855
|
+
// Carousel Options
|
856
|
+
itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
|
857
|
+
itemMargin: 0, //{NEW} Integer: Margin between carousel items.
|
858
|
+
minItems: 0, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
|
859
|
+
maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
|
860
|
+
move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
|
861
|
+
|
862
|
+
// Callback API
|
863
|
+
start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
|
864
|
+
before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
|
865
|
+
after: function(){}, //Callback: function(slider) - Fires after each slider animation completes
|
866
|
+
end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
|
867
|
+
added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added
|
868
|
+
removed: function(){} //{NEW} Callback: function(slider) - Fires after a slide is removed
|
869
|
+
}
|
870
|
+
|
871
|
+
|
872
|
+
//FlexSlider: Plugin Function
|
873
|
+
$.fn.flexslider = function(options) {
|
874
|
+
if (options === undefined) options = {};
|
875
|
+
|
876
|
+
if (typeof options === "object") {
|
877
|
+
return this.each(function() {
|
878
|
+
var $this = $(this),
|
879
|
+
selector = (options.selector) ? options.selector : ".slides > li",
|
880
|
+
$slides = $this.find(selector);
|
881
|
+
|
882
|
+
if ($slides.length === 1) {
|
883
|
+
$slides.fadeIn(400);
|
884
|
+
if (options.start) options.start($this);
|
885
|
+
} else if ($this.data('flexslider') == undefined) {
|
886
|
+
new $.flexslider(this, options);
|
887
|
+
}
|
888
|
+
});
|
889
|
+
} else {
|
890
|
+
// Helper strings to quickly perform functions on the slider
|
891
|
+
var $slider = $(this).data('flexslider');
|
892
|
+
switch (options) {
|
893
|
+
case "play": $slider.play(); break;
|
894
|
+
case "pause": $slider.pause(); break;
|
895
|
+
case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
|
896
|
+
case "prev":
|
897
|
+
case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
|
898
|
+
default: if (typeof options === "number") $slider.flexAnimate(options, true);
|
899
|
+
}
|
900
|
+
}
|
901
|
+
}
|
902
|
+
|
903
|
+
})(jQuery);
|