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.