(function ($) {
function FadeTransition(element, opts) {
var el = element,
$el = $(el),
fadeTimer = null,
current = 0,
paused = false,
self = this,
options = $.extend({pauseTime: 5000,
transitionTime: 2000,
ignore: null,
singleLoop: false,
delayStart: 0,
pauseOnMouseOver: false,
manualNavigation: false,
createNavButtons: false,
navButtonContainer: null}, opts),
els = (options.ignore)?$("> *:not(" + options.ignore + ")", el):$("> *", el);
function setup() {
$el.css("position", "relative");
els.css("display", "none").css({left: 0, top: 0, position: "absolute"});
els.filter(':first').css("display", "block");
if (options.createNavButtons) {
createNavButtons();
highlightNav();
}
if (options.pauseOnMouseOver) {
$el.mouseover(pause).mouseout(unpause);
$('a', options.navButtonContainer || el).mouseover(pause).mouseout(unpause);
}
if (options.delayStart > 0) {
setTimeout(start, options.delayStart);
}
else {
start();
}
}
function transitionTo(nextIdx) {
$(els[current]).fadeOut(options.transitionTime);
$(els[current = nextIdx]).fadeIn(options.transitionTime, cue);
highlightNav();
}
function manualNav(e) {
var idx;
this.blur();
$(els).stop(true);
clearTimeouts();
$(els).css({'opacity': 1, 'display': 'none'});
$(els[current]).css({'display': 'block'});
idx = $('.fadenav a', el).index(this);
transitionTo(idx);
e.preventDefault();
}
function createNavButtons() {
var i, nav = $('
');
for (i=0; i ', options.navButtonContainer || el).click(manualNav).appendTo(nav);
}
nav.appendTo(options.navButtonContainer || el);
}
function highlightNav() {
if (options.createNavButtons) {
$('.fadenav a', options.navButtonContainer || el).removeClass('current');
$('.fadenav a:nth-child(' + (1 + current) + ')', options.navButtonContainer || el).addClass('current');
}
}
function start() {
if (options.ignore) {
$(options.ignore, el).fadeOut(options.transitionTime);
$(els[current]).fadeIn(options.transitionTime);
fadeTimer = setTimeout(self.next, options.pauseTime + options.transitionTime);
}
else {
highlightNav();
if (!options.manualNavigation) {
fadeTimer = setTimeout(self.next, options.pauseTime);
}
}
}
function pause() {
paused = true;
clearTimeouts();
}
function unpause() {
paused = false;
cue();
}
function clearTimeouts() {
if (fadeTimer) {
window.clearTimeout(fadeTimer);
fadeTimer = null;
}
}
this.show = function(item) {
if (typeof(els[item]) !== 'undefined') {
clearTimeouts();
transition(item);
}
return this;
};
this.currentItem = function() {
return current;
}
function cue() {
if (paused || options.manualNavigation || (els.length < 2)) {
return false;
}
clearTimeouts();
fadeTimer = window.setTimeout(self.next, options.pauseTime);
}
this.next = function() {
if (!options.singleLoop || ((current + 1) % els.length > 0)) {
transitionTo((current + 1) % els.length || 0);
}
};
this.prev = function() {
transitionTo(((current || els.length) - 1) % els.length);
};
$el.data('Fader', this);
setup();
}
$.fn.fadeTransition = function(options) {
function getFader() {
if (typeof $(this).data('Fader') === 'object') {
return $(this).data('Fader');
}
else {
return new FadeTransition(this, options);
}
}
this.fader = function() {
if (typeof $(this).filter(':first').data('Fader') === 'object') {
return $(this).filter(':first').data('Fader');
}
return null;
};
return this.each(getFader);
};
}(jQuery));