473 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			473 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | ;(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 = $('[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.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>'); | ||
|  |         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).on('click', self.link_bullet);; | ||
|  |           bullets_container.append(bullet); | ||
|  |         }); | ||
|  |       } | ||
|  | 
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     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); | ||
|  | 
 | ||
|  |       if (settings.next_on_click) { | ||
|  |         container.on('click', '.'+settings.slides_container_class+' [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('load 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('.'+settings.preloader_class).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.4.7', | ||
|  | 
 | ||
|  |     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', | ||
|  |       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(this.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, window, window.document)); |