Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / foundation / foundation.topbar.js @ 65635b1b

History | View | Annotate | Download (6.8 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.topbar = {
7 b3c1328b Olga Brani
    name : 'topbar',
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
      index : 0,
13 b3c1328b Olga Brani
      stickyClass : 'sticky',
14 b3c1328b Olga Brani
      custom_back_text: true,
15 b3c1328b Olga Brani
      back_text: 'Back',
16 b3c1328b Olga Brani
      init : false
17 b3c1328b Olga Brani
    },
18 b3c1328b Olga Brani
19 b3c1328b Olga Brani
    init : function (scope, method, options) {
20 b3c1328b Olga Brani
      var self = this;
21 b3c1328b Olga Brani
      this.scope = scope || this.scope;
22 b3c1328b Olga Brani
23 b3c1328b Olga Brani
      if (typeof method === 'object') {
24 b3c1328b Olga Brani
        $.extend(true, this.settings, method);
25 b3c1328b Olga Brani
      }
26 b3c1328b Olga Brani
27 b3c1328b Olga Brani
      if (typeof method != 'string') {
28 b3c1328b Olga Brani
29 b3c1328b Olga Brani
        $('.top-bar').each(function () {
30 b3c1328b Olga Brani
          self.settings.$w = $(window);
31 b3c1328b Olga Brani
          self.settings.$topbar = $(this);
32 b3c1328b Olga Brani
          self.settings.$section = self.settings.$topbar.find('section');
33 b3c1328b Olga Brani
          self.settings.$titlebar = self.settings.$topbar.children('ul').first();
34 b3c1328b Olga Brani
35 b3c1328b Olga Brani
36 b3c1328b Olga Brani
          self.settings.$topbar.data('index', 0);
37 b3c1328b Olga Brani
38 b3c1328b Olga Brani
          var breakpoint = $("<div class='top-bar-js-breakpoint'/>").insertAfter(self.settings.$topbar);
39 b3c1328b Olga Brani
          self.settings.breakPoint = breakpoint.width();
40 b3c1328b Olga Brani
          breakpoint.remove();
41 b3c1328b Olga Brani
42 b3c1328b Olga Brani
          self.assemble();
43 b3c1328b Olga Brani
44 b3c1328b Olga Brani
          if (self.settings.$topbar.parent().hasClass('fixed')) {
45 b3c1328b Olga Brani
            $('body').css('padding-top', self.outerHeight(self.settings.$topbar));
46 b3c1328b Olga Brani
          }
47 b3c1328b Olga Brani
        });
48 b3c1328b Olga Brani
49 b3c1328b Olga Brani
        if (!self.settings.init) {
50 b3c1328b Olga Brani
          this.events();
51 b3c1328b Olga Brani
        }
52 b3c1328b Olga Brani
53 b3c1328b Olga Brani
        return this.settings.init;
54 b3c1328b Olga Brani
      } else {
55 b3c1328b Olga Brani
        // fire method
56 b3c1328b Olga Brani
        return this[method].call(this, options);
57 b3c1328b Olga Brani
      }
58 b3c1328b Olga Brani
    },
59 b3c1328b Olga Brani
60 b3c1328b Olga Brani
    events : function () {
61 b3c1328b Olga Brani
      var self = this;
62 b3c1328b Olga Brani
      var offst = this.outerHeight($('.top-bar'));
63 b3c1328b Olga Brani
      $(this.scope)
64 b3c1328b Olga Brani
        .on('click.fndtn.topbar', '.top-bar .toggle-topbar', function (e) {
65 b3c1328b Olga Brani
          var topbar = $(this).closest('.top-bar'),
66 b3c1328b Olga Brani
              section = topbar.find('section, .section'),
67 b3c1328b Olga Brani
              titlebar = topbar.children('ul').first();
68 b3c1328b Olga Brani
69 b3c1328b Olga Brani
          if (!topbar.data('height')) self.largestUL();
70 b3c1328b Olga Brani
71 b3c1328b Olga Brani
          e.preventDefault();
72 b3c1328b Olga Brani
73 b3c1328b Olga Brani
          if (self.breakpoint()) {
74 b3c1328b Olga Brani
            topbar
75 b3c1328b Olga Brani
              .toggleClass('expanded')
76 b3c1328b Olga Brani
              .css('min-height', '');
77 b3c1328b Olga Brani
          }
78 b3c1328b Olga Brani
79 b3c1328b Olga Brani
          if (!topbar.hasClass('expanded')) {
80 b3c1328b Olga Brani
            section.css({left: '0%'});
81 b3c1328b Olga Brani
            section.find('>.name').css({left: '100%'});
82 b3c1328b Olga Brani
            section.find('li.moved').removeClass('moved');
83 b3c1328b Olga Brani
            topbar.data('index', 0);
84 b3c1328b Olga Brani
          }
85 b3c1328b Olga Brani
86 b3c1328b Olga Brani
          if (topbar.parent().hasClass('fixed')) {
87 b3c1328b Olga Brani
            topbar.parent().removeClass('fixed');
88 b3c1328b Olga Brani
            $('body').css('padding-top','0');
89 b3c1328b Olga Brani
            window.scrollTo(0);
90 b3c1328b Olga Brani
          } else if (topbar.hasClass('fixed expanded')) {
91 b3c1328b Olga Brani
            topbar.parent().addClass('fixed');
92 b3c1328b Olga Brani
            $('body').css('padding-top',offst);
93 b3c1328b Olga Brani
          }
94 b3c1328b Olga Brani
95 b3c1328b Olga Brani
        })
96 b3c1328b Olga Brani
97 b3c1328b Olga Brani
        .on('click.fndtn.topbar', '.top-bar .has-dropdown>a', function (e) {
98 b3c1328b Olga Brani
          var topbar = $(this).closest('.top-bar'),
99 b3c1328b Olga Brani
              section = topbar.find('section, .section'),
100 b3c1328b Olga Brani
              titlebar = topbar.children('ul').first();
101 b3c1328b Olga Brani
102 b3c1328b Olga Brani
          if (Modernizr.touch || self.breakpoint()) {
103 b3c1328b Olga Brani
            e.preventDefault();
104 b3c1328b Olga Brani
          }
105 b3c1328b Olga Brani
106 b3c1328b Olga Brani
          if (self.breakpoint()) {
107 b3c1328b Olga Brani
            var $this = $(this),
108 b3c1328b Olga Brani
                $selectedLi = $this.closest('li');
109 b3c1328b Olga Brani
110 b3c1328b Olga Brani
            topbar.data('index', topbar.data('index') + 1);
111 b3c1328b Olga Brani
            $selectedLi.addClass('moved');
112 b3c1328b Olga Brani
            section.css({left: -(100 * topbar.data('index')) + '%'});
113 b3c1328b Olga Brani
            section.find('>.name').css({left: 100 * topbar.data('index') + '%'});
114 b3c1328b Olga Brani
115 b3c1328b Olga Brani
            $this.siblings('ul')
116 b3c1328b Olga Brani
              .height(topbar.data('height') + self.outerHeight(titlebar, true));
117 b3c1328b Olga Brani
            topbar
118 b3c1328b Olga Brani
              .css('min-height', topbar.data('height') + self.outerHeight(titlebar, true) * 2)
119 b3c1328b Olga Brani
          }
120 b3c1328b Olga Brani
      });
121 b3c1328b Olga Brani
122 b3c1328b Olga Brani
      $(window).on('resize.fndtn.topbar', function () {
123 b3c1328b Olga Brani
        if (!this.breakpoint()) {
124 b3c1328b Olga Brani
          $('.top-bar').css('min-height', '');
125 b3c1328b Olga Brani
        }
126 b3c1328b Olga Brani
      }.bind(this));
127 b3c1328b Olga Brani
128 b3c1328b Olga Brani
      // Go up a level on Click
129 b3c1328b Olga Brani
      $(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back', function (e) {
130 b3c1328b Olga Brani
        e.preventDefault();
131 b3c1328b Olga Brani
132 b3c1328b Olga Brani
        var $this = $(this),
133 b3c1328b Olga Brani
            topbar = $this.closest('.top-bar'),
134 b3c1328b Olga Brani
            section = topbar.find('section, .section'),
135 b3c1328b Olga Brani
            $movedLi = $this.closest('li.moved'),
136 b3c1328b Olga Brani
            $previousLevelUl = $movedLi.parent();
137 b3c1328b Olga Brani
138 b3c1328b Olga Brani
        topbar.data('index', topbar.data('index') - 1);
139 b3c1328b Olga Brani
        section.css({left: -(100 * topbar.data('index')) + '%'});
140 b3c1328b Olga Brani
        section.find('>.name').css({'left': 100 * topbar.data('index') + '%'});
141 b3c1328b Olga Brani
142 b3c1328b Olga Brani
        if (topbar.data('index') === 0) {
143 b3c1328b Olga Brani
          topbar.css('min-height', 0);
144 b3c1328b Olga Brani
        }
145 b3c1328b Olga Brani
146 b3c1328b Olga Brani
        setTimeout(function () {
147 b3c1328b Olga Brani
          $movedLi.removeClass('moved');
148 b3c1328b Olga Brani
        }, 300);
149 b3c1328b Olga Brani
      });
150 b3c1328b Olga Brani
    },
