1/* 2 * jQuery FatMenu v0.9.6 3 * 4 * Copyright (c) 2016 Christophe Béghin - Inovagora 5 * 6 * Licensed under MIT 7 * 8 */ 9 10(function ($, window, document) { 11 'use strict'; 12 13 var animationend = 'animationend webkitAnimationEnd MSAnimationEnd oAnimationEnd', 14 transitionend = 'transitionend webkitTransitionEnd MSTransitionEnd oTransitionEnd', 15 16 debounce = function(callback, delay){ 17 var timer; 18 return function(){ 19 var args = arguments; 20 var context = this; 21 clearTimeout(timer); 22 timer = setTimeout(function(){ 23 callback.apply(context, args); 24 }, delay); 25 }; 26 }, 27 28 throttle = function(callback, delay) { 29 var last; 30 var timer; 31 return function () { 32 var context = this; 33 var now = +new Date(); 34 var args = arguments; 35 if (last && now < last + delay) { 36 // le délai n'est pas écoulé on reset le timer 37 clearTimeout(timer); 38 timer = setTimeout(function () { 39 last = now; 40 callback.apply(context, args); 41 }, delay); 42 } else { 43 last = now; 44 callback.apply(context, args); 45 } 46 }; 47 }, 48 49 FatMenu = { 50 init : function (options, el) { 51 var FM = this; 52 53 FM.$elem = $(el); 54 55 FM.options = $.extend({}, $.fn.FatMenu.options, FM.$elem.data(), options); 56 FM.userOptions = options; 57 58 FM.classes = { 59 group : 'fm-group', 60 layer : 'fm-layer', 61 breadcrumb : 'fm-breadcrumb', 62 overlay : 'fm-overlay', 63 trigger : 'fm-trigger', 64 triggerMain : 'fm-main-trigger', 65 triggerSearch : 'fm-search-trigger', 66 backButton : 'fm-back-button', 67 68 isMobile : 'fm-is-mobile', 69 isAnimate : 'fm-is-animate', 70 isOpen : 'fm-is-open', 71 isVisible : 'fm-is-visible', 72 isHidden : 'fm-is-hidden' 73 }; 74 75 FM.elems = { 76 wrapper : '.fm-wrapper', 77 breadcrumbList : '.fm-breadcrumb ul', 78 }; 79 80 FM.$breadcrumb = FM.$elem.find(FM.options.breadcrumbContainer); 81 FM.$wrapper = FM.$elem.find(FM.options.wrapperContainer); 82 FM.$body = $('body'); 83 84 FM.fullscreenMode = false; 85 FM.mobileMode = false; 86 FM.supportCssAnimation = true; 87 88 // Define id search layer 89 FM.options.searchLayer = FM.$elem.find('.' + FM.options.triggerSearchClass).attr('href'); 90 91 if (!FM.detectCSSFeature('animation')) { 92 FM.supportCssAnimation = false; 93 } 94 95 FM.onStartup(); 96 }, 97 98 onStartup : function () { 99 var FM = this; 100 FM.browserCheckCapability(); 101 FM.mobileInit(); 102 103 FM.triggerInit(); 104 FM.triggerListener(); 105 106 if (FM.options.fullscreen) { 107 FM.fullscreenMode = true; 108 } else { 109 FM.fullscreenMode = false; 110 } 111 if (FM.options.overlay && !FM.fullscreenMode) { 112 FM.overlayInit(); 113 } 114 115 FM.optionsInit(); 116 FM.mobileCheck(); 117 FM.layerInit(); 118 FM.screenHeightCheck(); 119 FM.resizeEvent(); 120 FM.scrollEvent(); 121 }, 122 123 scrollEvent : function () { 124 var FM = this; 125 126 $(window).on('scroll', debounce(function(event){ 127 FM.screenHeightCheck(); 128 }, 300)); 129 }, 130 131 resizeEvent : function () { 132 var FM = this; 133 134 var width = window.innerWidth, 135 height = window.innerHeight; 136 137 $(window).on('resize', debounce(function(event){ 138 var $window = $(window); 139 140 if ( window.innerWidth == width && window.innerHeight == height ) return; 141 142 FM.screenHeightCheck(); 143 144 if ( window.innerWidth == width ) return; 145 width = window.innerWidth; 146 147 // Si un panel est ouvert, on reset tout 148 if ( FM.$elem.find('.' + FM.options.visibleClass).length > 0 ) { 149 FM.hidePanel(FM.$elem.find('.' + FM.options.visibleClass), 'slideUp', true); 150 FM.breadcrumbReset(); 151 FM.overlayHide(); 152 FM.$elem.find('.fm-is-active').removeClass('fm-is-active'); 153 } 154 155 // FM.overlayResize(); 156 FM.mobileCheck(); 157 158 FM.$elem.find('.fm-layer').removeAttr('data-height'); 159 160 161 }, 300)); 162 }, 163 164 browserCheckCapability : function () { 165 if (!String.prototype.trim) { 166 String.prototype.trim = function () { 167 return this.replace(/^\s+|\s+$/g, ''); 168 }; 169 } 170 }, 171 172 detectCSSFeature : function (featurename){ 173 var feature = false, 174 domPrefixes = 'Webkit Moz ms O'.split(' '), 175 elm = document.createElement('div'), 176 featurenameCapital = null; 177 178 featurename = featurename.toLowerCase(); 179 180 if( elm.style[featurename] !== undefined ) { feature = true; } 181 182 if( feature === false ) { 183 featurenameCapital = featurename.charAt(0).toUpperCase() + featurename.substr(1); 184 for( var i = 0; i < domPrefixes.length; i++ ) { 185 if( elm.style[domPrefixes[i] + featurenameCapital ] !== undefined ) { 186 feature = true; 187 break; 188 } 189 } 190 } 191 return feature; 192 }, 193 194 mobileCheck : function () { 195 var FM = this; 196 197 if ( window.innerWidth < FM.options.mobileBreakpoint ) { 198 FM.$elem.addClass(FM.options.mobileClass); 199 FM.mobileMode = true; 200 FM.$body.addClass('fm-mobile-mode'); 201 202 FM.fullscreenMode = false;
203 FM.$elem.removeClass('fm-is-fullscreen'); 204 } else { 205 FM.$elem.removeClass(FM.options.mobileClass); 206 FM.mobileMode = false; 207 FM.$body.removeClass('fm-mobile-mode'); 208 if (FM.options.fullscreen) { 209 FM.fullscreenMode = true; 210 FM.$elem.addClass('fm-is-fullscreen'); 211 } 212 } 213 }, 214 215 mobileInit : function () { 216 var FM = this, 217 mainGroupElem = FM.$elem.find('.navbar-nav').find('li').clone(), 218 mainNavDom = '<div class="fm-group">' + 219 '<div id="layer-main" class="fm-layer">' + 220 '<div class="container"><ul class="fm-textlines"></ul></div>' + 221 '</div>' + 222 '</div>'; 223 224 // On ajoute le nouveau premier niveau de menu dans le wrapper 225 FM.$wrapper.prepend(mainNavDom); 226 227 // On ajoute ce dernier dans une nouvelle variable 228 var $layerMain = $('#layer-main'); 229 230 // On ajoute les classes necessaires pour le style 231 $layerMain.find('ul').html(mainGroupElem).find('a').addClass('fm-textline ' + FM.options.triggerMainClass).wrapInner('<div class="fm-textline-title"></div>'); 232 233 234 FM.$elem.find('.fm-navbar-toggler, .fm-search-toggler').removeAttr('data-toggle data-target').on('click', function(event) { 235 event.preventDefault(); 236 237 var $visibleLayer = FM.$wrapper.find('.' + FM.options.visibleClass); 238 239 if ($(this).hasClass('fm-search-toggler')) { 240 if ($visibleLayer.length > 0 && $visibleLayer.attr('id') == 'layer-search-engine') { 241 FM.hidePanel($visibleLayer, 'slideUp', true); 242 FM.overlayHide(); 243 return false; 244 } else if ($visibleLayer.length > 0 && $visibleLayer.attr('id') != 'layer-search-engine') { 245 FM.hidePanel($visibleLayer, 'slideUp', false); 246 FM.showPanel($('#layer-search-engine'), 'slideDown'); 247 return false; 248 } else { 249 FM.showPanel($('#layer-search-engine'), 'slideDown'); 250 FM.overlayShow(); 251 return false; 252 } 253 } else { 254 if ($visibleLayer.length > 0) { 255 // if ($visibleLayer.length > 0 && $visibleLayer.attr('id') == 'layer-main') { 256 FM.hidePanel($visibleLayer, 'slideUp', true); 257 FM.overlayHide(); 258 return false; 259 // } else if ($visibleLayer.length > 0 && $visibleLayer.attr('id') != 'layer-main') { 260 // FM.hidePanel($visibleLayer, 'slideUp', false); 261 // FM.showPanel($('#layer-main'), 'slideDown'); 262 // return false; 263 } else { 264 FM.showPanel($('#layer-main'), 'slideDown'); 265 FM.overlayShow(); 266 return false; 267 } 268 } 269 270 }); 271 }, 272 273 optionsInit : function () { 274 var FM = this; 275 276 $('.' + FM.options.overlayClass).on('click', function (event) { 277 event.preventDefault(); 278 279 FM.hidePanel(FM.$wrapper.find('.' + FM.options.visibleClass), 'slideUp', true); 280 setTimeout(function() { 281 FM.breadcrumbReset(); 282 FM.$elem.find('.fm-is-active').removeClass('fm-is-active'); 283 }, FM.options.animationDuration); 284 FM.overlayHide(); 285 286 }); 287 288 if (FM.fullscreenMode && !FM.mobileMode) { 289 FM.$elem.addClass('fm-is-fullscreen'); 290 } 291 292 if (FM.options.pushOnShow) { 293 FM.$elem.addClass('fm-pushOnShow'); 294 } 295 }, 296 297 screenHeightCheck : function () { 298 var FM = this; 299 300 // if ( FM.mobileMode ) { 301 var $window = $(window), 302 windowHeight = $window.height(), 303 windowScrollTop = $window.scrollTop(), 304 offset = FM.$elem.offset(), 305 navbarHeight = FM.$elem.find('.navbar').outerHeight(), 306 maxHeight = windowHeight - ( offset.top - windowScrollTop ) - navbarHeight; 307 308 FM.$wrapper.css('max-height', maxHeight); 309 // } else { 310 // FM.$wrapper.css('max-height', 'none'); 311 // } 312 }, 313 314 overlayInit : function () { 315 var FM = this; 316 317 FM.$body.append('<div class="' + FM.options.overlayClass + '"></div>'); 318 // FM.overlayResize(); 319 }, 320 321 // overlayResize : function () { 322 // var FM = this, 323 // windowHeight = $(window).height(); 324 // $('.' + FM.options.overlayClass).css('height', windowHeight); 325 // }, 326 327 overlayShow : function () { 328 var FM = this; 329 330 $('.' + FM.options.overlayClass).css('display', 'block'); 331 }, 332 333 overlayHide : function () { 334 var FM = this; 335 336 $('.' + FM.options.overlayClass).css('display', 'none'); 337 }, 338 339 layerInit : function () { 340 var FM = this; 341 FM.$elem.find('.fm-layer').addClass(FM.options.hiddenClass); 342 }, 343 344 // Affiche le panel indiqué 345 showPanel : function ($layer, event) { 346 var FM = this; 347 //$layerGroup = $layer.closest('.' + FM.options.groupClass); 348 349 // if ($('.' + FM.options.visibleClass).length > 0) { 350 // $('.' + FM.options.visibleClass).removeClass(FM.options.visibleClass); 351 // } 352 353 if (typeof $layer.attr('data-height') == 'undefined') { 354 $layer.attr('data-height', $layer.outerHeight()); 355 } 356 var layerHeight = $layer.outerHeight(); 357 358 if (event == 'slideDown') { 359 360 // Si le navigateur supporte les animations css3 361 362 // On ajoute la classe d'ouverture sur le body 363 FM.$body.addClass(FM.options.openMenuClass); 364 365 if (FM.supportCssAnimation) { 366 367 $layer.addClass(FM.options.visibleClass + ' fm-fadeInDown fm-is-animate').removeClass(FM.options.hiddenClass); 368 if (FM.fullscreenMode) { 369 FM.$wrapper.css( 'height', 'auto' ).addClass('fm-is-animate'); 370 } else { 371 FM.$wrapper.css('height', layerHeight ).addClass('fm-is-animate'); 372 } 373 setTimeout(function() { 374 $layer.removeClass('fm-fadeInDown fm-is-animate'); 375 FM.$wrapper.removeClass('fm-is-animate'); 376 }, FM.options.animationDuration); 377 378 } else { 379 $layer.addClass(FM.options.visibleClass).removeClass(FM.options.hiddenClass); 380 if (FM.fullscreenMode) { 381 FM.$wrapper.css( 'height', 'auto' ); 382 } else { 383 FM.$wrapper.css('height', layerHeight ); 384 } 385 } 386 387 return false;
388 389 } else if (event == 'slideLeft') { 390 391 // Si le navigateur supporte les animations css3 392 if (FM.supportCssAnimation) { 393 394 $layer.addClass(FM.options.visibleClass + ' fm-fadeInRight fm-is-animate').removeClass(FM.options.hiddenClass); 395 396 if (FM.fullscreenMode) { 397 FM.$wrapper.css('height', 'auto' ).addClass('fm-is-animate'); 398 } else { 399 FM.$wrapper.css('height', layerHeight ).addClass('fm-is-animate'); 400 } 401 402 setTimeout(function() { 403 $layer.removeClass('fm-fadeInRight fm-is-animate'); 404 FM.$wrapper.removeClass('fm-is-animate'); 405 }, FM.options.animationDuration); 406 407 } else { 408 $layer.removeClass(FM.options.hiddenClass).addClass(FM.options.visibleClass); 409 410 if (FM.fullscreenMode) { 411 FM.$wrapper.css('height', 'auto' ); 412 } else { 413 FM.$wrapper.css('height', layerHeight ); 414 } 415 416 417 } 418 419 return false; 420 421 } else if (event == 'slideRight') { 422 423 // Si le navigateur supporte les animations css3 424 if (FM.supportCssAnimation) { 425 $layer.addClass(FM.options.visibleClass + ' fm-fadeInLeft fm-is-animate').removeClass(FM.options.hiddenClass); 426 if (FM.fullscreenMode) { 427 FM.$wrapper.css('height', 'auto' ).addClass('fm-is-animate'); 428 } else { 429 FM.$wrapper.css('height', layerHeight ).addClass('fm-is-animate'); 430 } 431 setTimeout(function() { 432 $layer.removeClass('fm-fadeInLeft fm-is-animate'); 433 FM.$wrapper.removeClass('fm-is-animate'); 434 }, FM.options.animationDuration); 435 } else { 436 $layer.addClass(FM.options.visibleClass).removeClass(FM.options.hiddenClass); 437 if (FM.fullscreenMode) { 438 FM.$wrapper.css('height', 'auto' ); 439 } else { 440 FM.$wrapper.css('height', layerHeight ); 441 } 442 } 443 444 return false; 445 446 } 447 }, 448 449 // Masque le panel indiqué 450 hidePanel : function ($layer, event, lastAction) { 451 var FM = this; 452 453 // Si la variable n'existe, on la met par default à false 454 lastAction = typeof lastAction !== 'undefined' ? lastAction : false; 455 456 457 // Si c'est la dernière action et qu'on ouvre aucun autre panel après 458 if (lastAction) { 459 // On retire la classe d'ouverture sur le body 460 if (FM.supportCssAnimation) { 461 setTimeout(function() { 462 FM.$body.removeClass(FM.options.openMenuClass); 463 FM.$elem.removeAttr('data-open data-open-id'); 464 }, FM.options.animationDuration); 465 } else { 466 FM.$body.removeClass(FM.options.openMenuClass); 467 } 468 } 469 470 if (event == 'slideUp') { 471 472 // Si le navigateur supporte les animations css3 473 if (FM.supportCssAnimation) { 474 475 $layer.addClass('fm-fadeOutUp fm-is-animate'); 476 FM.$wrapper.css('height', '0'); 477 478 setTimeout(function() { 479 $layer.removeClass('fm-fadeOutUp fm-is-animate ' + FM.options.visibleClass).addClass(FM.options.hiddenClass); 480 }, FM.options.animationDuration); 481 } else { 482 FM.$wrapper.css('height', '0'); 483 $layer.addClass(FM.options.hiddenClass).removeClass(FM.options.visibleClass); 484 } 485 486 return false;
487 488 } else if (event == 'slideLeft') { 489 490 // Si le navigateur supporte les animations css3 491 if (FM.supportCssAnimation) { 492 $layer.addClass('fm-fadeOutLeft fm-is-animate'); 493 setTimeout(function() { 494 $layer.removeClass(FM.options.visibleClass + ' fm-fadeOutLeft fm-is-animate').addClass(FM.options.hiddenClass); 495 }, FM.options.animationDuration); 496 } else { 497 $layer.addClass(FM.options.hiddenClass).removeClass(FM.options.visibleClass); 498 } 499 500 return false; 501 502 } else if (event == 'slideRight') { 503 504 // Si le navigateur supporte les animations css3 505 if (FM.supportCssAnimation) { 506 $layer.addClass('fm-fadeOutRight fm-is-animate'); 507 setTimeout(function() { 508 $layer.removeClass(FM.options.visibleClass + ' fm-fadeOutRight fm-is-animate').addClass(FM.options.hiddenClass); 509 }, FM.options.animationDuration); 510 } else { 511 $layer.addClass(FM.options.hiddenClass).removeClass(FM.options.visibleClass); 512 } 513 514 return false; 515 516 } else if (event == 'slideLeftMobile') { 517 518 // Si le navigateur supporte les animations css3 519 if (FM.supportCssAnimation) { 520 $layer.addClass('fm-fadeOutLeft fm-is-animate'); 521 setTimeout(function() { 522 $layer.removeClass(FM.options.visibleClass + ' fm-fadeOutLeft fm-is-animate').addClass(FM.options.hiddenClass); 523 }, FM.options.animationDuration); 524 } else { 525 $layer.addClass(FM.options.hiddenClass).removeClass(FM.options.visibleClass); 526 } 527 528 return false; 529 530 } 531 }, 532 533 breadcrumbAdd : function ($elem) { 534 var FM = this, 535 layerName = $elem[0].getAttribute('data-name'), 536 layerId = $elem.attr('id'); 537 538 if (FM.mobileMode || FM.fullscreenMode) { return false; } 539 FM.$breadcrumb 540 .append('<li><a class="' + FM.options.triggerClass + ' fm-is-animate fm-fadeInRight" href="#' + layerId + '">' + layerName + '</a></li>'); 541 }, 542 543 breadcrumbDelete : function ($elem) { 544 var FM = this, 545 // layerName = $elem.data('name'), 546 layerId = $elem.attr('id'), 547 layerPosition = FM.$breadcrumb.find('a[href="#' + layerId + '"]').parent().index(), 548 $breadcrumbItems = FM.$breadcrumb.find('li'); 549 550 if (FM.mobileMode || FM.fullscreenMode) { return false; } 551 for (var i = $breadcrumbItems.length - 1; i >= 0; i--) { 552 if (i > layerPosition) { 553 $breadcrumbItems[i].remove(); 554 } 555 } 556 }, 557 558 breadcrumbReset : function () { 559 var FM = this; 560 if (FM.mobileMode || FM.fullscreenMode) { return false; } 561 FM.$breadcrumb.html(''); 562 }, 563 564 // Initialisation des triggers 565 triggerInit : function () { 566 var FM = this; 567 568 FM.$elem.find('.' + FM.options.triggerClass).each(function(index, el) { 569 570 var $elem = $(el); 571 572 // if ($elem.hasClass(FM.options.triggerCloseClass)) { 573 // return false; 574 // } 575 576 var $href = $($elem.attr('href')), 577 name = $elem.find('[class$="-title"]').text().trim(), 578 id = $elem.attr('href').replace('#layer-', ''), 579 layerID = $elem.closest('.fm-layer').attr('id'), 580 $parentGroup = $href.closest('.' + FM.options.groupClass); 581 582 // On detecte que le trigger n'est pas le déclencheur du moteur de recherche 583 if (!$elem.hasClass(FM.options.triggerSearchClass)) {
584 $elem.append('<span class="fm-trigger-icon">' + FM.options.triggerButtonIcon + '</span>'); 585 } 586 587 // Si c'est un lien de premier niveau 588 if ($elem.parents('.navbar').length > 0) { 589 590 $elem.addClass(FM.options.triggerMainClass).attr('data-group', name); 591 592 } else { 593 594 // Si le nom du calque n'est pas encore défini 595 if (!$href.data('name')) { 596 // On lui donne un data-name 597 $href.attr('data-name', name); 598 // Et un lien de "retour" pour la version mobile 599 $href.find('ul').prepend('<li class="back-item"><a class="' + FM.options.backButtonClass + ' fm-textline" href="#' + layerID + '"><div class="fm-textline-title">' + FM.options.backButtonContent + '</div></a></li>'); 600 } 601 602 // Si le group n'a pas encore de data-name 603 if (!$parentGroup.data('group')) { 604 // On lui en donne un 605 $parentGroup.attr('data-group', name); 606 } 607 608 } 609 }); 610 }, 611 612 triggerListener : function () { 613 var FM = this, 614 timer = null; 615 616 617 618 FM.$elem.on( 'click', '.' + FM.options.triggerClass + ', .'+ FM.options.backButtonClass, function(event) { 619 event.preventDefault(); 620 }); 621 622 FM.$elem.on( 'click', '.' + FM.options.triggerClass + ', .'+ FM.options.backButtonClass, throttle(function(event){ 623 var $elem = $(this); 624 625 FM.actionRouteur($elem, event); 626 627 }, 300)); 628 629 if ( FM.options.triggerType == 'hover' ) { 630 631 FM.$elem.on( 'mouseover mouseout', '.' + FM.options.triggerClass + ', .'+ FM.options.backButtonClass, function(event){ 632 var $elem = $(this); 633 634 if (event.type == 'mouseover') { 635 clearTimeout(timer); 636 timer = setTimeout(function() { 637 FM.actionRouteur($elem, event); 638 }, 300); 639 } else { 640 clearTimeout(timer); 641 } 642 643 }); 644 } 645 646 }, 647 648 estimateMaxHeight : function ($elem) { 649 // var FM = this; 650 // var windowHeight = $(window).height(), 651 // position = $elem.offset().top + $elem.outerHeight() 652 653 // FM.$wrapper.css({ 654 // 'max-height': windowHeight - position + 'px', 655 // }) 656 }, 657 658 actionRouteur : function ($elem, event) { 659 var FM = this; 660 661 if ( FM.$wrapper.hasClass('fm-is-animate') && FM.options.triggerType == 'click' ) { 662 return false; 663 } 664 if ( !FM.fullscreenMode ) { 665 FM.screenHeightCheck(); 666 } 667 668 var isBreadcrumb = false, 669 isMainTrigger = false, 670 isBackButton = false, 671 isSearch = false, 672 673 $currentLayer = FM.$elem.find('.' + FM.options.visibleClass), 674 currentLayerId = $currentLayer.attr('id'), 675 currentLayerName = $currentLayer.data('name'), 676 currentLayerGroup = $currentLayer.closest('.' + FM.options.groupClass).data('group'); 677 678 if (event.type == 'click' && $elem.hasClass(FM.options.triggerCloseClass)) { 679 FM.hidePanel($currentLayer, 'slideUp', true); 680 setTimeout(function() { 681 FM.breadcrumbReset(); 682 FM.$elem.find('.' + FM.options.triggerMainClass).removeClass('fm-is-active'); 683 }, FM.options.animationDuration); 684 FM.overlayHide(); 685 686 return false;
687 } 688 689 690 var $nextLayer = $($elem.attr('href')), 691 nextLayerName = $nextLayer.data('name'), 692 nextLayerId = $nextLayer.attr('id'), 693 nextLayerGroup = $nextLayer.closest('.' + FM.options.groupClass).data('group'), 694 695 groupId = $elem.attr('href'); 696 697 groupId = groupId.split('#'); 698 groupId = groupId[1]; 699 700 if ( $elem.closest('.' + FM.options.breadcrumbClass).length > 0) { 701 isBreadcrumb = true; 702 } 703 if ( $elem.hasClass(FM.options.triggerMainClass) ) { 704 isMainTrigger = true; 705 706 FM.$elem.attr({ 707 'data-open': groupId, 708 'data-open-id': $elem.parent().index() 709 }); 710 } 711 if ( $elem.hasClass(FM.options.backButtonClass) ) { 712 isBackButton = true; 713 } 714 if ( $elem.hasClass(FM.options.triggerSearchClass) ) { 715 isSearch = true; 716 717 setTimeout(function() { 718 $(FM.options.searchLayer).find('.form-control').focus(); 719 }, FM.options.animationDuration); 720 } 721 722 723 // Les différents événements possibles 724 if ( event.type == 'click' && isBackButton ) { 725 726 //EVENT : click sur button back 727 FM.hidePanel($currentLayer, 'slideRight', false); 728 FM.showPanel($nextLayer, 'slideRight'); 729 FM.breadcrumbDelete($nextLayer); 730 731 return false; 732 733 } 734 735 FM.estimateMaxHeight($elem); 736 737 if ( ( (FM.options.triggerType == 'hover' && event.type == 'mouseover' && !FM.mobileMode) || ( (FM.options.triggerType == 'click' || FM.mobileMode) && event.type == 'click')) && $currentLayer.length < 1 && !isBreadcrumb ) { 738 739 //EVENT : Ouverture du panel (Add on breadcrumb) 740 $elem.addClass('fm-is-active'); 741 FM.showPanel($nextLayer, 'slideDown'); 742 FM.overlayShow(); 743 FM.breadcrumbAdd($nextLayer); 744 745 return false; 746 747 } else if (event.type == 'click' && isBreadcrumb) { 748 749 if ( $currentLayer.length > 1 ) { 750 // EVENT : Click sur le fil d'ariane + Ouverture du panel 751 // Prévoir le cas des pages intérieures 752 753 return false; 754 } 755 if ( $currentLayer.length > 0 && currentLayerId != nextLayerId ) { 756 757 // EVENT : Même groupe vers niveau supérieur (Delete on breadcrumb) 758 FM.hidePanel($currentLayer, 'slideRight', false); 759 FM.showPanel($nextLayer, 'slideRight'); 760 FM.breadcrumbDelete($nextLayer); 761 762 return false; 763 } 764 765 return false; 766 767 } else if ($currentLayer.length > 0 && !isBreadcrumb ) { 768 // EVENT : Un panel déjà ouvert et n'est pas un lien du fil d'ariane 769 770 if (event.type == 'click' && !isMainTrigger && currentLayerId != nextLayerId && currentLayerGroup == nextLayerGroup ) { 771 // CONDITION : Non principal + Autre layer appelé + Même groupe 772 // EVENT : Même groupe vers niveau inférieur (Add on breadcrumb) 773 FM.hidePanel($currentLayer, 'slideLeft', false); 774 FM.showPanel($nextLayer, 'slideLeft'); 775 FM.breadcrumbAdd($nextLayer); 776 777 return false; 778 779 } 780 781 if ( ( (FM.options.triggerType == 'hover' && event.type == 'mouseover' && !FM.mobileMode) || ( (FM.options.triggerType == 'click' || FM.mobileMode) && event.type == 'click')) && isMainTrigger && currentLayerGroup != nextLayerGroup && currentLayerId != nextLayerId ) { 782 // CONDITION : Principal + Autre layer appelé + Autre groupe 783 // EVENT : Changement de groupe (Reset + Add on breadcrumb) 784 785 if (FM.mobileMode) { 786 if (isSearch) { 787 FM.hidePanel($currentLayer,'slideUp', false); 788 FM.showPanel($nextLayer, 'slideDown'); 789 790 return false;
791 } 792 FM.hidePanel($currentLayer,'slideLeft', false); 793 FM.showPanel($nextLayer, 'slideLeft'); 794 795 return false; 796 } 797 798 799 FM.$elem.find('.' + FM.options.triggerMainClass).removeClass('fm-is-active'); 800 $elem.addClass('fm-is-active'); 801 FM.hidePanel($currentLayer, 'slideUp', false); 802 FM.breadcrumbReset(); 803 804 805 FM.showPanel($nextLayer, 'slideDown'); 806 FM.breadcrumbAdd($nextLayer); 807 808 return false; 809 810 } 811 if ( FM.options.triggerType == 'click' && event.type == 'click' && isMainTrigger && currentLayerGroup == nextLayerGroup ) { 812 // CONDITION : Principal + Même groupe 813 // EVENT : Fermeture du panel (Reset on breadcrumb) 814 FM.hidePanel($currentLayer, 'slideUp', true); 815 setTimeout(function() { 816 FM.breadcrumbReset(); 817 FM.$elem.find('.' + FM.options.triggerMainClass).removeClass('fm-is-active'); 818 }, FM.options.animationDuration); 819 FM.overlayHide(); 820 821 return false; 822 } 823 824 } 825 }, 826 827 }; 828 829 830 $.fn.FatMenu = function (options) { 831 this.each(function () { 832 833 // On check si la function Object.create existe, si ce n'est pas le cas, on la crée (pour IE8) 834 if (typeof Object.create != 'function') { 835 (function () { 836 var F = function () {}; 837 Object.create = function (o) { 838 if (arguments.length > 1) { throw Error('Second argument not supported');} 839 if (o === null) { throw Error('Cannot set a null [[Prototype]]');} 840 if (typeof o != 'object') { throw TypeError('Argument must be an object');} 841 F.prototype = o; 842 return new F(); 843 }; 844 })(); 845 } 846 847 var fatmenu = Object.create(FatMenu); 848 fatmenu.init(options, this); 849 850 }); 851 return this; 852 }; 853 854 855 $.fn.FatMenu.options = { 856 pushOnShow : false, 857 overlay : true, 858 mobileBreakpoint : 992, 859 backButtonContent : '<i class="fa fa-angle-left"></i> Retour', 860 triggerButtonIcon : '<i class="fa fa-angle-right"></i>', 861 animationDuration : 250, 862 fullscreen : false, 863 triggerType : 'click', 864 865 // pushOnShow : this.dataset.pushOnShow || false, 866 // overlay : this.dataset.overlay || true, 867 // mobileBreakpoint : this.dataset.mobileBreakpoint || 992, 868 // backButtonContent : this.dataset.backButtonContent || '<i class="fa fa-angle-left"></i> Retour', 869 // triggerButtonIcon : this.dataset.triggerButtonIcon || '<i class="fa fa-angle-right"></i>', 870 // animationDuration : this.dataset.animationDuration || 250, 871 // fullscreen : this.dataset.fullscreen || false, 872 // triggerType : this.dataset.triggerType || 'click', 873 874 875 wrapperContainer : '.fm-wrapper', 876 breadcrumbClass : 'fm-breadcrumb', 877 breadcrumbContainer : '.fm-breadcrumb ul', 878 879 groupClass : 'fm-group', 880 layerClass : 'fm-layer', 881 triggerClass : 'fm-trigger', 882 triggerMainClass : 'fm-main-trigger', 883 triggerCloseClass : 'fm-close-trigger', 884 overlayClass : 'fm-overlay', 885 openMenuClass : 'fm-is-open', 886 887 triggerSearchClass : 'fm-search-trigger', 888 889 mobileClass : 'fm-is-mobile', 890 backButtonClass : 'fm-back-button', 891 892 visibleClass : 'fm-is-visible', 893 hiddenClass : 'fm-is-hidden'
894 }; 895 896 897}(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.