/** * Slider Pagination Concept * jquery.pagination.js v1.0.0 * http://www.codrops.com * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php * * Copyright 2012, Codrops * http://www.codrops.com */ ;( function( $, window, undefined ) { 'use strict'; $.Slider = function( settings, element ) { this.$el = element; this.value = settings.value; this.total = settings.total; this.width = settings.width; this._create(); }; $.Slider.prototype = { _create : function() { var self = this; this.slider = this.$el.slider( { value : this.value, min : 1, max : this.total, step : 1 } ); this.$value = $( '' + this.value + '' ); this.getHandle().append( this.$value ); }, setValue : function( value ) { this.value = value; this.$value.text( value ); this.slider.slider( 'value', value ); }, getValue : function() { return this.value; }, getHandle : function() { return this.$el.find( 'a.ui-slider-handle' ); }, getSlider : function() { return this.slider; }, getSliderEl : function() { return this.$el; }, next : function( callback ) { if( this.value < this.total ) { this.setValue( ++this.value ); if( callback ) { callback.call( this, this.value ); } } }, previous : function( callback ) { if( this.value > 1 ) { this.setValue( --this.value ); if( callback ) { callback.call( this, this.value ); } } } }; $.Pagination = function( options, element ) { this.$el = $( element ); this._init( options ); }; // the options $.Pagination.defaults = { value : 1, total : 50, width : 200, onChange : function( value ) { return false; }, onSlide : function( value ) { return false; } }; $.Pagination.prototype = { _init : function( options ) { // options this.options = $.extend( true, {}, $.Pagination.defaults, options ); var transEndEventNames = { 'WebkitTransition' : 'webkitTransitionEnd', 'MozTransition' : 'transitionend', 'OTransition' : 'oTransitionEnd', 'msTransition' : 'MSTransitionEnd', 'transition' : 'transitionend' }; this.transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ]; $.fn.applyStyle = Modernizr.csstransitions ? $.fn.css : $.fn.animate; this._layout(); this._initEvents(); }, _layout : function() { // next and previous this.$navNext = this.$el.find( 'nav > a.sp-next' ); this.$navPrev = this.$el.find( 'nav > a.sp-prev' ); // slider var $slider = $( '
' ).appendTo( this.$el ); this.slider = new $.Slider( { value : this.options.value, total : this.options.total, width : this.options.width }, $slider ); // control if the slider is opened/closed this.isSliderOpened = false; }, _initEvents : function() { var self = this; //»¬¶¯¹¦ÄÜ // this.slider.getHandle().on( 'click', function() { // // if( self.isSliderOpened ) { // return false; // } // self.isSliderOpened = true; // self.slider.getSliderEl().addClass( 'sp-slider-open' ); // // expand slider wrapper // self.$el.stop().applyStyle( { width : self.options.width }, $.extend( true, [], { duration : '150ms' } ) ); // // hide navigation // self.toggleNavigation( false ); // return false; // // } ); this.slider.getSlider().on( { 'slidestop' : function( event, ui ) { if( !self.isSliderOpened ) { return false; } var animcomplete = function() { self.isSliderOpened = false; self.slider.getSliderEl().removeClass( 'sp-slider-open' ); // show navigation self.toggleNavigation( true ); }; self.$el.stop().applyStyle( { width : 0 }, $.extend( true, [], { duration : '150ms', complete : animcomplete } ) ).on( self.transEndEventName, function() { $( this ).off( self.transEndEventName ); animcomplete.call(); } ); self.options.onChange( ui.value ); }, 'slide' : function( event, ui ) { if( !self.isSliderOpened ) { return false; } self.slider.setValue( ui.value ); self.options.onSlide( ui.value ); } } ); this.$navNext.on( 'click', function() { self.slider.next( function( value ) { self.options.onChange( value ); } ); return false; } ); this.$navPrev.on( 'click', function() { self.slider.previous( function( value ) { self.options.onChange( value ); } ); return false; } ); }, toggleNavigation : function( toggle ) { $.fn.render = toggle ? $.fn.show : $.fn.hide; this.$navNext.render(); this.$navPrev.render(); } } $.fn.pagination = function( options ) { var instance = $.data( this, 'pagination' ); if ( typeof options === 'string' ) { var args = Array.prototype.slice.call( arguments,1 ); this.each(function() { instance[ options ].apply( instance, args ); }); } else { this.each(function() { instance ? instance._init() : instance = $.data( this, 'pagination', new $.Pagination( options, this ) ); }); } return instance; }; } )( jQuery, window );