1 2;(function ( $, window, document, undefined ){ 3 4 $.navigation = function(element, options){ 5 6 var defaults = { 7 responsive: true, 8 mobileBreakpoint: 1000, 9 showDuration: 300, 10 hideDuration: 300, 11 showDelayDuration: 0, 12 hideDelayDuration: 0, 13 submenuTrigger: "hover", 14 effect: "fade", 15 submenuIndicator: true, 16 submenuIndicatorTrigger: false, 17 hideSubWhenGoOut: true, 18 visibleSubmenusOnMobile: false, 19 overlay: true, 20 overlayColor: "rgba(0, 0, 0, 0.7)", 21 hidden: false, 22 hiddenOnMobile: false, 23 offCanvasSide: "left", 24 offCanvasCloseButton: true, 25 animationOnShow: "", 26 animationOnHide: "", 27 hideScrollBar: true, 28 onInit: function() {}, 29 onLandscape: function() {}, 30 onPortrait: function() {}, 31 onShowOffCanvas: function() {}, 32 onHideOffCanvas: function() {} 33 }; 34 35 var plugin = this, 36 bigScreenFlag = Number.MAX_VALUE, 37 smallScreenFlag = 1, 38 clickTouchEvents = "click.nav touchstart.nav", 39 hoverShowEvents = "mouseenter focusin", 40 hoverHideEvents = "mouseleave focusout"; 41 plugin.settings = {}; 42 var $element = $(element), element = element; 43 44 if($(element).find(".nav-search").length > 0){ 45 $(element).find(".nav-search").find("form").prepend("<span class='nav-search-close-button' tabindex='0'>✕</span>"); 46 } 47 48 plugin.init = function(){ 49 plugin.settings = $.extend({}, defaults, options); 50 51 if(plugin.settings.offCanvasCloseButton){ 52 $(element).find(".nav-menus-wrapper").prepend("<span class='nav-menus-wrapper-close-button'>✕</span>"); 53 } 54 55 if(plugin.settings.offCanvasSide == "right"){ 56 $(element).find(".nav-menus-wrapper").addClass("nav-menus-wrapper-right"); 57 } 58 59 if(plugin.settings.hidden){ 60 $(element).addClass("navigation-hidden"); 61 plugin.settings.mobileBreakpoint = 99999; 62 } 63 64 checkSubmenus(); 65 66 $(element).find(".nav-toggle").on("click touchstart", function(e){ 67 e.stopPropagation(); 68 e.preventDefault(); 69 plugin.showOffcanvas(); 70 if(options !== undefined){ 71 plugin.callback("onShowOffCanvas"); 72 } 73 }); 74 75 $(element).find(".nav-menus-wrapper-close-button").on("click touchstart", function(){ 76 plugin.hideOffcanvas(); 77 if(options !== undefined){ 78 plugin.callback("onHideOffCanvas"); 79 } 80 }); 81 82 $(element).find(".nav-search-button, .nav-search-close-button").on("click touchstart keydown", function(e){ 83 e.stopPropagation(); 84 e.preventDefault(); 85 var code = e.keyCode || e.which; 86 if(e.type === "click" || e.type === "touchstart" || (e.type === "keydown" && code == 13)){ 87 plugin.toggleSearch(); 88 } 89 else{ 90 if(code == 9){ 91 $(e.target).blur(); 92 } 93 } 94 }); 95 96 $(window).resize(function(){ 97 plugin.initNavigationMode(windowWidth()); 98 fixSubmenuRightPosition(); 99 if(plugin.settings.hiddenOnMobile){ 100 hideNavbarPortrait(); 101 } 102 }); 103 104 plugin.initNavigationMode(windowWidth()); 105 106 if(plugin.settings.hiddenOnMobile){ 107 hideNavbarPortrait(); 108 } 109 110 if(plugin.settings.overlay){ 111 $(element).append("<div class='nav-overlay-panel'></div>"); 112 } 113 114 if($(element).find(".megamenu-tabs").length > 0){ 115 activateTabs(); 116 } 117 118 if(options !== undefined){ 119 plugin.callback("onInit"); 120 } 121 }; 122 123 // reset submenus 124 var resetSubmenus = function(){ 125 $(element).find(".nav-submenu").hide(0); 126 $(element).find("li").removeClass("focus"); 127 }; 128
129 // check the existence of submenus/add indicators to them 130 var checkSubmenus = function(){ 131 $(element).find("li").each(function(){ 132 if($(this).children(".nav-dropdown,.megamenu-panel").length > 0){ 133 $(this).children(".nav-dropdown,.megamenu-panel").addClass("nav-submenu"); 134 if(plugin.settings.submenuIndicator){ 135 $(this).children("a").append( 136 "<span class='submenu-indicator'>" + 137 "<span class='submenu-indicator-chevron'></span>" + 138 "</span>" 139 ); 140 } 141 } 142 }); 143 }; 144 145 //hide navbar on portrait mode 146 var hideNavbarPortrait = function(){ 147 if($(element).hasClass("navigation-portrait")){ 148 $(element).addClass("navigation-hidden"); 149 } 150 else{ 151 $(element).removeClass("navigation-hidden"); 152 } 153 }; 154 155 // show a submenu 156 plugin.showSubmenu = function(parentItem, submenuEffect){ 157 if(windowWidth() > plugin.settings.mobileBreakpoint){ 158 $(element).find(".nav-search").find("form").fadeOut(); 159 } 160 if(submenuEffect == "fade"){ 161 $(parentItem).children(".nav-submenu") 162 .stop(true, true) 163 .delay(plugin.settings.showDelayDuration) 164 .fadeIn(plugin.settings.showDuration) 165 .removeClass(plugin.settings.animationOnHide) 166 .addClass(plugin.settings.animationOnShow); 167 } 168 else{ 169 $(parentItem).children(".nav-submenu") 170 .stop(true, true) 171 .delay(plugin.settings.showDelayDuration) 172 .slideDown(plugin.settings.showDuration) 173 .removeClass(plugin.settings.animationOnHide) 174 .addClass(plugin.settings.animationOnShow); 175 } 176 $(parentItem).addClass("focus"); 177 }; 178 179 // hide a submenu 180 plugin.hideSubmenu = function(parentItem, submenuEffect){ 181 if(submenuEffect == "fade"){ 182 $(parentItem).find(".nav-submenu") 183 .stop(true, true) 184 .delay(plugin.settings.hideDelayDuration) 185 .fadeOut(plugin.settings.hideDuration) 186 .removeClass(plugin.settings.animationOnShow) 187 .addClass(plugin.settings.animationOnHide); 188 } 189 else{ 190 $(parentItem).find(".nav-submenu") 191 .stop(true, true) 192 .delay(plugin.settings.hideDelayDuration) 193 .slideUp(plugin.settings.hideDuration) 194 .removeClass(plugin.settings.animationOnShow) 195 .addClass(plugin.settings.animationOnHide); 196 } 197 $(parentItem).removeClass("focus").find(".focus").removeClass("focus"); 198 }; 199 200 // show the overlay panel 201 var showOverlay = function(){ 202 if(plugin.settings.hideScrollBar){ 203 $("body").addClass("no-scroll"); 204 } 205 if(plugin.settings.overlay){ 206 $(element).find(".nav-overlay-panel") 207 .css("background-color", plugin.settings.overlayColor) 208 .fadeIn(300) 209 .on("click touchstart", function(){ 210 plugin.hideOffcanvas(); 211 }); 212 } 213 }; 214 215 // hide the overlay panel 216 var hideOverlay = function(){ 217 if(plugin.settings.hideScrollBar){ 218 $("body").removeClass("no-scroll"); 219 } 220 if(plugin.settings.overlay){ 221 $(element).find(".nav-overlay-panel").fadeOut(400); 222 } 223 }; 224 225 // show offcanvas 226 plugin.showOffcanvas = function(){ 227 showOverlay(); 228 if(plugin.settings.offCanvasSide == "left"){ 229 $(element).find(".nav-menus-wrapper").css("transition-property", "left").addClass("nav-menus-wrapper-open"); 230 } 231 else{ 232 $(element).find(".nav-menus-wrapper").css("transition-property", "right").addClass("nav-menus-wrapper-open"); 233 } 234 }; 235 236 // hide offcanvas 237 plugin.hideOffcanvas = function(){ 238 $(element).find(".nav-menus-wrapper").removeClass("nav-menus-wrapper-open") 239 .on("webkitTransitionEnd moztransitionend transitionend oTransitionEnd", function(){ 240 $(element).find(".nav-menus-wrapper") 241 .css("transition-property", "none") 242 .off(); 243 }); 244 hideOverlay(); 245 }; 246 247 // toggle offcanvas 248 plugin.toggleOffcanvas = function(){ 249 if(windowWidth() <= plugin.settings.mobileBreakpoint){ 250 if($(element).find(".nav-menus-wrapper").hasClass("nav-menus-wrapper-open")){ 251 plugin.hideOffcanvas(); 252 if(options !== undefined){ 253 plugin.callback("onHideOffCanvas"); 254 } 255 } 256 else{ 257 plugin.showOffcanvas(); 258 if(options !== undefined){ 259 plugin.callback("onShowOffCanvas"); 260 } 261 } 262 } 263 }; 264 265 // show/hide the search form 266 plugin.toggleSearch = function(){ 267 if($(element).find(".nav-search").find("form").css("display") == "none"){ 268 $(element).find(".nav-search").find("form").fadeIn(200); 269 $(element).find(".nav-search").find("input").focus(); 270 } 271 else{ 272 $(element).find(".nav-search").find("form").fadeOut(200); 273 $(element).find(".nav-search").find("input").blur(); 274 } 275 }; 276 277 // set the navigation mode and others configs 278 plugin.initNavigationMode = function(screenWidth){ 279 if(plugin.settings.responsive){ 280 if(screenWidth <= plugin.settings.mobileBreakpoint && bigScreenFlag > plugin.settings.mobileBreakpoint){ 281 $(element).addClass("navigation-portrait").removeClass("navigation-landscape"); 282 portraitMode(); 283 if(options !== undefined){ 284 plugin.callback("onPortrait"); 285 } 286 } 287 if(screenWidth > plugin.settings.mobileBreakpoint && smallScreenFlag <= plugin.settings.mobileBreakpoint){ 288 $(element).addClass("navigation-landscape").removeClass("navigation-portrait"); 289 landscapeMode(); 290 hideOverlay(); 291 plugin.hideOffcanvas(); 292 if(options !== undefined){ 293 plugin.callback("onLandscape"); 294 } 295 } 296 bigScreenFlag = screenWidth; 297 smallScreenFlag = screenWidth; 298 } 299 else{ 300 $(element).addClass("navigation-landscape"); 301 landscapeMode(); 302 if(options !== undefined){ 303 plugin.callback("onLandscape"); 304 } 305 } 306 }; 307 308 // hide submenus/form when click/touch outside 309 var goOut = function(){ 310 $("html").on("click.body touchstart.body", function(e){
311 if($(e.target).closest(".navigation").length === 0){ 312 $(element).find(".nav-submenu").fadeOut(); 313 $(element).find(".focus").removeClass("focus"); 314 $(element).find(".nav-search").find("form").fadeOut(); 315 } 316 }); 317 }; 318 319 // return the window's width 320 var windowWidth = function(){ 321 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 322 }; 323 324 // unbind events 325 var unbindEvents = function(mode){ 326 if(mode == "landscape") 327 $(element).find(".nav-menu").find("li, a").off(clickTouchEvents) 328 else 329 $(element).find(".nav-menu").find("li, a").off(hoverShowEvents).off(hoverHideEvents); 330 }; 331 332 // fix submenu right position 333 var fixSubmenuRightPosition = function(){ 334 if(windowWidth() > plugin.settings.mobileBreakpoint){ 335 var navWidth = $(element).outerWidth(); 336 $(element).find(".nav-menu").children("li").children(".nav-submenu").each(function(){ 337 if($(this).parent().position().left + $(this).outerWidth() > navWidth){ 338 $(this).css("right", 0); 339 } 340 else{ 341 $(this).css("right", "auto"); 342 } 343 }); 344 } 345 }; 346 347 // activate the tabs 348 var activateTabs = function(){ 349 function initTabs(tabs){ 350 var navs = $(tabs).children(".megamenu-tabs-nav").children("li"); 351 var panes = $(tabs).children(".megamenu-tabs-pane"); 352 $(navs).on("mouseenter.tabs click.tabs touchstart.tabs", function(e){ 353 e.stopPropagation(); 354 e.preventDefault(); 355 $(navs).removeClass("active"); 356 $(this).addClass("active"); 357 $(panes).hide(0).removeClass("active"); 358 $(panes[$(this).index()]).show(0).addClass("active"); 359 }); 360 } 361 362 if($(element).find(".megamenu-tabs").length > 0){ 363 var navigationTabs = $(element).find(".megamenu-tabs"); 364 for(var i = 0; i < navigationTabs.length; i++){ 365 initTabs(navigationTabs[i]); 366 } 367 } 368 }; 369 370 // set the landscape mode 371 var landscapeMode = function(){ 372 unbindEvents("landscape"); 373 resetSubmenus(); 374 if(navigator.userAgent.match(/Mobi/i) || navigator.maxTouchPoints > 0 || plugin.settings.submenuTrigger == "click"){ 375 $(element).find(".nav-menu, .nav-dropdown").children("li").children("a").on(clickTouchEvents, function(e){ 376 plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect); 377 $(this).closest(".nav-menu").siblings(".nav-menu").find(".nav-submenu").fadeOut(plugin.settings.hideDuration); 378 if($(this).siblings(".nav-submenu").length > 0){ 379 e.stopPropagation(); 380 e.preventDefault(); 381 if($(this).siblings(".nav-submenu").css("display") == "none"){ 382 plugin.showSubmenu($(this).parent("li"), plugin.settings.effect); 383 fixSubmenuRightPosition(); 384 return false; 385 } 386 else{ 387 plugin.hideSubmenu($(this).parent("li"), plugin.settings.effect); 388 } 389 if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){ 390 window.open($(this).attr("href")); 391 } 392 else{ 393 if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){ 394 return false; 395 } 396 else{ 397 window.location.href = $(this).attr("href"); 398 } 399 } 400 } 401 }); 402 } 403 else{ 404 $(element).find(".nav-menu").find("li").on(hoverShowEvents, function(){ 405 plugin.showSubmenu(this, plugin.settings.effect); 406 fixSubmenuRightPosition(); 407 }).on(hoverHideEvents, function(){ 408 plugin.hideSubmenu(this, plugin.settings.effect); 409 }); 410 } 411 if(plugin.settings.hideSubWhenGoOut){ 412 goOut(); 413 } 414 }; 415 416 // set the portrait mode 417 var portraitMode = function(){ 418 unbindEvents("portrait"); 419 resetSubmenus(); 420 if(plugin.settings.visibleSubmenusOnMobile){ 421 $(element).find(".nav-submenu").show(0); 422 } 423 else{ 424 $(element).find(".submenu-indicator").removeClass("submenu-indicator-up"); 425 if(plugin.settings.submenuIndicator && plugin.settings.submenuIndicatorTrigger){ 426 $(element).find(".submenu-indicator").on(clickTouchEvents, function(e){ 427 e.stopPropagation(); 428 e.preventDefault(); 429 plugin.hideSubmenu($(this).parent("a").parent("li").siblings("li"), "slide");
430 plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide"); 431 if($(this).parent("a").siblings(".nav-submenu").css("display") == "none"){ 432 $(this).addClass("submenu-indicator-up"); 433 $(this).parent("a").parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 434 $(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up"); 435 plugin.showSubmenu($(this).parent("a").parent("li"), "slide"); 436 return false; 437 } 438 else{ 439 $(this).parent("a").parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 440 plugin.hideSubmenu($(this).parent("a").parent("li"), "slide"); 441 } 442 }); 443 } 444 else{ 445 $(element).find(".nav-menu, .nav-dropdown").children("li").children("a").each(function(){ 446 if($(this).siblings(".nav-submenu").length > 0){ 447 $(this).on(clickTouchEvents, function(e){ 448 e.stopPropagation(); 449 e.preventDefault(); 450 plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect); 451 plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide"); 452 if($(this).siblings(".nav-submenu").css("display") == "none"){ 453 $(this).children(".submenu-indicator").addClass("submenu-indicator-up"); 454 $(this).parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 455 $(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up"); 456 plugin.showSubmenu($(this).parent("li"), "slide"); 457 return false; 458 } 459 else{ 460 $(this).parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 461 plugin.hideSubmenu($(this).parent("li"), "slide"); 462 } 463 if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){ 464 window.open($(this).attr("href")); 465 } 466 else{ 467 if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){ 468 return false; 469 } 470 else{ 471 window.location.href = $(this).attr("href"); 472 } 473 } 474 }); 475 } 476 }); 477 } 478 } 479 }; 480 481 plugin.callback = function(func) { 482 if (options[func] !== undefined) { 483 options[func].call(element); 484 } 485 }; 486 487 plugin.init(); 488 489 }; 490 491 $.fn.navigation = function(options){ 492 return this.each(function(){ 493 if (undefined === $(this).data("navigation")){ 494 var plugin = new $.navigation(this, options); 495 $(this).data("navigation", plugin); 496 } 497 }); 498 }; 499 500})( jQuery, window, document );
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.