PageSourceSearch

https://www.savons-sativa.fr/js1776270319/side-menu.js

js savons-sativa.fr collected 2026-09-27 07:28:20 UTC 7,853 bytes, 238 lines download raw bytes

1;
2(function (window, document, location, history) {
3    'use strict';
4
5    var isIE = document.all && !window.atob;
6
7    var extend = function (out) {
8        out = out || {};
9
10        for (var i = 1; i < arguments.length; i++) {
11            if (!arguments[i])
12                continue;
13
14            for (var key in arguments[i]) {
15                if (arguments[i].hasOwnProperty(key))
16                    out[key] = arguments[i][key];
17            }
18        }
19
20        return out;
21    };
22
23    function addEventListener(el, eventName, handler) {
24        if (el.addEventListener) {
25            el.addEventListener(eventName, handler);
26        } else {
27            el.attachEvent('on' + eventName, function () {
28                handler.call(el);
29            });
30        }
31    }
32
33    function forEach(array, fn) {
34        for (var i = 0; i < array.length; i++)
35            fn(array[i], i);
36    }
37
38    /*
39     * Ajouter une classe
40     * sources:  http://youmightnotneedjquery.com/
41     */
42    function addClass(el, className) {
43        if(el !== null){
44            if (el.classList) {
45                el.classList.add(className);
46            } else {
47                el.className += ' ' + className;
48            }
49        }
50    }
51
52    /*
53     * Supprimer une Classe
54     * sources:  http://youmightnotneedjquery.com/
55     */
56    function removeClass(el, className) {
57        if (el.classList) {
58            el.classList.remove(className);
59        } else {
60            el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
61        }
62    }
63
64    function hasClass(el, className) {
65        if (el.classList) {
66            return el.classList.contains(className);
67        } else {
68            return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className);
69        }
70    }
71
72
73    function sideMenu(element, options) {
74        // Init du tableau d'option
75        this.options = {};
76        // Merge des options en paramètre avec celle par défaut
77        this.options = extend({}, sideMenu.defaults, options);
78
79        if (typeof element === "object") {
80            this.element = element;
81        }
82
83        if (typeof element === "string") {
84            this.element = document.querySelector(element);
85        }
86
87        if (this.element != null) {
88            // Start !
89            this.init();
90        }
91
92    }
93
94
95    sideMenu.defaults = {
96        sidebar: ".side-tabs",
97        contents: ".contents-tabs",
98        content: ".content-tab",
99        active: "active",
100        onClick: function (event, link) {
101        }
102    };
103
104    sideMenu.prototype = {
105        // Start !
106        init: function () {
107            var self = this;
108            // on va chercher les différents élements dans le HTML pour le traitement
109            // Si la sidebar configurée est absente du DOM, on abandonne proprement
110            if (!this.getAllElement()) {
111                return;
112            }
113            
114            // On active les évenements
115            this.event();
116            // Si un id est dans l'url
117            if (location.hash != "") {
118                forEach(this.allLinks, function (listlink, k) {
119                    if (listlink.getAttribute('href') == location.hash && !hasClass(listlink, 'hide')) {
120                        self.changeTab(listlink);
121                    }
122                });
123            }
124        },
125        // Evenement du module
126        event: function () {
127            var self = this;
128            // Pour chaque lien dans le menu
129            forEach(this.allLinks, function (link, i) {
130                // on créé un évenement click
131                addEventListener(link, 'click', function (event) {
132                    if (self.changeTab(link, event)) {
133                        event.preventDefault();
134                    }
135                });
136
137            });
138
139            if (("onhashchange" in window) && !(isIE)) {
140                window.onhashchange = function () {
141                    self.changeTab(window.location.hash)
142                }
143            } else {
144                var prevHash = window.location.hash;
145                window.setInterval(function () {
146                    if (window.location.hash != prevHash) {
147                        prevHash = window.location.hash;
148                        self.changeTab(window.location.hash);
149                    }
150                }, 100);
151            }
152
153
154        },
155        // On va chercher dans le DOM HTML les élements utiles
156        getAllElement: function () {
157            this.sidebar = this.element.querySelector(this.options.sidebar);
158            // La sidebar peut être absente selon le template (ex. tunnel sans stepper) : on n'initialise pas
159            if (this.sidebar == null) {
160                return false;
161            }
162            this.content = this.element.querySelectorAll(this.options.content);
163            this.allLinks = this.sidebar.querySelectorAll('a');
164            return true;
165        },
166        // changement de tab
167        changeTab: function (link, event) {
168
169            var
170                self = this,
171                // regex, savoir si c'est un ID et pas un lien
172                isID = /^#(.*)/,
173
174                isHashEvent = typeof link == "string",
175                // on récupére le href du lien
176                href = (isHashEvent ? link : link.getAttribute('href'));
177
178            // on test le href
179            if (isID.test(href)) {
180                if (typeof event !== "undefined") {
181                    // On annule la propagation de l'evenement (pour que le lien ne fonctionne pas)
182                    event.preventDefault();
183                }
184                // On recupére l'id
185                var id = isID.exec(href)[1];
186                // on répére le bloc de l'id dans le DOM HTML
187                var newContent = document.getElementById(id);
188                // On supprime la class active sur tous les élements
189                forEach(self.content, function (content, j) {
190                    if (hasClass(content, self.options.active)) {
191                        removeClass(content, self.options.active);
192                    }
193                });
194                forEach(self.allLinks, function (listlink, k) {
195                    if (hasClass(listlink, self.options.active)) {
196                        removeClass(listlink, self.options.active);
197                    }
198                });
199                // On met la class Active sur le nouveau bloc conserné
200                if (newContent) {
201                    addClass(newContent, self.options.active);
202
203                    if(typeof require !== 'undefined'){
204                        require(['helper'], function () {
205                            Helper.fireEvent(newContent, 'tabs:open');
206                        });
207                    }
208                }
209
210                if (!isHashEvent) {
211                    addClass(link, self.options.active);
212                } else {
213                    addClass(this.sidebar.querySelector('a[href="' + link + '"]'), self.options.active);
214                }
215
216                if (history.pushState) {
217                    history.pushState(null, null, href);
218                } else {
219                    location.hash = href;
220                }
221
222            }
223            // Callback onClick
224            self.options.onClick(event, link);
225
226            if (isID.test(href)) {
227                return true;
228            } else {
229                return false;
230            }
231        }
232
233    };
234
235    // Ajout du NameSpace dans le navigateur
236    window.sideMenu = sideMenu;
237
238})(window, document, location, history);

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.