PageSourceSearch

https://lifeandthyme.com/wp-content/themes/v4/resources/js/lemmon-slider.js

js lifeandthyme.com collected 2026-10-02 02:27:50 UTC 9,075 bytes, 346 lines download raw bytes

1/*
2 * Lemmon Slider - jQuery Plugin
3 * Simple and lightweight slider/carousel supporting variable elements/images widths.
4 *
5 * Examples and documentation at: http://jquery.lemmonjuice.com/plugins/slider-variable-widths.php
6 *
7 * Copyright (c) 2011 Jakub Pelák <[email protected]>
8 *
9 * Version: 0.2 (9/6/2011)
10 * Requires: jQuery v1.4+
11 *
12 * Licensed under the MIT license:
13 *   http://www.opensource.org/licenses/mit-license.php
14 */
15(function( $ ){
16
17	var _css = {};
18
19	var methods = {
20		//
21		// Initialzie plugin
22		//
23		init : function(options){
24
25			var options = $.extend({}, $.fn.lemmonSlider.defaults, options);
26
27			return this.each(function(){
28
29				var $slider = $( this ),
30				    data = $slider.data( 'slider' );
31
32				if ( ! data ){
33
34					var $sliderContainer = $slider.find(options.slider),
35					    $sliderControls = $slider.next().filter('.controls'),
36					    $items = $sliderContainer.find( options.items ),
37					    originalWidth = 1;
38
39					$items.each(function(){ originalWidth += $(this).outerWidth(true) });
40					$sliderContainer.width( originalWidth );
41
42					// slide to last item
43					if ( options.slideToLast ) $sliderContainer.css( 'padding-right', $slider.width() );
44
45					// infinite carousel
46					if ( options.infinite ){
47						$slider.attr('data-slider-infinite',true)
48
49						originalWidth = originalWidth * 3;
50						$sliderContainer.width( originalWidth );
51
52						$items.clone().addClass( '-after' ).insertAfter( $items.filter(':last') );
53						$items.filter( ':first' ).before( $items.clone().addClass('-before') );
54
55					    $items = $sliderContainer.find( options.items );
56
57					}
58					
59
60					$slider.items = $items;
61					$slider.options = options;
62
63					// first item
64					//$items.filter( ':first' ).addClass( 'active' );
65
66					// attach events
67					$slider.bind( 'nextSlide', function( e, t ){
68
69						var scroll = $slider.scrollLeft();
70						var x = 0;
71						var slide = 0;
72
73						$items.each(function( i ){
74							if ( x == 0 && $( this ).position().left > 1 ){
75								x = $( this ).position().left;
76								slide = i;
77							}
78						});
79
80						if ( x > 0 && $sliderContainer.outerWidth() - scroll - $slider.width() - 1 > 0 ){
81							slideTo( e, $slider, scroll+x, slide, 'fast' );
82						} else if ( options.loop ){
83							// return to first
84							slideTo( e, $slider, 0, 0, 'slow' );
85						}
86
87					});
88					$slider.bind( 'prevSlide', function( e, t ){
89
90						var scroll = $slider.scrollLeft();
91						var x = 0;
92						var slide = 0;
93
94						$items.each(function( i ){
95							if ( $( this ).position().left < 0 ){
96								x = $( this ).position().left;
97								slide = i;
98							}
99						});
100
101						if ( x ){
102							slideTo( e, $slider, scroll+x, slide, 'fast' )
103						} else if ( options.loop ){
104							// return to last
105							var a = $sliderContainer.outerWidth() - $slider.width();
106							var b = $items.filter( ':last' ).position().left;
107							slide = $items.size() - 1;
108							if ( a > b ){
109								slideTo( e, $slider, b, slide, 'fast' );
110							} else {
111								slideTo( e, $slider, a, slide, 'fast' );
112							}
113						}
114
115					});
116					$slider.bind( 'nextPage', function( e, t ){
117
118						var scroll = $slider.scrollLeft();
119						var w = $slider.width();
120						var x = 0;
121						var slide = 0;
122
123						$items.each(function( i ){
124							if ( $( this ).position().left < w ){
125								x = $( this ).position().left;
126								slide = i;
127							}
128						});
129
130						if ( x > 0 && scroll + w + 1 < originalWidth ){
131							slideTo( e, $slider, scroll+x, slide, 'slow' );
132						} else if ( options.loop ){
133							// return to first
134							slideTo( e, $slider, 0, 0, 'slow' );
135						}
136
137					});
138					$slider.bind( 'prevPage', function( e, t ){
139
140						var scroll = $slider.scrollLeft();
141						var w = $slider.width();
142						var x = 0;
143
144						$items.each(function( i ){
145							if ( $( this ).position().left < 1 - w ){
146								x = $( this ).next().position().left;
147								slide = i;
148							}
149						});
150
151						if ( scroll ){
152							if ( x == 0 ){
153								//$slider.animate({ 'scrollLeft' : 0 }, 'slow' );
154								slideTo( e, $slider, 0, 0, 'slow' );
155							} else {
156								//$slider.animate({ 'scrollLeft' : scroll + x }, 'slow' );
157								slideTo( e, $slider, scroll+x, slide, 'slow' );
158							}
159						} else if ( options.loop ) {
160							// return to last
161							var a = $sliderContainer.outerWidth() - $slider.width();
162							var b = $items.filter( ':last' ).position().left;
163							if ( a > b ){
164								$slider.animate({ 'scrollLeft' : b }, 'slow' );
165							} else {
166								$slider.animate({ 'scrollLeft' : a }, 'slow' );
167							}
168						}
169
170					});
171					$slider.bind( 'slideTo', function( e, i, t ){
172
173						slideTo(
174							e, $slider,
175							$slider.scrollLeft() + $items.filter( ':eq(' + i +')' ).position().left,
176							i, t );
177
178					});
179
180					// controls
181					$sliderControls.find( '.next-slide' ).click(function(){
182						$slider.trigger( 'nextSlide' );
183						return false;
184					});
185					$sliderControls.find( '.prev-slide' ).click(function(){
186						$slider.trigger( 'prevSlide' );
187						return false;
188					});
189					$sliderControls.find( '.next-page' ).click(function(){
190						$slider.trigger( 'nextPage' );
191						return false;
192					});
193					$sliderControls.find( '.prev-page' ).click(function(){
194						$slider.trigger( 'prevPage' );
195						return false;
196					});
197
198					//if ( typeof $slider.options.create == 'function' ) $slider.options.create();
199
200					$slider.data( 'slider', {
201						'target'  : $slider,
202						'options' : options
203					})
204
205				}
206
207			});
208
209		},
210		//
211    // Add Item
212    //
213    addItem : function(options){
214        var options = $.extend({}, $.fn.lemmonSlider.defaults, options);
215
216        var $slider = $( this ),
217            $sliderContainer = $slider.find(options.slider),
218            $sliderControls = $slider.next().filter('.controls'),
219            $items = $sliderContainer.find( options.items )
220
221        options.infinite = $slider.attr('data-slider-infinite')
222
223        if (!options.item) { return false }
224        methods.destroy.apply(this);
225        if (options.prepend) {
226            $sliderContainer.prepend(options.item);
227        } else {
228            $sliderContainer.append(options.item);
229        }
230        methods.init.apply( this, [options]);
231    },
232		//
233		// Destroy plugin
234		//
235		destroy : function(){
236
237			return this.each(function(){
238
239				var $slider = $( this ),
240				    $sliderControls = $slider.next().filter( '.controls' ),
241				    $items = $slider.find('> *:first > *'),
242				    data = $slider.data( 'slider' );
243
244				$slider.unbind( 'nextSlide' );
245				$slider.unbind( 'prevSlide' );
246				$slider.unbind( 'nextPage' );
247				$slider.unbind( 'prevPage' );
248				$slider.unbind( 'slideTo' );
249
250				$sliderControls.find( '.next-slide' ).unbind( 'click' );
251				$sliderControls.find( '.prev-slide' ).unbind( 'click' );
252				$sliderControls.find( '.next-page' ).unbind( 'click' );
253				$sliderControls.find( '.next-page' ).unbind( 'click' );
254
255				$slider.removeData( 'slider' );
256
257				if ($slider.attr('data-slider-infinite')) {
258            $.merge($items.filter('.-before'),$items.filter('.-after')).each(function(index,item){
259                $(item).remove();
260            });
261        }
262			});
263
264		}
265		//
266		//
267		//
268	}
269	//
270	// Private functions
271	//
272	function slideTo( e, $slider, x, i, t ){
273
274		$slider.items.filter( 'li:eq(' + i + ')' ).addClass( 'active' ).siblings( '.active' ).removeClass( 'active' );
275
276		if ( typeof t == 'undefined' ){
277			t = 'fast';
278		}
279		if ( t ){
280			$slider.animate({ 'scrollLeft' : x }, t, function(){
281				checkInfinite( $slider );
282			});
283		} else {
284			var time = 0;
285			$slider.scrollLeft( x );
286			checkInfinite( $slider );
287		}
288
289		//if ( typeof $slider.options.slide == 'function' ) $slider.options.slide( e, i, time );
290
291	}
292	function checkInfinite( $slider ){
293
294		var $active = $slider.items.filter( '.active' );
295		if ( $active.hasClass( '-before' ) ){
296
297			var i = $active.prevAll().size();
298			$active.removeClass( 'active' );
299			$active = $slider.items.filter( ':not(.-before):eq(' + i + ')' ).addClass( 'active' );
300			$slider.scrollLeft( $slider.scrollLeft() + $active.position().left );
301
302		} else if ( $active.hasClass( '-after' ) ){
303
304			var i = $active.prevAll( '.-after' ).size();
305			$active.removeClass( 'active' );
306			$active = $slider.items.filter( ':not(.-before):eq(' + i + ')' ).addClass( 'active' );
307			$slider.scrollLeft( $slider.scrollLeft() + $active.position().left );
308
309		}
310
311	}
312	//
313	// Debug
314	//
315	function debug( text ){
316		$( '#debug span' ).text( text );
317	}
318	//
319	//
320	//
321	$.fn.lemmonSlider = function( method , options ){
322		if (options == null) { options = {}; };
323		if ( methods[method] ) {
324			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
325		} else if ( typeof method === 'object' || !method ){
326			return methods.init.apply( this, arguments );
327		} else {
328			$.error( 'Method ' +  method + ' does not exist on jQuery.lemmonSlider' );
329		}
330
331	};
332	//
333	//
334	//
335	$.fn.lemmonSlider.defaults = {
336
337		'items'       : '> *',
338		'loop'        : true,
339		'slideToLast' : false,
340		'slider'      : '> *:first',
341		// since 0.2
342		'infinite'    : false
343
344	}
345
346})( jQuery );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.