PageSourceSearch

https://www.westhertshospitals.nhs.uk/application/blocks/autonav/t…=83e7a3a971e53e744a744fb93f8c7f619d995080

js westhertshospitals.nhs.uk collected 2026-10-02 06:27:34 UTC 13,514 bytes, 298 lines download raw bytes

1$(document).ready(function() {
2    // Initialise nav
3    var mobileView = 991;
4    var navWrapper = $('.header .navigation .header-nav'),
5    screenMode = window.innerWidth <= mobileView ? 'mobile' : 'desktop',
6    mobNavPos = 0,
7    navAniDuration = 300;
8    
9    // Handle nav reset
10    resetNav();
11    function resetNav() {
12        if (screenMode === 'desktop') {
13            closeMobileNav();
14            $('#nav').attr('aria-hidden', 'false');
15            navWrapper.find('li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false');
16            navWrapper.find('> li > .nav-item > a, > li > .nav-item > a + button').removeAttr('tabindex aria-hidden');
17            navWrapper.find('div.lvl-2 .nav-item > a').attr({
18                'tabindex': '-1',
19                'aria-hidden': 'true'
20            });
21        } else if (screenMode === 'mobile') {
22            navWrapper.find('> li.nav-dropdown').removeClass('open-nav');
23            navWrapper.find('li.nav-dropdown > .nav-item > a + button').removeAttr('aria-expanded');
24            navWrapper.find('div.lvl-2 .nav-item > a').removeAttr('tabindex aria-hidden');
25            closeMobileNav();
26        }
27    }
28
29    // Handle closing the mobile nav
30    function closeMobileNav() {
31        if (mobNavPos != 0) {
32            mobNavPos = 0;
33            navWrapper.css('transform', '');
34            setTimeout(function() {
35                navWrapper.find('ul').removeClass('nav-show');
36            }, navAniDuration);
37        }
38        $('.header .header-top .mobile-buttons .nav-toggle').removeClass('active').attr('aria-expanded', 'false');
39        $('.ccm-page, button.cc-revoke, .cc-window').removeClass('nav-open');
40
41        // Hide mobile navigation from assistive technologies
42        $('#nav').attr('aria-hidden', 'true');
43        navWrapper.find('ul').removeClass('nav-show').attr('aria-hidden', 'true');
44        navWrapper.find('li a, li button').attr({
45            'tabindex': '-1',
46            'aria-hidden': 'true'
47        });
48    }
49
50    // Toggle mobile nav
51    $('.header .header-top .mobile-buttons').on('click', '.nav-toggle', function() {
52        if ($(this).attr('aria-expanded') === 'false') {
53            $(this).addClass('active').attr('aria-expanded', 'true');
54            $('.ccm-page, button.cc-revoke, .cc-window').addClass('nav-open');
55
56            // Close all mobile toolbars
57            $('.header .mobile-buttons .header-tool-button').attr('aria-expanded', 'false');
58            $('.header .header-mobile-tool').removeClass('active').find('a, button, input, select, textarea').attr({
59                'tabindex': '-1',
60                'aria-hidden': 'true'
61            });
62
63            // Reveal mobile navigation to assistive technologies
64            $('#nav').attr('aria-hidden', 'false');
65            navWrapper.find('> li > .nav-item > a, > li > .nav-item > button').attr({
66                'tabindex': '0',
67                'aria-hidden': 'false'
68            });
69            navWrapper.find('> li:first-child > .nav-item > a').focus();
70        } else {
71            closeMobileNav();
72        }
73    });
74
75    // Leaving focus on mobile nav toggle
76    $('.header .header-top .mobile-buttons').on('keydown', '.nav-toggle', function(e) {
77        if (screenMode === 'mobile') {
78            if (!e.shiftKey && e.key === 'Tab') {
79                if ($(this).attr('aria-expanded') === 'true') {
80                    e.preventDefault();
81                    navWrapper.find('[tabindex="0"]').first().focus();
82                }
83            }
84        }
85    });
86
87    // Leaving focus on mobile nav
88    navWrapper.on('keydown', '> li:first-child > .nav-item > a', function(e) {
89        if (screenMode === 'mobile') {
90            if (e.shiftKey && e.key === 'Tab') {
91                e.preventDefault();
92                $('.header .header-top .mobile-buttons .nav-toggle').focus();
93            }
94        }
95    });
96
97    // Close mobile nav when clicked outside
98    $(document).on('click', function(e) {
99        if ($('.ccm-page').hasClass('nav-open') && $(e.target).closest('.nav-toggle').length === 0) {
100            if ($(e.target).closest('.navigation').length === 0) {
101                closeMobileNav();
102            }
103        }
104    });
105
106    // Navigation through mobile nav
107    navWrapper.on('click', 'li.nav-dropdown > .nav-item > a + button', function() {
108        if (screenMode === 'mobile') {
109            var subMenu = $(this).parent('.nav-item').next('div[class*="lvl-"]').find('> ul');
110            if (subMenu.length) {
111                subMenu.addClass('nav-show').attr('aria-hidden', 'false');
112                subMenu.find('> li.nav-title > .nav-item > button:first-child, > li > .nav-item > a, > li > .nav-item > a + button').attr({
113                    'tabindex': '0',
114                    'aria-hidden': 'false'
115                });
116                mobNavPos -= 100;
117                navWrapper.css('transform', 'translateX(' + mobNavPos + '%)');
118
119                // Hide parent items for looping within sub menus
120                var parentItems = subMenu.closest('li.nav-dropdown').parent('ul').find('> li > .nav-item > [tabindex="0"]');
121                parentItems.attr('tabindex', '-1');
122            }
123        }
124    });
125    navWrapper.on('click', 'li.nav-dropdown .nav-title > .nav-item > button:first-child', function() {
126        if (screenMode === 'mobile') {
127            var subMenu = $(this).closest('div[class*="lvl-"] > ul');
128            if (subMenu.length) {
129                mobNavPos += 100;
130                navWrapper.css('transform', 'translateX(' + mobNavPos + '%)');
131                setTimeout(function() {
132                    subMenu.removeClass('nav-show').attr('aria-hidden', 'true');
133                    subMenu.find('> li.nav-title > .nav-item > button:first-child, > li > .nav-item > a, > li > .nav-item > a + button').attr({
134                        'tabindex': '-1',
135                        'aria-hidden': 'true'
136                    });
137                }, navAniDuration);
138
139                // Show parent items
140                var parentItems = subMenu.parent('div[class*="lvl-"]').parent('li').parent('ul').find('> li > .nav-item > [tabindex="-1"]');
141                parentItems.attr('tabindex', '0');
142            }
143        }
144    });
145
146    // Leaving focus from last nav item inside dropdown
147    navWrapper.on('blur', '.nav-item > [tabindex="0"]:last', function() {
148        if (screenMode === 'mobile') {
149            $('.header .header-top .mobile-buttons .nav-toggle').focus();
150        }
151    });
152
153    // Reset nav on window resize
154    window.addEventListener('resize', function() {
155        if (screenMode === 'desktop' && window.innerWidth <= mobileView) {
156            screenMode = 'mobile';
157            resetNav();
158        } else if (screenMode === 'mobile' && window.innerWidth > mobileView) {
159            screenMode = 'desktop';
160            resetNav();
161        }
162    });
163
164    // Dropdown buttons
165    navWrapper.on('click', '> li.nav-dropdown > .nav-item > a + button', function() {
166        if (screenMode === 'desktop') {
167            if ($(this).attr('aria-expanded') === 'false') {
168                navWrapper.find('> li.nav-dropdown').removeClass('open-nav');
169                navWrapper.find('> li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false');
170                $(this).closest('.header-nav > li.nav-dropdown').addClass('open-nav');
171                $(this).attr('aria-expanded', 'true');
172                $(this).parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'false');
173                $(this).parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({
174                    'tabindex': '0',
175                    'aria-hidden': 'false'
176                });
177            } else if ($(this).attr('aria-expanded') === 'true') {
178                $(this).closest('.header-nav > li.nav-dropdown').removeClass('open-nav');
179                $(this).attr('aria-expanded', 'false');
180                $(this).parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true');
181                $(this).parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({
182                    'tabindex': '-1',
183                    'aria-hidden': 'true'
184                });
185            }
186        }
187    });
188
189    // Escape keypress while navigating with keyboard
190    navWrapper.on('keyup', '.nav-item > a, .nav-item > button', function(e) {
191        if (e.key === 'Escape' || e.key === 'Esc') {
192            var currentL1 = $(this).closest('.header-nav > li.nav-dropdown');
193            if (screenMode === 'desktop' && currentL1.find('div.lvl-2').length) {
194                currentL1.removeClass('open-nav');
195                currentL1.find('> .nav-item > button').attr('aria-expanded', 'false').focus();
196                currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true');
197                currentL1.find('div.lvl-2 .nav-item > a').attr({
198                    'tabindex': '-1',
199                    'aria-hidden': 'true'
200                });
201            } else if (screenMode === 'mobile') {
202                closeMobileNav();
203                $('.header .header-top .mobile-buttons .nav-toggle').focus();
204            }
205        }
206    });
207
208    // Escape keypress while hovering over menu
209    navWrapper.on('mouseover', '> li.nav-dropdown', function() {
210        if (screenMode === 'desktop') {
211            $(document).on('keyup', function(e) {
212                if (e.key === 'Escape' || e.key === 'Esc') {
213                    $(this).find('div.lvl-2').css('transform', 'unset');
214                }
215            });
216            if ($(this).find('div.lvl-2').attr('style')) {
217                $(this).find('div.lvl-2').attr('style', '');
218            }
219        }
220    })
221
222    // Leaving focus from last nav item inside dropdown
223    navWrapper.on('blur', '> li.nav-dropdown.open-nav div.lvl-2 .nav-item > a:last', function() {
224        if (screenMode === 'desktop') {
225            var currentL1 = $(this).closest('.header-nav > li.nav-dropdown');
226            currentL1.removeClass('open-nav');
227            currentL1.find('> .nav-item > button').attr('aria-expanded', 'false').focus();
228            currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true');
229            currentL1.find('div.lvl-2 .nav-item > a').attr({
230                'tabindex': '-1',
231                'aria-hidden': 'true'
232            });
233        }
234    });
235
236    // Leaving focus from first nav item inside dropdown
237    navWrapper.on('keydown', '> li.nav-dropdown.open-nav div.lvl-2 .nav-item > a:first', function(e) {
238        if (screenMode === 'desktop') {
239            if (e.shiftKey && e.key === 'Tab') {
240                var currentL1 = $(this).closest('.header-nav > li.nav-dropdown');
241                currentL1.removeClass('open-nav');
242                currentL1.find('> .nav-item > button').attr('aria-expanded', 'false');
243                currentL1.find('div.lvl-2 ul').attr('aria-hidden', 'true');
244                currentL1.find('div.lvl-2 .nav-item > a').attr({
245                    'tabindex': '-1',
246                    'aria-hidden': 'true'
247                });
248            }
249        }
250    });
251
252    // Nav touch
253    navWrapper.on('touchstart', '> li.nav-dropdown > .nav-item > a', function(e) {
254        if (screenMode === 'desktop') {
255            e.preventDefault();
256            var btn = $(this).next('button');
257            if (btn.length) {
258                if (btn.attr('aria-expanded') === 'false') {
259                    navWrapper.find('> li.nav-dropdown').removeClass('open-nav');
260                    navWrapper.find('> li.nav-dropdown > .nav-item > a + button').attr('aria-expanded', 'false');
261                    btn.closest('.header-nav > li.nav-dropdown').addClass('open-nav');
262                    btn.attr('aria-expanded', 'true');
263                    btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'false');
264                    btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({
265                        'tabindex': '0',
266                        'aria-hidden': 'false'
267                    });
268                } else if (btn.attr('aria-expanded') === 'true') {
269                    btn.closest('.header-nav > li.nav-dropdown').removeClass('open-nav');
270                    btn.attr('aria-expanded', 'false');
271                    btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true');
272                    btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({
273                        'tabindex': '-1',
274                        'aria-hidden': 'true'
275                    });
276                }
277            }
278        }
279    });
280
281    // Close desktop nav when clicked outside (Touch based)
282    $(document).on('touchstart', function(e) {
283        if (screenMode === 'desktop' && navWrapper.find('> li.nav-dropdown.open-nav').length) {
284            if ($(e.target).closest('.header .navigation .header-nav > li.nav-dropdown.open-nav').length === 0) {
285                var btn = navWrapper.find('> li.nav-dropdown.open-nav > .nav-item > button');
286                if (btn.length) {
287                    btn.closest('.header-nav > li.nav-dropdown').removeClass('open-nav');
288                    btn.attr('aria-expanded', 'false');
289                    btn.parent('.nav-item').find('+ div.lvl-2 ul').attr('aria-hidden', 'true');
290                    btn.parent('.nav-item').find('+ div.lvl-2 .nav-item > a').attr({
291                        'tabindex': '-1',
292                        'aria-hidden': 'true'
293                    });
294                }
295            }
296        }
297    });
298});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.