diff options
Diffstat (limited to 'website/static/js/foundation3/jquery.foundation.topbar.js')
-rw-r--r-- | website/static/js/foundation3/jquery.foundation.topbar.js | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/website/static/js/foundation3/jquery.foundation.topbar.js b/website/static/js/foundation3/jquery.foundation.topbar.js new file mode 100644 index 0000000..2121dcb --- /dev/null +++ b/website/static/js/foundation3/jquery.foundation.topbar.js @@ -0,0 +1,174 @@ +/* + * jQuery Foundation Top Bar 2.0.4 + * http://foundation.zurb.com + * Copyright 2012, ZURB + * Free to use under the MIT license. + * http://www.opensource.org/licenses/mit-license.php +*/ + +/*jslint unparam: true, browser: true, indent: 2 */ + +;(function ($, window, undefined) { + 'use strict'; + + var settings = { + index : 0, + initialized : false + }, + + methods = { + init : function (options) { + return this.each(function () { + settings = $.extend(settings, options); + settings.$w = $(window), + settings.$topbar = $('nav.top-bar'), + settings.$section = settings.$topbar.find('section'), + settings.$titlebar = settings.$topbar.children('ul:first'); + + var breakpoint = $("<div class='top-bar-js-breakpoint'/>").appendTo("body"); + settings.breakPoint = breakpoint.width(); + breakpoint.remove(); + + if (!settings.initialized) { + methods.assemble(); + settings.initialized = true; + } + + if (!settings.height) { + methods.largestUL(); + } + + if (settings.$topbar.parent().hasClass('fixed')) { + $('body').css('padding-top',settings.$topbar.outerHeight()) + } + + $('.top-bar .toggle-topbar').off('click.fndtn').on('click.fndtn', function (e) { + e.preventDefault(); + + if (methods.breakpoint()) { + settings.$topbar.toggleClass('expanded'); + settings.$topbar.css('min-height', ''); + } + + if (!settings.$topbar.hasClass('expanded')) { + settings.$section.css({left: '0%'}); + settings.$section.find('>.name').css({left: '100%'}); + settings.$section.find('li.moved').removeClass('moved'); + settings.index = 0; + } + }); + + // Show the Dropdown Levels on Click + $('.top-bar .has-dropdown>a').off('click.fndtn').on('click.fndtn', function (e) { + if (Modernizr.touch || methods.breakpoint()) + e.preventDefault(); + + if (methods.breakpoint()) { + var $this = $(this), + $selectedLi = $this.closest('li'); + + settings.index += 1; + $selectedLi.addClass('moved'); + settings.$section.css({left: -(100 * settings.index) + '%'}); + settings.$section.find('>.name').css({left: 100 * settings.index + '%'}); + + $this.siblings('ul').height(settings.height + settings.$titlebar.outerHeight(true)); + settings.$topbar.css('min-height', settings.height + settings.$titlebar.outerHeight(true) * 2) + } + }); + + $(window).on('resize.fndtn.topbar',function() { + if (!methods.breakpoint()) { + settings.$topbar.css('min-height', ''); + } + }); + + // Go up a level on Click + $('.top-bar .has-dropdown .back').off('click.fndtn').on('click.fndtn', function (e) { + e.preventDefault(); + + var $this = $(this), + $movedLi = $this.closest('li.moved'), + $previousLevelUl = $movedLi.parent(); + + settings.index -= 1; + settings.$section.css({left: -(100 * settings.index) + '%'}); + settings.$section.find('>.name').css({'left': 100 * settings.index + '%'}); + + if (settings.index === 0) { + settings.$topbar.css('min-height', 0); + } + + setTimeout(function () { + $movedLi.removeClass('moved'); + }, 300); + }); + }); + }, + + breakpoint : function () { + return settings.$w.width() < settings.breakPoint; + }, + + assemble : function () { + // Pull element out of the DOM for manipulation + settings.$section.detach(); + + settings.$section.find('.has-dropdown>a').each(function () { + var $link = $(this), + $dropdown = $link.siblings('.dropdown'), + $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>'); + + // Copy link to subnav + $titleLi.find('h5>a').html($link.html()); + $dropdown.prepend($titleLi); + }); + + // Put element back in the DOM + settings.$section.appendTo(settings.$topbar); + }, + + largestUL : function () { + var uls = settings.$topbar.find('section ul ul'), + largest = uls.first(), + total = 0; + + uls.each(function () { + if ($(this).children('li').length > largest.children('li').length) { + largest = $(this); + } + }); + + largest.children('li').each(function () { total += $(this).outerHeight(true); }); + + settings.height = total; + } + }; + + $.fn.foundationTopBar = function (method) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.foundationTopBar'); + } + }; + + // Monitor scroll position for sticky + if ($('.sticky').length > 0) { + var distance = $('.sticky').length ? $('.sticky').offset().top: 0, + $window = $(window); + + $window.scroll(function() { + if ( $window.scrollTop() >= distance ) { + $(".sticky").addClass("fixed"); + } + + else if ( $window.scrollTop() < distance ) { + $(".sticky").removeClass("fixed"); + } + }); + } + +}(jQuery, this)); |