(function ($) { 'use strict'; var $body = $('body'), $window = $(window), $document = $(document); // debouncing function from John Hann // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ function debounce(func, threshold, execAsap) { var timeout; return function debounced() { var obj = this, args = arguments; function delayed() { if (!execAsap) func.apply(obj, args); timeout = null; }; if (timeout) clearTimeout(timeout); else if (execAsap) func.apply(obj, args); timeout = setTimeout(delayed, threshold || 100); }; }; // Throttle http://sampsonblog.com/simple-throttle-function/ function throttle(callback, limit) { var tick = false; return function () { if (!tick) { callback.call(); tick = true; setTimeout(function () { tick = false; }, limit); } } } function throttleRaf (callback) { var tick = false; return function () { if (!tick) { window.requestAnimationFrame(function(){ callback.call(); tick = false; }); tick = true; } } } // smartscroll with throttle $.fn['smartscroll'] = function (fn) { return fn ? this.bind('scroll', throttleRaf(fn)) : this.trigger('smartscroll'); }; // offcanvas menu function offCanvasNav() { var isSmoothScrollSupported = 'scrollBehavior' in document.documentElement.style, isScrollToOptionsSupported = (function() { var supports = false try { var div = document.createElement('div'); div.scrollTo({ top: 0, get behavior () { supports = true return 'smooth' } }); } catch (err) {} return supports })(); var $offCanvasCollapse = $('.offcanvas-collapse'), $navbarCollapse = $('.site-header .navbar-collapse'); function scrollToTop() { if (isSmoothScrollSupported && isScrollToOptionsSupported) { // jump if needed if (window.scrollY > 300) { window.scrollTo(0, 300); } // and smooth scroll window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); } else { // use jquery $("html, body").animate({ scrollTop: 0 }, "fast"); } } // open offcanvas menu function offcanvasOpen() { $offCanvasCollapse.addClass('open'); $body.addClass('offcanvas-active'); scrollToTop(); } // close offcanvas menu function offcanvasClose() { $offCanvasCollapse.removeClass('open'); $body.removeClass('offcanvas-active') .addClass('offcanvas-deactivating'); window.setTimeout(function () { $body.removeClass('offcanvas-deactivating'); }, 300); scrollToTop(); } function offcanvasIsOpened() { return ($body.hasClass('offcanvas-active')); } function offcanvasToggle() { if (offcanvasIsOpened()) { offcanvasClose(); } else { offcanvasOpen(); } } // add mobile menu logo $('.site-header .site-title') .clone() .prependTo($navbarCollapse); // add mobile menu close $navbarCollapse.append('Close'); // add close overlay $('.outer-wrapper').append('
'); $('[data-toggle="offcanvas"]').on('click', function () { offcanvasToggle(); }); } // sticky top nav function stickyNav() { var scrollTop = 0, navbarHeight = 80; $window.smartscroll(function () { scrollTop = $window.scrollTop(); if (scrollTop >= navbarHeight) { $body.addClass('scrolled'); } else { $body.removeClass('scrolled'); } }); } // search menu expand/collapsing functionality function searchNav() { var $navItemSearch = $('.nav-item-search'), // $searchField = $navItemSearch.find('.search-field'), $toggle; if ($navItemSearch.length) { $toggle = $('Toggle').appendTo($navItemSearch); $toggle.on('click', function (ev) { $navItemSearch.toggleClass('expand'); $('.search-field').focus(); ev.preventDefault(); }); $('.search-field, .search-submit').on('blur', function () { window.requestAnimationFrame(function () { var isFocus = $('.search-submit').is(':focus'); if (!isFocus) { $navItemSearch.removeClass('expand'); } }); }); } } $document.ready(function () { offCanvasNav(); stickyNav(); searchNav(); }); }(jQuery));