|
|
Line 1: |
Line 1: |
- | ;(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('<div class="'+settings.container_class+'"></div>');
| |
- | 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="#"><span></span></a>').addClass(settings.prev_class));
| |
- | container.append($('<a href="#"><span></span></a>').addClass(settings.next_class));
| |
- | }
| |
- |
| |
- | if (settings.timer) {
| |
- | timer_container = $('<div>').addClass(settings.timer_container_class);
| |
- | timer_container.append('<span>');
| |
- | if (settings.timer_show_progress_bar) {
| |
- | timer_container.append($('<div>').addClass(settings.timer_progress_class));
| |
- | }
| |
- | timer_container.addClass(settings.timer_paused_class);
| |
- | container.append(timer_container);
| |
- | }
| |
- |
| |
- | if (settings.slide_number) {
| |
- | number_container = $('<div>').addClass(settings.slide_number_class);
| |
- | number_container.append('<span></span> ' + settings.slide_number_text + ' <span></span>');
| |
- | container.append(number_container);
| |
- | }
| |
- |
| |
- | if (settings.bullets) {
| |
- | bullets_container = $('<ol>').addClass(settings.bullets_container_class);
| |
- | container.append(bullets_container);
| |
- | bullets_container.wrap('<div class="orbit-bullets-container"></div>');
| |
- | self.slides().each(function(idx, el) {
| |
- | var bullet = $('<li>').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));
| |