pelican-red/static/js/vendor/foundation/foundation.topbar.js

305 lines
9.6 KiB
JavaScript

/*jslint unparam: true, browser: true, indent: 2 */
;(function ($, window, document, undefined) {
'use strict';
Foundation.libs.topbar = {
name : 'topbar',
version : '4.2.3',
settings : {
index : 0,
stickyClass : 'sticky',
custom_back_text: true,
back_text: 'Back',
is_hover: true,
scrolltop : true, // jump to top when sticky nav menu toggle is clicked
init : false
},
init : function (section, method, options) {
Foundation.inherit(this, 'data_options');
var self = this;
if (typeof method === 'object') {
$.extend(true, this.settings, method);
} else if (typeof options !== 'undefined') {
$.extend(true, this.settings, options);
}
if (typeof method !== 'string') {
$('.top-bar, [data-topbar]').each(function () {
$.extend(true, self.settings, self.data_options($(this)));
self.settings.$w = $(window);
self.settings.$topbar = $(this);
self.settings.$section = self.settings.$topbar.find('section');
self.settings.$titlebar = self.settings.$topbar.children('ul').first();
self.settings.$topbar.data('index', 0);
var breakpoint = $("<div class='top-bar-js-breakpoint'/>").insertAfter(self.settings.$topbar);
self.settings.breakPoint = breakpoint.width();
breakpoint.remove();
self.assemble();
if (self.settings.$topbar.parent().hasClass('fixed')) {
$('body').css('padding-top', self.outerHeight(self.settings.$topbar));
}
});
if (!self.settings.init) {
this.events();
}
return this.settings.init;
} else {
// fire method
return this[method].call(this, options);
}
},
events : function () {
var self = this;
var offst = this.outerHeight($('.top-bar, [data-topbar]'));
$(this.scope)
.off('.fndtn.topbar')
.on('click.fndtn.topbar', '.top-bar .toggle-topbar, [data-topbar] .toggle-topbar', function (e) {
var topbar = $(this).closest('.top-bar, [data-topbar]'),
section = topbar.find('section, .section'),
titlebar = topbar.children('ul').first();
e.preventDefault();
if (self.breakpoint()) {
if (!self.rtl) {
section.css({left: '0%'});
section.find('>.name').css({left: '100%'});
} else {
section.css({right: '0%'});
section.find('>.name').css({right: '100%'});
}
section.find('li.moved').removeClass('moved');
topbar.data('index', 0);
topbar
.toggleClass('expanded')
.css('height', '');
}
if (!topbar.hasClass('expanded')) {
if (topbar.hasClass('fixed')) {
topbar.parent().addClass('fixed');
topbar.removeClass('fixed');
$('body').css('padding-top',offst);
}
} else if (topbar.parent().hasClass('fixed')) {
topbar.parent().removeClass('fixed');
topbar.addClass('fixed');
$('body').css('padding-top','0');
if (self.settings.scrolltop) {
window.scrollTo(0,0);
}
}
})
.on('mouseenter mouseleave', '.top-bar li', function (e) {
if (!self.settings.is_hover) return;
if (/enter|over/i.test(e.type)) {
$(this).addClass('hover');
} else {
$(this).removeClass('hover');
}
})
.on('click.fndtn.topbar', '.top-bar li.has-dropdown', function (e) {
if (self.breakpoint()) return;
var li = $(this),
target = $(e.target),
topbar = li.closest('[data-topbar], .top-bar'),
is_hover = topbar.data('topbar');
if (self.settings.is_hover && !Modernizr.touch) return;
e.stopImmediatePropagation();
if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) {
e.preventDefault();
}
if (li.hasClass('hover')) {
li
.removeClass('hover')
.find('li')
.removeClass('hover');
} else {
li.addClass('hover');
}
})
.on('click.fndtn.topbar', '.top-bar .has-dropdown>a, [data-topbar] .has-dropdown>a', function (e) {
if (self.breakpoint()) {
e.preventDefault();
var $this = $(this),
topbar = $this.closest('.top-bar, [data-topbar]'),
section = topbar.find('section, .section'),
titlebar = topbar.children('ul').first(),
dropdownHeight = $this.next('.dropdown').outerHeight(),
$selectedLi = $this.closest('li');
topbar.data('index', topbar.data('index') + 1);
$selectedLi.addClass('moved');
if (!self.rtl) {
section.css({left: -(100 * topbar.data('index')) + '%'});
section.find('>.name').css({left: 100 * topbar.data('index') + '%'});
} else {
section.css({right: -(100 * topbar.data('index')) + '%'});
section.find('>.name').css({right: 100 * topbar.data('index') + '%'});
}
topbar.css('height', self.outerHeight($this.siblings('ul'), true) + self.outerHeight(titlebar, true));
}
});
$(window).on('resize.fndtn.topbar', function () {
if (!self.breakpoint()) {
$('.top-bar, [data-topbar]')
.css('height', '')
.removeClass('expanded')
.find('li')
.removeClass('hover');
}
}.bind(this));
$('body').on('click.fndtn.topbar', function (e) {
var parent = $(e.target).closest('[data-topbar], .top-bar');
if (parent.length > 0) {
return;
}
$('.top-bar li, [data-topbar] li').removeClass('hover');
});
// Go up a level on Click
$(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back, [data-topbar] .has-dropdown .back', function (e) {
e.preventDefault();
var $this = $(this),
topbar = $this.closest('.top-bar, [data-topbar]'),
titlebar = topbar.children('ul').first(),
section = topbar.find('section, .section'),
$movedLi = $this.closest('li.moved'),
$previousLevelUl = $movedLi.parent();
topbar.data('index', topbar.data('index') - 1);
if (!self.rtl) {
section.css({left: -(100 * topbar.data('index')) + '%'});
section.find('>.name').css({left: 100 * topbar.data('index') + '%'});
} else {
section.css({right: -(100 * topbar.data('index')) + '%'});
section.find('>.name').css({right: 100 * topbar.data('index') + '%'});
}
if (topbar.data('index') === 0) {
topbar.css('height', '');
} else {
topbar.css('height', self.outerHeight($previousLevelUl, true) + self.outerHeight(titlebar, true));
}
setTimeout(function () {
$movedLi.removeClass('moved');
}, 300);
});
},
breakpoint : function () {
return $(document).width() <= this.settings.breakPoint || $('html').hasClass('lt-ie9');
},
assemble : function () {
var self = this;
// Pull element out of the DOM for manipulation
this.settings.$section.detach();
this.settings.$section.find('.has-dropdown>a').each(function () {
var $link = $(this),
$dropdown = $link.siblings('.dropdown'),
url = $link.attr('href');
if (url && url.length > 1) {
var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li><li><a class="parent-link js-generated" href="' + url + '">' + $link.text() +'</a></li>');
} else {
var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>');
}
// Copy link to subnav
if (self.settings.custom_back_text == true) {
$titleLi.find('h5>a').html('&laquo; ' + self.settings.back_text);
} else {
$titleLi.find('h5>a').html('&laquo; ' + $link.html());
}
$dropdown.prepend($titleLi);
});
// Put element back in the DOM
this.settings.$section.appendTo(this.settings.$topbar);
// check for sticky
this.sticky();
},
height : function (ul) {
var total = 0,
self = this;
ul.find('> li').each(function () { total += self.outerHeight($(this), true); });
return total;
},
sticky : function () {
var klass = '.' + this.settings.stickyClass;
if ($(klass).length > 0) {
var distance = $(klass).length ? $(klass).offset().top: 0,
$window = $(window),
offst = this.outerHeight($('.top-bar')),
t_top;
//Whe resize elements of the page on windows resize. Must recalculate distance
$(window).resize(function() {
clearTimeout(t_top);
t_top = setTimeout (function() {
distance = $(klass).offset().top;
},105);
});
$window.scroll(function() {
if ($window.scrollTop() > (distance)) {
$(klass).addClass("fixed");
$('body').css('padding-top',offst);
}
else if ($window.scrollTop() <= distance) {
$(klass).removeClass("fixed");
$('body').css('padding-top','0');
}
});
}
},
off : function () {
$(this.scope).off('.fndtn.topbar');
$(window).off('.fndtn.topbar');
},
reflow : function () {}
};
}(Foundation.zj, this, this.document));