summaryrefslogtreecommitdiff
path: root/website/static/js/foundation3/jquery.foundation.magellan.js
blob: f4e8411ee843aca8a410cae6b985db13437167db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 * jQuery Foundation Magellan 0.1.0
 * http://foundation.zurb.com
 * Copyright 2012, ZURB
 * Free to use under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
*/

/*jslint unparam: true, browser: true, indent: 2 */

;(function ($, window, undefined) {
  'use strict';

  $.fn.foundationMagellan = function(options) {
    var $window = $(window),
  		$document = $(document),
  		$fixedMagellan = $('[data-magellan-expedition=fixed]'),
    	defaults = {
	      threshold: ($fixedMagellan.length) ? $fixedMagellan.outerHeight(true) : 0,
	      activeClass: 'active'
	    },
		options = $.extend({}, defaults, options);
	
    // Indicate we have arrived at a destination
    $document.on('magellan.arrival', '[data-magellan-arrival]', function(e) {
		var $destination = $(this),
      		$expedition = $destination.closest('[data-magellan-expedition]'),
			activeClass = $expedition.attr('data-magellan-active-class') || options.activeClass;
      $destination
        .closest('[data-magellan-expedition]')
        .find('[data-magellan-arrival]')
        .not(this)
        .removeClass(activeClass);
      $destination.addClass(activeClass);
    });

    // Set starting point as the current destination
    var $expedition = $('[data-magellan-expedition]');
    $expedition.find('[data-magellan-arrival]:first')
      .addClass($expedition.attr('data-magellan-active-class') || options.activeClass);

    // Update fixed position
    $fixedMagellan.on('magellan.update-position', function(){
      var $el = $(this);
      $el.data("magellan-fixed-position","");
      $el.data("magellan-top-offset", "");
    })
    .trigger('magellan.update-position');

    $window.on('resize.magellan', function() {
      $fixedMagellan.trigger('magellan.update-position');
    });
    
    $window.on('scroll.magellan', function() {
      var windowScrollTop = $window.scrollTop();
      $fixedMagellan.each(function() {
        var $expedition = $(this);
        if ($expedition.data("magellan-top-offset") === "") {
          $expedition.data("magellan-top-offset", $expedition.offset().top);
        }
        var fixed_position = (windowScrollTop + options.threshold) > $expedition.data("magellan-top-offset");
        if ($expedition.data("magellan-fixed-position") != fixed_position) {
          $expedition.data("magellan-fixed-position", fixed_position);
          if (fixed_position) {
            $expedition.css({position:"fixed", top:0});
          } else {
            $expedition.css({position:"", top:""});
          }
        }
      });
    });

    // Determine when a destination has been reached, ah0y!
    var $lastDestination = $('[data-magellan-destination]:last');
      // Determine if a destination has been set
    if ($lastDestination.length > 0) {
        $window.on('scroll.magellan', function (e) {
            var windowScrollTop = $window.scrollTop(),
                scrolltopPlusHeight = windowScrollTop + $window.outerHeight(true),
                lastDestinationTop = Math.ceil($lastDestination.offset().top);
            $('[data-magellan-destination]').each(function () {
                var $destination = $(this),
                    destination_name = $destination.attr('data-magellan-destination'),
                    topOffset = $destination.offset().top - windowScrollTop;
                if (topOffset <= options.threshold) {
                    $('[data-magellan-arrival=' + destination_name + ']').trigger('magellan.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 >= $document.outerHeight(true) && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) {
                    $('[data-magellan-arrival]:last').trigger('magellan.arrival');
                }
            });
        });
    }
  };
}(jQuery, this));