aboutsummaryrefslogtreecommitdiffstats
path: root/foundation-default-colours/static/js/foundation/foundation.magellan.js
diff options
context:
space:
mode:
Diffstat (limited to 'foundation-default-colours/static/js/foundation/foundation.magellan.js')
-rw-r--r--foundation-default-colours/static/js/foundation/foundation.magellan.js118
1 files changed, 118 insertions, 0 deletions
diff --git a/foundation-default-colours/static/js/foundation/foundation.magellan.js b/foundation-default-colours/static/js/foundation/foundation.magellan.js
new file mode 100644
index 0000000..586741b
--- /dev/null
+++ b/foundation-default-colours/static/js/foundation/foundation.magellan.js
@@ -0,0 +1,118 @@
+;(function ($, window, document, undefined) {
+ 'use strict';
+
+ Foundation.libs.magellan = {
+ name : 'magellan',
+
+ version : '5.0.0',
+
+ settings : {
+ active_class: 'active',
+ threshold: 0
+ },
+
+ init : function (scope, method, options) {
+ this.fixed_magellan = $("[data-magellan-expedition]");
+ this.set_threshold();
+ this.last_destination = $('[data-magellan-destination]').last();
+ this.events();
+ },
+
+ events : function () {
+ var self = this;
+
+ $(this.scope)
+ .off('.magellan')
+ .on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) {
+ var $destination = $(this),
+ $expedition = $destination.closest('[data-magellan-expedition]'),
+ active_class = $expedition.attr('data-magellan-active-class')
+ || self.settings.active_class;
+
+ $destination
+ .closest('[data-magellan-expedition]')
+ .find('[data-magellan-arrival]')
+ .not($destination)
+ .removeClass(active_class);
+ $destination.addClass(active_class);
+ });
+
+ this.fixed_magellan
+ .off('.magellan')
+ .on('update-position.fndtn.magellan', function() {
+ var $el = $(this);
+ })
+ .trigger('update-position');
+
+ $(window)
+ .off('.magellan')
+ .on('resize.fndtn.magellan', function() {
+ this.fixed_magellan.trigger('update-position');
+ }.bind(this))
+ .on('scroll.fndtn.magellan', function() {
+ var windowScrollTop = $(window).scrollTop();
+ self.fixed_magellan.each(function() {
+ var $expedition = $(this);
+ if (typeof $expedition.data('magellan-top-offset') === 'undefined') {
+ $expedition.data('magellan-top-offset', $expedition.offset().top);
+ }
+ if (typeof $expedition.data('magellan-fixed-position') === 'undefined') {
+ $expedition.data('magellan-fixed-position', false);
+ }
+ var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset");
+ var attr = $expedition.attr('data-magellan-top-offset');
+
+ if ($expedition.data("magellan-fixed-position") != fixed_position) {
+ $expedition.data("magellan-fixed-position", fixed_position);
+ if (fixed_position) {
+ $expedition.addClass('fixed');
+ $expedition.css({position:"fixed", top:0});
+ } else {
+ $expedition.removeClass('fixed');
+ $expedition.css({position:"", top:""});
+ }
+ if (fixed_position && typeof attr != 'undefined' && attr != false) {
+ $expedition.css({position:"fixed", top:attr + "px"});
+ }
+ }
+ });
+ });
+
+
+ if (this.last_destination.length > 0) {
+ $(window).on('scroll.fndtn.magellan', function (e) {
+ var windowScrollTop = $(window).scrollTop(),
+ scrolltopPlusHeight = windowScrollTop + $(window).height(),
+ lastDestinationTop = Math.ceil(self.last_destination.offset().top);
+
+ $('[data-magellan-destination]').each(function () {
+ var $destination = $(this),
+ destination_name = $destination.attr('data-magellan-destination'),
+ topOffset = $destination.offset().top - $destination.outerHeight(true) - windowScrollTop;
+ if (topOffset <= self.settings.threshold) {
+ $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival');
+ }
+ // In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it
+ if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) {
+ $('[data-magellan-arrival]').last().trigger('arrival');
+ }
+ });
+ });
+ }
+ },
+
+ set_threshold : function () {
+ if (typeof this.settings.threshold !== 'number') {
+ this.settings.threshold = (this.fixed_magellan.length > 0) ?
+ this.fixed_magellan.outerHeight(true) : 0;
+ }
+ },
+
+ off : function () {
+ $(this.scope).off('.fndtn.magellan');
+ $(window).off('.fndtn.magellan');
+ },
+
+ reflow : function () {}
+ };
+}(jQuery, this, this.document));