anything-slider 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 43fc2fd7194a8809bce91250e5a9c3babcee6785
4
+ data.tar.gz: 9998b495b06c6eec39ec295214e7a431eace44e6
5
+ SHA512:
6
+ metadata.gz: 85886a7c0c63f6fbe25fad4a5c6fb2e941c22480bf2b1053b5c318cabd211929f58211b8ec1e603089306eec559e3d95da533a300e1332de8ccea0fb72ae5b92
7
+ data.tar.gz: 78e1792ebcf09ba12f31b71de4e70fe9165bffce6bc9f7fd747ca17677a94c505411fd4b51347e544bd11e82e37013af4a53a9398de59a5c4c015fb1953776a5
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in anything-slider.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Oscar Hugo Cardenas Lopez
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # Anything::Slider
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'anything-slider'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install anything-slider
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'anything/slider/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "anything-slider"
8
+ spec.version = Anything::Slider::VERSION
9
+ spec.authors = ["Oscar Hugo Cardenas Lopez"]
10
+ spec.email = ["ohcl87@hotmail.com"]
11
+ spec.description = %q{This is a personal gem to add anything slider efect in rails application}
12
+ spec.summary = %q{provide a rails genetator and easy to configure}
13
+ spec.homepage = "https://github.com/sorsucrel/anything-slider"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "haml"
24
+ end
@@ -0,0 +1,952 @@
1
+ /*!
2
+ AnythingSlider v1.9.2
3
+ Original by Chris Coyier: http://css-tricks.com
4
+ Get the latest version: https://github.com/CSS-Tricks/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
+ /*jshint browser:true, jquery:true, unused:false */
18
+ ;(function($, win, doc) {
19
+ "use strict";
20
+ $.anythingSlider = function(el, options) {
21
+
22
+ var base = this, o, t;
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
+ // Add "as-oldie" class to body for css purposes
41
+ $('<!--[if lte IE 8]><script>jQuery("body").addClass("as-oldie");</script><![endif]-->').appendTo('body').remove();
42
+
43
+ // Cache existing DOM elements for later
44
+ // base.$el = original ul
45
+ // for wrap - get parent() then closest in case the ul has "anythingSlider" class
46
+ base.$wrapper = base.$el.parent().closest('div.anythingSlider').addClass('anythingSlider-' + o.theme);
47
+ base.$outer = base.$wrapper.parent();
48
+ base.$window = base.$el.closest('div.anythingWindow');
49
+ base.$win = $(win);
50
+
51
+ base.$controls = $('<div class="anythingControls"></div>');
52
+ base.$nav = $('<ul class="thumbNav"><li><a><span></span></a></li></ul>');
53
+ base.$startStop = $('<a href="#" class="start-stop"></a>');
54
+
55
+ if (o.buildStartStop || o.buildNavigation) {
56
+ base.$controls.appendTo( (o.appendControlsTo && $(o.appendControlsTo).length) ? $(o.appendControlsTo) : base.$wrapper);
57
+ }
58
+ if (o.buildNavigation) {
59
+ base.$nav.appendTo( (o.appendNavigationTo && $(o.appendNavigationTo).length) ? $(o.appendNavigationTo) : base.$controls );
60
+ }
61
+ if (o.buildStartStop) {
62
+ base.$startStop.appendTo( (o.appendStartStopTo && $(o.appendStartStopTo).length) ? $(o.appendStartStopTo) : base.$controls );
63
+ }
64
+
65
+ // Figure out how many sliders are on the page for indexing
66
+ base.runTimes = $('.anythingBase').length;
67
+ // hash tag regex - fixes issue #432
68
+ base.regex = (o.hashTags) ? new RegExp('panel' + base.runTimes + '-(\\d+)', 'i') : null;
69
+ if (base.runTimes === 1) { base.makeActive(); } // make the first slider on the page active
70
+
71
+ // Set up a few defaults & get details
72
+ base.flag = false; // event flag to prevent multiple calls (used in control click/focusin)
73
+ if (o.autoPlayLocked) { o.autoPlay = true; } // if autoplay is locked, start playing
74
+ base.playing = o.autoPlay; // slideshow state; removed "startStopped" option
75
+ base.slideshow = false; // slideshow flag needed to correctly trigger slideshow events
76
+ base.hovered = false; // actively hovering over the slider
77
+ base.panelSize = []; // will contain dimensions and left position of each panel
78
+ base.currentPage = base.targetPage = o.startPanel = parseInt(o.startPanel,10) || 1; // make sure this isn't a string
79
+ o.changeBy = parseInt(o.changeBy,10) || 1;
80
+
81
+ // set slider type, but keep backward compatibility with the vertical option
82
+ t = (o.mode || 'h').toLowerCase().match(/(h|v|f)/);
83
+ t = o.vertical ? 'v' : (t || ['h'])[0];
84
+ o.mode = t === 'v' ? 'vertical' : t === 'f' ? 'fade' : 'horizontal';
85
+ if (t === 'f') {
86
+ o.showMultiple = 1; // all slides are stacked in fade mode
87
+ o.infiniteSlides = false; // no cloned slides
88
+ }
89
+
90
+ base.adj = (o.infiniteSlides) ? 0 : 1; // adjust page limits for infinite or limited modes
91
+ base.adjustMultiple = 0;
92
+ if (o.playRtl) { base.$wrapper.addClass('rtl'); }
93
+
94
+ // Build start/stop button
95
+ if (o.buildStartStop) { base.buildAutoPlay(); }
96
+
97
+ // Build forwards/backwards buttons
98
+ if (o.buildArrows) { base.buildNextBackButtons(); }
99
+
100
+ base.$lastPage = base.$targetPage = base.$currentPage;
101
+
102
+ base.updateSlider();
103
+
104
+ // Expand slider to fit parent
105
+ if (o.expand) {
106
+ base.$window.css({ width: '100%', height: '100%' }); // needed for Opera
107
+ base.checkResize();
108
+ }
109
+
110
+ // Make sure easing function exists.
111
+ if (!$.isFunction($.easing[o.easing])) { o.easing = "swing"; }
112
+
113
+ // If pauseOnHover then add hover effects
114
+ if (o.pauseOnHover) {
115
+ base.$wrapper.hover(function() {
116
+ if (base.playing) {
117
+ base.$el.trigger('slideshow_paused', base);
118
+ base.clearTimer(true);
119
+ }
120
+ }, function() {
121
+ if (base.playing) {
122
+ base.$el.trigger('slideshow_unpaused', base);
123
+ base.startStop(base.playing, true);
124
+ }
125
+ });
126
+ }
127
+
128
+ // Hide/Show navigation & play/stop controls
129
+ base.slideControls(false);
130
+ base.$wrapper.bind('mouseenter mouseleave', function(e){
131
+ // add hovered class to outer wrapper
132
+ $(this)[e.type === 'mouseenter' ? 'addClass' : 'removeClass']('anythingSlider-hovered');
133
+ base.hovered = (e.type === 'mouseenter') ? true : false;
134
+ base.slideControls(base.hovered);
135
+ });
136
+
137
+ // Add keyboard navigation
138
+ $(doc).keyup(function(e){
139
+ // Stop arrow keys from working when focused on form items
140
+ if (o.enableKeyboard && base.$wrapper.hasClass('activeSlider') && !e.target.tagName.match('TEXTAREA|INPUT|SELECT')) {
141
+ if (o.mode !== 'vertical' && (e.which === 38 || e.which === 40)) { return; }
142
+ switch (e.which) {
143
+ case 39: case 40: // right & down arrow
144
+ base.goForward();
145
+ break;
146
+ case 37: case 38: // left & up arrow
147
+ base.goBack();
148
+ break;
149
+ }
150
+ }
151
+ });
152
+
153
+ // If a hash can not be used to trigger the plugin, then go to start panel - see issue #432
154
+ base.currentPage = ((o.hashTags) ? base.gotoHash() : '') || o.startPanel || 1;
155
+ base.gotoPage(base.currentPage, false, null, -1);
156
+
157
+ // Binds events
158
+ var triggers = "slideshow_resized slideshow_paused slideshow_unpaused slide_init slide_begin slideshow_stop slideshow_start initialized swf_completed".split(" ");
159
+ $.each("onSliderResize onShowPause onShowUnpause onSlideInit onSlideBegin onShowStop onShowStart onInitialized onSWFComplete".split(" "), function(i,f){
160
+ if ($.isFunction(o[f])){
161
+ base.$el.bind(triggers[i], o[f]);
162
+ }
163
+ });
164
+ if ($.isFunction(o.onSlideComplete)){
165
+ // Added setTimeout (zero time) to ensure animation is complete... see this bug report: http://bugs.jquery.com/ticket/7157
166
+ base.$el.bind('slide_complete', function(){
167
+ setTimeout(function(){ o.onSlideComplete(base); }, 0);
168
+ return false;
169
+ });
170
+ }
171
+ base.initialized = true;
172
+ base.$el.trigger('initialized', base);
173
+
174
+ // trigger the slideshow
175
+ base.startStop(o.autoPlay);
176
+
177
+ };
178
+
179
+ // called during initialization & to update the slider if a panel is added or deleted
180
+ base.updateSlider = function(){
181
+ // needed for updating the slider
182
+ base.$el.children('.cloned').remove();
183
+ base.navTextVisible = base.$nav.find('span:first').css('visibility') !== 'hidden';
184
+ base.$nav.empty();
185
+ // set currentPage to 1 in case it was zero - occurs when adding slides after removing them all
186
+ base.currentPage = base.currentPage || 1;
187
+
188
+ base.$items = base.$el.children();
189
+ base.pages = base.$items.length;
190
+ base.dir = (o.mode === 'vertical') ? 'top' : 'left';
191
+ o.showMultiple = parseInt(o.showMultiple, 10) || 1; // only integers allowed
192
+ o.navigationSize = (o.navigationSize === false) ? 0 : parseInt(o.navigationSize,10) || 0;
193
+
194
+ // Fix tabbing through the page, but don't change the view if the link is in view (showMultiple = true)
195
+ base.$items.find('a').unbind('focus.AnythingSlider').bind('focus.AnythingSlider', function(e){
196
+ var panel = $(this).closest('.panel'),
197
+ indx = base.$items.index(panel) + base.adj; // index can be -1 in nested sliders - issue #208
198
+ base.$items.find('.focusedLink').removeClass('focusedLink');
199
+ $(this).addClass('focusedLink');
200
+ base.$window.scrollLeft(0).scrollTop(0);
201
+ if ( ( indx !== -1 && (indx >= base.currentPage + o.showMultiple || indx < base.currentPage) ) ) {
202
+ base.gotoPage(indx);
203
+ e.preventDefault();
204
+ }
205
+ });
206
+ if (o.showMultiple > 1) {
207
+ if (o.showMultiple > base.pages) { o.showMultiple = base.pages; }
208
+ base.adjustMultiple = (o.infiniteSlides && base.pages > 1) ? 0 : o.showMultiple - 1;
209
+ }
210
+
211
+ // Hide navigation & player if there is only one page
212
+ base.$controls
213
+ .add(base.$nav)
214
+ .add(base.$startStop)
215
+ .add(base.$forward)
216
+ .add(base.$back)[(base.pages <= 1) ? 'hide' : 'show']();
217
+ if (base.pages > 1) {
218
+ // Build/update navigation tabs
219
+ base.buildNavigation();
220
+ }
221
+
222
+ // Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
223
+ // This supports the "infinite" scrolling, also ensures any cloned elements don't duplicate an ID
224
+ // Moved removeAttr before addClass otherwise IE7 ignores the addClass: http://bugs.jquery.com/ticket/9871
225
+ if (o.mode !== 'fade' && o.infiniteSlides && base.pages > 1) {
226
+ base.$el.prepend( base.$items.filter(':last').clone().addClass('cloned') );
227
+ // Add support for multiple sliders shown at the same time
228
+ if (o.showMultiple > 1) {
229
+ base.$el.append( base.$items.filter(':lt(' + o.showMultiple + ')').clone().addClass('cloned multiple') );
230
+ } else {
231
+ base.$el.append( base.$items.filter(':first').clone().addClass('cloned') );
232
+ }
233
+ base.$el.find('.cloned').each(function(){
234
+ // disable all focusable elements in cloned panels to prevent shifting the panels by tabbing
235
+ $(this).find('a,input,textarea,select,button,area,form').attr({ disabled : 'disabled', name : '' });
236
+ $(this).find('[id]')[ $.fn.addBack ? 'addBack' : 'andSelf' ]().removeAttr('id');
237
+ });
238
+ }
239
+
240
+ // We just added two items, time to re-cache the list, then get the dimensions of each panel
241
+ base.$items = base.$el.addClass(o.mode).children().addClass('panel');
242
+ base.setDimensions();
243
+
244
+ // Set the dimensions of each panel
245
+ if (o.resizeContents) {
246
+ base.$items.css('width', base.width);
247
+ base.$wrapper
248
+ .css('width', base.getDim(base.currentPage)[0])
249
+ .add(base.$items).css('height', base.height);
250
+ } else {
251
+ base.$win.load(function(){
252
+ // set dimensions after all images load
253
+ base.setDimensions();
254
+ // make sure the outer wrapper is set properly
255
+ t = base.getDim(base.currentPage);
256
+ base.$wrapper.css({ width: t[0], height: t[1] });
257
+ base.setCurrentPage(base.currentPage, false);
258
+ });
259
+ }
260
+
261
+ if (base.currentPage > base.pages) {
262
+ base.currentPage = base.pages;
263
+ }
264
+ base.setCurrentPage(base.currentPage, false);
265
+ base.$nav.find('a').eq(base.currentPage - 1).addClass('cur'); // update current selection
266
+
267
+ if (o.mode === 'fade') {
268
+ t = base.$items.eq(base.currentPage-1);
269
+ if (o.resumeOnVisible) {
270
+ // prevent display: none;
271
+ t.css({ opacity: 1 }).siblings().css({ opacity: 0 });
272
+ } else {
273
+ // allow display: none; - resets video
274
+ base.$items.css('opacity',1);
275
+ t.fadeIn(0).siblings().fadeOut(0);
276
+ }
277
+ }
278
+
279
+ };
280
+
281
+ // Creates the numbered navigation links
282
+ base.buildNavigation = function() {
283
+ if (o.buildNavigation && (base.pages > 1)) {
284
+ var a, c, i, t, $li;
285
+ base.$items.filter(':not(.cloned)').each(function(j){
286
+ $li = $('<li/>');
287
+ i = j + 1;
288
+ c = (i === 1 ? ' first' : '') + (i === base.pages ? ' last' : '');
289
+ a = '<a class="panel' + i + ( base.navTextVisible ? '"' : ' ' + o.tooltipClass + '" title="@"' ) + ' href="#"><span>@</span></a>';
290
+ // If a formatter function is present, use it
291
+ if ($.isFunction(o.navigationFormatter)) {
292
+ t = o.navigationFormatter(i, $(this));
293
+ if (typeof(t) === "string") {
294
+ $li.html(a.replace(/@/g,t));
295
+ } else {
296
+ $li = $('<li/>', t);
297
+ }
298
+ } else {
299
+ $li.html(a.replace(/@/g,i));
300
+ }
301
+ $li
302
+ .appendTo(base.$nav)
303
+ .addClass(c)
304
+ .data('index', i);
305
+ });
306
+ base.$nav.children('li').bind(o.clickControls, function(e) {
307
+ if (!base.flag && o.enableNavigation) {
308
+ // prevent running functions twice (once for click, second time for focusin)
309
+ base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
310
+ base.gotoPage( $(this).data('index') );
311
+ }
312
+ e.preventDefault();
313
+ });
314
+
315
+ // Add navigation tab scrolling - use !! in case someone sets the size to zero
316
+ if (!!o.navigationSize && o.navigationSize < base.pages) {
317
+ if (!base.$controls.find('.anythingNavWindow').length){
318
+ base.$nav
319
+ .before('<ul><li class="prev"><a href="#"><span>' + o.backText + '</span></a></li></ul>')
320
+ .after('<ul><li class="next"><a href="#"><span>' + o.forwardText + '</span></a></li></ul>')
321
+ .wrap('<div class="anythingNavWindow"></div>');
322
+ }
323
+ // include half of the left position to include extra width from themes like tabs-light and tabs-dark (still not perfect)
324
+ base.navWidths = base.$nav.find('li').map(function(){
325
+ return $(this).outerWidth(true) + Math.ceil(parseInt($(this).find('span').css('left'),10)/2 || 0);
326
+ }).get();
327
+ base.navLeft = base.currentPage;
328
+ // add 25 pixels (old IE needs more than 5) to make sure the tabs don't wrap to the next line
329
+ base.$nav.width( base.navWidth( 1, base.pages + 1 ) + 25 );
330
+ base.$controls.find('.anythingNavWindow')
331
+ .width( base.navWidth( 1, o.navigationSize + 1 ) ).end()
332
+ .find('.prev,.next').bind(o.clickControls, function(e) {
333
+ if (!base.flag) {
334
+ base.flag = true; setTimeout(function(){ base.flag = false; }, 200);
335
+ base.navWindow( base.navLeft + o.navigationSize * ( $(this).is('.prev') ? -1 : 1 ) );
336
+ }
337
+ e.preventDefault();
338
+ });
339
+ }
340
+
341
+ }
342
+ };
343
+
344
+ base.navWidth = function(x,y){
345
+ var i, s = Math.min(x,y),
346
+ e = Math.max(x,y),
347
+ w = 0;
348
+ for (i = s; i < e; i++) {
349
+ w += base.navWidths[i-1] || 0;
350
+ }
351
+ return w;
352
+ };
353
+
354
+ base.navWindow = function(n){
355
+ if (!!o.navigationSize && o.navigationSize < base.pages && base.navWidths) {
356
+ var p = base.pages - o.navigationSize + 1;
357
+ n = (n <= 1) ? 1 : (n > 1 && n < p) ? n : p;
358
+ if (n !== base.navLeft) {
359
+ base.$controls.find('.anythingNavWindow').animate(
360
+ { scrollLeft: base.navWidth(1, n), width: base.navWidth(n, n + o.navigationSize) },
361
+ { queue: false, duration: o.animationTime });
362
+ base.navLeft = n;
363
+ }
364
+ }
365
+ };
366
+
367
+ // Creates the Forward/Backward buttons
368
+ base.buildNextBackButtons = function() {
369
+ base.$forward = $('<span class="arrow forward"><a href="#"><span>' + o.forwardText + '</span></a></span>');
370
+ base.$back = $('<span class="arrow back"><a href="#"><span>' + o.backText + '</span></a></span>');
371
+
372
+ // Bind to the forward and back buttons
373
+ base.$back.bind(o.clickBackArrow, function(e) {
374
+ // prevent running functions twice (once for click, second time for swipe)
375
+ if (o.enableArrows && !base.flag) {
376
+ base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
377
+ base.goBack();
378
+ }
379
+ e.preventDefault();
380
+ });
381
+ base.$forward.bind(o.clickForwardArrow, function(e) {
382
+ // prevent running functions twice (once for click, second time for swipe)
383
+ if (o.enableArrows && !base.flag) {
384
+ base.flag = true; setTimeout(function(){ base.flag = false; }, 100);
385
+ base.goForward();
386
+ }
387
+ e.preventDefault();
388
+ });
389
+ // using tab to get to arrow links will show they have focus (outline is disabled in css)
390
+ base.$back.add(base.$forward).find('a').bind('focusin focusout',function(){
391
+ $(this).toggleClass('hover');
392
+ });
393
+
394
+ // Append elements to page
395
+ base.$back.appendTo( (o.appendBackTo && $(o.appendBackTo).length) ? $(o.appendBackTo) : base.$wrapper );
396
+ base.$forward.appendTo( (o.appendForwardTo && $(o.appendForwardTo).length) ? $(o.appendForwardTo) : base.$wrapper );
397
+
398
+ base.arrowWidth = base.$forward.width(); // assuming the left & right arrows are the same width - used for toggle
399
+ base.arrowRight = parseInt(base.$forward.css('right'), 10);
400
+ base.arrowLeft = parseInt(base.$back.css('left'), 10);
401
+
402
+ };
403
+
404
+ // Creates the Start/Stop button
405
+ base.buildAutoPlay = function(){
406
+ base.$startStop
407
+ .html('<span>' + (base.playing ? o.stopText : o.startText) + '</span>')
408
+ .bind(o.clickSlideshow, function(e) {
409
+ if (o.enableStartStop) {
410
+ base.startStop(!base.playing);
411
+ base.makeActive();
412
+ if (base.playing && !o.autoPlayDelayed) {
413
+ base.goForward(true, o.playRtl);
414
+ }
415
+ }
416
+ e.preventDefault();
417
+ })
418
+ // show button has focus while tabbing
419
+ .bind('focusin focusout',function(){
420
+ $(this).toggleClass('hover');
421
+ });
422
+ };
423
+
424
+ // Adjust slider dimensions on parent element resize
425
+ base.checkResize = function(stopTimer){
426
+ // checking document visibility -
427
+ var vis = !!(doc.hidden || doc.webkitHidden || doc.mozHidden || doc.msHidden);
428
+ clearTimeout(base.resizeTimer);
429
+ base.resizeTimer = setTimeout(function(){
430
+ var w = base.$outer.width(),
431
+ h = base.$outer[0].tagName === "BODY" ? base.$win.height() : base.$outer.height();
432
+ // base.width = width of one panel, so multiply by # of panels; outerPad is padding added for arrows.
433
+ // ignore changes if window hidden
434
+ if (!vis && (base.lastDim[0] !== w || base.lastDim[1] !== h)) {
435
+
436
+ base.setDimensions(); // adjust panel sizes
437
+
438
+ //callback for slider resize
439
+ base.$el.trigger('slideshow_resized', base);
440
+
441
+ // make sure page is lined up (use -1 animation time, so we can differeniate it from when animationTime = 0)
442
+ base.gotoPage(base.currentPage, base.playing, null, -1);
443
+
444
+ }
445
+ if (typeof(stopTimer) === 'undefined'){ base.checkResize(); }
446
+
447
+ // increase time if page is hidden; but don't stop it completely
448
+ }, vis ? 2000 : 500);
449
+ };
450
+
451
+ // Set panel dimensions to either resize content or adjust panel to content
452
+ base.setDimensions = function(){
453
+
454
+ // reset element width & height
455
+ base.$wrapper.find('.anythingWindow, .anythingBase, .panel')[ $.fn.addBack ? 'addBack' : 'andSelf' ]().css({ width: '', height: '' });
456
+ base.width = base.$el.width();
457
+ base.height = base.$el.height();
458
+ base.outerPad = [ base.$wrapper.innerWidth() - base.$wrapper.width(), base.$wrapper.innerHeight() - base.$wrapper.height() ];
459
+ var w, h, c, t, edge = 0,
460
+ fullsize = { width: '100%', height: '100%' },
461
+ // determine panel width
462
+ pw = (o.showMultiple > 1 && o.mode === 'horizontal') ? base.width || base.$window.width()/o.showMultiple : base.$window.width(),
463
+ ph = (o.showMultiple > 1 && o.mode === 'vertical') ? base.height/o.showMultiple || base.$window.height()/o.showMultiple : base.$window.height();
464
+ if (o.expand){
465
+ base.lastDim = [ base.$outer.width(), base.$outer.height() ];
466
+ w = base.lastDim[0] - base.outerPad[0];
467
+ h = base.lastDim[1] - base.outerPad[1];
468
+ base.$wrapper.add(base.$window).css({ width: w, height: h });
469
+ base.height = h = (o.showMultiple > 1 && o.mode === 'vertical') ? ph : h;
470
+ base.width = pw = (o.showMultiple > 1 && o.mode === 'horizontal') ? w/o.showMultiple : w;
471
+ base.$items.css({ width: pw, height: ph });
472
+ }
473
+ base.$items.each(function(i){
474
+ t = $(this);
475
+ c = t.children();
476
+ if (o.resizeContents){
477
+ // resize panel
478
+ w = base.width;
479
+ h = base.height;
480
+ t.css({ width: w, height: h });
481
+ if (c.length) {
482
+ if (c[0].tagName === "EMBED") { c.attr(fullsize); } // needed for IE7; also c.length > 1 in IE7
483
+ if (c[0].tagName === "OBJECT") { c.find('embed').attr(fullsize); }
484
+ // resize panel contents, if solitary (wrapped content or solitary image)
485
+ if (c.length === 1){ c.css(fullsize); }
486
+ }
487
+ } else {
488
+ // get panel width & height and save it
489
+ if (o.mode === 'vertical') {
490
+ w = t.css('display','inline-block').width();
491
+ t.css('display','');
492
+ } else {
493
+ w = t.width() || base.width; // if image hasn't finished loading, width will be zero, so set it to base width instead
494
+ }
495
+ if (c.length === 1 && w >= pw){
496
+ w = (c.width() >= pw) ? pw : c.width(); // get width of solitary child
497
+ c.css('max-width', w); // set max width for all children
498
+ }
499
+ t.css({ width: w, height: '' }); // set width of panel
500
+ h = (c.length === 1 ? c.outerHeight(true) : t.height()); // get height after setting width
501
+ if (h <= base.outerPad[1]) { h = base.height; } // if height less than the outside padding, then set it to the preset height
502
+ t.css('height', h);
503
+ }
504
+ base.panelSize[i] = [w,h,edge];
505
+ edge += (o.mode === 'vertical') ? h : w;
506
+ });
507
+ // Set total width of slider
508
+ base.$el.css((o.mode === 'vertical' ? 'height' : 'width'), o.mode === 'fade' ? base.width : edge );
509
+ };
510
+
511
+ // get dimension of multiple panels, as needed
512
+ base.getDim = function(page){
513
+ var t, i, w = base.width, h = base.height;
514
+ if (base.pages < 1 || isNaN(page)) { return [ w, h ]; } // prevent errors when base.panelSize is empty
515
+ page = (o.infiniteSlides && base.pages > 1) ? page : page - 1;
516
+ i = base.panelSize[page];
517
+ if (i) {
518
+ w = i[0] || w;
519
+ h = i[1] || h;
520
+ }
521
+ if (o.showMultiple > 1) {
522
+ for (i = 1; i < o.showMultiple; i++) {
523
+ t = page + i;
524
+ if (o.mode === 'vertical') {
525
+ w = Math.max(w, base.panelSize[t][0]);
526
+ h += base.panelSize[t][1];
527
+ } else {
528
+ w += base.panelSize[t][0];
529
+ h = Math.max(h, base.panelSize[t][1]);
530
+ }
531
+ }
532
+ }
533
+ return [w,h];
534
+ };
535
+
536
+ base.goForward = function(autoplay, rtl) {
537
+ // targetPage changes before animation so if rapidly changing pages, it will have the correct current page
538
+ base.gotoPage(base[ o.allowRapidChange ? 'targetPage' : 'currentPage'] + o.changeBy * (rtl ? -1 : 1), autoplay);
539
+ };
540
+
541
+ base.goBack = function(autoplay) {
542
+ base.gotoPage(base[ o.allowRapidChange ? 'targetPage' : 'currentPage'] - o.changeBy, autoplay);
543
+ };
544
+
545
+ base.gotoPage = function(page, autoplay, callback, time) {
546
+ if (autoplay !== true) {
547
+ autoplay = false;
548
+ base.startStop(false);
549
+ base.makeActive();
550
+ }
551
+ // check if page is an id or class name
552
+ if (/^[#|.]/.test(page) && $(page).length) {
553
+ page = $(page).closest('.panel').index() + base.adj;
554
+ }
555
+
556
+ // rewind effect occurs here when changeBy > 1
557
+ if (o.changeBy !== 1){
558
+ var adj = base.pages - base.adjustMultiple;
559
+ if (page < 1) {
560
+ page = o.stopAtEnd ? 1 : ( o.infiniteSlides ? base.pages + page : ( o.showMultiple > 1 - page ? 1 : adj ) );
561
+ }
562
+ if (page > base.pages) {
563
+ page = o.stopAtEnd ? base.pages : ( o.showMultiple > 1 - page ? 1 : page -= adj );
564
+ } else if (page >= adj) {
565
+ // show multiple adjustments
566
+ page = adj;
567
+ }
568
+ }
569
+
570
+ if (base.pages <= 1) { return; } // prevents animation
571
+ base.$lastPage = base.$currentPage;
572
+ if (typeof(page) !== "number") {
573
+ page = parseInt(page,10) || o.startPanel;
574
+ base.setCurrentPage(page);
575
+ }
576
+
577
+ // pause YouTube videos before scrolling or prevent change if playing
578
+ if (autoplay && o.isVideoPlaying(base)) { return; }
579
+ if (o.stopAtEnd && !o.infiniteSlides && page > base.pages - o.showMultiple) { page = base.pages - o.showMultiple + 1; } // fixes #515
580
+ base.exactPage = page;
581
+ if (page > base.pages + 1 - base.adj) { page = (!o.infiniteSlides && !o.stopAtEnd) ? 1 : base.pages; }
582
+ if (page < base.adj ) { page = (!o.infiniteSlides && !o.stopAtEnd) ? base.pages : 1; }
583
+ if (!o.infiniteSlides) { base.exactPage = page; } // exact page used by the fx extension
584
+ base.currentPage = ( page > base.pages ) ? base.pages : ( page < 1 ) ? 1 : base.currentPage;
585
+ base.$currentPage = base.$items.eq(base.currentPage - base.adj);
586
+ base.targetPage = (page === 0) ? base.pages : (page > base.pages) ? 1 : page;
587
+ base.$targetPage = base.$items.eq(base.targetPage - base.adj);
588
+ time = typeof time !== 'undefined' ? time : o.animationTime;
589
+ // don't trigger events when time < 0 - to prevent FX from firing multiple times on page resize
590
+ if (time >= 0) { base.$el.trigger('slide_init', base); }
591
+ // toggle arrows/controls only if there is time to see it - fix issue #317
592
+ if (time > 0) { base.slideControls(true); }
593
+
594
+ // Set visual
595
+ if (o.buildNavigation){
596
+ base.setNavigation(base.targetPage);
597
+ }
598
+
599
+ // When autoplay isn't passed, we stop the timer
600
+ if (autoplay !== true) { autoplay = false; }
601
+ // Stop the slider when we reach the last page, if the option stopAtEnd is set to true
602
+ if (!autoplay || (o.stopAtEnd && page === base.pages)) { base.startStop(false); }
603
+
604
+ if (time >= 0) { base.$el.trigger('slide_begin', base); }
605
+
606
+ // delay starting slide animation
607
+ setTimeout(function(d){
608
+ var t, p, empty = true;
609
+ if (o.allowRapidChange) {
610
+ base.$wrapper.add(base.$el).add(base.$items).stop(true, true);
611
+ }
612
+ // resize slider if content size varies
613
+ if (!o.resizeContents) {
614
+ // animating the wrapper resize before the window prevents flickering in Firefox
615
+ // don't animate the dimension if it hasn't changed - fix for issue #264
616
+ p = base.getDim(page); d = {};
617
+ // prevent animating a dimension to zero
618
+ if (base.$wrapper.width() !== p[0]) { d.width = p[0] || base.width; empty = false; }
619
+ if (base.$wrapper.height() !== p[1]) { d.height = p[1] || base.height; empty = false; }
620
+ if (!empty) {
621
+ base.$wrapper.filter(':not(:animated)').animate(d, { queue: false, duration: (time < 0 ? 0 : time), easing: o.easing });
622
+ }
623
+ }
624
+
625
+ if (o.mode === 'fade') {
626
+ if (base.$lastPage[0] !== base.$targetPage[0]) {
627
+ base.fadeIt( base.$lastPage, 0, time );
628
+ base.fadeIt( base.$targetPage, 1, time, function(){ base.endAnimation(page, callback, time); });
629
+ } else {
630
+ base.endAnimation(page, callback, time);
631
+ }
632
+ } else {
633
+ d = {};
634
+ d[base.dir] = -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2];
635
+ // resize width of base element (ul) if vertical & width of content varies
636
+ if (o.mode === 'vertical' && !o.resizeContents) { d.width = p[0]; }
637
+ // Animate Slider
638
+ base.$el.filter(':not(:animated)').animate(
639
+ d, { queue: false, duration: time < 0 ? 0 : time, easing: o.easing, complete: function(){ base.endAnimation(page, callback, time); } }
640
+ );
641
+ }
642
+ }, parseInt(o.delayBeforeAnimate, 10) || 0);
643
+ };
644
+
645
+ base.endAnimation = function(page, callback, time){
646
+ if (page === 0) {
647
+ base.$el.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[base.pages][2]);
648
+ page = base.pages;
649
+ } else if (page > base.pages) {
650
+ // reset back to start position
651
+ base.$el.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[1][2]);
652
+ page = 1;
653
+ }
654
+ base.exactPage = page;
655
+ base.setCurrentPage(page, false);
656
+
657
+ if (o.mode === 'fade') {
658
+ // make sure non current panels are hidden (rapid slide changes)
659
+ base.fadeIt( base.$items.not(':eq(' + (page - base.adj) + ')'), 0, 0);
660
+ }
661
+
662
+ if (!base.hovered) { base.slideControls(false); }
663
+
664
+ if (o.hashTags) { base.setHash(page); }
665
+
666
+ if (time >= 0) { base.$el.trigger('slide_complete', base); }
667
+ // callback from external slide control: $('#slider').anythingSlider(4, function(slider){ })
668
+ if (typeof callback === 'function') { callback(base); }
669
+
670
+ // Continue slideshow after a delay
671
+ if (o.autoPlayLocked && !base.playing) {
672
+ setTimeout(function(){
673
+ base.startStop(true);
674
+ // subtract out slide delay as the slideshow waits that additional time.
675
+ }, o.resumeDelay - (o.autoPlayDelayed ? o.delay : 0));
676
+ }
677
+ };
678
+
679
+ base.fadeIt = function(el, toOpacity, time, callback){
680
+ var t = time < 0 ? 0 : time;
681
+ if (o.resumeOnVisible) {
682
+ el.filter(':not(:animated)').fadeTo(t, toOpacity, callback);
683
+ } else {
684
+ el.filter(':not(:animated)')[ toOpacity === 0 ? 'fadeOut' : 'fadeIn' ](t, callback);
685
+ }
686
+ };
687
+
688
+ base.setCurrentPage = function(page, move) {
689
+ page = parseInt(page, 10);
690
+
691
+ if (base.pages < 1 || page === 0 || isNaN(page)) { return; }
692
+ if (page > base.pages + 1 - base.adj) { page = base.pages - base.adj; }
693
+ if (page < base.adj ) { page = 1; }
694
+
695
+ // hide/show arrows based on infinite scroll mode
696
+ if (o.buildArrows && !o.infiniteSlides && o.stopAtEnd){
697
+ base.$forward[ page === base.pages - base.adjustMultiple ? 'addClass' : 'removeClass']('disabled');
698
+ base.$back[ page === 1 ? 'addClass' : 'removeClass']('disabled');
699
+ if (page === base.pages && base.playing) { base.startStop(); }
700
+ }
701
+
702
+ // Only change left if move does not equal false
703
+ if (!move) {
704
+ var d = base.getDim(page);
705
+ base.$wrapper
706
+ .css({ width: d[0], height: d[1] })
707
+ .add(base.$window).scrollLeft(0).scrollTop(0); // reset in case tabbing changed this scrollLeft - probably overly redundant
708
+ base.$el.css( base.dir, o.mode === 'fade' ? 0 : -base.panelSize[(o.infiniteSlides && base.pages > 1) ? page : page - 1][2] );
709
+ }
710
+
711
+ // Update local variable
712
+ base.currentPage = page;
713
+ base.$currentPage = base.$items.removeClass('activePage').eq(page - base.adj).addClass('activePage');
714
+
715
+ if (o.buildNavigation){
716
+ base.setNavigation(page);
717
+ }
718
+
719
+ };
720
+
721
+ base.setNavigation = function(page){
722
+ base.$nav
723
+ .find('.cur').removeClass('cur').end()
724
+ .find('a').eq(page - 1).addClass('cur');
725
+ };
726
+
727
+ base.makeActive = function(){
728
+ // Set current slider as active so keyboard navigation works properly
729
+ if (!base.$wrapper.hasClass('activeSlider')){
730
+ $('.activeSlider').removeClass('activeSlider');
731
+ base.$wrapper.addClass('activeSlider');
732
+ }
733
+ };
734
+
735
+ // This method tries to find a hash that matches an ID and panel-X
736
+ // If either found, it tries to find a matching item
737
+ // If that is found as well, then it returns the page number
738
+ base.gotoHash = function(){
739
+ var h = win.location.hash,
740
+ i = h.indexOf('&'),
741
+ n = h.match(base.regex);
742
+ // test for "/#/" or "/#!/" used by the jquery address plugin - $('#/') breaks jQuery
743
+ if (n === null && !/^#&/.test(h) && !/#!?\//.test(h) && !/\=/.test(h)) {
744
+ // #quote2&panel1-3&panel3-3
745
+ h = h.substring(0, (i >= 0 ? i : h.length));
746
+ // ensure the element is in the same slider
747
+ n = ($(h).length && $(h).closest('.anythingBase')[0] === base.el) ? base.$items.index($(h).closest('.panel')) + base.adj : null;
748
+ } else if (n !== null) {
749
+ // #&panel1-3&panel3-3
750
+ n = (o.hashTags) ? parseInt(n[1],10) : null;
751
+ }
752
+ return n;
753
+ };
754
+
755
+ base.setHash = function(n){
756
+ var s = 'panel' + base.runTimes + '-',
757
+ h = win.location.hash;
758
+ if ( typeof h !== 'undefined' ) {
759
+ win.location.hash = (h.indexOf(s) > 0) ? h.replace(base.regex, s + n) : h + "&" + s + n;
760
+ }
761
+ };
762
+
763
+ // Slide controls (nav and play/stop button up or down)
764
+ base.slideControls = function(toggle){
765
+ var dir = (toggle) ? 'slideDown' : 'slideUp',
766
+ t1 = (toggle) ? 0 : o.animationTime,
767
+ t2 = (toggle) ? o.animationTime : 0,
768
+ op = (toggle) ? 1 : 0,
769
+ sign = (toggle) ? 0 : 1; // 0 = visible, 1 = hidden
770
+ if (o.toggleControls) {
771
+ base.$controls.stop(true,true).delay(t1)[dir](o.animationTime/2).delay(t2);
772
+ }
773
+ if (o.buildArrows && o.toggleArrows) {
774
+ if (!base.hovered && base.playing) { sign = 1; op = 0; } // don't animate arrows during slideshow
775
+ base.$forward.stop(true,true).delay(t1).animate({ right: base.arrowRight + (sign * base.arrowWidth), opacity: op }, o.animationTime/2);
776
+ base.$back.stop(true,true).delay(t1).animate({ left: base.arrowLeft + (sign * base.arrowWidth), opacity: op }, o.animationTime/2);
777
+ }
778
+ };
779
+
780
+ base.clearTimer = function(paused){
781
+ // Clear the timer only if it is set
782
+ if (base.timer) {
783
+ win.clearInterval(base.timer);
784
+ if (!paused && base.slideshow) {
785
+ base.$el.trigger('slideshow_stop', base);
786
+ base.slideshow = false;
787
+ }
788
+ }
789
+ };
790
+
791
+ // Pass startStop(false) to stop and startStop(true) to play
792
+ base.startStop = function(playing, paused) {
793
+ if (playing !== true) { playing = false; } // Default if not supplied is false
794
+ base.playing = playing;
795
+
796
+ if (playing && !paused) {
797
+ base.$el.trigger('slideshow_start', base);
798
+ base.slideshow = true;
799
+ }
800
+
801
+ // Toggle playing and text
802
+ if (o.buildStartStop) {
803
+ base.$startStop.toggleClass('playing', playing).find('span').html( playing ? o.stopText : o.startText );
804
+ // add button text to title attribute if it is hidden by text-indent
805
+ if ( base.$startStop.find('span').css('visibility') === "hidden" ) {
806
+ base.$startStop.addClass(o.tooltipClass).attr( 'title', playing ? o.stopText : o.startText );
807
+ }
808
+ }
809
+
810
+ // Pause slideshow while video is playing
811
+ if (playing){
812
+ base.clearTimer(true); // Just in case this was triggered twice in a row
813
+ base.timer = win.setInterval(function() {
814
+ if ( !!(doc.hidden || doc.webkitHidden || doc.mozHidden || doc.msHidden) ) {
815
+ // stop slideshow if the page isn't visible (issue #463)
816
+ if (!o.autoPlayLocked) {
817
+ base.startStop();
818
+ }
819
+ } else if ( !o.isVideoPlaying(base) ) {
820
+ // prevent autoplay if video is playing
821
+ base.goForward(true, o.playRtl);
822
+ } else if (!o.resumeOnVideoEnd) {
823
+ // stop slideshow if resume if false
824
+ base.startStop();
825
+ }
826
+ }, o.delay);
827
+ } else {
828
+ base.clearTimer();
829
+ }
830
+ };
831
+
832
+ // Trigger the initialization
833
+ base.init();
834
+ };
835
+
836
+ $.anythingSlider.defaults = {
837
+ // Appearance
838
+ theme : "default", // Theme name, add the css stylesheet manually
839
+ mode : "horiz", // Set mode to "horizontal", "vertical" or "fade" (only first letter needed); replaces vertical option
840
+ expand : false, // If true, the entire slider will expand to fit the parent element
841
+ resizeContents : true, // If true, solitary images/objects in the panel will expand to fit the viewport
842
+ showMultiple : false, // Set this value to a number and it will show that many slides at once
843
+ easing : "swing", // Anything other than "linear" or "swing" requires the easing plugin or jQuery UI
844
+
845
+ buildArrows : true, // If true, builds the forwards and backwards buttons
846
+ buildNavigation : true, // If true, builds a list of anchor links to link to each panel
847
+ buildStartStop : true, // ** If true, builds the start/stop button
848
+
849
+ /*
850
+ // commented out as this will reduce the size of the minified version
851
+ appendForwardTo : null, // Append forward arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null
852
+ appendBackTo : null, // Append back arrow to a HTML element (jQuery Object, selector or HTMLNode), if not null
853
+ appendControlsTo : null, // Append controls (navigation + start-stop) to a HTML element (jQuery Object, selector or HTMLNode), if not null
854
+ appendNavigationTo : null, // Append navigation buttons to a HTML element (jQuery Object, selector or HTMLNode), if not null
855
+ appendStartStopTo : null, // Append start-stop button to a HTML element (jQuery Object, selector or HTMLNode), if not null
856
+ */
857
+
858
+ toggleArrows : false, // If true, side navigation arrows will slide out on hovering & hide @ other times
859
+ toggleControls : false, // if true, slide in controls (navigation + play/stop button) on hover and slide change, hide @ other times
860
+
861
+ startText : "Start", // Start button text
862
+ stopText : "Stop", // Stop button text
863
+ forwardText : "&raquo;", // Link text used to move the slider forward (hidden by CSS, replaced with arrow image)
864
+ backText : "&laquo;", // Link text used to move the slider back (hidden by CSS, replace with arrow image)
865
+ tooltipClass : "tooltip", // Class added to navigation & start/stop button (text copied to title if it is hidden by a negative text indent)
866
+
867
+ // Function
868
+ enableArrows : true, // if false, arrows will be visible, but not clickable.
869
+ enableNavigation : true, // if false, navigation links will still be visible, but not clickable.
870
+ enableStartStop : true, // if false, the play/stop button will still be visible, but not clickable. Previously "enablePlay"
871
+ enableKeyboard : true, // if false, keyboard arrow keys will not work for this slider.
872
+
873
+ // Navigation
874
+ startPanel : 1, // This sets the initial panel
875
+ changeBy : 1, // Amount to go forward or back when changing panels.
876
+ hashTags : true, // Should links change the hashtag in the URL?
877
+ infiniteSlides : true, // if false, the slider will not wrap & not clone any panels
878
+ navigationFormatter : null, // Details at the top of the file on this use (advanced use)
879
+ navigationSize : false, // Set this to the maximum number of visible navigation tabs; false to disable
880
+
881
+ // Slideshow options
882
+ autoPlay : false, // If true, the slideshow will start running; replaces "startStopped" option
883
+ autoPlayLocked : false, // If true, user changing slides will not stop the slideshow
884
+ 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
885
+ pauseOnHover : true, // If true & the slideshow is active, the slideshow will pause on hover
886
+ 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.
887
+ playRtl : false, // If true, the slideshow will move right-to-left
888
+
889
+ // Times
890
+ delay : 3000, // How long between slideshow transitions in AutoPlay mode (in milliseconds)
891
+ resumeDelay : 15000, // Resume slideshow after user interaction, only if autoplayLocked is true (in milliseconds).
892
+ animationTime : 600, // How long the slideshow transition takes (in milliseconds)
893
+ delayBeforeAnimate : 0, // How long to pause slide animation before going to the desired slide (used if you want your "out" FX to show).
894
+
895
+ /*
896
+ // Callbacks - commented out to reduce size of the minified version - they still work
897
+ onSliderResize : function(e, slider) {}, // Callback when slider resizes
898
+ onBeforeInitialize : function(e, slider) {}, // Callback before the plugin initializes
899
+ onInitialized : function(e, slider) {}, // Callback when the plugin finished initializing
900
+ onShowStart : function(e, slider) {}, // Callback on slideshow start
901
+ onShowStop : function(e, slider) {}, // Callback after slideshow stops
902
+ onShowPause : function(e, slider) {}, // Callback when slideshow pauses
903
+ onShowUnpause : function(e, slider) {}, // Callback when slideshow unpauses - may not trigger properly if user clicks on any controls
904
+ onSlideInit : function(e, slider) {}, // Callback when slide initiates, before control animation
905
+ onSlideBegin : function(e, slider) {}, // Callback before slide animates
906
+ onSlideComplete : function(slider) {}, // Callback when slide completes - no event variable!
907
+ */
908
+
909
+ // Interactivity
910
+ clickForwardArrow : "click", // Event used to activate forward arrow functionality (e.g. add jQuery mobile's "swiperight")
911
+ clickBackArrow : "click", // Event used to activate back arrow functionality (e.g. add jQuery mobile's "swipeleft")
912
+ clickControls : "click focusin", // Events used to activate navigation control functionality
913
+ clickSlideshow : "click", // Event used to activate slideshow play/stop button
914
+ allowRapidChange : false, // If true, allow rapid changing of the active pane, instead of ignoring activity during animation
915
+
916
+ // Video
917
+ resumeOnVideoEnd : true, // If true & the slideshow is active & a supported video is playing, it will pause the autoplay until the video is complete
918
+ resumeOnVisible : true, // If true the video will resume playing, if previously paused; if false, the video remains paused.
919
+ isVideoPlaying : function(base){ return false; } // return true if video is playing or false if not - used by video extension
920
+
921
+ // deprecated - use the video extension wmode option now
922
+ // addWmodeToObject : "opaque" // If your slider has a video supported by the extension, the script will automatically add a wmode parameter with this setting
923
+
924
+ };
925
+
926
+ $.fn.anythingSlider = function(options, callback) {
927
+
928
+ return this.each(function(){
929
+ var page, anySlide = $(this).data('AnythingSlider');
930
+
931
+ // initialize the slider but prevent multiple initializations
932
+ if ((typeof(options)).match('object|undefined')){
933
+ if (!anySlide) {
934
+ (new $.anythingSlider(this, options));
935
+ } else {
936
+ anySlide.updateSlider();
937
+ }
938
+ // If options is a number, process as an external link to page #: $(element).anythingSlider(#)
939
+ } else if (/\d/.test(options) && !isNaN(options) && anySlide) {
940
+ page = (typeof(options) === "number") ? options : parseInt($.trim(options),10); // accepts " 2 "
941
+ // ignore out of bound pages
942
+ if ( page >= 1 && page <= anySlide.pages ) {
943
+ anySlide.gotoPage(page, false, callback); // page #, autoplay, one time callback
944
+ }
945
+ // Accept id or class name
946
+ } else if (/^[#|.]/.test(options) && $(options).length) {
947
+ anySlide.gotoPage(options, false, callback);
948
+ }
949
+ });
950
+ };
951
+
952
+ })(jQuery, window, document);