js/navigation.js   A
last analyzed

Complexity

Total Complexity 19
Complexity/F 3.8

Size

Lines of Code 100
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 55
c 0
b 0
f 0
dl 0
loc 100
rs 10
wmc 19
mnd 14
bc 14
fnc 5
bpm 2.8
cpm 3.8
noi 0

1 Function

Rating   Name   Duplication   Size   Complexity  
D navigation.js ➔ toggleFocus 0 18 12
1
/**
2
 * File navigation.js.
3
 *
4
 * Handles toggling the navigation menu for small screens and enables TAB key
5
 * navigation support for dropdown menus.
6
 */
7
( function() {
8
	var container, button, menu, links, i, len;
9
10
	container = document.getElementById( 'site-navigation' );
11
	if ( ! container ) {
12
		return;
13
	}
14
15
	button = container.getElementsByTagName( 'button' )[0];
16
	if ( 'undefined' === typeof button ) {
17
		return;
18
	}
19
20
	menu = container.getElementsByTagName( 'ul' )[0];
21
22
	// Hide menu toggle button if menu is empty and return early.
23
	if ( 'undefined' === typeof menu ) {
24
		button.style.display = 'none';
25
		return;
26
	}
27
28
	menu.setAttribute( 'aria-expanded', 'false' );
29
	if ( -1 === menu.className.indexOf( 'nav-menu' ) ) {
30
		menu.className += ' nav-menu';
31
	}
32
33
	button.onclick = function() {
34
		if ( -1 !== container.className.indexOf( 'toggled' ) ) {
35
			container.className = container.className.replace( ' toggled', '' );
36
			button.setAttribute( 'aria-expanded', 'false' );
37
			menu.setAttribute( 'aria-expanded', 'false' );
38
		} else {
39
			container.className += ' toggled';
40
			button.setAttribute( 'aria-expanded', 'true' );
41
			menu.setAttribute( 'aria-expanded', 'true' );
42
		}
43
	};
44
45
	// Get all the link elements within the menu.
46
	links    = menu.getElementsByTagName( 'a' );
47
48
	// Each time a menu link is focused or blurred, toggle focus.
49
	for ( i = 0, len = links.length; i < len; i++ ) {
50
		links[i].addEventListener( 'focus', toggleFocus, true );
51
		links[i].addEventListener( 'blur', toggleFocus, true );
52
	}
53
54
	/**
55
	 * Sets or removes .focus class on an element.
56
	 */
57
	function toggleFocus() {
58
		var self = this;
59
60
		// Move up through the ancestors of the current link until we hit .nav-menu.
61
		while ( -1 === self.className.indexOf( 'nav-menu' ) ) {
62
63
			// On li elements toggle the class .focus.
64
			if ( 'li' === self.tagName.toLowerCase() ) {
65
				if ( -1 !== self.className.indexOf( 'focus' ) ) {
66
					self.className = self.className.replace( ' focus', '' );
67
				} else {
68
					self.className += ' focus';
69
				}
70
			}
71
72
			self = self.parentElement;
73
		}
74
	}
75
76
	/**
77
	 * Toggles `focus` class to allow submenu access on tablets.
78
	 */
79
	( function( container ) {
80
		var touchStartFn, i,
81
			parentLink = container.querySelectorAll( '.menu-item-has-children > a, .page_item_has_children > a' );
82
83
		if ( 'ontouchstart' in window ) {
84
			touchStartFn = function( e ) {
85
				var menuItem = this.parentNode, i;
86
87
				if ( ! menuItem.classList.contains( 'focus' ) ) {
88
					e.preventDefault();
89
					for ( i = 0; i < menuItem.parentNode.children.length; ++i ) {
90
						if ( menuItem === menuItem.parentNode.children[i] ) {
91
							continue;
92
						}
93
						menuItem.parentNode.children[i].classList.remove( 'focus' );
94
					}
95
					menuItem.classList.add( 'focus' );
96
				} else {
97
					menuItem.classList.remove( 'focus' );
98
				}
99
			};
100
101
			for ( i = 0; i < parentLink.length; ++i ) {
102
				parentLink[i].addEventListener( 'touchstart', touchStartFn, false );
103
			}
104
		}
105
	}( container ) );
106
} )();
107