PageSourceSearch

https://www.val.se/download/18.162047b519a91d0533113c3c/1684226885572/iw-menu.js

js val.se collected 2026-10-02 03:27:46 UTC 5,162 bytes, 129 lines download raw bytes

1svDocReady(function () {
2   jQuery.fn.iwMenu = function (options) {
3      function init($menuContainer, config) {
4         var namespace = config.namespace;
5
6         if ($menuContainer.data('loaded') === true) {
7            return;
8         }
9         $menuContainer.data('loaded', true);
10         
11         if (typeof config.menudata === 'object') {
12            renderMenu(config.menudata);
13         } else if (typeof config.menudata === 'undefined' && typeof $menuContainer.data('iw-menu-uri') !== 'undefined') {
14            var menuURI = $menuContainer.data('iw-menu-uri');
15            $svjq.get({
16               datatype: 'json',
17               url: menuURI,
18               success: function (data) {
19                  renderMenu(data);
20               }
21            }).fail(function () {
22               console.error('Mobilemenu ' + menuURI + ' fail to load');
23            });
24         } else if (typeof config.menudata === 'function') {
25            config.menudata(renderMenu);
26         } else {
27            console.warn('No menudata specified.');
28            return;
29         }
30
31         function renderMenu(menudata) {
32            var $menu = $svjq('<div></div>');
33            renderMenuTree($menu, menudata.children, 1, 'mobilemenu');
34
35            $menu.find('> ul').addClass(namespace + '__list--expanded').attr("role", "menu");
36            $menuContainer.append($menu.children());
37
38            setCurrentPage();
39         }
40
41         function setCurrentPage() {
42            var currentPageURI = $menuContainer.data('iw-menu-current-page');
43            if (typeof currentPageURI === 'undefined') {
44               return;
45            }
46
47            var $currentPageMenuLink = $menuContainer.find('a[href="' + currentPageURI + '"]');
48            if ($currentPageMenuLink.length === 0) {
49               return;
50            }
51
52            $currentPageMenuLink.addClass(namespace + '__link--active');
53            $currentPageMenuLink.attr('aria-current', 'page');
54            $currentPageMenuLink.parents('li').each(function () {
55               var $expander = $svjq(this).find(' > div .' + namespace + '__expander');
56               $expander.iwButton('open', { transition: 'show' });
57            });
58         }
59
60         function renderMenuTree($container, children, depth, parentBranchId) {
61            var $ul = $svjq('<ul id="' + parentBranchId + '" class="' + namespace + '__list ' + namespace + '__list-' + depth + '"></ul>');
62            $container.append($ul);
63
64            for (var i = 0; i < children.length; i++) {
65               var page = children[i];
66               var $li = $svjq('<li></li>');
67               $li.addClass(namespace + '__item ' + namespace + '__item-' + depth).attr("role", "presentation");
68               var $div = $svjq('<div></div>').attr("role", "presentation");
69               $div.addClass(namespace + '__link-wrapper ' + namespace + '__link-wrapper-' + depth);
70               $li.append($div);
71               $ul.append($li);
72
73               if (page.cssClass) {
74                  $li.addClass(namespace + '__item--' + page.cssClass);
75               }
76
77               var branchId = parentBranchId + '-' + i;
78
79               var hasChildren = page.children && page.children.length > 0;
80               var $link = $svjq('<a role="menuitem" href="#" class="' + namespace + '__link ' + namespace + '__link-' + depth + '"><span class="' + namespace + '__link-text">' + page.name + '</span></a>');
81
82               $div.append($link);
83
84               if (typeof (page.locale) !== 'undefined') {
85                  $link.attr('lang', page.locale);
86               }
87
88               var $expander = null;
89
90               if (typeof (page.url) !== 'undefined') {
91                  $link.attr('href', page.url);
92
93                  if (hasChildren) {
94                     $expander = $svjq('<a href="#" role="button" class="' + namespace + '__expander"></a>');
95                     $div.append($expander);
96                  }
97               } else {
98                  $expander = $link;
99                  $link.addClass(namespace + '__expander');
100               }
101
102               if ($expander) {
103                  var $expanderIcon = $svjq('<span class="' + namespace + '__expander-icon"><span class="' + namespace + '__expander-icon-image"></span></span>');
104                  $expander.append($expanderIcon);
105                  $expander.iwButton({
106                     type: 'toggle-button',
107                     controlsId: branchId,
108                     transition: config.transition,
109                     pressedClass: namespace + '__expander--expanded',
110                     text: 'Öppna',
111                     pressedText: 'Stäng'
112                  });
113
114                  renderMenuTree($li, page.children, depth + 1, branchId);
115               }
116            }
117         }
118      }
119
120      var settings = $svjq.extend({
121         namespace: 'iw-menu',
122         transition: 'slideDown'
123      }, options);
124
125      return this.each(function () {
126         init($svjq(this), settings);
127      });
128   };
129});

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.