2 * Manages the sticky page header.
4 * @author Alexander Ebert
5 * @copyright 2001-2016 WoltLab GmbH
6 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
7 * @module WoltLabSuite/Core/Ui/Page/Header/Fixed
9 define(['Core', 'EventHandler', 'Ui/Alignment', 'Ui/CloseOverlay', 'Ui/Screen', 'Ui/Scroll', 'Ui/SimpleDropdown'], function(Core
, EventHandler
, UiAlignment
, UiCloseOverlay
, UiScreen
, UiScroll
, UiSimpleDropdown
) {
12 var _callbackScroll
= null;
13 var _pageHeader
, _pageHeaderContainer
, _searchInput
, _searchInputContainer
;
14 var _isMobile
= false;
17 * @exports WoltLabSuite/Core/Ui/Page/Header/Fixed
21 * Initializes the sticky page header handler.
24 _pageHeader
= elById('pageHeader');
25 _pageHeaderContainer
= elById('pageHeaderContainer');
27 this._initSearchBar();
29 UiScreen
.on('screen-md-down', {
30 match: function () { _isMobile
= true; },
31 unmatch: function () { _isMobile
= false; },
32 setup: function () { _isMobile
= true; }
37 * Provides the collapsible search bar.
41 _initSearchBar: function() {
42 var searchContainer
= elById('pageHeaderSearch');
43 searchContainer
.addEventListener(WCF_CLICK_EVENT
, function(event
) {
44 event
.stopPropagation();
47 _searchInput
= elById('pageHeaderSearchInput');
49 var userPanelSearchButton
= elById('userPanelSearchButton');
50 var pageHeaderFacade
= elById('pageHeaderFacade');
52 _searchInputContainer
= elById('pageHeaderSearchInputContainer');
54 var menu
= elById('topMenu');
55 userPanelSearchButton
.addEventListener(WCF_CLICK_EVENT
, (function(event
) {
56 event
.preventDefault();
57 event
.stopPropagation();
59 var facadeHeight
= pageHeaderFacade
.clientHeight
;
60 var scrollTop
= window
.pageYOffset
;
61 var skipScrollHandler
= false;
62 var isVisible
= !_isMobile
&& (facadeHeight
> scrollTop
);
64 if (!isVisible
&& !_pageHeader
.classList
.contains('searchBarOpen')) {
65 UiAlignment
.set(_searchInputContainer
, menu
, {
69 _pageHeader
.classList
.add('searchBarOpen');
72 else if (!_isMobile
) {
74 // setting focus could lead to the search bar to be
75 // hidden behind the fixed panel
76 UiScroll
.element(elById('top'), function () {
84 skipScrollHandler
= true;
87 WCF
.Dropdown
.Interactive
.Handler
.closeAll();
89 if (!skipScrollHandler
&& !_isMobile
&& _callbackScroll
=== null) {
90 _callbackScroll
= (function () {
91 if (pageHeaderFacade
.clientHeight
> window
.pageYOffset
) {
92 this._closeSearchBar();
95 window
.addEventListener('scroll', _callbackScroll
);
99 UiCloseOverlay
.add('WoltLabSuite/Core/Ui/Page/Header/Fixed', (function() {
100 if (_pageHeader
.classList
.contains('searchBarForceOpen')) return;
102 this._closeSearchBar();
105 EventHandler
.add('com.woltlab.wcf.MainMenuMobile', 'more', (function(data
) {
106 if (data
.identifier
=== 'com.woltlab.wcf.search') {
107 data
.handler
.close(true);
109 Core
.triggerEvent(elById('pageHeaderSearchInput'), WCF_CLICK_EVENT
);
114 _closeSearchBar: function () {
115 _pageHeader
.classList
.remove('searchBarOpen');
117 ['bottom', 'left', 'right', 'top'].forEach(function(propertyName
) {
118 _searchInputContainer
.style
.removeProperty(propertyName
);
123 if (_callbackScroll
!== null) {
124 window
.removeEventListener('scroll', _callbackScroll
);
125 _callbackScroll
= null;