151 b3c1328b Olga Brani
152 b3c1328b Olga Brani
    breakpoint : function () {
153 b3c1328b Olga Brani
      return $(window).width() <= this.settings.breakPoint || $('html').hasClass('lt-ie9');
154 b3c1328b Olga Brani
    },
155 b3c1328b Olga Brani
156 b3c1328b Olga Brani
    assemble : function () {
157 b3c1328b Olga Brani
      var self = this;
158 b3c1328b Olga Brani
      // Pull element out of the DOM for manipulation
159 b3c1328b Olga Brani
      this.settings.$section.detach();
160 b3c1328b Olga Brani
161 b3c1328b Olga Brani
      this.settings.$section.find('.has-dropdown>a').each(function () {
162 b3c1328b Olga Brani
        var $link = $(this),
163 b3c1328b Olga Brani
            $dropdown = $link.siblings('.dropdown'),
164 b3c1328b Olga Brani
            $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>');
165 b3c1328b Olga Brani
166 b3c1328b Olga Brani
        // Copy link to subnav
167 b3c1328b Olga Brani
        if (self.settings.custom_back_text == true) {
168 b3c1328b Olga Brani
          $titleLi.find('h5>a').html('&laquo; ' + self.settings.back_text);
169 b3c1328b Olga Brani
        } else {
170 b3c1328b Olga Brani
          $titleLi.find('h5>a').html('&laquo; ' + $link.html());
171 b3c1328b Olga Brani
        }
172 b3c1328b Olga Brani
        $dropdown.prepend($titleLi);
173 b3c1328b Olga Brani
      });
174 b3c1328b Olga Brani
175 b3c1328b Olga Brani
      // Put element back in the DOM
176 b3c1328b Olga Brani
      this.settings.$section.appendTo(this.settings.$topbar);
177 b3c1328b Olga Brani
178 b3c1328b Olga Brani
      // check for sticky
179 b3c1328b Olga Brani
      this.sticky();
180 b3c1328b Olga Brani
    },
