;(function($){ var defaults = { // GENERAL itemsToShow: 5, itemsOffset: 2, infiniteSlide : true, // CALLBACKS onPagePrevious: function() {}, onPageNext: function() {} } $.fn.pgSlider = function(options) { if(this.length == 0) return this; // support multiple elements if(this.length > 1){ this.each(function(){$(this).pgSlider(options)}); return this; } // create a namespace to be used throughout the plugin var slider = {}; var el = this; /** * =================================================================================== * = PRIVATE FUNCTIONS * =================================================================================== */ var init = function() { slider.settings = $.extend({}, defaults, options); slider.currentPage = 0; slider.next = $('.next', el).click(function() {el.nextPage(true) } ).attr('active', 1); slider.previous = $('.prev', el).click(function() {el.previousPage(true) } ).attr('active', 1); slider.nb = $('li', el).length; slider.current = 0; slider.realIdx = slider.settings.itemsToShow ; slider.active = false; var margin = parseInt($('li:first', el).css('margin-right')); var padding = parseInt($('li:first', el).css('padding-right')); var width = $('li:first', el).width() + margin + padding; width += parseInt($('li:first', el).css('border-left-width')) + parseInt($('li:first', el).css('border-right-width')); slider.elWidth = width; if( slider.settings.infiniteSlide && slider.nb >= slider.settings.itemsToShow ) { var ul = $('ul:first', el); var firstclones = []; var lastclones = []; for(var i = 0; i < slider.settings.itemsToShow; i ++ ) { firstclones.push( $('li:eq('+(slider.nb - 1 - i)+')', el).clone().addClass('clone') ); } for(var i = 0; i < slider.settings.itemsToShow; i ++ ) { lastclones.push( $('li:eq('+(i)+')', el).clone().addClass('clone') ); } for(var i = 0; i < firstclones.length; i ++ ) { ul.prepend( firstclones[i] ); } for(var i = 0; i < lastclones.length; i ++ ) { ul.append( lastclones[i] ); } //slider.current = slider.settings.itemsOffset; var left = slider.elWidth * slider.settings.itemsToShow; $('ul', el).css({'left' : -left + 'px'}); //ul.prepend( $('li:first', el).clone().addClass('clone') ); //ul.append( $('li:last', el).clone().addClass('clone') ); } else { /* hideButton(slider.previous); if( slider.nb <= slider.settings.itemsToShow ) { hideButton(slider.next); } */ slider.previous.hide(); slider.next.hide(); } } var setPage = function(idx, offset) { slider.currentPage = idx; var nb = $('li', el).length; var maxLeft = slider.elWidth * (nb - slider.settings.itemsToShow); var left = slider.elWidth * idx * slider.settings.itemsOffset; if( offset != null && offset > 0 ) { left -= slider.elWidth * offset; } if( slider.settings.infiniteSlide ) { left += slider.settings.itemsToShow * slider.elWidth; //maxLeft += slider.settings.itemsOffset * slider.elWidth; } else { if( left > maxLeft ) { left = maxLeft; } if( left < 0 ) { left = 0; } } var toStart = false; if(left >= maxLeft) { var nbCurrent = (left - maxLeft) / slider.elWidth; var toleft = (slider.settings.itemsToShow-1) * slider.elWidth; $('ul', el).css({'left' : -toleft + 'px'}); //alert('current = '+nbCurrent); slider.current = 0; // el.setCurrent(nbCurrent); setPage(1, nbCurrent); return; } $('ul', el).animate({'left' : -left + 'px'}, 600); showButton(slider.next); showButton(slider.previous); if( !slider.settings.infiniteSlide ) { if( slider.nb <= slider.settings.itemsToShow ) { hideButton(slider.next); hideButton(slider.previous); } else { if( idx == 0 ) { hideButton(slider.previous); } if( slider.settings.itemsToShow + idx * slider.settings.itemsOffset >= slider.nb ) { hideButton(slider.next); } } } }; var hideButton = function(dom) { dom.animate( { opacity : 0.3}, 'fast' ); dom.css('cursor', 'default'); dom.attr('active', 0); }; var showButton = function(dom) { dom.animate( { opacity : 1}, 'fast' ); dom.css('cursor', 'pointer'); dom.attr('active', 1); }; /** * =================================================================================== * = PUBLIC FUNCTIONS * =================================================================================== */ el.previousPage = function(isClick, self) { if( isClick && slider.active ) { return; } slider.settings.onPagePrevious(); slider.active = true; var left = slider.elWidth *slider.settings.itemsOffset ; //alert(slider.realIdx <= slider.settings.itemsToShow); //alert(slider.current <= slider.settings.itemsToShow); if(!self && slider.realIdx <= slider.settings.itemsToShow ) { var hiddenEnd = slider.settings.itemsToShow - 1; var diff = -(slider.current + slider.settings.itemsToShow); var offset = diff * slider.elWidth; $('ul', el).css({'left' : offset + 'px'}); slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; el.previousPage(false, true); return; } slider.current -= slider.settings.itemsOffset; if( slider.current < 0 ) { slider.current = slider.nb + slider.current; } $('ul', el).animate({'left' : '+=' + left + 'px'}, 600, function() { slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; if( slider.current < 0 ) { slider.current = slider.nb - slider.current; } slider.active = false; }); }; el.nextPage = function(isClick, self) { if( isClick && slider.active ) { return; } slider.settings.onPageNext(); slider.active = true; var left = slider.elWidth *slider.settings.itemsOffset ; var hiddenStart = slider.nb - slider.settings.itemsToShow; if(slider.realIdx >slider.settings.itemsToShow && !self && hiddenStart <= slider.current ) { var diff = hiddenStart - slider.current var offset = diff * slider.elWidth; $('ul', el).css({'left' : offset + 'px'}); slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; el.nextPage(false, true); return; } slider.current += slider.settings.itemsOffset; if( slider.current >= slider.nb ) { slider.current -= slider.nb; } $('ul', el).animate({'left' : '-=' + left + 'px'}, 600, function() { slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; if( slider.current >= slider.nb ) { slider.current -= slider.nb; } slider.active = false; }); }; el.setCurrent = function(current, auto) { var offset = 0; //alert('setcurrent = '+current); $('li', el).removeClass('active'); $('li[idx='+current+']', el).addClass('active'); if( current <= 5 ) { // offset = current; } if( slider.active ) { return; } //var left = slider.elWidth * (current + slider.settings.itemsToShow) ; //alert(slider.elWidth); /* var left = slider.elWidth*current + ( slider.elWidth * slider.settings.itemsToShow); //alert( left ); if( left < -parseInt($('ul', el).css('left')) ) { alert('next'); el.nextPage(false); return; } */ /* $('ul', el).animate({'left' : '+=' left + 'px'}, 600, function() { }); */ //alert(auto); if( auto ) { var left = slider.elWidth *slider.settings.itemsOffset ; var hiddenStart = slider.nb - slider.settings.itemsToShow; if(slider.realIdx >slider.settings.itemsToShow && hiddenStart <= slider.current ) { var diff = hiddenStart - slider.current var offset = diff * slider.elWidth; $('ul', el).css({'left' : offset + 'px'}); slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; } slider.current = slider.current + 1; if( slider.current % slider.settings.itemsToShow == 0 ) { var left = slider.elWidth * slider.settings.itemsToShow ; $('ul', el).animate({'left' : '-='+ left + 'px'}, 600, function() { slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; if( slider.current >= slider.nb ) { slider.current -= slider.nb; } }); slider.currentPage = 1; } if( slider.current >= slider.nb ) { slider.current -= slider.nb; } /* OLD var left = slider.elWidth *slider.settings.itemsOffset ; var hiddenStart = slider.nb - slider.settings.itemsToShow; if( hiddenStart <= slider.current ) { var diff = hiddenStart - slider.current var offset = diff * slider.elWidth; $('ul', el).css({'left' : offset + 'px'}); slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; } slider.current = slider.current + 1; var left = slider.elWidth ; $('ul', el).animate({'left' : '-='+ left + 'px'}, 600, function() { slider.realIdx = -parseInt($('ul', el).css('left')) / slider.elWidth; if( slider.current >= slider.nb ) { slider.current -= slider.nb; } }); */ } if( slider.settings.infiniteSlide ) { //current += slider.settings.itemsToShow; } var sens = current > slider.current ? 1 : -1; return false; // var page = current < 5 ? 0 : Math.ceil( (current - 4) / 2 ); // setPage(page, /*sens,*/ offset); } init(); // returns the current jQuery object return this; }; })( jQuery );