Statistics
| Branch: | Tag: | Revision:

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));