Team:WITS-CSIR SA/js/lib/liteaccordion.jquery.js

From 2011.igem.org

/*************************************************

  • project: liteAccordion - horizontal accordion plugin for jQuery
  • author: Nicola Hibbert
  • url: http://nicolahibbert.com/horizontal-accordion-jquery-plugin
  • demo: http://www.nicolahibbert.com/demo/liteAccordion
  • Version: 1.1.3
  • Copyright: (c) 2010-2011 Nicola Hibbert

/*************************************************/

(function($) {

$.fn.liteAccordion = function(options) {

// defaults var defaults = { containerWidth : 960, containerHeight : 320, headerWidth : 48,

firstSlide : 1, onActivate : function() {}, slideSpeed : 800, slideCallback : function() {},

autoPlay : false, pauseOnHover : false, cycleSpeed : 6000,

theme : 'basic', // basic, light*, dark, stitch* rounded : false, enumerateSlides : false },

// merge defaults with options in new settings object settings = $.extend({}, defaults, options),

// define key variables $accordion = this, $slides = $accordion.find('li'), slideLen = $slides.length, slideWidth = settings.containerWidth - (slideLen * settings.headerWidth), $header = $slides.children('h2'),

// core utility and animation methods utils = { getGroup : function(pos, index) { if (this.offsetLeft === pos.left) { return $header.slice(index + 1, slideLen).filter(function() { return this.offsetLeft === $header.index(this) * settings.headerWidth }); } else if (this.offsetLeft === pos.right) { return $header.slice(0, index + 1).filter(function() { return this.offsetLeft === slideWidth + ($header.index(this) * settings.headerWidth) }); } }, nextSlide : function(slideIndex) { var slide = slideIndex + 1 || settings.firstSlide;

// get index of next slide return function() { return slide++ % slideLen; } }, play : function(slideIndex) { var getNext = utils.nextSlide((slideIndex) ? slideIndex : ), // create closure start = function() { $header.eq(getNext()).click(); };

utils.playing = setInterval(start, settings.cycleSpeed); }, pause : function() { clearInterval(utils.playing); }, playing : 0, sentinel : false };

// set container heights, widths, theme & corner style $accordion .height(settings.containerHeight) .width(settings.containerWidth) .addClass(settings.theme) .addClass(settings.rounded && 'rounded');

// set tab width, height and selected class $header .width(settings.containerHeight) .height(settings.headerWidth) .eq(settings.firstSlide - 1).addClass('selected');

// ie :( if ($.browser.msie) { if ($.browser.version.substr(0,1) > 8) { $header.css('filter', 'none'); } else if ($.browser.version.substr(0,1) < 7) { return false; } }

// set initial positions for each slide $header.each(function(index) { var $this = $(this), left = index * settings.headerWidth;

if (index >= settings.firstSlide) left += slideWidth;

$this .css('left', left) .next() .width(slideWidth) .css({ left : left, paddingLeft : settings.headerWidth });

// add number to bottom of tab settings.enumerateSlides && $this.append('' + (index + 1) + '');

});

// bind event handler for activating slides $header.click(function(e) { var $this = $(this), index = $header.index($this), $next = $this.next(), pos = { left : index * settings.headerWidth, right : index * settings.headerWidth + slideWidth, newPos : 0 }, $group = utils.getGroup.call(this, pos, index);

// set animation direction if (this.offsetLeft === pos.left) { pos.newPos = slideWidth; } else if (this.offsetLeft === pos.right) { pos.newPos = -slideWidth; }

// check if animation in progress if (!$header.is(':animated')) {

// activate onclick callback with slide div as context if (e.originalEvent) { if (utils.sentinel === this) return false; settings.onActivate.call($next); utils.sentinel = this; } else { settings.onActivate.call($next); utils.sentinel = false; }

// remove, then add selected class $header.removeClass('selected').filter($this).addClass('selected');

// get group of tabs & animate $group .animate({ left : '+=' + pos.newPos }, settings.slideSpeed, function() { settings.slideCallback.call($next) }) .next() .animate({ left : '+=' + pos.newPos }, settings.slideSpeed);

} });

// pause on hover if (settings.pauseOnHover) { $accordion.hover(function() { utils.pause(); }, function() { utils.play($header.index($header.filter('.selected'))); }); }

// start autoplay, call utils with no args = start from firstSlide settings.autoPlay && utils.play();

return $accordion;

};

})(jQuery);