1(function($) { 2 $(document).ready(function() { 3 /* Adaption of the width from the content, if the subnavigation is visible */ 4 if ($('#esv-navigation').is(":visible")) { 5 $('#esv-container').addClass('visible_navigation'); 6 } 7 8 /* Encapsulates SVS Mobile Menu Behavior. 9 There are two slightly different behaviors: 10 If isAppMenu is set the application menu will be rendered like the 3rd level of content navigation. 11 Furthermore additional elements like targetgroup selector will be hidden. 12 */ 13 function SVSMobileMenu(menuWrapper, isAppMenu) { 14 this.template().insertAfter('#esv-container'); 15 16 this.menuWrapper = menuWrapper; 17 this.isAppMenu = isAppMenu; 18 this.originalMenu = menuWrapper.find('.menu'); 19 this.metaLinks = []; 20 21 // templates 22 this.mobileTemplate = $(document).find('#nav-mobile-template'); 23 this.menuEntry2Template = this.mobileTemplate.find('[data-menu-entry-template-level-1]'); 24 this.menuEntry3Template = this.mobileTemplate.find('[data-menu-entry-template-level-2]'); 25 26 // target containers 27 this.containerMain = this.mobileTemplate.find("[data-container-main]"); 28 this.containerSub = this.mobileTemplate.find("[data-container-sub]"); 29 30 this.pageHeader = $('#esv-header'); 31 this.burgerIcon = this.pageHeader.find('.menuicon a'); 32 this.closeIcon = this.mobileTemplate.find('[data-close-icon]'); 33 } 34 35 // because of IE11 support we cannot use template strings. 36 SVSMobileMenu.prototype.template = function() { 37 return $( 38 [ 39 '<div style=\"display: none;\" id=\"nav-mobile-template\" class=\"level-main\" role=\"navigation\" aria-label=\"Mobile Navigation\">', 40 ' <div class=\"hide-level-sub\">', 41 ' <div class=\"nav-mobile__header nav-mobile__header--small\">', 42 ' <a data-fixed-link=\"logo\" href=\"#\" class=\"nav-mobile__logo\" alt=\"zur Startseite\"><img class=\"nav-mobile__logo\" src=\"\" alt=\"SVS\"/></a>', 43 ' <a data-close-icon href=\"#\"><span class=\"sv-close\" role=\"img\" alt=\"\"aria-label=\"Icon Navigation Schließen\"></span></a>', 44 ' </div>', 45 ' </div>', 46 ' <div class=\"hide-level-sub\">', 47 ' <a data-fixed-link=\"mysv\" href=\"#\" class=\"nav-mobile__tile nav-mobile__tile--green nav-mobile__tile--with-arrow\">', 48 ' <div class=\"nav-mobile__tiletext\">Login</div>', 49 ' <span class=\"sv-arrow_r\" role=\"img\" aria-label=\"Icon Navigation öffnen\"></span>', 50 ' </a>', 51 ' <a data-fixed-link=\"onlinevers\" href=\"extract from header\" class=\"nav-mobile__tile nav-mobile__tile--grey nav-mobile__tile--with-arrow nav-mobile__tile--no-bottom-margin\">', 52 ' <div class=\"nav-mobile__tiletext\">Online Versicherungsanmeldung</div>', 53 ' <span class=\"sv-arrow_r\" role=\"img\" aria-label=\"Icon Navigation öffnen\"></span>', 54 ' </a>', 55 ' </div>', 56 ' <div data-container-main class=\"nav-mobile__tiles hide-level-sub\">', 57 ' <!-- container for 1st level a -->', 58 ' </div>', 59 ' <div data-container-meta class=\"nav-mobile__menu-entry-container nav-mobile__menu-entry-container--indent hide-level-sub\">', 60 ' <!-- container for meta links -->', 61 ' </div>', 62 '', 63 ' <div class=\"nav-mobile__subheader hide-level-main\">', 64 ' <div class=\"nav-mobile__subheader-icons\">', 65 ' <a id=\"nav-mobile__back-link\"><span class=\"sv-arrow_l\" role=\"img\" aria-label=\"Icon Navigation Zurück\"></span></a>', 66 ' <a data-close-icon href=\"#\"><span class=\"sv-close\" role=\"img\" aria-label=\"Icon Navigation SchlieÃen\"></span></a>', 67 ' </div>', 68 ' <a href=\"#\" class=\"nav-mobile__subheader-link\"></a>', 69 ' </div>', 70 ' <nav data-container-sub class=\"nav-mobile__menu-entry-container hide-level-main\">', 71 ' <!-- container for 2nd/3rd level a -->', 72 ' </nav>', 73 '', 74 ' <!-- templates -->', 75 ' <a data-menu-entry-template-level-1 href=\"#\" class=\"nav-mobile__template nav-mobile__menu-entry\">', 76 ' <div class=\"nav-mobile__menu-entry-text\"></div>', 77 ' <span class=\"sv-arrow_r\" role=\"img\" aria-label=\"Icon Navigation öffnen\"></span>', 78 ' </a>', 79 ' <div data-menu-entry-template-level-2 class=\"nav-mobile__template nav-mobile__menu-entry nav-mobile__menu-entry--with-submenu\">', 80 ' <div class=\"nav-mobile__menu-entry-dropdown-header\">', 81 ' <a href=\"#\" class=\"nav-mobile__menu-entry-dropdown-link\"></a>', 82 ' <div data-toggle=\"collapse\">', 83 ' <span data-dropdown-icon=\"open\" class=\"sv-o_prev\" role=\"img\" aria-label=\"Icon Untermenü öffnen\"></span>', 84 ' <span data-dropdown-icon=\"close\" class=\"sv-o_next\" role=\"img\" aria-label=\"Icon Navigation schließen\"></span>', 85 ' </div>', 86 ' </div>', 87 ' <div style=\"display: none;\" class=\"nav-mobile__submenu\">', 88 ' <!-- container for >= 4th level !-->', 89 ' </div>', 90 ' </div>', 91 '', 92 ' <div class=\"nav-mobile__meta\">', 93 ' <div>', 94 ' <a data-fixed-link=\"dashboard-back-to-startpage\" href=\"#\" class=\"nav-mobile__tile nav-mobile__tile--green nav-mobile__tile--with-arrow\">', 95 ' <div class=\"nav-mobile__tiletext\">Zurück zur SVS Website</div>', 96 ' <span class=\"sv-arrow_r\" role=\"img\" aria-label=\"Icon Navigation öffnen\"></span>', 97 ' </a>', 98 ' <a data-fixed-link=\"dashboard-logout\" href=\"#\" class=\"nav-mobile__tile nav-mobile__tile--orange nav-mobile__tile--with-arrow\">', 99 ' <div class=\"nav-mobile__tiletext\">Logout</div>', 100 ' <span class=\"sv-arrow_r\" role=\"img\" aria-label=\"Icon Navigation öffnen\"></span>', 101 ' </a>', 102 ' </div>', 103 ' <div class=\"nav-mobile__target-group\">', 104 ' <div class=\"nav-mobile__target-group-text\">Inhalte anzeigen für</div>', 105 ' <div class=\"targetgroupselect nav-mobile__target-group-select\">', 106 ' <nav data-targetgroup-select>', 107 ' <!-- placeholder for target group select -->', 108 ' </nav>', 109 ' </div>', 110 ' </div>', 111 ' <div class=\"nav-mobile__footer\">', 112 ' <a data-fixed-link=\"logo\" href=\"#\" class=\"nav-mobile__logo\" alt=\"zur Startseite\"><img class=\"nav-mobile__logo\" src=\"\" alt=\"SVS\"/></a>', 113 ' <div class=\"nav-mobile__footerlinks\">', 114 ' <a data-fixed-link=\"sitemap\" class=\"nav-mobile__footerlink\" href=\"#\">Sitemap</a>', 115 ' <a data-fixed-link=\"contrast\" class=\"nav-mobile__footerlink\" id=\"kontrastmodus_mobile\" data-behaviour=\"contrast-mode-link\" title=\"In Kontrastmodus umschalten\" href=\"https://www.et.esv.sozialversicherung.at/cdscontent/?contentid=10007.816825&viewmode=content&switchContrastMode=true\">', 116 ' <img src=\"\" alt=\"Icon Kontrastmodus\">', 117 ' </a>', 118 ' </div>', 119 ' </div>', 120 ' </div>', 121 ' </div>', 122 ].join('') 123 ); 124 } 125 126 SVSMobileMenu.prototype.init = function() { 127 this.fetchContentFromHeader(); 128 129 var currentItem = this.originalMenu.find('li.current-menu-item > a[data-level]'); 130 131 if (this.isAppMenu) { 132 this.mobileTemplate.find('.nav-mobile__subheader').remove(); 133 this.mobileTemplate.find('.nav-mobile__header').parent().removeClass('hide-level-sub'); 134 this.showApplicationMenu(currentItem); 135 } else { 136 if (currentItem.length == 1) { 137 this.showLevel(currentItem); 138 } else { 139 this.showMainMenu(); 140 } 141 } 142 143 var that = this; 144 145 // de-register default mobilenavi and register click 146 this.burgerIcon.off('click'); 147 this.burgerIcon.on('click', function(event) { 148 event.preventDefault(); 149 that.mobileTemplate.find('[data-targetgroup-select]').html($('#esv-header #targetgroup_list'));
150 that.menuWrapper.addClass('nav-mobile'); 151 that.mobileTemplate.show(0, function() { 152 that.mobileTemplate.find("[data-fixed-link=logo]").first().focus(); 153 }); 154 }); 155 156 // register close click 157 this.closeIcon.on('click', function(event) { 158 event.preventDefault(); 159 $('#esv-header .targetgroupselect nav').html(that.mobileTemplate.find('[data-targetgroup-select] ul')); 160 that.menuWrapper.removeClass('nav-mobile'); 161 that.mobileTemplate.hide(); 162 }); 163 164 // register menu item click 165 this.mobileTemplate.on("click", "[data-menu-item-id]", function(event) { 166 event.preventDefault(); 167 168 origMenuItem = that.originalMenu.find("[data-menu-item-id='"+ $(this).data('menuItemId') + "']"); 169 170 if (origMenuItem.length == 0) { 171 window.location.href = $(this).attr('href'); 172 } else if (origMenuItem.data('level') >= 3 || that.isAppMenu) { 173 window.location.href = origMenuItem.attr('href'); 174 } else { 175 that.mobileTemplate.scrollTop("0"); 176 that.showLevel(origMenuItem); 177 } 178 }); 179 180 // register 3rd level dropdown 181 this.mobileTemplate.on('click', "[data-toggle='collapse']", function(event) { 182 event.preventDefault(); 183 184 containerId = $(this).data('target'); 185 openIcon = $(this).find("[data-dropdown-icon='open']") 186 closeIcon = $(this).find("[data-dropdown-icon='close']") 187 188 if (containerId) { 189 if ($(containerId).is(":visible")) { 190 closeIcon.hide(); 191 openIcon.show(); 192 } else { 193 openIcon.hide(); 194 closeIcon.show(); 195 } 196 197 $(containerId).slideToggle(); 198 } 199 }); 200 201 // register back link 202 this.mobileTemplate.on('click', '#nav-mobile__back-link', function(event) { 203 event.preventDefault(); 204 menuItemId = $(this).closest('.nav-mobile__subheader').find('.nav-mobile__subheader-link').data('menuItemId'); 205 prevItem = that.originalMenu.find("[data-menu-item-id='"+ menuItemId + "']").closest('.sub-menu').prev('[data-level]').first(); 206 that.showLevel(prevItem); 207 }); 208 } 209 210 // extract links from header of page 211 SVSMobileMenu.prototype.fetchContentFromHeader = function() { 212 this.setFixedLink('#esv-header #zurStartseite',"[data-fixed-link='logo']"); 213 $("[data-fixed-link='logo'] img").attr('src', $('#esv-header #zurStartseite img').attr('src')); 214 this.setFixedLink('#esv-header #loginUrl', "[data-fixed-link='mysv']"); 215 $("[data-fixed-link='contrast'] img").attr('src', $('#esv-header .accessicon a img').attr('src')); 216 this.setFixedLink('#esv-header .optin_link a', "[data-fixed-link='onlinevers']"); 217 this.setFixedLink('#esv-header .sitemaplink a', "[data-fixed-link='sitemap']"); 218 this.setFixedLink('#esv-header .accessicon a', "[data-fixed-link='contrast']"); 219 this.setFixedLink('#esv-header #dashboard-back-to-startpage a', "[data-fixed-link='dashboard-back-to-startpage']"); 220 this.setFixedLink('#esv-header #dashboard-logout a', "[data-fixed-link='dashboard-logout']"); 221 222 var metaLinksToExtract = $('#esv-header nav.basenavi ul.menu > li.menu-item > a'); 223 that = this 224 metaLinksToExtract.each(function(idx, metaLink) { 225 var link = that.createLevel2Element(metaLink); 226 that.metaLinks.push(link); 227 }); 228 this.mobileTemplate.find('[data-container-meta]').html(this.metaLinks); 229 230 if (this.isAppMenu) { 231 this.mobileTemplate.find('.nav-mobile__target-group').remove(); 232 this.mobileTemplate.find('.nav-mobile__footerlinks').html($('#esv-header .dashboard-userinfo').clone()) 233 } 234 } 235 236 // tries to extract an element with given selector and if found sets the href attribute of the element 237 // and the text (if no children) identified by the templateSelector 238 SVSMobileMenu.prototype.setFixedLink = function(selector, templateSelector) { 239 var link = $(selector); 240 var templateLink = this.mobileTemplate.find(templateSelector); 241 if (link.length == 1) { 242 templateLink.attr('href', link.attr('href')); 243 if (templateLink.children().length == 0) { 244 templateLink.text(link.text()); 245 } 246 } else { 247 templateLink.remove(); 248 } 249 } 250 251 SVSMobileMenu.prototype.showApplicationMenu = function(currentMenuItem) { 252 var menuItems = this.menuWrapper.closest('#esv-navigation').find('form .menu > li.menu-item, .menu form > li.menu-item'); 253 254 var entries = []; 255 var that = this; 256 menuItems.each(function(idx, menuItem) { 257 var menuItemLink = $(menuItem).find('> a:not(.toggle-link), > .svamenu-item-block a:not(.toggle-link)') 258 if (menuItemLink.length > 0) { 259 var entry = that.createLevel3Element(menuItemLink, null, true); 260 } else { 261 if ($(menuItem).find('> .sub-menu').length > 0) { 262 // quirks if menuItem does not contain a "a" element right before .sub-menu 263 // we create a virtual one 264 var virtualLinkName = $(menuItem).clone() 265 .children() 266 .remove() 267 .end() 268 .text(); 269 270 var virtualLink = $('<a class="virtual-link" style="display: none;" href="#">
270' + virtualLinkName + '</a>'); 271 virtualLink.insertBefore($(menuItem).find('> .sub-menu')); 272 var entry = that.createLevel3Element($(menuItem).find('> a.virtual-link'), null, true); 273 } else { 274 // simply ignore menuItem 275 } 276 } 277 entries.push(entry); 278 }); 279 280 var mainEntries = this.buildSubMenuEntries(currentMenuItem, this.createLevel3Element.bind(this)); 281 282 this.containerSub.hide().html(entries.concat(mainEntries)); 283 this.mobileTemplate.find('.hide-level-sub').hide(); 284 this.mobileTemplate.find('.hide-level-main').fadeIn(500); 285 this.mobileTemplate.attr('class', 'level-sub'); 286 } 287 288 SVSMobileMenu.prototype.showMainMenu = function() { 289 level = 1; 290 elements = this.originalMenu.find("[data-level='0']").next('.sub-menu').find('> li > a[data-level]').clone(); 291 elements.addClass('nav-mobile__tile nav-mobile__tile--image'); 292 293 elements.each(function() { 294 imageUrl = $(this).data('mobilenavImage'); 295 if (imageUrl) { 296 $(this).css('background-image', 'url(' + imageUrl + ')'); 297 } 298 }); 299 300 // remove possible duplicates 301 metaLinksText = that.metaLinks.map(function(elem) { 302 return $(elem).text().trim(); 303 }); 304 305 elements = elements.filter(function() { 306 return ($.inArray($(this).text().trim(), metaLinksText)) == -1; 307 }); 308 309 this.containerMain.hide().html(elements); 310 this.mobileTemplate.find('.hide-level-main').hide(); 311 this.mobileTemplate.find('.hide-level-sub').fadeIn(500); 312 this.mobileTemplate.attr('class', 'level-main'); 313 } 314 315 // if no menuItem is given we assume that we are on level 0 and take these elements for rendering 316 SVSMobileMenu.prototype.buildSubMenuEntries = function(menuItem, createElementFct, subItem) { 317 var elements; 318 319 if (menuItem.length > 0) { 320 // set sub header bg image 321 imageUrl = menuItem.data('mobilenavImage'); 322 if (imageUrl) { 323 this.mobileTemplate.find('.nav-mobile__subheader').css('background-image', 'url(' + imageUrl + ')'); 324 } else { 325 this.mobileTemplate.find('.nav-mobile__subheader').css('background-image', 'none'); 326 } 327 328 // set title text and link 329 subheaderLink = this.mobileTemplate.find('.nav-mobile__subheader-link'); 330 subheaderLink.attr('href', menuItem.attr('href')); 331 subheaderLink.data('menuItemId', menuItem.data('menuItemId')); 332 subheaderLink.hide().text(menuItem.text()).fadeIn(500); 333 334 // set menu items 335 elements = menuItem.next('.sub-menu').find('> li > a[data-level]'); 336 } else { 337 elements = this.originalMenu.find("[data-level='0']").next('.sub-menu').find('> li > a[data-level]') 338 // fallback to structure of nav.main 339 if (elements.length == 0) { 340 elements = this.originalMenu.find('> li > a'); 341 } 342 } 343 344 var entries = []; 345 346 elements.each(function(idx, element) { 347 var entry = createElementFct(element, subItem); 348 entries.push(entry); 349 }); 350 351 return entries; 352 } 353 354 SVSMobileMenu.prototype.showSubMenu = function(menuItem, createElementFct, subItem) { 355 var entries = this.buildSubMenuEntries(menuItem, createElementFct, subItem); 356 357 this.containerSub.hide().html(entries); 358 this.mobileTemplate.find('.hide-level-sub').hide(); 359 this.mobileTemplate.find('.hide-level-main').fadeIn(500); 360 this.mobileTemplate.attr('class', 'level-sub'); 361 } 362 363 SVSMobileMenu.prototype.showLevel = function(item) { 364 var level = item.data('level'); 365 var subItem; 366 367 if (level > 2) { 368 subItem = item; 369 item = this.findParentItem(item, 2); 370 } 371 372 switch(item.data('level')) { 373 case 0: 374 this.showMainMenu(); 375 break; 376 case 1: 377 this.showSubMenu(item, this.createLevel2Element.bind(this)); 378 break; 379 default: 380 this.showSubMenu(item, this.createLevel3Element.bind(this), subItem); 381 break; 382 } 383 } 384 385 SVSMobileMenu.prototype.findParentItem = function(item, level) { 386 var startLevel = parseInt(item.data('level')) - 1; 387 388 for(i=startLevel; i >= level; i--) { 389 item = item.closest(".sub-menu").prev("a[data-level='" + i + "']"); 390 } 391 392 return item; 393 } 394 395 SVSMobileMenu.prototype.createLevel2Element = function(element) { 396 var entry = this.menuEntry2Template.clone(); 397 entry.removeClass('nav-mobile__template'); 398 entry.attr('data-menu-item-id', $(element).data('menuItemId')); 399 entry.attr('href', $(element).attr('href')); 400 entry.find('.nav-mobile__menu-entry-text').text($(element).text()); 401 return entry; 402 } 403 404 SVSMobileMenu.prototype.createLevel3Element = function(menuItemLink, subItem, showSubMenu) { 405 var entry = this.menuEntry3Template.clone(); 406 entry.removeClass('nav-mobile__template'); 407 var dowpdownHeaderLink = entry.find('.nav-mobile__menu-entry-dropdown-header a'); 408 409 dowpdownHeaderLink.attr('data-menu-item-id', $(menuItemLink).data('menuItemId')); 410 dowpdownHeaderLink.attr('href', $(menuItemLink).attr('href')); 411 dowpdownHeaderLink.text($(menuItemLink).text()); 412 413 subMenuEntries = $(menuItemLink).next('.sub-menu').find('> li > a').clone(); 414 415 // setup for toggle 416 if (subMenuEntries.length > 0) { 417 subMenuEntries.addClass('nav-mobile__submenu-entry'); 418 419 var subMenuContainer = entry.find('.nav-mobile__submenu'); 420 var uniqueId = this.generateUniqueID(); 421 subMenuContainer.html(subMenuEntries);
422 subMenuContainerId = 'sub-menu-' + uniqueId; 423 entry.find('[data-toggle]').attr('data-target', "#" + subMenuContainerId); 424 subMenuContainer.attr('id', subMenuContainerId); 425 426 if (subItem) { 427 showSubMenu = jQuery.grep(subMenuEntries, function(entry) { 428 return $(entry).data('menuItemId') == subItem.data('menuItemId'); 429 }).length > 0; 430 } 431 432 if(typeof showSubMenu !== 'undefined' && showSubMenu) { 433 entry.find("[data-dropdown-icon='close']").show(); 434 entry.find("[data-dropdown-icon='open']").hide(); 435 subMenuContainer.show(); 436 } else { 437 entry.find("[data-dropdown-icon='close']").hide(); 438 entry.find("[data-dropdown-icon='open']").show(); 439 subMenuContainer.hide(); 440 } 441 } else { 442 entry.find("[data-dropdown-icon]").hide(); 443 } 444 445 return entry; 446 } 447 448 SVSMobileMenu.prototype.findSubMenuEntries = function(menuEntry) { 449 return $(menuEntry).next('.sub-menu').find('> li > a[data-level]'); 450 } 451 452 SVSMobileMenu.prototype.generateUniqueID = function() { 453 return '_' + Math.random().toString(36).substr(2, 9); 454 } 455 456 // TODO: remove this line if svs menu template removed from Velocity template svs_sub 457 $('#nav-mobile-template').remove(); 458 459 var menuWrapper = $("#esv-navigation > nav").first(); 460 if (menuWrapper.length == 0) { 461 menuWrapper = $("nav.main"); 462 } 463 464 if (menuWrapper.length == 1) { 465 var svsMobileMenu = new SVSMobileMenu(menuWrapper, $('body').hasClass('esv-application')); 466 svsMobileMenu.init(); 467 } 468 }); 469})(ESV.jQuery);
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.