184 lines
4.9 KiB
JavaScript
184 lines
4.9 KiB
JavaScript
/*jslint unparam: true, browser: true, indent: 2 */
|
|
|
|
;(function ($, window, document, undefined) {
|
|
'use strict';
|
|
|
|
Foundation.libs.section = {
|
|
name: 'section',
|
|
|
|
version : '4.0.3',
|
|
|
|
settings : {
|
|
deep_linking: false,
|
|
one_up: true,
|
|
callback: function (){}
|
|
},
|
|
|
|
init : function (scope, method, options) {
|
|
this.scope = scope || this.scope;
|
|
Foundation.inherit(this, 'throttle data_options');
|
|
|
|
if (typeof method === 'object') {
|
|
$.extend(true, this.settings, method);
|
|
}
|
|
|
|
if (typeof method != 'string') {
|
|
this.set_active_from_hash();
|
|
if (!this.settings.init) this.events();
|
|
|
|
return this.settings.init;
|
|
} else {
|
|
return this[method].call(this, options);
|
|
}
|
|
},
|
|
|
|
events : function () {
|
|
var self = this;
|
|
$(this.scope).on('click.fndtn.section', '[data-section] .title', function (e) {
|
|
$.extend(true, self.settings, self.data_options($(this).closest('[data-section]')));
|
|
self.toggle_active.call(this, e, self);
|
|
});
|
|
|
|
$(window).on('resize.fndtn.section', self.throttle(function () {
|
|
self.resize.call(this);
|
|
}, 30)).trigger('resize');
|
|
|
|
this.settings.init = true;
|
|
},
|
|
|
|
toggle_active : function (e, self) {
|
|
var $this = $(this),
|
|
section = $this.closest('section, .section'),
|
|
content = section.find('.content'),
|
|
parent = section.closest('[data-section]'),
|
|
self = Foundation.libs.section;
|
|
|
|
if (!self.settings.deep_linking && content.length > 0) {
|
|
e.preventDefault();
|
|
}
|
|
|
|
if (section.hasClass('active')) {
|
|
if (self.small(parent)
|
|
|| self.is_vertical(parent)
|
|
|| self.is_accordion(parent)) {
|
|
section
|
|
.removeClass('active')
|
|
.attr('style', '');
|
|
}
|
|
} else {
|
|
if (self.small(parent) || self.settings.one_up) {
|
|
$this
|
|
.closest('[data-section]')
|
|
.find('section, .section')
|
|
.removeClass('active')
|
|
.attr('style', '');
|
|
|
|
section.css('padding-top', self.outerHeight(section.find('.title')) - 1);
|
|
}
|
|
|
|
if (self.small(parent)) {
|
|
section.attr('style', '');
|
|
}
|
|
|
|
section.addClass('active');
|
|
}
|
|
|
|
self.settings.callback();
|
|
},
|
|
|
|
resize : function () {
|
|
var sections = $('[data-section]'),
|
|
self = Foundation.libs.section;
|
|
|
|
sections.each(function() {
|
|
var $this = $(this),
|
|
active_section = $this.find('section.active, .section.active');
|
|
if (active_section.length > 1) {
|
|
active_section
|
|
.not(':first')
|
|
.removeClass('active')
|
|
.attr('style', '');
|
|
} else if (active_section.length < 1
|
|
&& !self.is_vertical($this)
|
|
&& !self.is_accordion($this)) {
|
|
var first = $this.find('section, .section').first();
|
|
first.addClass('active');
|
|
|
|
if (self.small($this)) {
|
|
first.attr('style', '');
|
|
} else {
|
|
first.css('padding-top', self.outerHeight(first.find('.title')) - 1);
|
|
}
|
|
}
|
|
|
|
if (self.small($this)) {
|
|
active_section.attr('style', '');
|
|
} else {
|
|
active_section.css('padding-top', self.outerHeight(active_section.find('.title')) - 1);
|
|
}
|
|
self.position_titles($this);
|
|
});
|
|
},
|
|
|
|
is_vertical : function (el) {
|
|
return el.hasClass('vertical-nav');
|
|
},
|
|
|
|
is_accordion : function (el) {
|
|
return el.hasClass('accordion');
|
|
},
|
|
|
|
set_active_from_hash : function () {
|
|
var hash = window.location.hash.substring(1),
|
|
sections = $('[data-section]'),
|
|
self = this;
|
|
|
|
sections.each(function () {
|
|
var section = $(this);
|
|
$.extend(true, self.settings, self.data_options(section));
|
|
|
|
if (hash.length > 0 && self.settings.deep_linking) {
|
|
section
|
|
.find('.content[data-slug="' + hash + '"]')
|
|
.closest('section, .section')
|
|
.addClass('active');
|
|
}
|
|
});
|
|
},
|
|
|
|
position_titles : function (section, off) {
|
|
var titles = section.find('.title'),
|
|
previous_width = 0,
|
|
self = this;
|
|
|
|
if (typeof off === 'boolean') {
|
|
titles.attr('style', '');
|
|
} else {
|
|
titles.each(function () {
|
|
$(this).css('left', previous_width);
|
|
previous_width += self.outerWidth($(this));
|
|
});
|
|
}
|
|
},
|
|
|
|
small : function (el) {
|
|
if (el && this.is_accordion(el)) {
|
|
return true;
|
|
}
|
|
if ($('html').hasClass('lt-ie9')) {
|
|
return true;
|
|
}
|
|
if ($('html').hasClass('ie8compat')) {
|
|
return true;
|
|
}
|
|
return $(this.scope).width() < 768;
|
|
},
|
|
|
|
off : function () {
|
|
$(this.scope).off('.fndtn.section');
|
|
$(window).off('.fndtn.section');
|
|
this.settings.init = false;
|
|
}
|
|
};
|
|
}(Foundation.zj, this, this.document));
|