123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- ;(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,
- timer,
- locked = false,
- adjust_height_after = false;
- self.slides = function() {
- return slides_container.children(settings.slide_selector);
- };
- 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 = $('a[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);
-
- 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>');
- 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);
- });
- }
- if (settings.stack_on_small) {
- container.addClass(settings.stack_on_small_class);
- }
- };
- self._goto = function(next_idx, start_timer) {
- // if (locked) {return false;}
- if (next_idx === idx) {return false;}
- if (typeof timer === 'object') {timer.restart();}
- var slides = self.slides();
- var dir = 'next';
- locked = true;
- if (next_idx < idx) {dir = 'prev';}
- 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));
- var next = $(slides.get(next_idx));
- current.css('zIndex', 2);
- current.removeClass(settings.active_slide_class);
- next.css('zIndex', 4).addClass(settings.active_slide_class);
- slides_container.trigger('before-slide-change.fndtn.orbit');
- settings.before_slide_change();
- self.update_active_link(next_idx);
-
- var callback = function() {
- var unlock = function() {
- idx = next_idx;
- locked = false;
- if (start_timer === true) {timer = self.create_timer(); timer.start();}
- self.update_slide_number(idx);
- slides_container.trigger('after-slide-change.fndtn.orbit',[{slide_number: idx, total_slides: slides.length}]);
- settings.after_slide_change(idx, slides.length);
- };
- 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._goto(idx + 1);
- };
-
- self.prev = function(e) {
- e.stopImmediatePropagation();
- e.preventDefault();
- self._goto(idx - 1);
- };
- 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) {self._goto(slide.index());}
- }
- };
- 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) {self._goto(slide.index() + 1);}
- }
- else
- {
- self._goto(parseInt(index));
- }
- }
- }
- 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 timer === 'object') timer.stop();
- };
- self.toggle_timer = function() {
- var t = container.find('.'+settings.timer_container_class);
- if (t.hasClass(settings.timer_paused_class)) {
- if (typeof timer === 'undefined') {timer = self.create_timer();}
- timer.start();
- }
- else {
- if (typeof timer === 'object') {timer.stop();}
- }
- };
- self.init = function() {
- self.build_markup();
- if (settings.timer) {
- timer = self.create_timer();
- Foundation.utils.image_loaded(this.slides().children('img'), timer.start);
- }
- animate = new FadeAnimation(settings, slides_container);
- if (settings.animation === 'slide')
- animate = new SlideAnimation(settings, slides_container);
- container.on('click', '.'+settings.next_class, self.next);
- container.on('click', '.'+settings.prev_class, self.prev);
- container.on('click', '[data-orbit-slide]', self.link_bullet);
- container.on('click', self.toggle_timer);
- if (settings.swipe) {
- container.on('touchstart.fndtn.orbit', function(e) {
- if (!e.touches) {e = e.originalEvent;}
- var data = {
- start_page_x: e.touches[0].pageX,
- start_page_y: e.touches[0].pageY,
- start_time: (new Date()).getTime(),
- delta_x: 0,
- is_scrolling: undefined
- };
- container.data('swipe-transition', data);
- e.stopPropagation();
- })
- .on('touchmove.fndtn.orbit', function(e) {
- if (!e.touches) { e = e.originalEvent; }
- // Ignore pinch/zoom events
- if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
- var data = container.data('swipe-transition');
- if (typeof data === 'undefined') {data = {};}
- data.delta_x = e.touches[0].pageX - data.start_page_x;
- if ( typeof data.is_scrolling === 'undefined') {
- data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) );
- }
- if (!data.is_scrolling && !data.active) {
- e.preventDefault();
- var direction = (data.delta_x < 0) ? (idx+1) : (idx-1);
- data.active = true;
- self._goto(direction);
- }
- })
- .on('touchend.fndtn.orbit', function(e) {
- container.data('swipe-transition', {});
- e.stopPropagation();
- })
- }
- 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) {
- timer.start();
- }
- });
-
- $(document).on('click', '[data-orbit-link]', self.link_custom);
- $(window).on('resize', self.compute_dimensions);
- Foundation.utils.image_loaded(this.slides().children('img'), self.compute_dimensions);
- Foundation.utils.image_loaded(this.slides().children('img'), function() {
- container.prev('.preloader').css('display', 'none');
- self.update_slide_number(0);
- self.update_active_link(0);
- 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),
- 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;
- self.update_progress(0);
- };
- this.start = function() {
- if (!el.hasClass(settings.timer_paused_class)) {return true;}
- left = (left === -1) ? duration : left;
- el.removeClass(settings.timer_paused_class);
- 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);
- 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 SlideAnimation = function(settings, container) {
- var duration = settings.animation_speed;
- var is_rtl = ($('html[dir=rtl]').length === 1);
- var margin = is_rtl ? 'marginRight' : 'marginLeft';
- var animMargin = {};
- animMargin[margin] = '0%';
- this.next = function(current, next, callback) {
- current.animate({marginLeft:'-100%'}, duration);
- next.animate(animMargin, duration, function() {
- current.css(margin, '100%');
- callback();
- });
- };
- this.prev = function(current, prev, callback) {
- current.animate({marginLeft:'100%'}, duration);
- prev.css(margin, '-100%');
- prev.animate(animMargin, duration, function() {
- current.css(margin, '100%');
- callback();
- });
- };
- };
- var FadeAnimation = function(settings, container) {
- var duration = settings.animation_speed;
- var is_rtl = ($('html[dir=rtl]').length === 1);
- var margin = is_rtl ? 'marginRight' : 'marginLeft';
- this.next = function(current, next, callback) {
- next.css({'margin':'0%', 'opacity':'0.01'});
- next.animate({'opacity':'1'}, duration, 'linear', function() {
- current.css('margin', '100%');
- callback();
- });
- };
- this.prev = function(current, prev, callback) {
- prev.css({'margin':'0%', 'opacity':'0.01'});
- prev.animate({'opacity':'1'}, duration, 'linear', function() {
- current.css('margin', '100%');
- callback();
- });
- };
- };
- Foundation.libs = Foundation.libs || {};
- Foundation.libs.orbit = {
- name: 'orbit',
- version: '5.1.1',
- settings: {
- animation: 'slide',
- timer_speed: 10000,
- pause_on_hover: true,
- resume_on_mouseout: false,
- 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',
- slides_container_class: 'orbit-slides-container',
- 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));
|