You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
412 lines
13 KiB
412 lines
13 KiB
;(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; |
|
|
|
slides_container.children().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(slides_container.children().length); |
|
} |
|
if (settings.bullets) { |
|
bullets_container.children().removeClass(settings.bullets_active_class); |
|
$(bullets_container.children().get(index)).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>').addClass(settings.prev_class).append('<span>')); |
|
container.append($('<a>').addClass(settings.next_class).append('<span>')); |
|
} |
|
|
|
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> of <span></span>'); |
|
container.append(number_container); |
|
} |
|
|
|
if (settings.bullets) { |
|
bullets_container = $('<ol>').addClass(settings.bullets_container_class); |
|
container.append(bullets_container); |
|
slides_container.children().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.update_slide_number(0); |
|
}; |
|
|
|
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 = slides_container.children(); |
|
|
|
var dir = 'next'; |
|
locked = true; |
|
if (next_idx < idx) {dir = 'prev';} |
|
if (next_idx >= slides.length) {next_idx = 0;} |
|
else if (next_idx < 0) {next_idx = slides.length - 1;} |
|
|
|
var current = $(slides.get(idx)); |
|
var next = $(slides.get(next_idx)); |
|
|
|
current.css('zIndex', 2); |
|
next.css('zIndex', 4).addClass('active'); |
|
|
|
slides_container.trigger('orbit:before-slide-change'); |
|
settings.before_slide_change(); |
|
|
|
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('orbit:after-slide-change',[{slide_number: idx, total_slides: slides.length}]); |
|
settings.after_slide_change(idx, slides.length); |
|
}; |
|
if (slides_container.height() != next.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()) { |
|
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)) != "") { |
|
self._goto(index); |
|
} |
|
} |
|
|
|
self.timer_callback = function() { |
|
self._goto(idx + 1, true); |
|
} |
|
|
|
self.compute_dimensions = function() { |
|
var current = $(slides_container.children().get(idx)); |
|
var h = current.height(); |
|
if (!settings.variable_height) { |
|
slides_container.children().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(); timer.start();} |
|
animate = new FadeAnimation(slides_container); |
|
if (settings.animation === 'slide') |
|
animate = new SlideAnimation(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); |
|
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(); |
|
}) |
|
.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); |
|
$(window).on('load', self.compute_dimensions); |
|
slides_container.trigger('orbit:ready'); |
|
}; |
|
|
|
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('orbit:timer-started') |
|
}; |
|
|
|
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('orbit:timer-stopped'); |
|
}; |
|
}; |
|
|
|
var SlideAnimation = function(container) { |
|
var duration = 400; |
|
var is_rtl = ($('html[dir=rtl]').length === 1); |
|
var margin = is_rtl ? 'marginRight' : 'marginLeft'; |
|
|
|
this.next = function(current, next, callback) { |
|
next.animate({margin: '0%'}, duration, 'linear', function() { |
|
current.css(margin, '100%'); |
|
callback(); |
|
}); |
|
}; |
|
|
|
this.prev = function(current, prev, callback) { |
|
prev.css(margin, '-100%'); |
|
prev.animate({margin:'0%'}, duration, 'linear', function() { |
|
current.css(margin, '100%'); |
|
callback(); |
|
}); |
|
}; |
|
}; |
|
|
|
var FadeAnimation = function(container) { |
|
var duration = 250; |
|
|
|
this.next = function(current, next, callback) { |
|
next.css({'marginLeft':'0%', 'opacity':'0.01'}); |
|
next.animate({'opacity':'1'}, duration, 'linear', function() { |
|
current.css('marginLeft', '100%'); |
|
callback(); |
|
}); |
|
}; |
|
|
|
this.prev = function(current, prev, callback) { |
|
prev.css({'marginLeft':'0%', 'opacity':'0.01'}); |
|
prev.animate({'opacity':'1'}, duration, 'linear', function() { |
|
current.css('marginLeft', '100%'); |
|
callback(); |
|
}); |
|
}; |
|
}; |
|
|
|
|
|
Foundation.libs = Foundation.libs || {}; |
|
|
|
Foundation.libs.orbit = { |
|
name: 'orbit', |
|
|
|
version: '4.3.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, |
|
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', |
|
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, |
|
timer: true, |
|
variable_height: false, |
|
before_slide_change: noop, |
|
after_slide_change: noop |
|
}, |
|
|
|
init: function (scope, method, options) { |
|
var self = this; |
|
Foundation.inherit(self, 'data_options'); |
|
|
|
if (typeof method === 'object') { |
|
$.extend(true, self.settings, method); |
|
} |
|
|
|
if ($(scope).is('[data-orbit]')) { |
|
var $el = $(scope); |
|
var opts = self.data_options($el); |
|
new Orbit($el, $.extend({},self.settings, opts)); |
|
} |
|
|
|
$('[data-orbit]', scope).each(function(idx, el) { |
|
var $el = $(el); |
|
var opts = self.data_options($el); |
|
new Orbit($el, $.extend({},self.settings, opts)); |
|
}); |
|
} |
|
}; |
|
|
|
|
|
}(Foundation.zj, this, this.document));
|
|
|