Team:StuyGem NYC/foundation.orbit.js

From 2014hs.igem.org

(function ($, window, document, undefined) {
 'use strict';
 var noop = function() {};
 var Orbit = function(el, settings) {
   // Don't reinitialize plugin
   if (el.hasClass(settings.slides_container_class)) {
     return this;
   }
   var self = this,
       container,
       slides_container = el,
       number_container,
       bullets_container,
       timer_container,
       idx = 0,
       animate,
       adjust_height_after = false,
       has_init_active = slides_container.find("." + settings.active_slide_class).length > 0;
   self.cache = {};
   self.slides = function() {
     return slides_container.children(settings.slide_selector);
   };
   if (!has_init_active) {self.slides().first().addClass(settings.active_slide_class)};
   self.update_slide_number = function(index) {
     if (settings.slide_number) {
       number_container.find('span:first').text(parseInt(index)+1);
       number_container.find('span:last').text(self.slides().length);
     }
     if (settings.bullets) {
       bullets_container.children().removeClass(settings.bullets_active_class);
       $(bullets_container.children().get(index)).addClass(settings.bullets_active_class);
     }
   };
   self.update_active_link = function(index) {
     var link = $('[data-orbit-link="'+self.slides().eq(index).attr('data-orbit-slide')+'"]');
     link.siblings().removeClass(settings.bullets_active_class);
     link.addClass(settings.bullets_active_class);
   };
   self.build_markup = function() {
slides_container.wrap('
');
     container = slides_container.parent();
     slides_container.addClass(settings.slides_container_class);
     slides_container.addClass(settings.animation);
     
     if (settings.stack_on_small) {
       container.addClass(settings.stack_on_small_class);
     }
     if (settings.navigation_arrows) {
       container.append($('<a href="#"></a>').addClass(settings.prev_class));
       container.append($('<a href="#"></a>').addClass(settings.next_class));
     }
     if (settings.timer) {
timer_container = $('
').addClass(settings.timer_container_class);
       timer_container.append('');
       if (settings.timer_show_progress_bar) {
timer_container.append($('
').addClass(settings.timer_progress_class));
       }
       timer_container.addClass(settings.timer_paused_class);
       container.append(timer_container);
     }
     if (settings.slide_number) {
number_container = $('
').addClass(settings.slide_number_class);
       number_container.append(' ' + settings.slide_number_text + ' ');
       container.append(number_container);
     }
     if (settings.bullets) {
bullets_container = $('
    ').addClass(settings.bullets_container_class); container.append(bullets_container); bullets_container.wrap('
    ');
           self.slides().each(function(idx, el) {
    
    var bullet = $('
  1. ').attr('data-orbit-slide', idx); bullets_container.append(bullet); }); } }; self._prepare_direction = function(next_idx, current_direction) { var dir = 'next'; if (next_idx <= idx) { dir = 'prev'; } if (settings.animation === 'slide') { setTimeout(function(){ slides_container.removeClass("swipe-prev swipe-next"); if (dir === 'next') {slides_container.addClass("swipe-next");} else if (dir === 'prev') {slides_container.addClass("swipe-prev");} },0); } var slides = self.slides(); if (next_idx >= slides.length) { if (!settings.circular) return false; next_idx = 0; } else if (next_idx < 0) { if (!settings.circular) return false; next_idx = slides.length - 1; } var current = $(slides.get(idx)) , next = $(slides.get(next_idx)); return [dir, current, next, next_idx]; }; self._goto = function(next_idx, start_timer) { if (next_idx === null) {return false;} if (self.cache.animating) {return false;} if (next_idx === idx) {return false;} if (typeof self.cache.timer === 'object') {self.cache.timer.restart();} var slides = self.slides(); self.cache.animating = true; var res = self._prepare_direction(next_idx) , dir = res[0] , current = res[1] , next = res[2] , next_idx = res[3]; // This means that circular is disabled and we most likely reached the last slide. if (res === false) return false; slides_container.trigger('before-slide-change.fndtn.orbit'); settings.before_slide_change(); idx = next_idx; current.css("transitionDuration", settings.animation_speed+"ms"); next.css("transitionDuration", settings.animation_speed+"ms"); var callback = function() { var unlock = function() { if (start_timer === true) {self.cache.timer.restart();} self.update_slide_number(idx); next.addClass(settings.active_slide_class); self.update_active_link(next_idx); slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]); settings.after_slide_change(idx, slides.length); setTimeout(function(){ self.cache.animating = false; }, 100); }; if (slides_container.height() != next.height() && settings.variable_height) { slides_container.animate({'height': next.height()}, 250, 'linear', unlock); } else { unlock(); } }; if (slides.length === 1) {callback(); return false;} var start_animation = function() { if (dir === 'next') {animate.next(current, next, callback);} if (dir === 'prev') {animate.prev(current, next, callback);} }; if (next.height() > slides_container.height() && settings.variable_height) { slides_container.animate({'height': next.height()}, 250, 'linear', start_animation); } else { start_animation(); } }; self.next = function(e) { e.stopImmediatePropagation(); e.preventDefault(); self._prepare_direction(idx + 1); setTimeout(function(){ self._goto(idx + 1); }, 100); }; self.prev = function(e) { e.stopImmediatePropagation(); e.preventDefault(); self._prepare_direction(idx - 1); setTimeout(function(){ self._goto(idx - 1) }, 100); }; self.link_custom = function(e) { e.preventDefault(); var link = $(this).attr('data-orbit-link'); if ((typeof link === 'string') && (link = $.trim(link)) != "") { var slide = container.find('[data-orbit-slide='+link+']'); if (slide.index() != -1) { setTimeout(function(){ self._goto(slide.index()); },100); } } }; self.link_bullet = function(e) { var index = $(this).attr('data-orbit-slide'); if ((typeof index === 'string') && (index = $.trim(index)) != "") { if(isNaN(parseInt(index))) { var slide = container.find('[data-orbit-slide='+index+']'); if (slide.index() != -1) { setTimeout(function(){ self._goto(slide.index() + 1); },100); } } else { setTimeout(function(){ self._goto(parseInt(index)); },100); } } } self.timer_callback = function() { self._goto(idx + 1, true); } self.compute_dimensions = function() { var current = $(self.slides().get(idx)); var h = current.height(); if (!settings.variable_height) { self.slides().each(function(){ if ($(this).height() > h) { h = $(this).height(); } }); } slides_container.height(h); }; self.create_timer = function() { var t = new Timer( container.find('.'+settings.timer_container_class), settings, self.timer_callback ); return t; }; self.stop_timer = function() { if (typeof self.cache.timer === 'object') self.cache.timer.stop(); }; self.toggle_timer = function() { var t = container.find('.'+settings.timer_container_class); if (t.hasClass(settings.timer_paused_class)) { if (typeof self.cache.timer === 'undefined') {self.cache.timer = self.create_timer();} self.cache.timer.start(); } else { if (typeof self.cache.timer === 'object') {self.cache.timer.stop();} } }; self.init = function() { self.build_markup(); if (settings.timer) { self.cache.timer = self.create_timer(); Foundation.utils.image_loaded(this.slides().children('img'), self.cache.timer.start); } animate = new CSSAnimation(settings, slides_container); if (has_init_active) { var $init_target = slides_container.find("." + settings.active_slide_class), animation_speed = settings.animation_speed; settings.animation_speed = 1; $init_target.removeClass('active'); self._goto($init_target.index()); settings.animation_speed = animation_speed; } container.on('click', '.'+settings.next_class, self.next); container.on('click', '.'+settings.prev_class, self.prev); if (settings.next_on_click) { container.on('click', '[data-orbit-slide]', self.link_bullet); } container.on('click', self.toggle_timer); if (settings.swipe) { slides_container.on('touchstart.fndtn.orbit',function(e) { if (self.cache.animating) {return;} if (!e.touches) {e = e.originalEvent;} e.preventDefault(); e.stopPropagation(); self.cache.start_page_x = e.touches[0].pageX; self.cache.start_page_y = e.touches[0].pageY; self.cache.start_time = (new Date()).getTime(); self.cache.delta_x = 0; self.cache.is_scrolling = null; self.cache.direction = null; self.stop_timer(); // does not appear to prevent callback from occurring }) .on('touchmove.fndtn.orbit',function(e) { if (Math.abs(self.cache.delta_x) > 5) { e.preventDefault(); e.stopPropagation(); } if (self.cache.animating) {return;} requestAnimationFrame(function(){ if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if(e.touches.length > 1 || e.scale && e.scale !== 1) return; self.cache.delta_x = e.touches[0].pageX - self.cache.start_page_x; if (self.cache.is_scrolling === null) { self.cache.is_scrolling = !!( self.cache.is_scrolling || Math.abs(self.cache.delta_x) < Math.abs(e.touches[0].pageY - self.cache.start_page_y) ); } if (self.cache.is_scrolling) { return; } var direction = (self.cache.delta_x < 0) ? (idx+1) : (idx-1); if (self.cache.direction !== direction) { var res = self._prepare_direction(direction); self.cache.direction = direction; self.cache.dir = res[0]; self.cache.current = res[1]; self.cache.next = res[2]; } if (settings.animation === 'slide') { var offset, next_offset; offset = (self.cache.delta_x / container.width()) * 100; if (offset >= 0) {next_offset = -(100 - offset);} else {next_offset = 100 + offset;} self.cache.current.css("transform","translate3d("+offset+"%,0,0)"); self.cache.next.css("transform","translate3d("+next_offset+"%,0,0)"); } }); }) .on('touchend.fndtn.orbit', function(e) { if (self.cache.animating) {return;} e.preventDefault(); e.stopPropagation(); setTimeout(function(){ self._goto(self.cache.direction); }, 50); }); } container.on('mouseenter.fndtn.orbit', function(e) { if (settings.timer && settings.pause_on_hover) { self.stop_timer(); } }) .on('mouseleave.fndtn.orbit', function(e) { if (settings.timer && settings.resume_on_mouseout) { self.cache.timer.start(); } }); $(document).on('click', '[data-orbit-link]', self.link_custom); $(window).on('load resize', self.compute_dimensions); var children = this.slides().find('img'); Foundation.utils.image_loaded(children, self.compute_dimensions); Foundation.utils.image_loaded(children, function() { container.prev('.'+settings.preloader_class).css('display', 'none'); self.update_slide_number(idx); self.update_active_link(idx); slides_container.trigger('ready.fndtn.orbit'); }); }; self.init(); }; var Timer = function(el, settings, callback) { var self = this, duration = settings.timer_speed, progress = el.find('.'+settings.timer_progress_class), do_progress = progress && progress.css('display') != 'none', start, timeout, left = -1; this.update_progress = function(w) { var new_progress = progress.clone(); new_progress.attr('style', ); new_progress.css('width', w+'%'); progress.replaceWith(new_progress); progress = new_progress; }; this.restart = function() { clearTimeout(timeout); el.addClass(settings.timer_paused_class); left = -1; if (do_progress) {self.update_progress(0);} self.start(); }; this.start = function() { if (!el.hasClass(settings.timer_paused_class)) {return true;} left = (left === -1) ? duration : left; el.removeClass(settings.timer_paused_class); if (do_progress) { start = new Date().getTime(); progress.animate({'width': '100%'}, left, 'linear'); } timeout = setTimeout(function() { self.restart(); callback(); }, left); el.trigger('timer-started.fndtn.orbit') }; this.stop = function() { if (el.hasClass(settings.timer_paused_class)) {return true;} clearTimeout(timeout); el.addClass(settings.timer_paused_class); if (do_progress) { var end = new Date().getTime(); left = left - (end - start); var w = 100 - ((left / duration) * 100); self.update_progress(w); } el.trigger('timer-stopped.fndtn.orbit'); }; }; var CSSAnimation = function(settings, container) { var animation_end = "webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend"; this.next = function(current, next, callback) { if (Modernizr.csstransitions) { next.on(animation_end, function(e){ next.unbind(animation_end); current.removeClass("active animate-out"); next.removeClass("animate-in"); container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); callback(); }); } else { setTimeout(function(){ current.removeClass("active animate-out"); next.removeClass("animate-in"); container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); callback(); }, settings.animation_speed); } container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); current.addClass("animate-out"); next.addClass("animate-in"); }; this.prev = function(current, prev, callback) { if (Modernizr.csstransitions) { prev.on(animation_end, function(e){ prev.unbind(animation_end); current.removeClass("active animate-out"); prev.removeClass("animate-in"); container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); callback(); }); } else { setTimeout(function(){ current.removeClass("active animate-out"); prev.removeClass("animate-in"); container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); callback(); }, settings.animation_speed); } container.children().css({ "transform":"", "-ms-transform":"", "-webkit-transition-duration":"", "-moz-transition-duration": "", "-o-transition-duration": "", "transition-duration":"" }); current.addClass("animate-out"); prev.addClass("animate-in"); }; }; Foundation.libs = Foundation.libs || {}; Foundation.libs.orbit = { name: 'orbit', version: '5.2.2', settings: { animation: 'slide', timer_speed: 10000, pause_on_hover: true, resume_on_mouseout: false, next_on_click: true, animation_speed: 500, stack_on_small: false, navigation_arrows: true, slide_number: true, slide_number_text: 'of', container_class: 'orbit-container', stack_on_small_class: 'orbit-stack-on-small', next_class: 'orbit-next', prev_class: 'orbit-prev', timer_container_class: 'orbit-timer', timer_paused_class: 'paused', timer_progress_class: 'orbit-progress', timer_show_progress_bar: true, slides_container_class: 'orbit-slides-container', preloader_class: 'preloader', slide_selector: '*', bullets_container_class: 'orbit-bullets', bullets_active_class: 'active', slide_number_class: 'orbit-slide-number', caption_class: 'orbit-caption', active_slide_class: 'active', orbit_transition_class: 'orbit-transitioning', bullets: true, circular: true, timer: true, variable_height: false, swipe: true, before_slide_change: noop, after_slide_change: noop }, init : function (scope, method, options) { var self = this; this.bindings(method, options); }, events : function (instance) { var orbit_instance = new Orbit(this.S(instance), this.S(instance).data('orbit-init')); this.S(instance).data(self.name + '-instance', orbit_instance); }, reflow : function () { var self = this; if (self.S(self.scope).is('[data-orbit]')) { var $el = self.S(self.scope); var instance = $el.data(self.name + '-instance'); instance.compute_dimensions(); } else { self.S('[data-orbit]', self.scope).each(function(idx, el) { var $el = self.S(el); var opts = self.data_options($el); var instance = $el.data(self.name + '-instance'); instance.compute_dimensions(); }); } } }; }(jQuery, this, this.document));