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.