Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / foundation / foundation.section.js @ cf508a0b

History | View | Annotate | Download (7.5 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.section = {
7 b3c1328b Olga Brani
    name: 'section',
8 b3c1328b Olga Brani
9 b3c1328b Olga Brani
    version : '4.0.9',
10 b3c1328b Olga Brani
11 b3c1328b Olga Brani
    settings : {
12 b3c1328b Olga Brani
      deep_linking: false,
13 b3c1328b Olga Brani
      one_up: true,
14 b3c1328b Olga Brani
      callback: function (){}
15 b3c1328b Olga Brani
    },
16 b3c1328b Olga Brani
17 b3c1328b Olga Brani
    init : function (scope, method, options) {
18 b3c1328b Olga Brani
      var self = this;
19 b3c1328b Olga Brani
20 b3c1328b Olga Brani
      this.scope = scope || this.scope;
21 b3c1328b Olga Brani
      Foundation.inherit(this, 'throttle data_options');
22 b3c1328b Olga Brani
23 b3c1328b Olga Brani
      if (typeof method != 'string') {
24 b3c1328b Olga Brani
        this.set_active_from_hash();
25 b3c1328b Olga Brani
        this.events();
26 b3c1328b Olga Brani
27 b3c1328b Olga Brani
        return true;
28 b3c1328b Olga Brani
      } else {
29 b3c1328b Olga Brani
        return this[method].call(this, options);
30 b3c1328b Olga Brani
      }
31 b3c1328b Olga Brani
    },
32 b3c1328b Olga Brani
33 b3c1328b Olga Brani
    events : function () {
34 b3c1328b Olga Brani
      var self = this;
35 b3c1328b Olga Brani
36 b3c1328b Olga Brani
      $(this.scope)
37 b3c1328b Olga Brani
        .on('click.fndtn.section', '[data-section] .title', function (e) {
38 b3c1328b Olga Brani
          var $this = $(this),
39 b3c1328b Olga Brani
              section = $this.closest('[data-section]');
40 b3c1328b Olga Brani
41 b3c1328b Olga Brani
          self.toggle_active.call(this, e, self);
42 b3c1328b Olga Brani
        });
43 b3c1328b Olga Brani
44 b3c1328b Olga Brani
      $(window)
45 b3c1328b Olga Brani
        .on('resize.fndtn.section', self.throttle(function () {
46 b3c1328b Olga Brani
          self.resize.call(this);
47 b3c1328b Olga Brani
        }, 30))
48 b3c1328b Olga Brani
        .on('hashchange', function () {
49 b3c1328b Olga Brani
          if (!self.settings.toggled){
50 b3c1328b Olga Brani
            self.set_active_from_hash();
51 b3c1328b Olga Brani
            $(this).trigger('resize');
52 b3c1328b Olga Brani
          }
53 b3c1328b Olga Brani
        }).trigger('resize');
54 b3c1328b Olga Brani
55 b3c1328b Olga Brani
      $(document)
56 b3c1328b Olga Brani
        .on('click.fndtn.section', function (e) {
57 b3c1328b Olga Brani
          if ($(e.target).closest('.title').length < 1) {
58 b3c1328b Olga Brani
            $('[data-section="vertical-nav"], [data-section="horizontal-nav"]')
59 b3c1328b Olga Brani
              .find('section, .section')
60 b3c1328b Olga Brani
              .removeClass('active')
61 b3c1328b Olga Brani
              .attr('style', '');
62 b3c1328b Olga Brani
          }
63 b3c1328b Olga Brani
        });
64 b3c1328b Olga Brani
65 b3c1328b Olga Brani
    },
66 b3c1328b Olga Brani
67 b3c1328b Olga Brani
    toggle_active : function (e, self) {
68 b3c1328b Olga Brani
      var $this = $(this),
69 b3c1328b Olga Brani
          section = $this.closest('section, .section'),
70 b3c1328b Olga Brani
          content = section.find('.content'),
71 b3c1328b Olga Brani
          parent = section.closest('[data-section]'),
72 b3c1328b Olga Brani
          self = Foundation.libs.section,
73 b3c1328b Olga Brani
          settings = $.extend({}, self.settings, self.data_options(parent));
74 b3c1328b Olga Brani
75 b3c1328b Olga Brani
      self.settings.toggled = true;
76 b3c1328b Olga Brani
77 b3c1328b Olga Brani
      if (!settings.deep_linking && content.length > 0) {
78 b3c1328b Olga Brani
        e.preventDefault();
79 b3c1328b Olga Brani
      }
80 b3c1328b Olga Brani
81 b3c1328b Olga Brani
      if (section.hasClass('active')) {
82 b3c1328b Olga Brani
        if (self.small(parent)
83 b3c1328b Olga Brani
          || self.is_vertical(parent)
84 b3c1328b Olga Brani
          || self.is_horizontal(parent)
85 b3c1328b Olga Brani
          || self.is_accordion(parent)) {
86 b3c1328b Olga Brani
          section
87 b3c1328b Olga Brani
            .removeClass('active')
88 b3c1328b Olga Brani
            .attr('style', '');
89 b3c1328b Olga Brani
        }
90 b3c1328b Olga Brani
      } else {
91 b3c1328b Olga Brani
        var prev_active_section = null,
92 b3c1328b Olga Brani
            title_height = self.outerHeight(section.find('.title'));
93 b3c1328b Olga Brani
94 b3c1328b Olga Brani
        if (self.small(parent) || settings.one_up) {
95 b3c1328b Olga Brani
          prev_active_section = $this.closest('[data-section]').find('section.active, .section.active');
96 b3c1328b Olga Brani
97 b3c1328b Olga Brani
          if (self.small(parent)) {
98 b3c1328b Olga Brani
            prev_active_section.attr('style', '');
99 b3c1328b Olga Brani
          } else {
100 b3c1328b Olga Brani
            prev_active_section.attr('style', 'visibility: hidden; padding-top: '+title_height+'px;');
101 b3c1328b Olga Brani
          }
102 b3c1328b Olga Brani
        }
103 b3c1328b Olga Brani
104 b3c1328b Olga Brani
        if (self.small(parent)) {
105 b3c1328b Olga Brani
          section.attr('style', '');
106 b3c1328b Olga Brani
        } else {
107 b3c1328b Olga Brani
          section.css('padding-top', title_height);
108 b3c1328b Olga Brani
        }
109 b3c1328b Olga Brani
110 b3c1328b Olga Brani
        section.addClass('active');
111 b3c1328b Olga Brani
112 b3c1328b Olga Brani
        if (prev_active_section !== null) {
113 b3c1328b Olga Brani
          prev_active_section.removeClass('active').attr('style', '');
114 b3c1328b Olga Brani
        }
115 b3c1328b Olga Brani
      }
116 b3c1328b Olga Brani
117 b3c1328b Olga Brani
      setTimeout(function () {
118 b3c1328b Olga Brani
        self.settings.toggled = false;
119 b3c1328b Olga Brani
      }, 300);
120 b3c1328b Olga Brani
121 b3c1328b Olga Brani
      settings.callback();
122 b3c1328b Olga Brani
    },
123 b3c1328b Olga Brani
124 b3c1328b Olga Brani
    resize : function () {
125 b3c1328b Olga Brani
      var sections = $('[data-section]'),
126 b3c1328b Olga Brani
          self = Foundation.libs.section;
127 b3c1328b Olga Brani
128 b3c1328b Olga Brani
      sections.each(function() {
129 b3c1328b Olga Brani
        var $this = $(this),
130 b3c1328b Olga Brani
            active_section = $this.find('section.active, .section.active'),
131 b3c1328b Olga Brani
            settings = $.extend({}, self.settings, self.data_options($this));
132 b3c1328b Olga Brani
133 b3c1328b Olga Brani
        if (active_section.length > 1) {
134 b3c1328b Olga Brani
          active_section
135 b3c1328b Olga Brani
            .not(':first')
136 b3c1328b Olga Brani
            .removeClass('active')
137 b3c1328b Olga Brani
            .attr('style', '');
138 b3c1328b Olga Brani
        } else if (active_section.length < 1
139 b3c1328b Olga Brani
          && !self.is_vertical($this)
140 b3c1328b Olga Brani
          && !self.is_horizontal($this)
141 b3c1328b Olga Brani
          && !self.is_accordion($this)) {
142 b3c1328b Olga Brani
143 b3c1328b Olga Brani
          var first = $this.find('section, .section').first();
144 b3c1328b Olga Brani
          first.addClass('active');
145 b3c1328b Olga Brani
146 b3c1328b Olga Brani
          if (self.small($this)) {
147 b3c1328b Olga Brani
            first.attr('style', '');
148 b3c1328b Olga Brani
          } else {
149 b3c1328b Olga Brani
            first.css('padding-top', self.outerHeight(first.find('.title')));
150 b3c1328b Olga Brani
          }
151 b3c1328b Olga Brani
        }
152 b3c1328b Olga Brani
153 b3c1328b Olga Brani
        if (self.small($this)) {
154 b3c1328b Olga Brani
          active_section.attr('style', '');
155 b3c1328b Olga Brani
        } else {
156 b3c1328b Olga Brani
          active_section.css('padding-top', self.outerHeight(active_section.find('.title')));
157 b3c1328b Olga Brani
        }
158 b3c1328b Olga Brani
159 b3c1328b Olga Brani
        self.position_titles($this);
160 b3c1328b Olga Brani
161 b3c1328b Olga Brani
        if (self.is_horizontal($this) && !self.small($this)) {
162 b3c1328b Olga Brani
          self.position_content($this);
163 b3c1328b Olga Brani
        } else {
164 b3c1328b Olga Brani
          self.position_content($this, false);
165 b3c1328b Olga Brani
        }
166 b3c1328b Olga Brani
      });
167 b3c1328b Olga Brani
    },
168 b3c1328b Olga Brani
169 b3c1328b Olga Brani
    is_vertical : function (el) {
170 b3c1328b Olga Brani
      return /vertical-nav/i.test(el.data('section'));
171 b3c1328b Olga Brani
    },
172 b3c1328b Olga Brani
173 b3c1328b Olga Brani
    is_horizontal : function (el) {
174 b3c1328b Olga Brani
      return /horizontal-nav/i.test(el.data('section'));
175 b3c1328b Olga Brani
    },
176 b3c1328b Olga Brani
177 b3c1328b Olga Brani
    is_accordion : function (el) {
178 b3c1328b Olga Brani
      return /accordion/i.test(el.data('section'));
179 b3c1328b Olga Brani
    },
180 b3c1328b Olga Brani
181 b3c1328b Olga Brani
    is_tabs : function (el) {
182 b3c1328b Olga Brani
      return /tabs/i.test(el.data('section'));
183 b3c1328b Olga Brani
    },
184 b3c1328b Olga Brani
185 b3c1328b Olga Brani
    set_active_from_hash : function () {
186 b3c1328b Olga Brani
      var hash = window.location.hash.substring(1),
187 b3c1328b Olga Brani
          sections = $('[data-section]'),
188 b3c1328b Olga Brani
          self = this;
189 b3c1328b Olga Brani
190 b3c1328b Olga Brani
      sections.each(function () {
191 b3c1328b Olga Brani
        var section = $(this),
192 b3c1328b Olga Brani
            settings = $.extend({}, self.settings, self.data_options(section));
193 b3c1328b Olga Brani
194 b3c1328b Olga Brani
        if (hash.length > 0 && settings.deep_linking) {
195 b3c1328b Olga Brani
          section
196 b3c1328b Olga Brani
            .find('section, .section')
197 b3c1328b Olga Brani
            .attr('style', '')
198 b3c1328b Olga Brani
            .removeClass('active');
199 b3c1328b Olga Brani
          section
200 b3c1328b Olga Brani
            .find('.content[data-slug="' + hash + '"]')
201 b3c1328b Olga Brani
            .closest('section, .section')
202 b3c1328b Olga Brani
            .addClass('active');
203 b3c1328b Olga Brani
        }
204 b3c1328b Olga Brani
      });
205 b3c1328b Olga Brani
    },
206 b3c1328b Olga Brani
207 b3c1328b Olga Brani
    position_titles : function (section, off) {
208 b3c1328b Olga Brani
      var titles = section.find('.title'),
209 b3c1328b Olga Brani
          previous_width = 0,
210 b3c1328b Olga Brani
          self = this;
211 b3c1328b Olga Brani
212 b3c1328b Olga Brani
      if (typeof off === 'boolean') {
213 b3c1328b Olga Brani
        titles.attr('style', '');
214 b3c1328b Olga Brani
215 b3c1328b Olga Brani
      } else {
216 b3c1328b Olga Brani
        titles.each(function () {
217 b3c1328b Olga Brani
          $(this).css('left', previous_width);
218 b3c1328b Olga Brani
          previous_width += self.outerWidth($(this));
219 b3c1328b Olga Brani
        });
220 b3c1328b Olga Brani
      }
221 b3c1328b Olga Brani
    },
222 b3c1328b Olga Brani
223 b3c1328b Olga Brani
    position_content : function (section, off) {
224 b3c1328b Olga Brani
      var titles = section.find('.title'),
225 b3c1328b Olga Brani
          content = section.find('.content'),
226 b3c1328b Olga Brani
          self = this;
227 b3c1328b Olga Brani
228 b3c1328b Olga Brani
      if (typeof off === 'boolean') {
229 b3c1328b Olga Brani
        content.attr('style', '');
230 b3c1328b Olga Brani
        section.attr('style', '');
231 b3c1328b Olga Brani
      } else {
232 b3c1328b Olga Brani
        section.find('section, .section').each(function () {
233 b3c1328b Olga Brani
          var title = $(this).find('.title'),
234 b3c1328b Olga Brani
              content = $(this).find('.content');
235 b3c1328b Olga Brani
236 b3c1328b Olga Brani
          content.css({left: title.position().left - 1, top: self.outerHeight(title) - 2});
237 b3c1328b Olga Brani
        });
238 b3c1328b Olga Brani
239 b3c1328b Olga Brani
        // temporary work around for Zepto outerheight calculation issues.
240 b3c1328b Olga Brani
        if (typeof Zepto === 'function') {
241 b3c1328b Olga Brani
          section.height(this.outerHeight(titles.first()));
242 b3c1328b Olga Brani
        } else {
243 b3c1328b Olga Brani
          section.height(this.outerHeight(titles.first()) - 2);
244 b3c1328b Olga Brani
        }
245 b3c1328b Olga Brani
      }
246 b3c1328b Olga Brani
247 b3c1328b Olga Brani
    },
248 b3c1328b Olga Brani
249 b3c1328b Olga Brani
    small : function (el) {
250 b3c1328b Olga Brani
      var settings = $.extend({}, this.settings, this.data_options(el));
251 b3c1328b Olga Brani
      if (this.is_tabs(el)) {
252 b3c1328b Olga Brani
        return false;
253 b3c1328b Olga Brani
      }
254 b3c1328b Olga Brani
      if (el && this.is_accordion(el)) {
255 b3c1328b Olga Brani
        return true;
256 b3c1328b Olga Brani
      }
257 b3c1328b Olga Brani
      if ($('html').hasClass('lt-ie9')) {
258 b3c1328b Olga Brani
        return true;
259 b3c1328b Olga Brani
      }
260 b3c1328b Olga Brani
      if ($('html').hasClass('ie8compat')) {
261 b3c1328b Olga Brani
        return true;
262 b3c1328b Olga Brani
      }
263 b3c1328b Olga Brani
      return $(this.scope).width() < 768;
264 b3c1328b Olga Brani
    },
265 b3c1328b Olga Brani
266 b3c1328b Olga Brani
    off : function () {
267 b3c1328b Olga Brani
      $(this.scope).off('.fndtn.section');
268 b3c1328b Olga Brani
      $(window).off('.fndtn.section');
269 b3c1328b Olga Brani
      $(document).off('.fndtn.section')
270 b3c1328b Olga Brani
    }
271 b3c1328b Olga Brani
  };
272 b3c1328b Olga Brani
}(Foundation.zj, this, this.document));