/** * Arnold UI Carousel jQuery Plugin * @version 1 * @author James Childers * @copyright (c) 2012 Arnold Media Consulting * @requires jQuery 1.7.1 */ $.fn.carousel = function(options, callback) { if($.isFunction(options)) { callback = options; options = {}; } // combine default options and user provided options options = $.extend({}, $.fn.carousel.default_options, options); var currentIndex = 0, methods = { init: function() { // loop through instances return this.each(function() { // create instance object var carousel = { parentEl: $(this), wrapper : $(this).find(options.wrapperSelectorName), items : $(this).find(options.wrapperSelectorName).find(options.itemSelectorName) }; // set required css var maskWidth = 0; carousel.items.each(function(i, el) { if (i == 0) { $(this).addClass('selected') } maskWidth += ($(this).outerWidth() + 100); $(this).css({'width': $(this).width(), 'margin-right': 100}); }); carousel.wrapper.css({'position': 'relative', 'width': maskWidth}); carousel.items.css({'float': 'left'}); carousel.parentEl.css({'position': 'relative'}); if(options.showMask) { carousel.parentEl.css({'overflow': 'hidden'}); } // move to defualt position methods.move(carousel, options.defaultPosition); carousel.parentEl.data('is-animating', false); // create nav + pagination html var html = ''; if(options.showNav) { html += ''; } if(options.showPagination) { html += ''; } // add to dom carousel.parentEl.append(html); // center pagination if(options.centerPagination) { var pagWrap = carousel.parentEl.find('.amc-carousel-pagination'), pagWidth = pagWrap.width(); pagWrap.css({ width: pagWidth, position: 'relative', marginLeft: '50%', left: (pagWidth/2) * -1 }) } // next btn carousel.parentEl.find('.amc-carousel-next').click(function(e) { methods.showNext(carousel); e.preventDefault(); e.stopPropagation(); }); // prev btn carousel.parentEl.find('.amc-carousel-prev').click(function(e) { methods.showPrev(carousel); e.preventDefault(); e.stopPropagation(); }); // pagination btns carousel.parentEl.find('.amc-carousel-pagination .amc-carousel-pagination-item[data-index] a').click( function(e) { var newPosition = $(this).parent().data('index'), $this = $(this); carousel.parentEl.find('.amc-carousel-pagination .amc-carousel-pagination-item[data-index].selected').removeClass('selected'); carousel.parentEl.find('.item').removeClass('selected'); $(carousel.parentEl.find('.item')[$(this).parent().data('index')]).addClass('selected'); $this.parent().addClass('selected'); methods.move(carousel, newPosition); e.preventDefault(); e.stopPropagation(); }); // set active pagination item carousel.parentEl.find('.amc-carousel-pagination div[data-index=' + options.defaultPosition + ']').addClass('selected'); }); }, showNext: function(carousel) { var currentWrapPosition = carousel.wrapper.position().left; var itemWidth = carousel.wrapper.width() / carousel.items.length; var newPosition = Math.abs(currentWrapPosition / itemWidth); var newIndex = Math.ceil(newPosition)+1; if(newIndex === carousel.items.length) { methods.move(carousel, 0, 'next'); } else { methods.move(carousel, newIndex, 'next'); } }, showPrev: function(carousel) { var currentWrapPosition = carousel.wrapper.position().left; var itemWidth = carousel.wrapper.width() / carousel.items.length; var newPosition = Math.abs(currentWrapPosition / itemWidth); var newIndex = Math.ceil((newPosition < carousel.items.length && newPosition > 0) ? newPosition - 1 : carousel.items.length - 1); // if in first pos, move to last if(currentWrapPosition === 0) { methods.move(carousel, carousel.items.length - 1, 'previous'); } else { methods.move(carousel, newIndex, 'previous'); } }, move: function(carousel, newPosition, direction) { if(carousel.parentEl.data('is-animating')) { return carousel; } var currentSelection = carousel.parentEl.find('.amc-carousel-pagination .amc-carousel-pagination-item[data-index].selected'); var currentItem = carousel.parentEl.find('.item.selected'); var firstItem = carousel.parentEl.find('.item:first'); var lastItem = carousel.parentEl.find('.item:last'); if(direction == 'next') { if(!currentSelection.next().find('a.amc-carousel-next').length > 0) { currentSelection.next().addClass('selected'); currentItem.next().addClass('selected'); } else { carousel.parentEl.find('.amc-carousel-pagination .amc-carousel-pagination-item[data-index]').first().addClass('selected'); firstItem.addClass('selected') } currentSelection.removeClass('selected'); currentItem.removeClass('selected'); } if(direction == 'previous') { if(!currentSelection.prev().find('a.amc-carousel-prev').length > 0) { currentSelection.prev().addClass('selected'); currentItem.prev().addClass('selected'); } else { carousel.parentEl.find('.amc-carousel-pagination .amc-carousel-pagination-item[data-index]').last().addClass('selected'); lastItem.addClass('selected') } currentSelection.removeClass('selected'); currentItem.removeClass('selected'); } // update pagination // get current and new pos var itemWidth = carousel.wrapper.width() / carousel.items.length; var currentWrapPosition = carousel.wrapper.position().left; newPosition = -(newPosition * itemWidth); // animate to new position carousel.parentEl.data('is-animating', true); carousel.wrapper.stop().animate( { 'left': newPosition }, { duration: options.animateSpeed, complete: function() { carousel.parentEl.data('is-animating', false); } } ); } }; // call init() methods.init.apply(this, []); }; $.fn.carousel.default_options = { wrapperSelectorName : '.carousel-wrapper', itemSelectorName : '.carousel-item', paginationWrapSelectorName: '.amc-carousel-pagination', paginationItemSelectorName: '.amc-carousel-pagination-item', prevButtonSelectorName : '.amc-carousel-prev', nextButtonSelectorName : '.amc-carousel-next', defaultPosition : 0, animateSpeed : 500, showMask : true, showNav : true, showPagination : true, centerPagination : true, marginRight : 100 };