anything_slider-rails 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/anything_slider.gemspec +22 -0
- data/lib/anything_slider-rails.rb +7 -0
- data/lib/anything_slider/rails/engine.rb +6 -0
- data/lib/anything_slider/rails/version.rb +5 -0
- data/readme.markdown +57 -0
- data/vendor/assets/images/anythingslider/arrows-metallic.png +0 -0
- data/vendor/assets/images/anythingslider/arrows-minimalist.png +0 -0
- data/vendor/assets/images/anythingslider/construction.gif +0 -0
- data/vendor/assets/images/anythingslider/cs-portfolio.png +0 -0
- data/vendor/assets/images/anythingslider/default.png +0 -0
- data/vendor/assets/javascripts/anythingslider/jquery.anythingslider.fx.js +188 -0
- data/vendor/assets/javascripts/anythingslider/jquery.anythingslider.js +831 -0
- data/vendor/assets/javascripts/anythingslider/jquery.anythingslider.video.js +379 -0
- data/vendor/assets/javascripts/anythingslider/jquery.easing.1.3.js +205 -0
- data/vendor/assets/javascripts/anythingslider/swfobject.js +4 -0
- data/vendor/assets/stylesheets/anythingslider/animate.css +3813 -0
- data/vendor/assets/stylesheets/anythingslider/anythingslider-ie.css +65 -0
- data/vendor/assets/stylesheets/anythingslider/anythingslider.css.erb +202 -0
- data/vendor/assets/stylesheets/anythingslider/theme-construction.css.erb +142 -0
- data/vendor/assets/stylesheets/anythingslider/theme-cs-portfolio.css.erb +149 -0
- data/vendor/assets/stylesheets/anythingslider/theme-metallic.css.erb +146 -0
- data/vendor/assets/stylesheets/anythingslider/theme-minimalist-round.css.erb +144 -0
- data/vendor/assets/stylesheets/anythingslider/theme-minimalist-square.css.erb +144 -0
- metadata +107 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "anything_slider/rails/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "anything_slider-rails"
|
7
|
+
s.version = AnythingSlider::Rails::VERSION
|
8
|
+
s.authors = ["Leif", "Han"]
|
9
|
+
s.email = ["leifcr@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{AnythingSlider automated install for Rails 3.1+}
|
12
|
+
s.description = %q{Gem installation of jquery plugin, AnythingSlider}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib", "vendor"]
|
18
|
+
|
19
|
+
s.add_dependency "railties", ">= 3.1.0"
|
20
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
21
|
+
s.add_development_dependency "rails", "~> 3.1"
|
22
|
+
end
|
data/readme.markdown
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# AnythingSlider for Rails
|
2
|
+
|
3
|
+
Current AnythingSlider version: v1.7.26
|
4
|
+
|
5
|
+
**AnythingSliderRails** packages the anything slider jquery plugin and stylesheets and allows you to merely include the required scripts in your manifest in order to start using the plugin.
|
6
|
+
|
7
|
+
# Included Javascripts
|
8
|
+
**minified js files are not included, since the rails asset pipeline sorta necessitates the compiling (and likely minifying) your js files for production**
|
9
|
+
|
10
|
+
anythingslider/jquery.anythingslider.fx.js
|
11
|
+
anythingslider/jquery.anythingslider.js
|
12
|
+
anythingslider/jquery.anythingslider.video.js
|
13
|
+
anythingslider/jquery.easing.1.3.js
|
14
|
+
anythingslider/swfobject.js
|
15
|
+
|
16
|
+
# Included Stylesheets
|
17
|
+
|
18
|
+
anythingslider/animate.css
|
19
|
+
anythingslider/anythingslider-ie.css
|
20
|
+
anythingslider/anythingslider.css
|
21
|
+
anythingslider/theme-construction.css
|
22
|
+
anythingslider/theme-cs-portfolio.css
|
23
|
+
anythingslider/theme-metallic.css
|
24
|
+
anythingslider/theme-minimalist-round.css
|
25
|
+
anythingslider/theme-minimalist-square.css
|
26
|
+
|
27
|
+
### Installation
|
28
|
+
|
29
|
+
This gem should work out of the box. All you have to do is add the gem to your Gemfile:
|
30
|
+
|
31
|
+
gem 'anything_slider_rails', :git => 'http://github.com/leifcr/AnythingSliderRails.git'
|
32
|
+
|
33
|
+
Then bundle install or update (depending on if you want to upgrade an older version of this gem).
|
34
|
+
|
35
|
+
bundle install
|
36
|
+
bundle update
|
37
|
+
|
38
|
+
In your assets/javascripts/application.js, you will need to add jquery.anythingslider to your manifest:
|
39
|
+
|
40
|
+
//= require jquery
|
41
|
+
.
|
42
|
+
.
|
43
|
+
//= require anythingslider/jquery.anythingslider
|
44
|
+
|
45
|
+
|
46
|
+
You might want to add the stylesheets to your assets/stylesheets/application.css
|
47
|
+
.
|
48
|
+
.
|
49
|
+
//= require anythingslider/anythingslider
|
50
|
+
// And perhaps a theme
|
51
|
+
//= require anythingslider/theme-ninimalist-round
|
52
|
+
// Animate.css if needed
|
53
|
+
//= require anythingslider/animate
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,188 @@
|
|
1
|
+
/*
|
2
|
+
* AnythingSlider Slide FX 1.6 for AnythingSlider v1.7.11+
|
3
|
+
* By Rob Garrison (aka Mottie & Fudgey)
|
4
|
+
* Dual licensed under the MIT and GPL licenses.
|
5
|
+
*/
|
6
|
+
(function($) {
|
7
|
+
$.fn.anythingSliderFx = function(effects, options){
|
8
|
+
|
9
|
+
// variable sizes shouldn't matter - it's just to get an idea to get the elements out of view
|
10
|
+
var wrap = $(this).closest('.anythingSlider'),
|
11
|
+
sliderWidth = wrap.width(),
|
12
|
+
sliderHeight = wrap.height(),
|
13
|
+
getBaseFx = function(s){
|
14
|
+
var size = s, size2;
|
15
|
+
// allow for start and end sizes/dimensions
|
16
|
+
if (s && typeof s === 'string' && s.indexOf(',') > 0) {
|
17
|
+
s = s.split(',');
|
18
|
+
size = $.trim(s[0]); size2 = $.trim(s[1]);
|
19
|
+
}
|
20
|
+
return {
|
21
|
+
// 'name' : [{ inFx: {effects}, { outFx: {effects} }, selector: []]
|
22
|
+
'top' : [{ inFx: { top: 0 }, outFx: { top: '-' + (size || sliderHeight) } }],
|
23
|
+
'bottom' : [{ inFx: { top: 0 }, outFx: { top: (size || sliderHeight) } }],
|
24
|
+
'left' : [{ inFx: { left: 0 }, outFx: { left: '-' + (size || sliderWidth) } }],
|
25
|
+
'right' : [{ inFx: { left: 0 }, outFx: { left: (size || sliderWidth) } }],
|
26
|
+
'fade' : [{ inFx: { opacity: size || 1 }, outFx: { opacity: 0 } }],
|
27
|
+
'expand' : [{ inFx: { width: size2 || '100%', height: size2 || '100%', top: '0%', left: '0%' } , outFx: { width: (size || '10%'), height: (size || '10%'), top: '50%', left: '50%' } }],
|
28
|
+
'grow' : [{ inFx: { top: 0, fontSize: size || '16px', opacity : 1 }, outFx: { top: '-200px', fontSize: size2 || '80px', opacity: 0 } }],
|
29
|
+
'listLR' : [{ inFx: { left: 0, opacity: 1 }, outFx: [{ left: (size || sliderWidth), opacity: 0 }, { left: '-' + (size || sliderWidth), opacity: 0 }], selector: [':odd', ':even'] }],
|
30
|
+
'listRL' : [{ inFx: { left: 0, opacity: 1 }, outFx: [{ left: (size || sliderWidth), opacity: 0 }, { left: '-' + (size || sliderWidth), opacity: 0 }], selector: [':even', ':odd'] }],
|
31
|
+
|
32
|
+
'caption-Top' : [{ inFx: { top: 0, opacity: 0.8 }, outFx: { top: ( '-' + size || -50 ), opacity: 0 } }],
|
33
|
+
'caption-Right' : [{ inFx: { right: 0, opacity: 0.8 }, outFx: { right: ( '-' + size || -150 ), opacity: 0 } }],
|
34
|
+
'caption-Bottom' : [{ inFx: { bottom: 0, opacity: 0.8 }, outFx: { bottom: ( '-' + size || -50 ), opacity: 0 } }],
|
35
|
+
'caption-Left' : [{ inFx: { left: 0, opacity: 0.8 }, outFx: { left: ( '-' + size || -150 ), opacity: 0 } }]
|
36
|
+
};
|
37
|
+
};
|
38
|
+
|
39
|
+
return this.each(function(){
|
40
|
+
|
41
|
+
$(this).data('AnythingSlider').fx = effects; // store fx list to allow dynamic modification
|
42
|
+
|
43
|
+
var defaults = $.extend({
|
44
|
+
easing : 'swing', // Default FX easing
|
45
|
+
timeIn : 400, // Default time for in FX animation
|
46
|
+
timeOut : 350, // Default time for out FX animation - when using predefined FX, this number gets divided by 2
|
47
|
+
stopRepeat : false, // stops repeating FX animation when clicking on the same navigation tab
|
48
|
+
outFxBind : 'slide_init', // When outFx animations are called
|
49
|
+
inFxBind : 'slide_complete', // When inFx animations are called
|
50
|
+
dataAnimate: 'data-animate' // data attribute containing the animate.css class names to add for in and out fx
|
51
|
+
}, options),
|
52
|
+
|
53
|
+
baseFx = getBaseFx(), // get base FX with standard sizes
|
54
|
+
|
55
|
+
// Animate FX
|
56
|
+
animateFx = function(el, opt, isOut, time){
|
57
|
+
if (el.length === 0 || typeof opt === 'undefined') { return; } // no fx
|
58
|
+
var o = opt[0] || opt,
|
59
|
+
s = o[1] || '',
|
60
|
+
// time needs to be a number, not a string
|
61
|
+
t = time || parseInt( ((s === '') ? o.duration : o[0].duration), 10);
|
62
|
+
if (isOut) {
|
63
|
+
// don't change caption position from absolute
|
64
|
+
if (el.css('position') !== 'absolute') { el.css({ position : 'relative' }); }
|
65
|
+
el.stop();
|
66
|
+
// multiple selectors for out animation
|
67
|
+
if (s !== ''){
|
68
|
+
el.filter(opt[1][0]).animate(o[0], { queue : false, duration : t, easing : o[0].easing });
|
69
|
+
el.filter(opt[1][1]).animate(s, { queue : true, duration : t, easing : o[0].easing });
|
70
|
+
return;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
// animation for no extra selectors
|
74
|
+
el.animate(o, { queue : true, duration : t, easing : o.easing });
|
75
|
+
},
|
76
|
+
|
77
|
+
// Extract FX
|
78
|
+
getFx = function(opts, isOut){
|
79
|
+
// example: '.textSlide h3' : [ 'top fade', '200px' '500', 'easeOutBounce' ],
|
80
|
+
var tmp, bfx2,
|
81
|
+
ex = (isOut) ? 'outFx' : 'inFx', // object key
|
82
|
+
bfx = {}, // base effects
|
83
|
+
time = (isOut) ? defaults.timeOut : defaults.timeIn, // default duration settings
|
84
|
+
// split & process multiple built-in effects (e.g. 'top fade')
|
85
|
+
fx = $.trim(opts[0].replace(/\s+/g,' ')).split(' ');
|
86
|
+
|
87
|
+
// look for multiple selectors in the Out effects
|
88
|
+
if (isOut && fx.length === 1 && baseFx.hasOwnProperty(fx) && typeof (baseFx[fx][0].selector) !== 'undefined') {
|
89
|
+
bfx2 = baseFx[fx][0].outFx;
|
90
|
+
// add time and easing to first set, the animation will use it for both
|
91
|
+
bfx2[0].duration = opts[2] || defaults.timeOut;
|
92
|
+
bfx2[0].easing = opts[3] || defaults.easing;
|
93
|
+
return [bfx2, baseFx[fx][0].selector || [] ];
|
94
|
+
}
|
95
|
+
|
96
|
+
// combine base effects
|
97
|
+
$.each(fx, function(i,f){
|
98
|
+
// check if built-in effect exists
|
99
|
+
if (baseFx.hasOwnProperty(f)) {
|
100
|
+
var t = typeof opts[1] === 'undefined' || opts[1] === '',
|
101
|
+
// if size option is defined, get new base fx
|
102
|
+
tmp = (t) ? baseFx : getBaseFx(opts[1]);
|
103
|
+
$.extend(true, bfx, tmp[f][0][ex]);
|
104
|
+
t = opts[2] || bfx.duration || time; // user set time || built-in time || default time set above
|
105
|
+
bfx.duration = (isOut) ? t/2 : t; // out animation time is 1/2 of in time for predefined fx only
|
106
|
+
bfx.easing = isNaN(opts[3]) ? opts[3] || defaults.easing : opts[4] || defaults.easing;
|
107
|
+
}
|
108
|
+
});
|
109
|
+
return [bfx];
|
110
|
+
},
|
111
|
+
|
112
|
+
base = $(this)
|
113
|
+
|
114
|
+
// bind events for "OUT" effects - occur when leaving a page
|
115
|
+
.bind(defaults.outFxBind, function(e, slider){
|
116
|
+
if (defaults.stopRepeat && slider.$lastPage[0] === slider.$targetPage[0]) { return; }
|
117
|
+
var el, elOut, time, page = slider.$lastPage.add( slider.$items.eq(slider.exactPage) ).add( slider.$targetPage ),
|
118
|
+
FX = slider.fx; // allow dynamically added FX
|
119
|
+
if (slider.exactPage === 0) { page = page.add( slider.$items.eq( slider.pages ) ); } // add last (non-cloned) page if on first
|
120
|
+
if (slider.options.animationTime < defaults.timeOut) {
|
121
|
+
time = slider.options.animationTime || defaults.timeOut;
|
122
|
+
}
|
123
|
+
page = page.find('*').andSelf(); // include the panel in the selectors
|
124
|
+
for (el in FX) {
|
125
|
+
if (el === 'outFx') {
|
126
|
+
// process "out" custom effects
|
127
|
+
for (elOut in FX.outFx) {
|
128
|
+
// animate current/last slide, unless it's a clone, then effect the original
|
129
|
+
if (page.filter(elOut).length) { animateFx( page.filter(elOut), FX.outFx[elOut], true); }
|
130
|
+
}
|
131
|
+
} else if (el !== 'inFx') {
|
132
|
+
// Use built-in effects
|
133
|
+
if ($.isArray(FX[el]) && page.filter(el).length) {
|
134
|
+
animateFx( page.filter(el), getFx(FX[el],true), true, time);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
el = page.filter('[' + defaults.dataAnimate + ']');
|
139
|
+
if (el.length) {
|
140
|
+
el.each(function(){
|
141
|
+
FX = $(this).attr(defaults.dataAnimate).split(',');
|
142
|
+
if (FX[0] !== '') {
|
143
|
+
$(this)
|
144
|
+
.removeClass(FX[0])
|
145
|
+
.addClass(FX[1] || FX[0]);
|
146
|
+
}
|
147
|
+
});
|
148
|
+
}
|
149
|
+
})
|
150
|
+
|
151
|
+
// bind events for "IN" effects - occurs on target page
|
152
|
+
.bind(defaults.inFxBind, function(e, slider){
|
153
|
+
if (defaults.stopRepeat && slider.$lastPage[0] === slider.$targetPage[0]) { return; }
|
154
|
+
var el, elIn, page = slider.$currentPage.add( slider.$items.eq(slider.exactPage) ),
|
155
|
+
FX = slider.fx; // allow dynamically added FX
|
156
|
+
page = page.find('*').andSelf(); // include the panel in the selectors
|
157
|
+
for (el in FX) {
|
158
|
+
if (el === 'inFx') {
|
159
|
+
// process "in" custom effects
|
160
|
+
for (elIn in FX.inFx) {
|
161
|
+
// animate current page
|
162
|
+
if (page.filter(elIn).length) { animateFx( page.filter(elIn), FX.inFx[elIn], false); }
|
163
|
+
}
|
164
|
+
// Use built-in effects
|
165
|
+
} else if (el !== 'outFx' && $.isArray(FX[el]) && page.filter(el).length) {
|
166
|
+
animateFx( page.filter(el), getFx(FX[el],false), false);
|
167
|
+
}
|
168
|
+
}
|
169
|
+
el = page.filter('[' + defaults.dataAnimate + ']');
|
170
|
+
if (el.length) {
|
171
|
+
el.each(function(){
|
172
|
+
FX = $(this).attr(defaults.dataAnimate).split(',');
|
173
|
+
if (FX[0] !== '') {
|
174
|
+
$(this)
|
175
|
+
.removeClass(FX[1] || FX[0])
|
176
|
+
.addClass(FX[0]);
|
177
|
+
}
|
178
|
+
});
|
179
|
+
}
|
180
|
+
})
|
181
|
+
.data('AnythingSlider');
|
182
|
+
|
183
|
+
// call gotoPage to trigger intro animation
|
184
|
+
$(window).load(function(){ base.gotoPage(base.currentPage, base.playing); });
|
185
|
+
|
186
|
+
});
|
187
|
+
};
|
188
|
+
})(jQuery);
|
@@ -0,0 +1,831 @@
|
|
1
|
+
/*
|
2
|
+
AnythingSlider v1.7.26
|
3
|
+
Original by Chris Coyier: http://css-tricks.com
|
4
|
+
Get the latest version: https://github.com/ProLoser/AnythingSlider
|
5
|
+
|
6
|
+
To use the navigationFormatter function, you must have a function that
|
7
|
+
accepts two paramaters, and returns a string of HTML text.
|
8
|
+
|
9
|
+
index = integer index (1 based);
|
10
|
+
panel = jQuery wrapped LI item this tab references
|
11
|
+
@return = Must return a string of HTML/Text
|
12
|
+
|
13
|
+
navigationFormatter: function(index, panel){
|
14
|
+
return "Panel #" + index; // This would have each tab with the text 'Panel #X' where X = index
|
15
|
+
}
|
16
|
+
*/
|
17
|
+
|
18
|
+
(function($) {
|
19
|
+
|
20
|
+
$.anythingSlider = function(el, options) {
|
21
|
+
|
22
|
+
var base = this, o;
|
23
|
+
|
24
|
+
// Wraps the ul in the necessary divs and then gives Access to jQuery element
|
25
|
+
base.el = el;
|
26
|
+
base.$el = $(el).addClass('anythingBase').wrap('<div class="anythingSlider"><div class="anythingWindow" /></div>');
|
27
|
+
|
28
|
+
// Add a reverse reference to the DOM object
|
29
|
+
base.$el.data("AnythingSlider", base);
|
30
|
+
|
31
|
+
base.init = function(){
|
32
|
+
|
33
|
+
// Added "o" to be used in the code instead of "base.options" which doesn't get modifed by the compiler - reduces size by ~1k
|
34
|
+
base.options = o = $.extend({}, $.anythingSlider.defaults, options);
|
35
|
+
|
36
|
+
base.initialized = false;
|
37
|
+
if ($.isFunction(o.onBeforeInitialize)) { base.$el.bind('before_initialize', o.onBeforeInitialize); }
|
38
|
+
base.$el.trigger('before_initialize', base);
|
39
|
+
|
40
|
+
// Cache existing DOM elements for later
|
41
|
+
// base.$el = original ul
|
42
|
+
// for wrap - get parent() then closest in case the ul has "anythingSlider" class
|
43
|
+
base.$wrapper = base.$el.parent().closest('div.anythingSlider').addClass('anythingSlider-' + o.theme);
|
44
|
+
base.$window = base.$el.closest('div.anythingWindow');
|
45
|
+
base.win = window;
|
46
|
+
base.$win = $(base.win);
|
47
|
+
|
48
|
+
base.$controls = $('<div class="anythingControls"></div>').appendTo( (o.appendControlsTo && $(o.appendControlsTo).length) ? $(o.appendControlsTo) : base.$wrapper);
|
49
|
+
base.$startStop = $('<a href="#" class="start-stop"></a>');
|
50
|
+
if (o.buildStartStop) {
|
51
|
+
base.$startStop.appendTo( (o.appendStartStopTo && $(o.appendStartStopTo).length) ? $(o.appendStartStopTo) : base.$controls );
|
52
|
+
}
|
53
|
+
base.$nav = $('<ul class="thumbNav" />').appendTo( (o.appendNavigationTo && $(o.appendNavigationTo).length) ? $(o.appendNavigationTo) : base.$controls );
|
54
|
+
|
55
|
+
// Set up a few defaults & get details
|
56
|
+
base.flag = false; // event flag to prevent multiple calls (used in control click/focusin)
|
57
|
+
base.playing = o.autoPlay; // slideshow state; removed "startStopped" option
|
58
|
+
base.slideshow = false; // slideshow flag needed to correctly trigger slideshow events
|
59
|
+
base.hovered = false; // actively hovering over the slider
|
60
|
+
base.panelSize = []; // will contain dimensions and left position of each panel
|
61
|
+
base.currentPage = o.startPanel = parseInt(o.startPanel,10) || 1; // make sure this isn't a string
|
62
|
+
o.changeBy = parseInt(o.changeBy,10) || 1;
|
63
|
+
base.adj = (o.infiniteSlides) ? 0 : 1; // adjust page limits for infinite or limited modes
|
64
|
+
base.width = base.$el.width();
|
65
|
+
base.height = base.$el.height();
|
66
|
+
base.outerPad = [ base.$wrapper.innerWidth() - base.$wrapper.width(), base.$wrapper.innerHeight() - base.$wrapper.height() ];
|
67
|
+
if (o.playRtl) { base.$wrapper.addClass('rtl'); }
|
68
|
+
|
69
|
+
// Expand slider to fit parent
|
70
|
+
if (o.expand) {
|
71
|
+
base.$outer = base.$wrapper.parent();
|
72
|
+
base.$window.css({ width: '100%', height: '100%' }); // needed for Opera
|
73
|
+
base.checkResize();
|
74
|
+
}
|
75
|
+
|
76
|
+
// Build start/stop button
|
77
|
+
if (o.buildStartStop) { base.buildAutoPlay(); }
|
78
|
+
|
79
|
+
// Build forwards/backwards buttons
|
80
|
+
if (o.buildArrows) { base.buildNextBackButtons(); }
|
81
|
+
|
82
|
+
// can't lock autoplay it if it's not enabled
|
83
|
+
if (!o.autoPlay) { o.autoPlayLocked = false; }
|
84
|
+
|
85
|
+
base.updateSlider();
|
86
|
+
|
87
|
+
// Get index (run time) of this slider on the page
|
88
|
+
base.runTimes = $('div.anythingSlider').index(base.$wrapper) + 1;
|
89
|
+
base.regex = new RegExp('panel' + base.runTimes + '-(\\d+)', 'i'); // hash tag regex
|
90
|
+
if (base.runTimes === 1) { base.makeActive(); } // make the first slider on the page active
|
91
|
+
|
92
|
+
// Make sure easing function exists.
|
93
|
+
if (!$.isFunction($.easing[o.easing])) { o.easing = "swing"; }
|
94
|
+
|
95
|
+
// If pauseOnHover then add hover effects
|
96
|
+
if (o.pauseOnHover) {
|
97
|
+
base.$wrapper.hover(function() {
|
98
|
+
if (base.playing) {
|
99
|
+
base.$el.trigger('slideshow_paused', base);
|
100
|
+
base.clearTimer(true);
|
101
|
+
}
|
102
|
+
}, function() {
|
103
|
+
if (base.playing) {
|
104
|
+
base.$el.trigger('slideshow_unpaused', base);
|
105
|
+
base.startStop(base.playing, true);
|
106
|
+
}
|
107
|
+
});
|
108
|
+
}
|
109
|
+
|
110
|
+
// If a hash can not be used to trigger the plugin, then go to start panel
|
111
|
+
base.setCurrentPage(base.gotoHash() || o.startPage, false);
|
112
|
+
|
113
|
+
base.$lastPage = base.$targetPage = base.$currentPage;
|
114
|
+
|
115
|
+
// Hide/Show navigation & play/stop controls
|
116
|
+
base.slideControls(false);
|
117
|
+
base.$wrapper.bind('mouseenter mouseleave', function(e){
|
118
|
+
base.hovered = (e.type === "mouseenter") ? true : false;
|
119
|
+
base.slideControls( base.hovered, false );
|
120
|
+
});
|
121
|
+
|
122
|
+
// Add keyboard navigation
|
123
|
+
$(document).keyup(function(e){
|
124
|
+
// Stop arrow keys from working when focused on form items
|
125
|
+
if (o.enableKeyboard && base.$wrapper.is('.activeSlider') && !e.target.tagName.match('TEXTAREA|INPUT|SELECT')) {
|
126
|
+
if (!o.vertical && (e.which === 38 || e.which === 40)) { return; }
|
127
|
+
switch (e.which) {
|
128
|
+
case 39: case 40: // right & down arrow
|
129
|
+
base.goForward();
|
130
|
+
break;
|
131
|
+
case 37: case 38: // left & up arrow
|
132
|
+
base.goBack();
|
133
|
+
break;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
});
|
137
|
+
|
138
|
+
// Fix tabbing through the page, but don't change the view if the link is in view (showMultiple = true)
|
139
|
+
base.$items.delegate('a', 'focus.AnythingSlider', function(e){
|
140
|
+
var panel = $(this).closest('.panel'),
|
141
|
+
indx = base.$items.index(panel) + base.adj; // index can be -1 in nested sliders - issue #208
|
142
|
+
base.$items.find('.focusedLink').removeClass('focusedLink');
|
143
|
+
$(this).addClass('focusedLink');
|
144
|
+
base.$window.scrollLeft(0);
|
145
|
+
if ( ( indx !== -1 && (indx >= base.currentPage + o.showMultiple || indx < base.currentPage) ) ) {
|
146
|
+
base.gotoPage(indx);
|
147
|
+
e.preventDefault();
|
148
|
+
}
|
149
|
+
});
|
150
|
+
|
151
|
+
// Binds events
|
152
|
+
var triggers = "slideshow_paused slideshow_unpaused slide_init slide_begin slideshow_stop slideshow_start initialized swf_completed".split(" ");
|
153
|
+
$.each("onShowPause onShowUnpause onSlideInit onSlideBegin onShowStop onShowStart onInitialized onSWFComplete".split(" "), function(i,f){
|
154
|
+
if ($.isFunction(o[f])){
|
155
|
+
base.$el.bind(triggers[i], o[f]);
|
156
|
+
}
|
157
|
+
});
|
158
|
+
if ($.isFunction(o.onSlideComplete)){
|
159
|
+
// Added setTimeout (zero time) to ensure animation is complete... see this bug report: http://bugs.jquery.com/ticket/7157
|
160
|
+
base.$el.bind('slide_complete', function(){
|
161
|
+
setTimeout(function(){ o.onSlideComplete(base); }, 0);
|
162
|
+
});
|
163
|
+
}
|
164
|
+
base.initialized = true;
|
165
|
+
base.$el.trigger('initialized', base);
|
166
|
+
|
167
|
+
// trigger the slideshow
|
168
|
+
base.startStop(base.playing);
|
169
|
+
|
170
|
+
};
|
171
|
+
|
172
|
+
// called during initialization & to update the slider if a panel is added or deleted
|
173
|
+
base.updateSlider = function(){
|
174
|
+
var t;
|
175
|
+
// needed for updating the slider
|
176
|
+
base.$el.children('.cloned').remove();
|
177
|
+
base.$nav.empty();
|
178
|
+
// set currentPage to 1 in case it was zero - occurs when adding slides after removing them all
|
179
|
+
base.currentPage = base.currentPage || 1;
|
180
|
+
|
181
|
+
base.$items = base.$el.children();
|
182
|
+
base.pages = base.$items.length;
|
183
|
+
base.dir = (o.vertical) ? 'top' : 'left';
|
184
|
+
o.showMultiple = (o.vertical) ? 1 : parseInt(o.showMultiple,10) || 1; // only integers allowed
|
185
|
+
o.navigationSize = (o.navigationSize === false) ? 0 : parseInt(o.navigationSize,10) || 0;
|
186
|
+
|
187
|
+
if (o.showMultiple > 1) {
|
188
|
+
if (o.showMultiple > base.pages) { o.showMultiple = base.pages; }
|
189
|
+
base.adjustMultiple = (o.infiniteSlides && base.pages > 1) ? 0 : o.showMultiple - 1;
|
190
|
+
base.pages = base.$items.length - base.adjustMultiple;
|
191
|
+
}
|
192
|
+
|
193
|
+
// Hide navigation & player if there is only one page
|
194
|
+
base.$controls
|
195
|
+
.add(base.$nav)
|
196
|
+
.add(base.$startStop)
|
197
|
+
.add(base.$forward)
|
198
|
+
.add(base.$back)[(base.pages <= 1) ? 'hide' : 'show']();
|
199
|
+
if (base.pages > 1) {
|
200
|
+
// Build/update navigation tabs
|
201
|
+
base.buildNavigation();
|
202
|
+
}
|
203
|
+
|
204
|
+
// Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
|
205
|
+
// This supports the "infinite" scrolling, also ensures any cloned elements don't duplicate an ID
|
206
|
+
// Moved removeAttr before addClass otherwise IE7 ignores the addClass: http://bugs.jquery.com/ticket/9871
|
207
|
+
if (o.infiniteSlides && base.pages > 1) {
|
208
|
+
base.$el.prepend( base.$items.filter(':last').clone().addClass('cloned') );
|
209
|
+
// Add support for multiple sliders shown at the same time
|
210
|
+
if (o.showMultiple > 1) {
|
211
|
+
base.$el.append( base.$items.filter(':lt(' + o.showMultiple + ')').clone().addClass('cloned multiple') );
|
212
|
+
} else {
|
213
|
+
base.$el.append( base.$items.filter(':first').clone().addClass('cloned') );
|
214
|
+
}
|
215
|
+
base.$el.find('.cloned').each(function(){
|
216
|
+
// disable all focusable elements in cloned panels to prevent shifting the panels by tabbing
|
217
|
+
$(this).find('a,input,textarea,select,button,area').attr('disabled', 'disabled');
|
218
|
+
$(this).find('[id]').andSelf().removeAttr('id');
|
219
|
+
});
|
220
|
+
}
|
221
|
+
|
222
|
+
// We just added two items, time to re-cache the list, then get the dimensions of each panel
|
223
|
+
base.$items = base.$el.children().addClass('panel' + (o.vertical ? ' vertical' : ''));
|
224
|
+
base.setDimensions();
|
225
|
+
|
226
|
+
// Set the dimensions of each panel
|
227
|
+
if (o.resizeContents) {
|
228
|
+
base.$items.css('width', base.width);
|
229
|
+
base.$wrapper
|
230
|
+
.css('width', base.getDim(base.currentPage)[0])
|
231
|
+
.add(base.$items).css('height', base.height);
|
232
|
+
} else {
|
233
|
+
base.$win.load(function(){
|
234
|
+
// set dimensions after all images load
|
235
|
+
base.setDimensions();
|
236
|
+
// make sure the outer wrapper is set properly
|
237
|
+
t = base.getDim(base.currentPage);
|
238
|
+
base.$wrapper.css({ width: t[0], height: t[1] });
|
239
|
+
});
|
240
|
+
}
|
241
|
+
|
242
|
+
if (base.currentPage > base.pages) {
|
243
|
+
base.currentPage = base.pages;
|
244
|
+
}
|
245
|
+
base.setCurrentPage(base.currentPage, false);
|
246
|
+
base.$nav.find('a').eq(base.currentPage - 1).addClass('cur'); // update current selection
|
247
|
+
|
248
|
+
};
|
249
|
+
|
250
|
+
// Creates the numbered navigation links
|
251
|
+
base.buildNavigation = function() {
|
252
|
+
if (o.buildNavigation && (base.pages > 1)) {
|
253
|
+
var a, c, i, t, $li;
|
254
|
+
base.$items.filter(':not(.cloned)').each(function(j){
|
255
|
+
$li = $('<li/>');
|
256
|
+
i = j + 1;
|
257
|
+
c = o.tooltipClass + ((i === 1) ? ' first' : '') + ((i === base.pages) ? ' last' : '');
|
258
|
+
a = '<a class="panel' + i + '" href="#"><span>@</span></a>';
|
259
|
+
// If a formatter function is present, use it
|
260
|
+
if ($.isFunction(o.navigationFormatter)) {
|
261
|
+
t = o.navigationFormatter(i, $(this));
|
262
|
+
if (typeof(t) === "string") {
|
263
|
+
$li.html(a.replace(/@/,t));
|
264
|
+
} else {
|
265
|
+
$li = $('<li/>', t);
|
266
|
+
}
|
267
|
+
} else {
|
268
|
+
$li.html(a.replace(/@/,i));
|
269
|
+
}
|
270
|
+
$li
|
271
|
+
.appendTo(base.$nav)
|
272
|
+
.addClass(c)
|
273
|
+
.data('index', i);
|
274
|
+
});
|
275
|
+
base.$nav.children('li').bind(o.clickControls, function(e) {
|
276
|
+
if (!base.flag && o.enableNavigation) {
|
277
|
+
// prevent running functions twice (once for click, second time for focusin)
|
278
|
+
base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
|
279
|
+
base.gotoPage( $(this).data('index') );
|
280
|
+
}
|
281
|
+
e.preventDefault();
|
282
|
+
});
|
283
|
+
|
284
|
+
// Add navigation tab scrolling - use !! in case someone sets the size to zero
|
285
|
+
if (!!o.navigationSize && o.navigationSize < base.pages) {
|
286
|
+
if (!base.$controls.find('.anythingNavWindow').length){
|
287
|
+
base.$nav
|
288
|
+
.before('<ul><li class="prev"><a href="#"><span>' + o.backText + '</span></a></li></ul>')
|
289
|
+
.after('<ul><li class="next"><a href="#"><span>' + o.forwardText + '</span></a></li></ul>')
|
290
|
+
.wrap('<div class="anythingNavWindow"></div>');
|
291
|
+
}
|
292
|
+
// include half of the left position to include extra width from themes like tabs-light and tabs-dark (still not perfect)
|
293
|
+
base.navWidths = base.$nav.find('li').map(function(){
|
294
|
+
return $(this).innerWidth() + Math.ceil(parseInt($(this).find('span').css('left'),10)/2 || 0);
|
295
|
+
}).get();
|
296
|
+
base.navLeft = base.currentPage;
|
297
|
+
// add 5 pixels to make sure the tabs don't wrap to the next line
|
298
|
+
base.$nav.width( base.navWidth( 1, base.pages + 1 ) + 5 );
|
299
|
+
base.$controls.find('.anythingNavWindow')
|
300
|
+
.width( base.navWidth( 1, o.navigationSize + 1 ) ).end()
|
301
|
+
.find('.prev,.next').bind(o.clickControls, function(e) {
|
302
|
+
if (!base.flag) {
|
303
|
+
base.flag = true; setTimeout(function(){ base.flag = false; }, 200);
|
304
|
+
base.navWindow( base.navLeft + o.navigationSize * ( $(this).is('.prev') ? -1 : 1 ) );
|
305
|
+
}
|
306
|
+
e.preventDefault();
|
307
|
+
});
|
308
|
+
}
|
309
|
+
|
310
|
+
}
|
311
|
+
};
|
312
|
+
|
313
|
+
base.navWidth = function(x,y){
|
314
|
+
var i, s = Math.min(x,y),
|
315
|
+
e = Math.max(x,y),
|
316
|
+
w = 0;
|
317
|
+
for (i = s; i < e; i++) {
|
318
|
+
w += base.navWidths[i-1] || 0;
|
319
|
+
}
|
320
|
+
return w;
|
321
|
+
};
|
322
|
+
|
323
|
+
base.navWindow = function(n){
|
324
|
+
if (!!o.navigationSize && o.navigationSize < base.pages && base.navWidths) {
|
325
|
+
var p = base.pages - o.navigationSize + 1;
|
326
|
+
n = (n <= 1) ? 1 : (n > 1 && n < p) ? n : p;
|
327
|
+
if (n !== base.navLeft) {
|
328
|
+
base.$controls.find('.anythingNavWindow').animate(
|
329
|
+
{ scrollLeft: base.navWidth(1, n), width: base.navWidth(n, n + o.navigationSize) },
|
330
|
+
{ queue: false, duration: o.animationTime });
|
331
|
+
base.navLeft = n;
|
332
|
+
}
|
333
|
+
}
|
334
|
+
};
|
335
|
+
|
336
|
+
// Creates the Forward/Backward buttons
|
337
|
+
base.buildNextBackButtons = function() {
|
338
|
+
base.$forward = $('<span class="arrow forward"><a href="#"><span>' + o.forwardText + '</span></a></span>');
|
339
|
+
base.$back = $('<span class="arrow back"><a href="#"><span>' + o.backText + '</span></a></span>');
|
340
|
+
|
341
|
+
// Bind to the forward and back buttons
|
342
|
+
base.$back.bind(o.clickBackArrow, function(e) {
|
343
|
+
// prevent running functions twice (once for click, second time for swipe)
|
344
|
+
if (o.enableArrows && !base.flag) {
|
345
|
+
base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
|
346
|
+
base.goBack();
|
347
|
+
}
|
348
|
+
e.preventDefault();
|
349
|
+
});
|
350
|
+
base.$forward.bind(o.clickForwardArrow, function(e) {
|
351
|
+
// prevent running functions twice (once for click, second time for swipe)
|
352
|
+
if (o.enableArrows && !base.flag) {
|
353
|
+
base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
|
354
|
+
base.goForward();
|
355
|
+
}
|
356
|
+
e.preventDefault();
|
357
|
+
});
|
358
|
+
// using tab to get to arrow links will show they have focus (outline is disabled in css)
|
359
|
+
base.$back.add(base.$forward).find('a').bind('focusin focusout',function(){
|
360
|
+
$(this).toggleClass('hover');
|
361
|
+
});
|
362
|
+
|
363
|
+
// Append elements to page
|
364
|
+
base.$back.appendTo( (o.appendBackTo && $(o.appendBackTo).length) ? $(o.appendBackTo) : base.$wrapper );
|
365
|
+
base.$forward.appendTo( (o.appendForwardTo && $(o.appendForwardTo).length) ? $(o.appendForwardTo) : base.$wrapper );
|
366
|
+
|
367
|
+
base.arrowWidth = base.$forward.width(); // assuming the left & right arrows are the same width - used for toggle
|
368
|
+
base.arrowRight = parseInt(base.$forward.css('right'), 10);
|
369
|
+
base.arrowLeft = parseInt(base.$back.css('left'), 10);
|
370
|
+
|
371
|
+
};
|
372
|
+
|
373
|
+
// Creates the Start/Stop button
|
374
|
+
base.buildAutoPlay = function(){
|
375
|
+
base.$startStop
|
376
|
+
.html('<span>' + (base.playing ? o.stopText : o.startText) + '</span>')
|
377
|
+
.bind(o.clickSlideshow, function(e) {
|
378
|
+
if (o.enableStartStop) {
|
379
|
+
base.startStop(!base.playing);
|
380
|
+
base.makeActive();
|
381
|
+
if (base.playing && !o.autoPlayDelayed) {
|
382
|
+
base.goForward(true);
|
383
|
+
}
|
384
|
+
}
|
385
|
+
e.preventDefault();
|
386
|
+
})
|
387
|
+
// show button has focus while tabbing
|
388
|
+
.bind('focusin focusout',function(){
|
389
|
+
$(this).toggleClass('hover');
|
390
|
+
});
|
391
|
+
};
|
392
|
+
|
393
|
+
// Adjust slider dimensions on parent element resize
|
394
|
+
base.checkResize = function(stopTimer){
|
395
|
+
clearTimeout(base.resizeTimer);
|
396
|
+
base.resizeTimer = setTimeout(function(){
|
397
|
+
var w = base.$outer.width() - base.outerPad[0],
|
398
|
+
h = (base.$outer[0].tagName === "BODY" ? base.$win.height() : base.$outer.height()) - base.outerPad[1];
|
399
|
+
// base.width = width of one panel, so multiply by # of panels; outerPad is padding added for arrows.
|
400
|
+
if (base.width * o.showMultiple !== w || base.height !== h) {
|
401
|
+
base.setDimensions(); // adjust panel sizes
|
402
|
+
// make sure page is lined up (use -1 animation time, so we can differeniate it from when animationTime = 0)
|
403
|
+
base.gotoPage(base.currentPage, base.playing, null, -1);
|
404
|
+
}
|
405
|
+
if (typeof(stopTimer) === 'undefined'){ base.checkResize(); }
|
406
|
+
}, 500);
|
407
|
+
};
|
408
|
+
|
409
|
+
// Set panel dimensions to either resize content or adjust panel to content
|
410
|
+
base.setDimensions = function(){
|
411
|
+
var w, h, c, t, edge = 0,
|
412
|
+
fullsize = { width: '100%', height: '100%' },
|
413
|
+
// determine panel width
|
414
|
+
pw = (o.showMultiple > 1) ? base.width || base.$window.width()/o.showMultiple : base.$window.width(),
|
415
|
+
winw = base.$win.width();
|
416
|
+
if (o.expand){
|
417
|
+
w = base.$outer.width() - base.outerPad[0];
|
418
|
+
base.height = h = base.$outer.height() - base.outerPad[1];
|
419
|
+
base.$wrapper.add(base.$window).add(base.$items).css({ width: w, height: h });
|
420
|
+
base.width = pw = (o.showMultiple > 1) ? w/o.showMultiple : w;
|
421
|
+
}
|
422
|
+
base.$items.each(function(i){
|
423
|
+
t = $(this);
|
424
|
+
c = t.children();
|
425
|
+
if (o.resizeContents){
|
426
|
+
// resize panel
|
427
|
+
w = base.width;
|
428
|
+
h = base.height;
|
429
|
+
t.css({ width: w, height: h });
|
430
|
+
if (c.length) {
|
431
|
+
if (c[0].tagName === "EMBED") { c.attr(fullsize); } // needed for IE7; also c.length > 1 in IE7
|
432
|
+
if (c[0].tagName === "OBJECT") { c.find('embed').attr(fullsize); }
|
433
|
+
// resize panel contents, if solitary (wrapped content or solitary image)
|
434
|
+
if (c.length === 1){ c.css(fullsize); }
|
435
|
+
}
|
436
|
+
} else {
|
437
|
+
// get panel width & height and save it
|
438
|
+
w = t.width() || base.width; // if image hasn't finished loading, width will be zero, so set it to base width instead
|
439
|
+
if (c.length === 1 && w >= winw){
|
440
|
+
w = (c.width() >= winw) ? pw : c.width(); // get width of solitary child
|
441
|
+
c.css('max-width', w); // set max width for all children
|
442
|
+
}
|
443
|
+
t.css('width', w); // set width of panel
|
444
|
+
h = (c.length === 1 ? c.outerHeight(true) : t.height()); // get height after setting width
|
445
|
+
if (h <= base.outerPad[1]) { h = base.height; } // if height less than the outside padding, then set it to the preset height
|
446
|
+
t.css('height', h);
|
447
|
+
}
|
448
|
+
base.panelSize[i] = [w,h,edge];
|
449
|
+
edge += (o.vertical) ? h : w;
|
450
|
+
});
|
451
|
+
// Set total width of slider, Note that this is limited to 32766 by Opera - option removed
|
452
|
+
base.$el.css((o.vertical ? 'height' : 'width'), edge);
|
453
|
+
};
|
454
|
+
|
455
|
+
// get dimension of multiple panels, as needed
|
456
|
+
base.getDim = function(page){
|
457
|
+
if (base.pages < 1 || isNaN(page)) { return [ base.width, base.height ]; } // prevent errors when base.panelSize is empty
|
458
|
+
page = (o.infiniteSlides && base.pages > 1) ? page : page - 1;
|
459
|
+
var i,
|
460
|
+
w = base.panelSize[page][0],
|
461
|
+
h = base.panelSize[page][1];
|
462
|
+
if (o.showMultiple > 1) {
|
463
|
+
for (i=1; i < o.showMultiple; i++) {
|
464
|
+
w += base.panelSize[(page + i)%o.showMultiple][0];
|
465
|
+
h = Math.max(h, base.panelSize[page + i][1]);
|
466
|
+
}
|
467
|
+
}
|
468
|
+
return [w,h];
|
469
|
+
};
|
470
|
+
|
471
|
+
base.goForward = function(autoplay) {
|
472
|
+
base.gotoPage(base.currentPage + o.changeBy * (o.playRtl ? -1 : 1), autoplay);
|
473
|
+
};
|
474
|
+
|
475
|
+
base.goBack = function(autoplay) {
|
476
|
+
base.gotoPage(base.currentPage + o.changeBy * (o.playRtl ? 1 : -1), autoplay);
|
477
|
+
};
|
478
|
+
|
479
|
+
base.gotoPage = function(page, autoplay, callback, time) {
|
480
|
+
if (autoplay !== true) {
|
481
|
+
autoplay = false;
|
482
|
+
base.startStop(false);
|
483
|
+
base.makeActive();
|
484
|
+
}
|
485
|
+
// check if page is an id or class name
|
486
|
+
if (/^[#|.]/.test(page) && $(page).length) {
|
487
|
+
page = $(page).closest('.panel').index() + base.adj;
|
488
|
+
}
|
489
|
+
// rewind effect occurs here when changeBy > 1
|
490
|
+
if (o.changeBy !== 1){
|
491
|
+
if (page < 0) { page += base.pages; }
|
492
|
+
if (page > base.pages) { page -= base.pages; }
|
493
|
+
}
|
494
|
+
if (base.pages <= 1) { return; } // prevents animation
|
495
|
+
base.$lastPage = base.$currentPage;
|
496
|
+
if (typeof(page) !== "number") {
|
497
|
+
page = o.startPanel;
|
498
|
+
base.setCurrentPage(page);
|
499
|
+
}
|
500
|
+
|
501
|
+
// pause YouTube videos before scrolling or prevent change if playing
|
502
|
+
if (autoplay && o.isVideoPlaying(base)) { return; }
|
503
|
+
|
504
|
+
base.exactPage = page;
|
505
|
+
if (page > base.pages + 1 - base.adj) { page = (!o.infiniteSlides && !o.stopAtEnd) ? 1 : base.pages; }
|
506
|
+
if (page < base.adj ) { page = (!o.infiniteSlides && !o.stopAtEnd) ? base.pages : 1; }
|
507
|
+
if (!o.infiniteSlides) { base.exactPage = page; } // exact page used by the fx extension
|
508
|
+
base.currentPage = ( page > base.pages ) ? base.pages : ( page < 1 ) ? 1 : base.currentPage;
|
509
|
+
base.$currentPage = base.$items.eq(base.currentPage - base.adj);
|
510
|
+
base.targetPage = (page === 0) ? base.pages : (page > base.pages) ? 1 : page;
|
511
|
+
base.$targetPage = base.$items.eq( base.targetPage - base.adj);
|
512
|
+
time = time || o.animationTime;
|
513
|
+
// don't trigger events when time < 0 - to prevent FX from firing multiple times on page resize
|
514
|
+
if (time >= 0) { base.$el.trigger('slide_init', base); }
|
515
|
+
|
516
|
+
base.slideControls(true, false);
|
517
|
+
|
518
|
+
// When autoplay isn't passed, we stop the timer
|
519
|
+
if (autoplay !== true) { autoplay = false; }
|
520
|
+
// Stop the slider when we reach the last page, if the option stopAtEnd is set to true
|
521
|
+
if (!autoplay || (o.stopAtEnd && page === base.pages)) { base.startStop(false); }
|
522
|
+
|
523
|
+
if (time >= 0) { base.$el.trigger('slide_begin', base); }
|
524
|
+
|
525
|
+
// delay starting slide animation
|
526
|
+
setTimeout(function(d){
|
527
|
+
var p, empty = true;
|
528
|
+
// resize slider if content size varies
|
529
|
+
if (!o.resizeContents) {
|
530
|
+
// animating the wrapper resize before the window prevents flickering in Firefox
|
531
|
+
// don't animate the dimension if it hasn't changed - fix for issue #264
|
532
|
+
p = base.getDim(page); d = {};
|
533
|
+
// prevent animating a dimension to zero
|
534
|
+
if (base.$wrapper.width() !== p[0]) { d.width = p[0] || base.width; empty = false; }
|
535
|
+
if (base.$wrapper.height() !== p[1]) { d.height = p[1] || base.height; empty = false; }
|
536
|
+
if (!empty) {
|
537
|
+
base.$wrapper.filter(':not(:animated)').animate(d, { queue: false, duration: (time < 0 ? 0 : time), easing: o.easing });
|
538
|
+
}
|
539
|
+
}
|
540
|
+
d = {};
|
541
|
+
d[base.dir] = -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2];
|
542
|
+
// Animate Slider
|
543
|
+
base.$el.filter(':not(:animated)').animate(
|
544
|
+
d, { queue: false, duration: time, easing: o.easing, complete: function(){ base.endAnimation(page, callback, time); } }
|
545
|
+
);
|
546
|
+
}, parseInt(o.delayBeforeAnimate, 10) || 0);
|
547
|
+
};
|
548
|
+
|
549
|
+
base.endAnimation = function(page, callback, time){
|
550
|
+
if (page === 0) {
|
551
|
+
base.$el.css( base.dir, -base.panelSize[base.pages][2]);
|
552
|
+
page = base.pages;
|
553
|
+
} else if (page > base.pages) {
|
554
|
+
// reset back to start position
|
555
|
+
base.$el.css( base.dir, -base.panelSize[1][2]);
|
556
|
+
page = 1;
|
557
|
+
}
|
558
|
+
base.exactPage = page;
|
559
|
+
base.setCurrentPage(page, false);
|
560
|
+
// Add active panel class
|
561
|
+
base.$items.removeClass('activePage').eq(page - base.adj).addClass('activePage');
|
562
|
+
|
563
|
+
if (!base.hovered) { base.slideControls(false); }
|
564
|
+
|
565
|
+
if (o.hashTags) { base.setHash(page); }
|
566
|
+
|
567
|
+
if (time >= 0) { base.$el.trigger('slide_complete', base); }
|
568
|
+
// callback from external slide control: $('#slider').anythingSlider(4, function(slider){ })
|
569
|
+
if (typeof callback === 'function') { callback(base); }
|
570
|
+
|
571
|
+
// Continue slideshow after a delay
|
572
|
+
if (o.autoPlayLocked && !base.playing) {
|
573
|
+
setTimeout(function(){
|
574
|
+
base.startStop(true);
|
575
|
+
// subtract out slide delay as the slideshow waits that additional time.
|
576
|
+
}, o.resumeDelay - (o.autoPlayDelayed ? o.delay : 0));
|
577
|
+
}
|
578
|
+
};
|
579
|
+
|
580
|
+
base.setCurrentPage = function(page, move) {
|
581
|
+
page = parseInt(page, 10);
|
582
|
+
if (base.pages < 1 || page === 0 || isNaN(page)) { return; }
|
583
|
+
if (page > base.pages + 1 - base.adj) { page = base.pages - base.adj; }
|
584
|
+
if (page < base.adj ) { page = 1; }
|
585
|
+
|
586
|
+
// Set visual
|
587
|
+
if (o.buildNavigation){
|
588
|
+
base.$nav
|
589
|
+
.find('.cur').removeClass('cur').end()
|
590
|
+
.find('a').eq(page - 1).addClass('cur');
|
591
|
+
}
|
592
|
+
|
593
|
+
// hide/show arrows based on infinite scroll mode
|
594
|
+
if (!o.infiniteSlides && o.stopAtEnd){
|
595
|
+
base.$wrapper
|
596
|
+
.find('span.forward')[ page === base.pages ? 'addClass' : 'removeClass']('disabled').end()
|
597
|
+
.find('span.back')[ page === 1 ? 'addClass' : 'removeClass']('disabled');
|
598
|
+
if (page === base.pages && base.playing) { base.startStop(); }
|
599
|
+
}
|
600
|
+
|
601
|
+
// Only change left if move does not equal false
|
602
|
+
if (!move) {
|
603
|
+
var d = base.getDim(page);
|
604
|
+
base.$wrapper
|
605
|
+
.css({ width: d[0], height: d[1] })
|
606
|
+
.add(base.$window).scrollLeft(0); // reset in case tabbing changed this scrollLeft - probably overly redundant
|
607
|
+
base.$el.css( base.dir, -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2] );
|
608
|
+
}
|
609
|
+
// Update local variable
|
610
|
+
base.currentPage = page;
|
611
|
+
base.$currentPage = base.$items.removeClass('activePage').eq(page - base.adj).addClass('activePage');
|
612
|
+
|
613
|
+
};
|
614
|
+
|
615
|
+
base.makeActive = function(){
|
616
|
+
// Set current slider as active so keyboard navigation works properly
|
617
|
+
if (!base.$wrapper.is('.activeSlider')){
|
618
|
+
$('.activeSlider').removeClass('activeSlider');
|
619
|
+
base.$wrapper.addClass('activeSlider');
|
620
|
+
}
|
621
|
+
};
|
622
|
+
|
623
|
+
// This method tries to find a hash that matches an ID and panel-X
|
624
|
+
// If either found, it tries to find a matching item
|
625
|
+
// If that is found as well, then it returns the page number
|
626
|
+
base.gotoHash = function(){
|
627
|
+
var h = base.win.location.hash,
|
628
|
+
i = h.indexOf('&'),
|
629
|
+
n = h.match(base.regex);
|
630
|
+
// test for "/#/" or "/#!/" used by the jquery address plugin - $('#/') breaks jQuery
|
631
|
+
if (n === null && !/^#&/.test(h) && !/#!?\//.test(h)) {
|
632
|
+
// #quote2&panel1-3&panel3-3
|
633
|
+
h = h.substring(0, (i >= 0 ? i : h.length));
|
634
|
+
// ensure the element is in the same slider
|
635
|
+
n = ($(h).length && $(h).closest('.anythingBase')[0] === base.el) ? $(h).closest('.panel').index() : null;
|
636
|
+
} else if (n !== null) {
|
637
|
+
// #&panel1-3&panel3-3
|
638
|
+
n = (o.hashTags) ? parseInt(n[1],10) : null;
|
639
|
+
}
|
640
|
+
return n;
|
641
|
+
};
|
642
|
+
|
643
|
+
base.setHash = function(n){
|
644
|
+
var s = 'panel' + base.runTimes + '-',
|
645
|
+
h = base.win.location.hash;
|
646
|
+
if ( typeof h !== 'undefined' ) {
|
647
|
+
base.win.location.hash = (h.indexOf(s) > 0) ? h.replace(base.regex, s + n) : h + "&" + s + n;
|
648
|
+
}
|
649
|
+
};
|
650
|
+
|
651
|
+
// Slide controls (nav and play/stop button up or down)
|
652
|
+
base.slideControls = function(toggle){
|
653
|
+
var dir = (toggle) ? 'slideDown' : 'slideUp',
|
654
|
+
t1 = (toggle) ? 0 : o.animationTime,
|
655
|
+
t2 = (toggle) ? o.animationTime: 0,
|
656
|
+
op = (toggle) ? 1 : 0,
|
657
|
+
sign = (toggle) ? 0 : 1; // 0 = visible, 1 = hidden
|
658
|
+
if (o.toggleControls) {
|
659
|
+
base.$controls.stop(true,true).delay(t1)[dir](o.animationTime/2).delay(t2);
|
660
|
+
}
|
661
|
+
if (o.buildArrows && o.toggleArrows) {
|
662
|
+
if (!base.hovered && base.playing) { sign = 1; op = 0; } // don't animate arrows during slideshow
|
663
|
+
base.$forward.stop(true,true).delay(t1).animate({ right: base.arrowRight + (sign * base.arrowWidth), opacity: op }, o.animationTime/2);
|
664
|
+
base.$back.stop(true,true).delay(t1).animate({ left: base.arrowLeft + (sign * base.arrowWidth), opacity: op }, o.animationTime/2);
|
665
|
+
}
|
666
|
+
};
|
667
|
+
|
668
|
+
base.clearTimer = function(paused){
|
669
|
+
// Clear the timer only if it is set
|
670
|
+
if (base.timer) {
|
671
|
+
base.win.clearInterval(base.timer);
|
672
|
+
if (!paused && base.slideshow) {
|
673
|
+
base.$el.trigger('slideshow_stop', base);
|
674
|
+
base.slideshow = false;
|
675
|
+
}
|
676
|
+
}
|
677
|
+
};
|
678
|
+
|
679
|
+
// Pass startStop(false) to stop and startStop(true) to play
|
680
|
+
base.startStop = function(playing, paused) {
|
681
|
+
if (playing !== true) { playing = false; } // Default if not supplied is false
|
682
|
+
base.playing = playing;
|
683
|
+
|
684
|
+
if (playing && !paused) {
|
685
|
+
base.$el.trigger('slideshow_start', base);
|
686
|
+
base.slideshow = true;
|
687
|
+
}
|
688
|
+
|
689
|
+
// Toggle playing and text
|
690
|
+
if (o.buildStartStop) {
|
691
|
+
base.$startStop.toggleClass('playing', playing).find('span').html( playing ? o.stopText : o.startText );
|
692
|
+
// add button text to title attribute if it is hidden by text-indent
|
693
|
+
if ( base.$startStop.find('span').css('visibility') === "hidden" ) {
|
694
|
+
base.$startStop.addClass(o.tooltipClass).attr( 'title', playing ? o.stopText : o.startText );
|
695
|
+
}
|
696
|
+
}
|
697
|
+
|
698
|
+
// Pause slideshow while video is playing
|
699
|
+
if (playing){
|
700
|
+
base.clearTimer(true); // Just in case this was triggered twice in a row
|
701
|
+
base.timer = base.win.setInterval(function() {
|
702
|
+
// prevent autoplay if video is playing
|
703
|
+
if ( !o.isVideoPlaying(base) ) {
|
704
|
+
base.goForward(true);
|
705
|
+
// stop slideshow if resume if false
|
706
|
+
} else if (!o.resumeOnVideoEnd) {
|
707
|
+
base.startStop();
|
708
|
+
}
|
709
|
+
}, o.delay);
|
710
|
+
} else {
|
711
|
+
base.clearTimer();
|
712
|
+
}
|
713
|
+
};
|
714
|
+
|
715
|
+
// Trigger the initialization
|
716
|
+
base.init();
|
717
|
+
};
|
718
|
+
|
719
|
+
$.anythingSlider.defaults = {
|
720
|
+
// Appearance
|
721
|
+
theme : "default", // Theme name, add the css stylesheet manually
|
722
|
+
expand : false, // If true, the entire slider will expand to fit the parent element
|
723
|
+
resizeContents : true, // If true, solitary images/objects in the panel will expand to fit the viewport
|
724
|
+
vertical : false, // If true, all panels will slide vertically; they slide horizontally otherwise
|
725
|
+
showMultiple : false, // Set this value to a number and it will show that many slides at once
|
726
|
+
easing : "swing", // Anything other than "linear" or "swing" requires the easing plugin or jQuery UI
|
727
|
+
|
728
|
+
buildArrows : true, // If true, builds the forwards and backwards buttons
|
729
|
+
buildNavigation : true, // If true, builds a list of anchor links to link to each panel
|
730
|
+
buildStartStop : true, // ** If true, builds the start/stop button
|
731
|
+
|
732
|
+
/*
|
733
|
+
// commented out as this will reduce the size of the minified version
|
734
|
+
appendForwardTo : null, // Append forward arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null
|
735
|
+
appendBackTo : null, // Append back arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null
|
736
|
+
appendControlsTo : null, // Append controls (navigation + start-stop) to a HTML element (jQuery Object, selector or HTMLNode), if not null
|
737
|
+
appendNavigationTo : null, // Append navigation buttons to a HTML element (jQuery Object, selector or HTMLNode), if not null
|
738
|
+
appendStartStopTo : null, // Append start-stop button to a HTML element (jQuery Object, selector or HTMLNode), if not null
|
739
|
+
*/
|
740
|
+
|
741
|
+
toggleArrows : false, // If true, side navigation arrows will slide out on hovering & hide @ other times
|
742
|
+
toggleControls : false, // if true, slide in controls (navigation + play/stop button) on hover and slide change, hide @ other times
|
743
|
+
|
744
|
+
startText : "Start", // Start button text
|
745
|
+
stopText : "Stop", // Stop button text
|
746
|
+
forwardText : "»", // Link text used to move the slider forward (hidden by CSS, replaced with arrow image)
|
747
|
+
backText : "«", // Link text used to move the slider back (hidden by CSS, replace with arrow image)
|
748
|
+
tooltipClass : "tooltip", // Class added to navigation & start/stop button (text copied to title if it is hidden by a negative text indent)
|
749
|
+
|
750
|
+
// Function
|
751
|
+
enableArrows : true, // if false, arrows will be visible, but not clickable.
|
752
|
+
enableNavigation : true, // if false, navigation links will still be visible, but not clickable.
|
753
|
+
enableStartStop : true, // if false, the play/stop button will still be visible, but not clickable. Previously "enablePlay"
|
754
|
+
enableKeyboard : true, // if false, keyboard arrow keys will not work for this slider.
|
755
|
+
|
756
|
+
// Navigation
|
757
|
+
startPanel : 1, // This sets the initial panel
|
758
|
+
changeBy : 1, // Amount to go forward or back when changing panels.
|
759
|
+
hashTags : true, // Should links change the hashtag in the URL?
|
760
|
+
infiniteSlides : true, // if false, the slider will not wrap & not clone any panels
|
761
|
+
navigationFormatter : null, // Details at the top of the file on this use (advanced use)
|
762
|
+
navigationSize : false, // Set this to the maximum number of visible navigation tabs; false to disable
|
763
|
+
|
764
|
+
// Slideshow options
|
765
|
+
autoPlay : false, // If true, the slideshow will start running; replaces "startStopped" option
|
766
|
+
autoPlayLocked : false, // If true, user changing slides will not stop the slideshow
|
767
|
+
autoPlayDelayed : false, // If true, starting a slideshow will delay advancing slides; if false, the slider will immediately advance to the next slide when slideshow starts
|
768
|
+
pauseOnHover : true, // If true & the slideshow is active, the slideshow will pause on hover
|
769
|
+
stopAtEnd : false, // If true & the slideshow is active, the slideshow will stop on the last page. This also stops the rewind effect when infiniteSlides is false.
|
770
|
+
playRtl : false, // If true, the slideshow will move right-to-left
|
771
|
+
|
772
|
+
// Times
|
773
|
+
delay : 3000, // How long between slideshow transitions in AutoPlay mode (in milliseconds)
|
774
|
+
resumeDelay : 15000, // Resume slideshow after user interaction, only if autoplayLocked is true (in milliseconds).
|
775
|
+
animationTime : 600, // How long the slideshow transition takes (in milliseconds)
|
776
|
+
delayBeforeAnimate : 0, // How long to pause slide animation before going to the desired slide (used if you want your "out" FX to show).
|
777
|
+
|
778
|
+
/*
|
779
|
+
// Callbacks - commented out to reduce size of the minified version - they still work
|
780
|
+
onBeforeInitialize : function(e, slider) {}, // Callback before the plugin initializes
|
781
|
+
onInitialized : function(e, slider) {}, // Callback when the plugin finished initializing
|
782
|
+
onShowStart : function(e, slider) {}, // Callback on slideshow start
|
783
|
+
onShowStop : function(e, slider) {}, // Callback after slideshow stops
|
784
|
+
onShowPause : function(e, slider) {}, // Callback when slideshow pauses
|
785
|
+
onShowUnpause : function(e, slider) {}, // Callback when slideshow unpauses - may not trigger properly if user clicks on any controls
|
786
|
+
onSlideInit : function(e, slider) {}, // Callback when slide initiates, before control animation
|
787
|
+
onSlideBegin : function(e, slider) {}, // Callback before slide animates
|
788
|
+
onSlideComplete : function(slider) {}, // Callback when slide completes - no event variable!
|
789
|
+
*/
|
790
|
+
|
791
|
+
// Interactivity
|
792
|
+
clickForwardArrow : "click", // Event used to activate forward arrow functionality (e.g. add jQuery mobile's "swiperight")
|
793
|
+
clickBackArrow : "click", // Event used to activate back arrow functionality (e.g. add jQuery mobile's "swipeleft")
|
794
|
+
clickControls : "click focusin", // Events used to activate navigation control functionality
|
795
|
+
clickSlideshow : "click", // Event used to activate slideshow play/stop button
|
796
|
+
|
797
|
+
// Video
|
798
|
+
resumeOnVideoEnd : true, // If true & the slideshow is active & a supported video is playing, it will pause the autoplay until the video is complete
|
799
|
+
resumeOnVisible : true, // If true the video will resume playing (if previously paused, except for YouTube iframe - known issue); if false, the video remains paused.
|
800
|
+
addWmodeToObject : "opaque", // If your slider has an embedded object, the script will automatically add a wmode parameter with this setting
|
801
|
+
isVideoPlaying : function(base){ return false; } // return true if video is playing or false if not - used by video extension
|
802
|
+
|
803
|
+
};
|
804
|
+
|
805
|
+
$.fn.anythingSlider = function(options, callback) {
|
806
|
+
|
807
|
+
return this.each(function(){
|
808
|
+
var page, anySlide = $(this).data('AnythingSlider');
|
809
|
+
|
810
|
+
// initialize the slider but prevent multiple initializations
|
811
|
+
if ((typeof(options)).match('object|undefined')){
|
812
|
+
if (!anySlide) {
|
813
|
+
(new $.anythingSlider(this, options));
|
814
|
+
} else {
|
815
|
+
anySlide.updateSlider();
|
816
|
+
}
|
817
|
+
// If options is a number, process as an external link to page #: $(element).anythingSlider(#)
|
818
|
+
} else if (/\d/.test(options) && !isNaN(options) && anySlide) {
|
819
|
+
page = (typeof(options) === "number") ? options : parseInt($.trim(options),10); // accepts " 2 "
|
820
|
+
// ignore out of bound pages
|
821
|
+
if ( page >= 1 && page <= anySlide.pages ) {
|
822
|
+
anySlide.gotoPage(page, false, callback); // page #, autoplay, one time callback
|
823
|
+
}
|
824
|
+
// Accept id or class name
|
825
|
+
} else if (/^[#|.]/.test(options) && $(options).length) {
|
826
|
+
anySlide.gotoPage(options, false, callback);
|
827
|
+
}
|
828
|
+
});
|
829
|
+
};
|
830
|
+
|
831
|
+
})(jQuery);
|