root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / foundation / foundation.magellan.js @ 25a02c79
History | View | Annotate | Download (4.6 kB)
1 | b3c1328b | Olga Brani | /*jslint unparam: true, browser: true, indent: 2 */
|
---|---|---|---|
2 | b3c1328b | Olga Brani | |
3 | b3c1328b | Olga Brani | ;(function ($, window, document, undefined) { |
4 | b3c1328b | Olga Brani | 'use strict';
|
5 | b3c1328b | Olga Brani | |
6 | b3c1328b | Olga Brani | Foundation.libs.magellan = { |
7 | b3c1328b | Olga Brani | name : 'magellan', |
8 | b3c1328b | Olga Brani | |
9 | b3c1328b | Olga Brani | version : '4.0.0', |
10 | b3c1328b | Olga Brani | |
11 | b3c1328b | Olga Brani | settings : {
|
12 | b3c1328b | Olga Brani | activeClass: 'active' |
13 | b3c1328b | Olga Brani | }, |
14 | b3c1328b | Olga Brani | |
15 | b3c1328b | Olga Brani | init : function (scope, method, options) { |
16 | b3c1328b | Olga Brani | this.scope = scope || this.scope; |
17 | b3c1328b | Olga Brani | Foundation.inherit(this, 'data_options'); |
18 | b3c1328b | Olga Brani | |
19 | b3c1328b | Olga Brani | if (typeof method === 'object') { |
20 | b3c1328b | Olga Brani | $.extend(true, this.settings, method); |
21 | b3c1328b | Olga Brani | } |
22 | b3c1328b | Olga Brani | |
23 | b3c1328b | Olga Brani | if (typeof method != 'string') { |
24 | b3c1328b | Olga Brani | if (!this.settings.init) { |
25 | b3c1328b | Olga Brani | this.fixed_magellan = $("[data-magellan-expedition]"); |
26 | b3c1328b | Olga Brani | this.set_threshold();
|
27 | b3c1328b | Olga Brani | this.last_destination = $('[data-magellan-destination]').last(); |
28 | b3c1328b | Olga Brani | this.events();
|
29 | b3c1328b | Olga Brani | } |
30 | b3c1328b | Olga Brani | |
31 | b3c1328b | Olga Brani | return this.settings.init; |
32 | b3c1328b | Olga Brani | } else {
|
33 | b3c1328b | Olga Brani | return this[method].call(this, options); |
34 | b3c1328b | Olga Brani | } |
35 | b3c1328b | Olga Brani | }, |
36 | b3c1328b | Olga Brani | |
37 | b3c1328b | Olga Brani | events : function () { |
38 | b3c1328b | Olga Brani | var self = this; |
39 | b3c1328b | Olga Brani | $(this.scope).on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) { |
40 | b3c1328b | Olga Brani | var $destination = $(this), |
41 | b3c1328b | Olga Brani | $expedition = $destination.closest('[data-magellan-expedition]'), |
42 | b3c1328b | Olga Brani | activeClass = $expedition.attr('data-magellan-active-class') |
43 | b3c1328b | Olga Brani | || self.settings.activeClass; |
44 | b3c1328b | Olga Brani | |
45 | b3c1328b | Olga Brani | $destination
|
46 | b3c1328b | Olga Brani | .closest('[data-magellan-expedition]')
|
47 | b3c1328b | Olga Brani | .find('[data-magellan-arrival]')
|
48 | b3c1328b | Olga Brani | .not($destination)
|
49 | b3c1328b | Olga Brani | .removeClass(activeClass); |
50 | b3c1328b | Olga Brani | $destination.addClass(activeClass);
|
51 | b3c1328b | Olga Brani | }); |
52 | b3c1328b | Olga Brani | |
53 | b3c1328b | Olga Brani | this.fixed_magellan
|
54 | b3c1328b | Olga Brani | .on('update-position.fndtn.magellan', function(){ |
55 | b3c1328b | Olga Brani | var $el = $(this); |
56 | b3c1328b | Olga Brani | // $el.data("magellan-fixed-position","");
|
57 | b3c1328b | Olga Brani | //$el.data("magellan-top-offset", "");
|
58 | b3c1328b | Olga Brani | }) |
59 | b3c1328b | Olga Brani | .trigger('update-position');
|
60 | b3c1328b | Olga Brani | |
61 | b3c1328b | Olga Brani | $(window)
|
62 | b3c1328b | Olga Brani | .on('resize.fndtn.magellan', function() { |
63 | b3c1328b | Olga Brani | this.fixed_magellan.trigger('update-position'); |
64 | b3c1328b | Olga Brani | }.bind(this))
|
65 | b3c1328b | Olga Brani | |
66 | b3c1328b | Olga Brani | .on('scroll.fndtn.magellan', function() { |
67 | b3c1328b | Olga Brani | var windowScrollTop = $(window).scrollTop(); |
68 | b3c1328b | Olga Brani | self.fixed_magellan.each(function() {
|
69 | b3c1328b | Olga Brani | var $expedition = $(this); |
70 | b3c1328b | Olga Brani | if (typeof $expedition.data('magellan-top-offset') === 'undefined') { |
71 | b3c1328b | Olga Brani | $expedition.data('magellan-top-offset', $expedition.offset().top); |
72 | b3c1328b | Olga Brani | } |
73 | b3c1328b | Olga Brani | if (typeof $expedition.data('magellan-fixed-position') === 'undefined') { |
74 | b3c1328b | Olga Brani | $expedition.data('magellan-fixed-position', false) |
75 | b3c1328b | Olga Brani | } |
76 | b3c1328b | Olga Brani | var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset"); |
77 | b3c1328b | Olga Brani | var attr = $expedition.attr('data-magellan-top-offset'); |
78 | b3c1328b | Olga Brani | |
79 | b3c1328b | Olga Brani | if ($expedition.data("magellan-fixed-position") != fixed_position) { |
80 | b3c1328b | Olga Brani | $expedition.data("magellan-fixed-position", fixed_position); |
81 | b3c1328b | Olga Brani | if (fixed_position) {
|
82 | b3c1328b | Olga Brani | $expedition.css({position:"fixed", top:0}); |
83 | b3c1328b | Olga Brani | } else {
|
84 | b3c1328b | Olga Brani | $expedition.css({position:"", top:""}); |
85 | b3c1328b | Olga Brani | } |
86 | b3c1328b | Olga Brani | if (fixed_position && typeof attr != 'undefined' && attr != false) { |
87 | b3c1328b | Olga Brani | $expedition.css({position:"fixed", top:attr + "px"}); |
88 | b3c1328b | Olga Brani | } |
89 | b3c1328b | Olga Brani | } |
90 | b3c1328b | Olga Brani | }); |
91 | b3c1328b | Olga Brani | }); |
92 | b3c1328b | Olga Brani | |
93 | b3c1328b | Olga Brani | |
94 | b3c1328b | Olga Brani | if (this.last_destination.length > 0) { |
95 | b3c1328b | Olga Brani | $(window).on('scroll.fndtn.magellan', function (e) { |
96 | b3c1328b | Olga Brani | var windowScrollTop = $(window).scrollTop(), |
97 | b3c1328b | Olga Brani | scrolltopPlusHeight = windowScrollTop + $(window).height(),
|
98 | b3c1328b | Olga Brani | lastDestinationTop = Math.ceil(self.last_destination.offset().top); |
99 | b3c1328b | Olga Brani | |
100 | b3c1328b | Olga Brani | $('[data-magellan-destination]').each(function () { |
101 | b3c1328b | Olga Brani | var $destination = $(this), |
102 | b3c1328b | Olga Brani | destination_name = $destination.attr('data-magellan-destination'), |
103 | b3c1328b | Olga Brani | topOffset = $destination.offset().top - windowScrollTop;
|
104 | b3c1328b | Olga Brani | |
105 | b3c1328b | Olga Brani | if (topOffset <= self.settings.threshold) {
|
106 | b3c1328b | Olga Brani | $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival'); |
107 | b3c1328b | Olga Brani | } |
108 | b3c1328b | Olga Brani | // 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
|
109 | b3c1328b | Olga Brani | if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) { |
110 | b3c1328b | Olga Brani | $('[data-magellan-arrival]').last().trigger('arrival'); |
111 | b3c1328b | Olga Brani | } |
112 | b3c1328b | Olga Brani | }); |
113 | b3c1328b | Olga Brani | }); |
114 | b3c1328b | Olga Brani | } |
115 | b3c1328b | Olga Brani | |
116 | b3c1328b | Olga Brani | this.settings.init = true; |
117 | b3c1328b | Olga Brani | }, |
118 | b3c1328b | Olga Brani | |
119 | b3c1328b | Olga Brani | set_threshold : function () { |
120 | b3c1328b | Olga Brani | if (!this.settings.threshold) { |
121 | b3c1328b | Olga Brani | this.settings.threshold = (this.fixed_magellan.length > 0) ? |
122 | b3c1328b | Olga Brani | this.outerHeight(this.fixed_magellan, true) : 0; |
123 | b3c1328b | Olga Brani | } |
124 | b3c1328b | Olga Brani | }, |
125 | b3c1328b | Olga Brani | |
126 | b3c1328b | Olga Brani | off : function () { |
127 | b3c1328b | Olga Brani | $(this.scope).off('.fndtn.magellan'); |
128 | b3c1328b | Olga Brani | } |
129 | b3c1328b | Olga Brani | }; |
130 | b3c1328b | Olga Brani | }(Foundation.zj, this, this.document)); |