Source: components/topnav.js

;(function () {
    'use strict';

    /**
     * @namespace
     */
    sh.libs.topnav = (function($){

        var name = 'topnav';

        /**
         * Triggers when search recives (or should recive) focus
         * @private
         * @memberof sh.libs.topnav
         * @param {external:jQuery|string} id Selector or jQuery element
         * @return {external:jQuery}
         */
        function focusSearch(id){
            var $topnav = $(id);
            $topnav.find('.search').addClass('active');

            setTimeout(function(){
                if( !$topnav.find('.search input').is(':focus') ){
                    $topnav.find('.search input').focus();
                }
            }, 0);

            return $topnav;
        }

        /**
         * Triggers when search looses focus
         * @private
         * @memberof sh.libs.topnav
         * @param {external:jQuery|string} id Selector or jQuery element
         * @return {external:jQuery}
         */
        function blurSearch(id){
            $(id).find('.search').removeClass('active');
            return $(id);
        }

        /**
         * Toggle visibility of small navigation. This is only visible for small viewports
         * @public
         * @memberof sh.libs.topnav
         * @param {external:jQuery|string} id Selector or jQuery element
         * @return {external:jQuery}
         */
        function toggleSmallNavigation(id){
            var $topnav = $(id);
            $topnav.find('.small-navigation-toggle').toggleClass('active');
            if( $topnav.find('#js-small-navigation').length === 0 ){
                var data = {
                    "loggedIn": false,
                    "returnURL": window.location.href
                };
                if (document.cookie.indexOf('cor_session') > -1 ) {
                    data.loggedIn = true;
                }
                $topnav.find('.primary').after( Mustache.render(sh.templates['global-small-navigation'], data) );
            }
            $topnav.find('#js-small-navigation').toggleClass('active');
            return $topnav;
        }

        /**
         * Toggle visibility for secondary navigation. This is only visible for small viewports
         * @public
         * @memberof sh.libs.topnav
         * @param {external:jQuery|string} id Selector or jQuery element
         * @return {external:jQuery}
         */
        function toggleSmallSecondary(id){
            var $topnav = $(id);
            $topnav.find('.small-secondary-toggle').toggleClass('active');
            $topnav.find('.secondary nav').toggleClass('active');
            return $topnav;
        }

        /**
         * Initialize the component
         * @public
         * @memberof sh.libs.topnav
         * @param {external:jQuery|string} [id] Selector or jQuery element
         * @return {array} All targeted elements
         */
        function init(id){

            var $targets;

            if(id !== undefined){
                $targets = $(id);
            } else {
                $targets = $('.top-nav');
            }

            $targets.each(function(i, el){
                if( !sh.utils.isInitialized(el, name) ){

                    $(el).find('.search').on('click', function(){
                        focusSearch( $(event.currentTarget).closest('.top-nav') );
                    });

                    $(el).find('.search input').on('focus', function(){
                        focusSearch( $(event.currentTarget).closest('.top-nav') );
                    });

                    $(el).find('.search input').on('blur', function(){
                        blurSearch( $(event.currentTarget).closest('.top-nav') );
                    });

                    $(el).find('.small-navigation-toggle').on('click', function(){
                        event.preventDefault();
                        toggleSmallNavigation( $(event.currentTarget).closest('.top-nav') );
                    });

                    $(el).find('.small-secondary-toggle').on('click', function(){
                        event.preventDefault();
                        toggleSmallSecondary( $(event.currentTarget).closest('.top-nav') );
                    });

                    sh.utils.initialized(el, name);
                }
            });

            return $targets;
        }

        return {
            init: init,
            reflow: init,
            toggleSmallSecondary: toggleSmallSecondary,
            toggleSmallNavigation: toggleSmallNavigation
        };

    })(jQuery);

})();