1 2;(function ( $, window, document, undefined ){ 3 4 $.navigation = function(element, options){ 5 6 var defaults = { 7 responsive: true, 8 mobileBreakpoint: 767, 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 console.log('resize + refresh '+$(parentItem).children('.megamenu-panel').css('display')); 179 $(parentItem).children('.megamenu-panel').css('display', 'block'); 180 $('.mediaBoxes').mediaBoxes( 'resize' ); 181 $(window).trigger('resize'); 182 */ 183 }; 184 185 // hide a submenu 186 plugin.hideSubmenu = function(parentItem, submenuEffect){ 187 if(submenuEffect == "fade"){ 188 $(parentItem).find(".nav-submenu") 189 .stop(true, true) 190 .delay(plugin.settings.hideDelayDuration) 191 .fadeOut(plugin.settings.hideDuration) 192 .removeClass(plugin.settings.animationOnShow) 193 .addClass(plugin.settings.animationOnHide); 194 } 195 else{ 196 $(parentItem).find(".nav-submenu") 197 .stop(true, true) 198 .delay(plugin.settings.hideDelayDuration) 199 .slideUp(plugin.settings.hideDuration) 200 .removeClass(plugin.settings.animationOnShow) 201 .addClass(plugin.settings.animationOnHide); 202 } 203 $(parentItem).removeClass("focus").find(".focus").removeClass("focus"); 204 }; 205 206 // show the overlay panel 207 var showOverlay = function(){ 208 if(plugin.settings.hideScrollBar){ 209 $("body").addClass("no-scroll"); 210 } 211 if(plugin.settings.overlay){ 212 $(element).find(".nav-overlay-panel") 213 .css("background-color", plugin.settings.overlayColor) 214 .fadeIn(300) 215 .on("click touchstart", function(){ 216 plugin.hideOffcanvas(); 217 }); 218 } 219 }; 220 221 // hide the overlay panel 222 var hideOverlay = function(){ 223 if(plugin.settings.hideScrollBar){ 224 $("body").removeClass("no-scroll"); 225 } 226 if(plugin.settings.overlay){ 227 $(element).find(".nav-overlay-panel").fadeOut(400); 228 } 229 }; 230 231 // show offcanvas 232 plugin.showOffcanvas = function(){ 233 showOverlay(); 234 if(plugin.settings.offCanvasSide == "left"){ 235 $(element).find(".nav-menus-wrapper").css("transition-property", "left").addClass("nav-menus-wrapper-open"); 236 } 237 else{ 238 $(element).find(".nav-menus-wrapper").css("transition-property", "right").addClass("nav-menus-wrapper-open"); 239 } 240 }; 241 242 // hide offcanvas 243 plugin.hideOffcanvas = function(){ 244 $(element).find(".nav-menus-wrapper").removeClass("nav-menus-wrapper-open") 245 .on("webkitTransitionEnd moztransitionend transitionend oTransitionEnd", function(){ 246 $(element).find(".nav-menus-wrapper") 247 .css("transition-property", "none") 248 .off(); 249 }); 250 hideOverlay(); 251 }; 252 253 // toggle offcanvas 254 plugin.toggleOffcanvas = function(){ 255 if(windowWidth() <= plugin.settings.mobileBreakpoint){ 256 if($(element).find(".nav-menus-wrapper").hasClass("nav-menus-wrapper-open")){ 257 plugin.hideOffcanvas(); 258 if(options !== undefined){ 259 plugin.callback("onHideOffCanvas"); 260 } 261 } 262 else{ 263 plugin.showOffcanvas(); 264 if(options !== undefined){ 265 plugin.callback("onShowOffCanvas"); 266 } 267 } 268 } 269 }; 270 271 // show/hide the search form 272 plugin.toggleSearch = function(){ 273 if($(element).find(".nav-search").find("form").css("display") == "none"){ 274 $(element).find(".nav-search").find("form").fadeIn(200); 275 $(element).find(".nav-search").find("input").focus(); 276 } 277 else{ 278 $(element).find(".nav-search").find("form").fadeOut(200); 279 $(element).find(".nav-search").find("input").blur(); 280 } 281 }; 282 283 // set the navigation mode and others configs 284 plugin.initNavigationMode = function(screenWidth){ 285 if(plugin.settings.responsive){ 286 if(screenWidth <= plugin.settings.mobileBreakpoint && bigScreenFlag > plugin.settings.mobileBreakpoint){ 287 $(element).addClass("navigation-portrait").removeClass("navigation-landscape"); 288 portraitMode(); 289 if(options !== undefined){ 290 plugin.callback("onPortrait"); 291 } 292 } 293 if(screenWidth > plugin.settings.mobileBreakpoint && smallScreenFlag <= plugin.settings.mobileBreakpoint){ 294 $(element).addClass("navigation-landscape").removeClass("navigation-portrait"); 295 landscapeMode(); 296 hideOverlay(); 297 plugin.hideOffcanvas(); 298 if(options !== undefined){ 299 plugin.callback("onLandscape"); 300 } 301 } 302 bigScreenFlag = screenWidth; 303 smallScreenFlag = screenWidth; 304 } 305 else{ 306 $(element).addClass("navigation-landscape"); 307 landscapeMode(); 308 if(options !== undefined){ 309 plugin.callback("onLandscape"); 310 } 311 } 312 }; 313 314 // hide submenus/form when click/touch outside 315 var goOut = function(){ 316 $("html").on("click.body touchstart.body", function(e){
317 if($(e.target).closest(".navigation").length === 0){ 318 $(element).find(".nav-submenu").fadeOut(); 319 $(element).find(".focus").removeClass("focus"); 320 $(element).find(".nav-search").find("form").fadeOut(); 321 } 322 }); 323 }; 324 325 // return the window's width 326 var windowWidth = function(){ 327 return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 328 }; 329 330 // unbind events 331 var unbindEvents = function(mode){ 332 if(mode == "landscape") 333 $(element).find(".nav-menu").find("li, a").off(clickTouchEvents) 334 else 335 $(element).find(".nav-menu").find("li, a").off(hoverShowEvents).off(hoverHideEvents); 336 }; 337 338 // fix submenu right position 339 var fixSubmenuRightPosition = function(){ 340 if(windowWidth() > plugin.settings.mobileBreakpoint){ 341 var navWidth = $(element).outerWidth(); 342 $(element).find(".nav-menu").children("li").children(".nav-submenu").each(function(){ 343 if($(this).parent().position().left + $(this).outerWidth() > navWidth){ 344 $(this).css("right", 0); 345 } 346 else{ 347 $(this).css("right", "auto"); 348 } 349 }); 350 } 351 }; 352 353 // activate the tabs 354 var activateTabs = function(){ 355 function initTabs(tabs){ 356 var navs = $(tabs).children(".megamenu-tabs-nav").children("li"); 357 var panes = $(tabs).children(".megamenu-tabs-pane"); 358 $(navs).on("mouseenter.tabs click.tabs touchstart.tabs", function(e){ 359 e.stopPropagation(); 360 e.preventDefault(); 361 $(navs).removeClass("active"); 362 $(this).addClass("active"); 363 $(panes).hide(0).removeClass("active"); 364 $(panes[$(this).index()]).show(0).addClass("active"); 365 }); 366 } 367 368 if($(element).find(".megamenu-tabs").length > 0){ 369 var navigationTabs = $(element).find(".megamenu-tabs"); 370 for(var i = 0; i < navigationTabs.length; i++){ 371 initTabs(navigationTabs[i]); 372 } 373 } 374 }; 375 376 // set the landscape mode 377 var landscapeMode = function(){ 378 unbindEvents("landscape"); 379 resetSubmenus(); 380 if(navigator.userAgent.match(/Mobi/i) || navigator.maxTouchPoints > 0 || plugin.settings.submenuTrigger == "click"){ 381 $(element).find(".nav-menu, .nav-dropdown").children("li").children("a").on(clickTouchEvents, function(e){ 382 plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect); 383 $(this).closest(".nav-menu").siblings(".nav-menu").find(".nav-submenu").fadeOut(plugin.settings.hideDuration); 384 if($(this).siblings(".nav-submenu").length > 0){ 385 e.stopPropagation(); 386 e.preventDefault(); 387 if($(this).siblings(".nav-submenu").css("display") == "none"){ 388 plugin.showSubmenu($(this).parent("li"), plugin.settings.effect); 389 fixSubmenuRightPosition(); 390 if(windowWidth() > plugin.settings.mobileBreakpoint){ 391 //console.log('resize + refresh 390'); 392 $(this).parent("li").children('.megamenu-panel').css('display', 'block'); 393 $(this).parent("li").addClass("focus"); 394 $('.mediaBoxes').mediaBoxes( 'resize' ); 395 $(window).trigger('resize'); 396 } 397 return false; 398 } 399 else{ 400 plugin.hideSubmenu($(this).parent("li"), plugin.settings.effect); 401 } 402 if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){ 403 window.open($(this).attr("href")); 404 } 405 else{ 406 if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){ 407 return false;
408 } 409 else{ 410 window.location.href = $(this).attr("href"); 411 } 412 } 413 } 414 }); 415 } 416 else{ 417 $(element).find(".nav-menu").find("li").on(hoverShowEvents, function(){ 418 plugin.showSubmenu(this, plugin.settings.effect); 419 $(this).children('.megamenu-panel').css('display', 'block'); 420 $('.mediaBoxes').mediaBoxes( 'resize' ); 421 $(window).trigger('resize'); 422 fixSubmenuRightPosition(); 423 }).on(hoverHideEvents, function(){ 424 plugin.hideSubmenu(this, plugin.settings.effect); 425 }); 426 } 427 if(plugin.settings.hideSubWhenGoOut){ 428 goOut(); 429 } 430 }; 431 432 // set the portrait mode 433 var portraitMode = function(){ 434 unbindEvents("portrait"); 435 resetSubmenus(); 436 if(plugin.settings.visibleSubmenusOnMobile){ 437 $(element).find(".nav-submenu").show(0); 438 } 439 else{ 440 $(element).find(".submenu-indicator").removeClass("submenu-indicator-up"); 441 if(plugin.settings.submenuIndicator && plugin.settings.submenuIndicatorTrigger){ 442 $(element).find(".submenu-indicator").on(clickTouchEvents, function(e){ 443 e.stopPropagation(); 444 e.preventDefault(); 445 plugin.hideSubmenu($(this).parent("a").parent("li").siblings("li"), "slide"); 446 plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide"); 447 if($(this).parent("a").siblings(".nav-submenu").css("display") == "none"){ 448 $(this).addClass("submenu-indicator-up"); 449 $(this).parent("a").parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 450 $(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up"); 451 plugin.showSubmenu($(this).parent("a").parent("li"), "slide"); 452 //console.log('resize + refresh 442'); 453 $(this).parent("li").children('.megamenu-panel').css('display', 'block'); 454 $('.mediaBoxes').mediaBoxes( 'resize' ); 455 $(window).trigger('resize'); 456 return false; 457 } 458 else{ 459 $(this).parent("a").parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 460 plugin.hideSubmenu($(this).parent("a").parent("li"), "slide"); 461 } 462 }); 463 } 464 else{ 465 $(element).find(".nav-menu, .nav-dropdown").children("li").children("a").each(function(){ 466 if($(this).siblings(".nav-submenu").length > 0){ 467 $(this).on(clickTouchEvents, function(e){ 468 //console.log('navigation.js'); 469 e.stopPropagation(); 470 e.preventDefault(); 471 plugin.hideSubmenu($(this).parent("li").siblings("li"), plugin.settings.effect); 472 plugin.hideSubmenu($(this).closest(".nav-menu").siblings(".nav-menu").children("li"), "slide"); 473 if($(this).siblings(".nav-submenu").css("display") == "none"){ 474 $(this).children(".submenu-indicator").addClass("submenu-indicator-up"); 475 $(this).parent("li").siblings("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 476 $(this).closest(".nav-menu").siblings(".nav-menu").find(".submenu-indicator").removeClass("submenu-indicator-up"); 477 plugin.showSubmenu($(this).parent("li"), "slide"); 478 479 //console.log('resize + refresh 469'); 480 $(this).parent("li").children('.megamenu-panel').css('display', 'block'); 481 $('.mediaBoxes').mediaBoxes( 'resize' ); 482 $(window).trigger('resize'); 483 484 return false; 485 } 486 else{ 487 $(this).parent("li").find(".submenu-indicator").removeClass("submenu-indicator-up"); 488 plugin.hideSubmenu($(this).parent("li"), "slide"); 489 } 490 if($(this).attr("target") === "_blank" || $(this).attr("target") === "blank"){ 491 window.open($(this).attr("href")); 492 } 493 else{ 494 if($(this).attr("href") === "#" || $(this).attr("href") === "" || $(this).attr("href") === "javascript:void(0)"){ 495 return false;
496 } 497 else{ 498 window.location.href = $(this).attr("href"); 499 } 500 } 501 }); 502 } 503 }); 504 } 505 } 506 }; 507 508 plugin.callback = function(func) { 509 if (options[func] !== undefined) { 510 options[func].call(element); 511 } 512 }; 513 514 plugin.init(); 515 516 }; 517 518 $.fn.navigation = function(options){ 519 return this.each(function(){ 520 if (undefined === $(this).data("navigation")){ 521 var plugin = new $.navigation(this, options); 522 $(this).data("navigation", plugin); 523 } 524 }); 525 }; 526 527})( 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.