fullscreenslider-rails 1.0.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 185032b8a99bf16ea7d885bcf89d22327932a107
4
+ data.tar.gz: baebf2b97ca9c1c89be7d7169a4ee050017f1754
5
+ SHA512:
6
+ metadata.gz: 95309188e600930007b3294bce32aaa73c32084b702b35ba17a74536999cba98b5fc2866f5068f0dfd584bb5aa2770314d2581040d5eab19ae52d5d2fc1a9d84
7
+ data.tar.gz: fff898df6f26c4ca66d5a3c7b5e1668887fb57d529038f1d15ee853e2090ad274182c53f73ddfb8baae02524c8226ccbe4563fb8c6f42e5d045182d39f5d671e
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fullscreenslider-rails.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fullscreenslider-rails (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.4.2)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.7)
16
+ fullscreenslider-rails!
17
+ rake (~> 10.0)
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 producao02
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.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Fullscreenslider::Rails
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'fullscreenslider-rails'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install fullscreenslider-rails
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it ( https://github.com/[my-github-username]/fullscreenslider-rails/fork )
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,12 @@
1
+ /*
2
+ * cond - v0.1 - 6/10/2009
3
+ * http://benalman.com/projects/jquery-cond-plugin/
4
+ *
5
+ * Copyright (c) 2009 "Cowboy" Ben Alman
6
+ * Licensed under the MIT license
7
+ * http://benalman.com/about/license/
8
+ *
9
+ * Based on suggestions and sample code by Stephen Band and DBJDBJ in the
10
+ * jquery-dev Google group: http://bit.ly/jqba1
11
+ */
12
+ (function($){$.fn.cond=function(){var e,a=arguments,b=0,f,d,c;while(!f&&b<a.length){f=a[b++];d=a[b++];f=$.isFunction(f)?f.call(this):f;c=!d?f:f?d.call(this,f):e}return c!==e?c:this}})(jQuery);
@@ -0,0 +1,676 @@
1
+ /**
2
+ * jquery.slitslider.js v1.1.0
3
+ * http://www.codrops.com
4
+ *
5
+ * Licensed under the MIT license.
6
+ * http://www.opensource.org/licenses/mit-license.php
7
+ *
8
+ * Copyright 2012, Codrops
9
+ * http://www.codrops.com
10
+ */
11
+
12
+ ;( function( $, window, undefined ) {
13
+
14
+ 'use strict';
15
+
16
+ /*
17
+ * debouncedresize: special jQuery event that happens once after a window resize
18
+ *
19
+ * latest version and complete README available on Github:
20
+ * https://github.com/louisremi/jquery-smartresize/blob/master/jquery.debouncedresize.js
21
+ *
22
+ * Copyright 2011 @louis_remi
23
+ * Licensed under the MIT license.
24
+ */
25
+ var $event = $.event,
26
+ $special,
27
+ resizeTimeout;
28
+
29
+ $special = $event.special.debouncedresize = {
30
+ setup: function() {
31
+ $( this ).on( "resize", $special.handler );
32
+ },
33
+ teardown: function() {
34
+ $( this ).off( "resize", $special.handler );
35
+ },
36
+ handler: function( event, execAsap ) {
37
+ // Save the context
38
+ var context = this,
39
+ args = arguments,
40
+ dispatch = function() {
41
+ // set correct event type
42
+ event.type = "debouncedresize";
43
+ $event.dispatch.apply( context, args );
44
+ };
45
+
46
+ if ( resizeTimeout ) {
47
+ clearTimeout( resizeTimeout );
48
+ }
49
+
50
+ execAsap ?
51
+ dispatch() :
52
+ resizeTimeout = setTimeout( dispatch, $special.threshold );
53
+ },
54
+ threshold: 20
55
+ };
56
+
57
+ // global
58
+ var $window = $( window ),
59
+ $document = $( document ),
60
+ Modernizr = window.Modernizr;
61
+
62
+ $.Slitslider = function( options, element ) {
63
+
64
+ this.$elWrapper = $( element );
65
+ this._init( options );
66
+
67
+ };
68
+
69
+ $.Slitslider.defaults = {
70
+ // transitions speed
71
+ speed : 800,
72
+ // if true the item's slices will also animate the opacity value
73
+ optOpacity : false,
74
+ // amount (%) to translate both slices - adjust as necessary
75
+ translateFactor : 230,
76
+ // maximum possible angle
77
+ maxAngle : 25,
78
+ // maximum possible scale
79
+ maxScale : 2,
80
+ // slideshow on / off
81
+ autoplay : false,
82
+ // keyboard navigation
83
+ keyboard : true,
84
+ // time between transitions
85
+ interval : 4000,
86
+ // callbacks
87
+ onBeforeChange : function( slide, idx ) { return false; },
88
+ onAfterChange : function( slide, idx ) { return false; }
89
+ };
90
+
91
+ $.Slitslider.prototype = {
92
+
93
+ _init : function( options ) {
94
+
95
+ // options
96
+ this.options = $.extend( true, {}, $.Slitslider.defaults, options );
97
+
98
+ // https://github.com/twitter/bootstrap/issues/2870
99
+ this.transEndEventNames = {
100
+ 'WebkitTransition' : 'webkitTransitionEnd',
101
+ 'MozTransition' : 'transitionend',
102
+ 'OTransition' : 'oTransitionEnd',
103
+ 'msTransition' : 'MSTransitionEnd',
104
+ 'transition' : 'transitionend'
105
+ };
106
+ this.transEndEventName = this.transEndEventNames[ Modernizr.prefixed( 'transition' ) ];
107
+ // suport for css 3d transforms and css transitions
108
+ this.support = Modernizr.csstransitions && Modernizr.csstransforms3d;
109
+ // the slider
110
+ this.$el = this.$elWrapper.children( '.sl-slider' );
111
+ // the slides
112
+ this.$slides = this.$el.children( '.sl-slide' ).hide();
113
+ // total slides
114
+ this.slidesCount = this.$slides.length;
115
+ // current slide
116
+ this.current = 0;
117
+ // control if it's animating
118
+ this.isAnimating = false;
119
+ // get container size
120
+ this._getSize();
121
+ // layout
122
+ this._layout();
123
+ // load some events
124
+ this._loadEvents();
125
+ // slideshow
126
+ if( this.options.autoplay ) {
127
+
128
+ this._startSlideshow();
129
+
130
+ }
131
+
132
+ },
133
+ // gets the current container width & height
134
+ _getSize : function() {
135
+
136
+ this.size = {
137
+ width : this.$elWrapper.outerWidth( true ),
138
+ height : this.$elWrapper.outerHeight( true )
139
+ };
140
+
141
+ },
142
+ _layout : function() {
143
+
144
+ this.$slideWrapper = $( '<div class="sl-slides-wrapper" />' );
145
+
146
+ // wrap the slides
147
+ this.$slides.wrapAll( this.$slideWrapper ).each( function( i ) {
148
+
149
+ var $slide = $( this ),
150
+ // vertical || horizontal
151
+ orientation = $slide.data( 'orientation' );
152
+
153
+ $slide.addClass( 'sl-slide-' + orientation )
154
+ .children()
155
+ .wrapAll( '<div class="sl-content-wrapper" />' )
156
+ .wrapAll( '<div class="sl-content" />' );
157
+
158
+ } );
159
+
160
+ // set the right size of the slider/slides for the current window size
161
+ this._setSize();
162
+ // show first slide
163
+ this.$slides.eq( this.current ).show();
164
+
165
+ },
166
+ _navigate : function( dir, pos ) {
167
+
168
+ if( this.isAnimating || this.slidesCount < 2 ) {
169
+
170
+ return false;
171
+
172
+ }
173
+
174
+ this.isAnimating = true;
175
+
176
+ var self = this,
177
+ $currentSlide = this.$slides.eq( this.current );
178
+
179
+ // if position is passed
180
+ if( pos !== undefined ) {
181
+
182
+ this.current = pos;
183
+
184
+ }
185
+ // if not check the boundaries
186
+ else if( dir === 'next' ) {
187
+
188
+ this.current = this.current < this.slidesCount - 1 ? ++this.current : 0;
189
+
190
+ }
191
+ else if( dir === 'prev' ) {
192
+
193
+ this.current = this.current > 0 ? --this.current : this.slidesCount - 1;
194
+
195
+ }
196
+
197
+ this.options.onBeforeChange( $currentSlide, this.current );
198
+
199
+ // next slide to be shown
200
+ var $nextSlide = this.$slides.eq( this.current ),
201
+ // the slide we want to cut and animate
202
+ $movingSlide = ( dir === 'next' ) ? $currentSlide : $nextSlide,
203
+
204
+ // the following are the data attrs set for each slide
205
+ configData = $movingSlide.data(),
206
+ config = {};
207
+
208
+ config.orientation = configData.orientation || 'horizontal',
209
+ config.slice1angle = configData.slice1Rotation || 0,
210
+ config.slice1scale = configData.slice1Scale || 1,
211
+ config.slice2angle = configData.slice2Rotation || 0,
212
+ config.slice2scale = configData.slice2Scale || 1;
213
+
214
+ this._validateValues( config );
215
+
216
+ var cssStyle = config.orientation === 'horizontal' ? {
217
+ marginTop : -this.size.height / 2
218
+ } : {
219
+ marginLeft : -this.size.width / 2
220
+ },
221
+ // default slide's slices style
222
+ resetStyle = {
223
+ 'transform' : 'translate(0%,0%) rotate(0deg) scale(1)',
224
+ opacity : 1
225
+ },
226
+ // slice1 style
227
+ slice1Style = config.orientation === 'horizontal' ? {
228
+ 'transform' : 'translateY(-' + this.options.translateFactor + '%) rotate(' + config.slice1angle + 'deg) scale(' + config.slice1scale + ')'
229
+ } : {
230
+ 'transform' : 'translateX(-' + this.options.translateFactor + '%) rotate(' + config.slice1angle + 'deg) scale(' + config.slice1scale + ')'
231
+ },
232
+ // slice2 style
233
+ slice2Style = config.orientation === 'horizontal' ? {
234
+ 'transform' : 'translateY(' + this.options.translateFactor + '%) rotate(' + config.slice2angle + 'deg) scale(' + config.slice2scale + ')'
235
+ } : {
236
+ 'transform' : 'translateX(' + this.options.translateFactor + '%) rotate(' + config.slice2angle + 'deg) scale(' + config.slice2scale + ')'
237
+ };
238
+
239
+ if( this.options.optOpacity ) {
240
+
241
+ slice1Style.opacity = 0;
242
+ slice2Style.opacity = 0;
243
+
244
+ }
245
+
246
+ // we are adding the classes sl-trans-elems and sl-trans-back-elems to the slide that is either coming "next"
247
+ // or going "prev" according to the direction.
248
+ // the idea is to make it more interesting by giving some animations to the respective slide's elements
249
+ //( dir === 'next' ) ? $nextSlide.addClass( 'sl-trans-elems' ) : $currentSlide.addClass( 'sl-trans-back-elems' );
250
+
251
+ $currentSlide.removeClass( 'sl-trans-elems' );
252
+
253
+ var transitionProp = {
254
+ 'transition' : 'all ' + this.options.speed + 'ms ease-in-out'
255
+ };
256
+
257
+ // add the 2 slices and animate them
258
+ $movingSlide.css( 'z-index', this.slidesCount )
259
+ .find( 'div.sl-content-wrapper' )
260
+ .wrap( $( '<div class="sl-content-slice" />' ).css( transitionProp ) )
261
+ .parent()
262
+ .cond(
263
+ dir === 'prev',
264
+ function() {
265
+
266
+ var slice = this;
267
+ this.css( slice1Style );
268
+ setTimeout( function() {
269
+
270
+ slice.css( resetStyle );
271
+
272
+ }, 50 );
273
+
274
+ },
275
+ function() {
276
+
277
+ var slice = this;
278
+ setTimeout( function() {
279
+
280
+ slice.css( slice1Style );
281
+
282
+ }, 50 );
283
+
284
+ }
285
+ )
286
+ .clone()
287
+ .appendTo( $movingSlide )
288
+ .cond(
289
+ dir === 'prev',
290
+ function() {
291
+
292
+ var slice = this;
293
+ this.css( slice2Style );
294
+ setTimeout( function() {
295
+
296
+ $currentSlide.addClass( 'sl-trans-back-elems' );
297
+
298
+ if( self.support ) {
299
+
300
+ slice.css( resetStyle ).on( self.transEndEventName, function() {
301
+
302
+ self._onEndNavigate( slice, $currentSlide, dir );
303
+
304
+ } );
305
+
306
+ }
307
+ else {
308
+
309
+ self._onEndNavigate( slice, $currentSlide, dir );
310
+
311
+ }
312
+
313
+ }, 50 );
314
+
315
+ },
316
+ function() {
317
+
318
+ var slice = this;
319
+ setTimeout( function() {
320
+
321
+ $nextSlide.addClass( 'sl-trans-elems' );
322
+
323
+ if( self.support ) {
324
+
325
+ slice.css( slice2Style ).on( self.transEndEventName, function() {
326
+
327
+ self._onEndNavigate( slice, $currentSlide, dir );
328
+
329
+ } );
330
+
331
+ }
332
+ else {
333
+
334
+ self._onEndNavigate( slice, $currentSlide, dir );
335
+
336
+ }
337
+
338
+ }, 50 );
339
+
340
+ }
341
+ )
342
+ .find( 'div.sl-content-wrapper' )
343
+ .css( cssStyle );
344
+
345
+ $nextSlide.show();
346
+
347
+ },
348
+ _validateValues : function( config ) {
349
+
350
+ // OK, so we are restricting the angles and scale values here.
351
+ // This is to avoid the slices wrong sides to be shown.
352
+ // you can adjust these values as you wish but make sure you also ajust the
353
+ // paddings of the slides and also the options.translateFactor value and scale data attrs
354
+ if( config.slice1angle > this.options.maxAngle || config.slice1angle < -this.options.maxAngle ) {
355
+
356
+ config.slice1angle = this.options.maxAngle;
357
+
358
+ }
359
+ if( config.slice2angle > this.options.maxAngle || config.slice2angle < -this.options.maxAngle ) {
360
+
361
+ config.slice2angle = this.options.maxAngle;
362
+
363
+ }
364
+ if( config.slice1scale > this.options.maxScale || config.slice1scale <= 0 ) {
365
+
366
+ config.slice1scale = this.options.maxScale;
367
+
368
+ }
369
+ if( config.slice2scale > this.options.maxScale || config.slice2scale <= 0 ) {
370
+
371
+ config.slice2scale = this.options.maxScale;
372
+
373
+ }
374
+ if( config.orientation !== 'vertical' && config.orientation !== 'horizontal' ) {
375
+
376
+ config.orientation = 'horizontal'
377
+
378
+ }
379
+
380
+ },
381
+ _onEndNavigate : function( $slice, $oldSlide, dir ) {
382
+
383
+ // reset previous slide's style after next slide is shown
384
+ var $slide = $slice.parent(),
385
+ removeClasses = 'sl-trans-elems sl-trans-back-elems';
386
+
387
+ // remove second slide's slice
388
+ $slice.remove();
389
+ // unwrap..
390
+ $slide.css( 'z-index', 1 )
391
+ .find( 'div.sl-content-wrapper' )
392
+ .unwrap();
393
+
394
+ // hide previous current slide
395
+ $oldSlide.hide().removeClass( removeClasses );
396
+ $slide.removeClass( removeClasses );
397
+ // now we can navigate again..
398
+ this.isAnimating = false;
399
+ this.options.onAfterChange( $slide, this.current );
400
+
401
+ },
402
+ _setSize : function() {
403
+
404
+ // the slider and content wrappers will have the window's width and height
405
+ var cssStyle = {
406
+ width : this.size.width,
407
+ height : this.size.height
408
+ };
409
+
410
+ this.$el.css( cssStyle ).find( 'div.sl-content-wrapper' ).css( cssStyle );
411
+
412
+ },
413
+ _loadEvents : function() {
414
+
415
+ var self = this;
416
+
417
+ $window.on( 'debouncedresize.slitslider', function( event ) {
418
+
419
+ // update size values
420
+ self._getSize();
421
+ // set the sizes again
422
+ self._setSize();
423
+
424
+ } );
425
+
426
+ if ( this.options.keyboard ) {
427
+
428
+ $document.on( 'keydown.slitslider', function(e) {
429
+
430
+ var keyCode = e.keyCode || e.which,
431
+ arrow = {
432
+ left: 37,
433
+ up: 38,
434
+ right: 39,
435
+ down: 40
436
+ };
437
+
438
+ switch (keyCode) {
439
+
440
+ case arrow.left :
441
+
442
+ self._stopSlideshow();
443
+ self._navigate( 'prev' );
444
+ break;
445
+
446
+ case arrow.right :
447
+
448
+ self._stopSlideshow();
449
+ self._navigate( 'next' );
450
+ break;
451
+
452
+ }
453
+
454
+ } );
455
+
456
+ }
457
+
458
+ },
459
+ _startSlideshow: function() {
460
+
461
+ var self = this;
462
+
463
+ this.slideshow = setTimeout( function() {
464
+
465
+ self._navigate( 'next' );
466
+
467
+ if ( self.options.autoplay ) {
468
+
469
+ self._startSlideshow();
470
+
471
+ }
472
+
473
+ }, this.options.interval );
474
+
475
+ },
476
+ _stopSlideshow: function() {
477
+
478
+ if ( this.options.autoplay ) {
479
+
480
+ clearTimeout( this.slideshow );
481
+ this.isPlaying = false;
482
+ this.options.autoplay = false;
483
+
484
+ }
485
+
486
+ },
487
+ _destroy : function( callback ) {
488
+
489
+ this.$el.off( '.slitslider' ).removeData( 'slitslider' );
490
+ $window.off( '.slitslider' );
491
+ $document.off( '.slitslider' );
492
+ this.$slides.each( function( i ) {
493
+
494
+ var $slide = $( this ),
495
+ $content = $slide.find( 'div.sl-content' ).children();
496
+
497
+ $content.appendTo( $slide );
498
+ $slide.children( 'div.sl-content-wrapper' ).remove();
499
+
500
+ } );
501
+ this.$slides.unwrap( this.$slideWrapper ).hide();
502
+ this.$slides.eq( 0 ).show();
503
+ if( callback ) {
504
+
505
+ callback.call();
506
+
507
+ }
508
+
509
+ },
510
+ // public methos: adds more slides to the slider
511
+ add : function( $slides, callback ) {
512
+
513
+ this.$slides = this.$slides.add( $slides );
514
+
515
+ var self = this;
516
+
517
+
518
+ $slides.each( function( i ) {
519
+
520
+ var $slide = $( this ),
521
+ // vertical || horizontal
522
+ orientation = $slide.data( 'orientation' );
523
+
524
+ $slide.hide().addClass( 'sl-slide-' + orientation )
525
+ .children()
526
+ .wrapAll( '<div class="sl-content-wrapper" />' )
527
+ .wrapAll( '<div class="sl-content" />' )
528
+ .end()
529
+ .appendTo( self.$el.find( 'div.sl-slides-wrapper' ) );
530
+
531
+ } );
532
+
533
+ this._setSize();
534
+
535
+ this.slidesCount = this.$slides.length;
536
+
537
+ if ( callback ) {
538
+
539
+ callback.call( $items );
540
+
541
+ }
542
+
543
+ },
544
+ // public method: shows next slide
545
+ next : function() {
546
+
547
+ this._stopSlideshow();
548
+ this._navigate( 'next' );
549
+
550
+ },
551
+ // public method: shows previous slide
552
+ previous : function() {
553
+
554
+ this._stopSlideshow();
555
+ this._navigate( 'prev' );
556
+
557
+ },
558
+ // public method: goes to a specific slide
559
+ jump : function( pos ) {
560
+
561
+ pos -= 1;
562
+
563
+ if( pos === this.current || pos >= this.slidesCount || pos < 0 ) {
564
+
565
+ return false;
566
+
567
+ }
568
+
569
+ this._stopSlideshow();
570
+ this._navigate( pos > this.current ? 'next' : 'prev', pos );
571
+
572
+ },
573
+ // public method: starts the slideshow
574
+ // any call to next(), previous() or jump() will stop the slideshow
575
+ play : function() {
576
+
577
+ if( !this.isPlaying ) {
578
+
579
+ this.isPlaying = true;
580
+
581
+ this._navigate( 'next' );
582
+ this.options.autoplay = true;
583
+ this._startSlideshow();
584
+
585
+ }
586
+
587
+ },
588
+ // public method: pauses the slideshow
589
+ pause : function() {
590
+
591
+ if( this.isPlaying ) {
592
+
593
+ this._stopSlideshow();
594
+
595
+ }
596
+
597
+ },
598
+ // public method: check if isAnimating is true
599
+ isActive : function() {
600
+
601
+ return this.isAnimating;
602
+
603
+ },
604
+ // publicc methos: destroys the slicebox instance
605
+ destroy : function( callback ) {
606
+
607
+ this._destroy( callback );
608
+
609
+ }
610
+
611
+ };
612
+
613
+ var logError = function( message ) {
614
+
615
+ if ( window.console ) {
616
+
617
+ window.console.error( message );
618
+
619
+ }
620
+
621
+ };
622
+
623
+ $.fn.slitslider = function( options ) {
624
+
625
+ var self = $.data( this, 'slitslider' );
626
+
627
+ if ( typeof options === 'string' ) {
628
+
629
+ var args = Array.prototype.slice.call( arguments, 1 );
630
+
631
+ this.each(function() {
632
+
633
+ if ( !self ) {
634
+
635
+ logError( "cannot call methods on slitslider prior to initialization; " +
636
+ "attempted to call method '" + options + "'" );
637
+ return;
638
+
639
+ }
640
+
641
+ if ( !$.isFunction( self[options] ) || options.charAt(0) === "_" ) {
642
+
643
+ logError( "no such method '" + options + "' for slitslider self" );
644
+ return;
645
+
646
+ }
647
+
648
+ self[ options ].apply( self, args );
649
+
650
+ });
651
+
652
+ }
653
+ else {
654
+
655
+ this.each(function() {
656
+
657
+ if ( self ) {
658
+
659
+ self._init();
660
+
661
+ }
662
+ else {
663
+
664
+ self = $.data( this, 'slitslider', new $.Slitslider( options, this ) );
665
+
666
+ }
667
+
668
+ });
669
+
670
+ }
671
+
672
+ return self;
673
+
674
+ };
675
+
676
+ } )( jQuery, window );