PageSourceSearch

https://www.saintjeandemaurienne.fr/wp-content/themes/saint-jean-d…/dist/js/jquery.fatmenu.js?ver=0.9.6

js saintjeandemaurienne.fr collected 2026-10-02 19:04:45 UTC 36,635 bytes, 897 lines download raw bytes

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.