Team:USTC-Software/js/jquery.cslider

From 2012.igem.org

(function( $, undefined ) {

/* * Slider object. */ $.Slider = function( options, element ) {

this.$el = $( element );

this._init( options );

};

$.Slider.defaults = { current : 0, // index of current slide bgincrement : 50, // increment the bg position (parallax effect) when sliding autoplay : false,// slideshow on / off interval : 4000 // time between transitions

   };

$.Slider.prototype = { _init : function( options ) {

this.options = $.extend( true, {}, $.Slider.defaults, options );

this.$slides = this.$el.children('div.da-slide'); this.slidesCount = this.$slides.length;

this.current = this.options.current;

if( this.current < 0 || this.current >= this.slidesCount ) {

this.current = 0;

}

this.$slides.eq( this.current ).addClass( 'da-slide-current' );

var $navigation = $( '<nav class="da-dots"/>' ); for( var i = 0; i < this.slidesCount; ++i ) {

$navigation.append( '<span/>' );

} $navigation.appendTo( this.$el );

this.$pages = this.$el.find('nav.da-dots > span'); this.$navNext = this.$el.find('span.da-arrows-next'); this.$navPrev = this.$el.find('span.da-arrows-prev');

this.isAnimating = false;

this.bgpositer = 0;

this.cssAnimations = Modernizr.cssanimations; this.cssTransitions = Modernizr.csstransitions;

if( !this.cssAnimations || !this.cssAnimations ) {

this.$el.addClass( 'da-slider-fb' );

}

this._updatePage();

// load the events this._loadEvents();

// slideshow if( this.options.autoplay ) {

this._startSlideshow();

}

}, _navigate : function( page, dir ) {

var $current = this.$slides.eq( this.current ), $next, _self = this;

if( this.current === page || this.isAnimating ) return false;

this.isAnimating = true;

// check dir var classTo, classFrom, d;

if( !dir ) {

( page > this.current ) ? d = 'next' : d = 'prev';

} else {

d = dir;

}

if( this.cssAnimations && this.cssAnimations ) {

if( d === 'next' ) {

classTo = 'da-slide-toleft'; classFrom = 'da-slide-fromright'; ++this.bgpositer;

} else {

classTo = 'da-slide-toright'; classFrom = 'da-slide-fromleft'; --this.bgpositer;

}

this.$el.css( 'background-position' , this.bgpositer * this.options.bgincrement + '% 0%' );

}

this.current = page;

$next = this.$slides.eq( this.current );

if( this.cssAnimations && this.cssAnimations ) {

var rmClasses = 'da-slide-toleft da-slide-toright da-slide-fromleft da-slide-fromright'; $current.removeClass( rmClasses ); $next.removeClass( rmClasses );

$current.addClass( classTo ); $next.addClass( classFrom );

$current.removeClass( 'da-slide-current' ); $next.addClass( 'da-slide-current' );

}

// fallback if( !this.cssAnimations || !this.cssAnimations ) {

$next.css( 'left', ( d === 'next' ) ? '100%' : '-100%' ).stop().animate( { left : '0%' }, 1000, function() { _self.isAnimating = false; });

$current.stop().animate( { left : ( d === 'next' ) ? '-100%' : '100%' }, 1000, function() { $current.removeClass( 'da-slide-current' ); });

}

this._updatePage();

}, _updatePage : function() {

this.$pages.removeClass( 'da-dots-current' ); this.$pages.eq( this.current ).addClass( 'da-dots-current' );

}, _startSlideshow : function() {

var _self = this;

this.slideshow = setTimeout( function() {

var page = ( _self.current < _self.slidesCount - 1 ) ? page = _self.current + 1 : page = 0; _self._navigate( page, 'next' );

if( _self.options.autoplay ) {

_self._startSlideshow();

}

}, this.options.interval );

}, page : function( idx ) {

if( idx >= this.slidesCount || idx < 0 ) {

return false;

}

if( this.options.autoplay ) {

clearTimeout( this.slideshow ); this.options.autoplay = false;

}

this._navigate( idx );

}, _loadEvents : function() {

var _self = this;

this.$pages.on( 'click.cslider', function( event ) {

_self.page( $(this).index() ); return false;

});

this.$navNext.on( 'click.cslider', function( event ) {

if( _self.options.autoplay ) {

clearTimeout( _self.slideshow ); _self.options.autoplay = false;

}

var page = ( _self.current < _self.slidesCount - 1 ) ? page = _self.current + 1 : page = 0; _self._navigate( page, 'next' ); return false;

});

this.$navPrev.on( 'click.cslider', function( event ) {

if( _self.options.autoplay ) {

clearTimeout( _self.slideshow ); _self.options.autoplay = false;

}

var page = ( _self.current > 0 ) ? page = _self.current - 1 : page = _self.slidesCount - 1; _self._navigate( page, 'prev' ); return false;

});

if( this.cssTransitions ) {

if( !this.options.bgincrement ) {

this.$el.on( 'webkitAnimationEnd.cslider animationend.cslider OAnimationEnd.cslider', function( event ) {

if( event.originalEvent.animationName === 'toRightAnim4' || event.originalEvent.animationName === 'toLeftAnim4' ) {

_self.isAnimating = false;

}

});

} else {

this.$el.on( 'webkitTransitionEnd.cslider transitionend.cslider OTransitionEnd.cslider', function( event ) {

if( event.target.id === _self.$el.attr( 'id' ) ) _self.isAnimating = false;

});

}

}

} };

var logError = function( message ) { if ( this.console ) { console.error( message ); } };

$.fn.cslider = function( options ) {

if ( typeof options === 'string' ) {

var args = Array.prototype.slice.call( arguments, 1 );

this.each(function() {

var instance = $.data( this, 'cslider' );

if ( !instance ) { logError( "cannot call methods on cslider prior to initialization; " + "attempted to call method '" + options + "'" ); return; }

if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { logError( "no such method '" + options + "' for cslider instance" ); return; }

instance[ options ].apply( instance, args );

});

} else {

this.each(function() {

var instance = $.data( this, 'cslider' ); if ( !instance ) { $.data( this, 'cslider', new $.Slider( options, this ) ); } });

}

return this;

};

})( jQuery );