181 b3c1328b Olga Brani
182 b3c1328b Olga Brani
    largestUL : function () {
183 b3c1328b Olga Brani
      var uls = this.settings.$topbar.find('section ul ul'),
184 b3c1328b Olga Brani
          largest = uls.first(),
185 b3c1328b Olga Brani
          total = 0,
186 b3c1328b Olga Brani
          self = this;
187 b3c1328b Olga Brani
188 b3c1328b Olga Brani
      uls.each(function () {
189 b3c1328b Olga Brani
        if ($(this).children('li').length > largest.children('li').length) {
190 b3c1328b Olga Brani
          largest = $(this);
191 b3c1328b Olga Brani
        }
192 b3c1328b Olga Brani
      });
193 b3c1328b Olga Brani
194 b3c1328b Olga Brani
      largest.children('li').each(function () { total += self.outerHeight($(this), true); });
195 b3c1328b Olga Brani
196 b3c1328b Olga Brani
      this.settings.$topbar.data('height', total);
197 b3c1328b Olga Brani
    },
198 b3c1328b Olga Brani
199 b3c1328b Olga Brani
    sticky : function () {
200 b3c1328b Olga Brani
      var klass = '.' + this.settings.stickyClass;
201 b3c1328b Olga Brani
      if ($(klass).length > 0) {
202 b3c1328b Olga Brani
        var distance = $(klass).length ? $(klass).offset().top: 0,
203 b3c1328b Olga Brani
            $window = $(window);
204 b3c1328b Olga Brani
            var offst = this.outerHeight($('.top-bar'));
205 b3c1328b Olga Brani
206 b3c1328b Olga Brani
          $window.scroll(function() {
207 b3c1328b Olga Brani
            if ($window.scrollTop() >= (distance)) {
208 b3c1328b Olga Brani
              $(klass).addClass("fixed");
209 b3c1328b Olga Brani
              $('body').css('padding-top',offst);
210 b3c1328b Olga Brani
            }
211 b3c1328b Olga Brani
212 b3c1328b Olga Brani
            else if ($window.scrollTop() < distance) {
213 b3c1328b Olga Brani
              $(klass).removeClass("fixed");
214 b3c1328b Olga Brani
              $('body').css('padding-top','0');
215 b3c1328b Olga Brani
            }
216 b3c1328b Olga Brani
        });
217 b3c1328b Olga Brani
      }
218 b3c1328b Olga Brani
    },
219 b3c1328b Olga Brani
220 b3c1328b Olga Brani
    off : function () {
221 b3c1328b Olga Brani
      $(this.scope).off('.fndtn.topbar');
222 b3c1328b Olga Brani
      $(window).off('.fndtn.topbar');
223 b3c1328b Olga Brani
    }
224 b3c1328b Olga Brani
  };
225 b3c1328b Olga Brani
}(Foundation.zj, this, this.document));