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 options = $.extend( {}, $.fn.lemmonSlider.defaults, options ); 25 26 return this.each( function() { 27 28 var $slider = $( this ), 29 data = $slider.data( 'slider' ); 30 31 if( !data ) { 32 33 var $sliderContainer = $slider.find( options.slider ), 34 $sliderControls = $slider.next().filter( '.controls' ), 35 $items = $sliderContainer.find( options.items ), 36 originalWidth = 1; 37 38 $items.each( function() { originalWidth += $( this ).outerWidth( true ) } ); 39 $sliderContainer.width( originalWidth ); 40 41 // slide to last item 42 if( options.slideToLast ) $sliderContainer.css( 'padding-right', $slider.width() ); 43 44 // infinite carousel 45 if( options.infinite ) { 46 $slider.data( 'slider-infinite', true ); 47 48 originalWidth = originalWidth * 3; 49 $sliderContainer.width( originalWidth ); 50 51 $items.clone(true, true).addClass( '-after' ).insertAfter( $items.filter( ':last' ) ); 52 $items.filter( ':first' ).before( $items.clone(true, true).addClass( '-before' ) ); 53 54 $items = $sliderContainer.find( options.items ); 55 56 } 57 58 $slider.items = $items; 59 $slider.options = options; 60 61 // first item 62 //$items.filter( ':first' ).addClass( 'active' ); 63 64 slideTo( {}, $slider, 0, 0, 0 ); 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 > options.offset ) { 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, 'slow' ); 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 < options.offset ) { 96 x = $( this ).position().left; 97 slide = i; 98 } 99 } ); 100 101 if( x ) { 102 slideTo( e, $slider, scroll + x, slide, 'slow' ) 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, 'slow' ); 110 } else { 111 slideTo( e, $slider, a, slide, 'slow' ); 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' ).on('click', function() { 182 $slider.trigger( 'nextSlide' ); 183 return false; 184 } ); 185 $sliderControls.find( '.prev-slide' ).on('click', function() { 186 $slider.trigger( 'prevSlide' ); 187 return false; 188 } ); 189 $sliderControls.find( '.next-page' ).on('click', function() { 190 $slider.trigger( 'nextPage' ); 191 return false; 192 } ); 193 $sliderControls.find( '.prev-page' ).on('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.data( 'slider-infinite' ) 222 223 if( !options.item ) { 224 return false 225 } 226 methods.destroy.apply( this ); 227 if( options.prepend ) { 228 $sliderContainer.prepend( options.item ); 229 } else { 230 $sliderContainer.append( options.item ); 231 } 232 methods.init.apply( this, [options] ); 233 }, 234 // 235 // Destroy plugin 236 // 237 destroy: function() { 238 239 return this.each( function() { 240 241 var $slider = $( this ), 242 $sliderControls = $slider.next().filter( '.controls' ), 243 $items = $slider.find( '> *:first > *' ), 244 data = $slider.data( 'slider' ); 245 246 $slider.unbind( 'nextSlide' ); 247 $slider.unbind( 'prevSlide' ); 248 $slider.unbind( 'nextPage' ); 249 $slider.unbind( 'prevPage' ); 250 $slider.unbind( 'slideTo' ); 251 252 $sliderControls.find( '.next-slide' ).unbind( 'click' ); 253 $sliderControls.find( '.prev-slide' ).unbind( 'click' ); 254 $sliderControls.find( '.next-page' ).unbind( 'click' ); 255 $sliderControls.find( '.next-page' ).unbind( 'click' ); 256 257 $slider.removeData( 'slider' ); 258 259 if( $slider.data( 'slider-infinite' ) ) { 260 $.merge( $items.filter( '.-before' ), $items.filter( '.-after' ) ).each( function( index, item ) { 261 $( item ).remove(); 262 } ); 263 } 264 } ); 265 266 } 267 // 268 // 269 // 270 } 271 // 272 // Private functions 273 // 274 function slideTo( e, $slider, x, i, t ) { 275 276 $slider.items.filter( 'li:eq(' + i + ')' ).addClass( 'active' ).siblings( '.active' ).removeClass( 'active' ); 277 278 if( $slider.options.center ) { 279 var currentElement = $( $slider.items[ i ] ); 280 $slider.options.offset = Math.floor( ( $('.qode_image_gallery_holder').width() - currentElement.width() ) / 2 ); 281 console.log( 'set offset to ', $slider.options.offset ); 282 } 283 284 if( typeof t == 'undefined' ) { 285 t = 'slow'; 286 } 287 if( t ) { 288 $slider.animate( { 'scrollLeft': x - $slider.options.offset }, t, function() { 289 checkInfinite( $slider ); 290 } ); 291 } else { 292 var time = 0; 293 $slider.scrollLeft( x - $slider.options.offset ); 294 checkInfinite( $slider ); 295 } 296 297 //if ( typeof $slider.options.slide == 'function' ) $slider.options.slide( e, i, time ); 298 } 299 300 function checkInfinite( $slider ) { 301 302 var $active = $slider.items.filter( '.active' ); 303 if( $active.hasClass( '-before' ) ) { 304 305 var i = $active.prevAll().size(); 306 $active.removeClass( 'active' ); 307 $active = $slider.items.filter( ':not(.-before):eq(' + i + ')' ).addClass( 'active' ); 308 $slider.scrollLeft( $slider.scrollLeft() + $active.position().left - $slider.options.offset ); 309 310 } else if( $active.hasClass( '-after' ) ) { 311 312 var i = $active.prevAll( '.-after' ).size(); 313 $active.removeClass( 'active' ); 314 $active = $slider.items.filter( ':not(.-before):eq(' + i + ')' ).addClass( 'active' ); 315 $slider.scrollLeft( $slider.scrollLeft() + $active.position().left - $slider.options.offset ); 316 317 } 318 319 } 320 321 // 322 // Debug 323 // 324 function debug( text ) { 325 $( '#debug span' ).text( text ); 326 } 327 328 // 329 // 330 // 331 $.fn.lemmonSlider = function( method, options ) { 332 if( methods[method] ) { 333 return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) ); 334 } else if( typeof method === 'object' || !method ) { 335 return methods.init.apply( this, arguments ); 336 } else { 337 $.error( 'Method ' + method + ' does not exist on jQuery.lemmonSlider' ); 338 } 339 340 }; 341 // 342 // 343 // 344 $.fn.lemmonSlider.defaults = { 345 346 'items': '> *', 347 'loop': true, 348 'slideToLast': false, 349 'slider': '> *:first', 350 // since 0.2 351 'infinite': true, 352 'center': true, 353 'offset': 0 354 355 } 356 357})( 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.