/**
* 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
};