1// +-------------------------------------------------+ 2// © 2002-2004 PMB Services / www.sigb.net [email protected] et contributeurs (voir www.sigb.net) 3// +-------------------------------------------------+ 4// $Id: misc.js,v 1.25.4.1 2025/02/27 14:05:54 dgoron Exp $ 5 6 7function replace_texte(string, text, by) { 8 var strLength = string.length, txtLength = text.length; 9 if ((strLength == 0) || (txtLength == 0)) return string; 10 11 var i = string.indexOf(text); 12 if ((!i) && (text != string.substring(0, txtLength))) return string; 13 if (i == -1) return string; 14 15 var newstr = string.substring(0, i) + by; 16 17 if (i + txtLength < strLength) 18 newstr += replace_texte(string.substring(i + txtLength, strLength), text, by); 19 20 return newstr; 21} 22 23 24function reverse_html_entities(text) { 25 26 text = replace_texte(text, '"', unescape('%22')); 27 text = replace_texte(text, ''', unescape('%27')); 28 text = replace_texte(text, ''', unescape('%27')); 29 text = replace_texte(text, '&', unescape('%26')); 30 text = replace_texte(text, '<', unescape('%3C')); 31 text = replace_texte(text, '>', unescape('%3E')); 32 text = replace_texte(text, ' ', unescape('%A0')); 33 text = replace_texte(text, '¡', unescape('%A1')); 34 text = replace_texte(text, '¢', unescape('%A2')); 35 text = replace_texte(text, '£', unescape('%A3')); 36 text = replace_texte(text, '¥', unescape('%A5')); 37 text = replace_texte(text, '¦', unescape('%A6')); 38 text = replace_texte(text, '§', unescape('%A7')); 39 text = replace_texte(text, '¨', unescape('%A8')); 40 text = replace_texte(text, '©', unescape('%A9')); 41 text = replace_texte(text, 'ª', unescape('%AA')); 42 text = replace_texte(text, '«', unescape('%AB')); 43 text = replace_texte(text, '¬', unescape('%AC')); 44 text = replace_texte(text, '­', unescape('%AD')); 45 text = replace_texte(text, '®', unescape('%AE')); 46 text = replace_texte(text, '¯', unescape('%AF')); 47 text = replace_texte(text, '°', unescape('%B0')); 48 text = replace_texte(text, '±', unescape('%B1')); 49 text = replace_texte(text, '²', unescape('%B2')); 50 text = replace_texte(text, '³', unescape('%B3')); 51 text = replace_texte(text, '´', unescape('%B4')); 52 text = replace_texte(text, 'µ', unescape('%B5')); 53 text = replace_texte(text, '¶', unescape('%B6')); 54 text = replace_texte(text, '·', unescape('%B7')); 55 text = replace_texte(text, '¸', unescape('%B8')); 56 text = replace_texte(text, '¹', unescape('%B9')); 57 text = replace_texte(text, 'º', unescape('%BA')); 58 text = replace_texte(text, '»', unescape('%BB')); 59 text = replace_texte(text, '¼', unescape('%BC')); 60 text = replace_texte(text, '½', unescape('%BD')); 61 text = replace_texte(text, '¾', unescape('%BE')); 62 text = replace_texte(text, '¿', unescape('%BF')); 63 text = replace_texte(text, 'À', unescape('%C0')); 64 text = replace_texte(text, 'Á', unescape('%C1')); 65 text = replace_texte(text, 'Â', unescape('%C2')); 66 text = replace_texte(text, 'Ã', unescape('%C3')); 67 text = replace_texte(text, 'Ä', unescape('%C4')); 68 text = replace_texte(text, 'Å', unescape('%C5')); 69 text = replace_texte(text, 'Æ', unescape('%C6')); 70 text = replace_texte(text, 'Ç', unescape('%C7')); 71 text = replace_texte(text, 'È', unescape('%C8')); 72 text = replace_texte(text, 'É', unescape('%C9')); 73 text = replace_texte(text, 'Ê', unescape('%CA')); 74 text = replace_texte(text, 'Ë', unescape('%CB')); 75 text = replace_texte(text, 'Ì', unescape('%CC')); 76 text = replace_texte(text, 'Í', unescape('%CD')); 77 text = replace_texte(text, 'Î', unescape('%CE')); 78 text = replace_texte(text, 'Ï', unescape('%CF')); 79 text = replace_texte(text, 'Ð', unescape('%D0')); 80 text = replace_texte(text, 'Ñ', unescape('%D1')); 81 text = replace_texte(text, 'Ò', unescape('%D2')); 82 text = replace_texte(text, 'Ó', unescape('%D3')); 83 text = replace_texte(text, 'Ô', unescape('%D4')); 84 text = replace_texte(text, 'Õ', unescape('%D5')); 85 text = replace_texte(text, 'Ö', unescape('%D6')); 86 text = replace_texte(text, '×', unescape('%D7')); 87 text = replace_texte(text, 'Ø', unescape('%D8')); 88 text = replace_texte(text, 'Ù', unescape('%D9')); 89 text = replace_texte(text, 'Ú', unescape('%DA')); 90 text = replace_texte(text, 'Û', unescape('%DB')); 91 text = replace_texte(text, 'Ü', unescape('%DC')); 92 text = replace_texte(text, 'Ý', unescape('%DD')); 93 text = replace_texte(text, 'Þ', unescape('%DE')); 94 text = replace_texte(text, 'ß', unescape('%DF')); 95 text = replace_texte(text, 'à', unescape('%E0')); 96 text = replace_texte(text, 'á', unescape('%E1')); 97 text = replace_texte(text, 'â', unescape('%E2')); 98 text = replace_texte(text, 'ã', unescape('%E3')); 99 text = replace_texte(text, 'ä', unescape('%E4')); 100 text = replace_texte(text, 'å', unescape('%E5')); 101 text = replace_texte(text, 'æ', unescape('%E6')); 102 text = replace_texte(text, 'ç', unescape('%E7')); 103 text = replace_texte(text, 'è', unescape('%E8')); 104 text = replace_texte(text, 'é', unescape('%E9')); 105 text = replace_texte(text, 'ê', unescape('%EA')); 106 text = replace_texte(text, 'ë', unescape('%EB')); 107 text = replace_texte(text, 'ì', unescape('%EC')); 108 text = replace_texte(text, 'í', unescape('%ED')); 109 text = replace_texte(text, 'î', unescape('%EE')); 110 text = replace_texte(text, 'ï', unescape('%EF')); 111 text = replace_texte(text, 'ð', unescape('%F0')); 112 text = replace_texte(text, 'ñ', unescape('%F1')); 113 text = replace_texte(text, 'ò', unescape('%F2')); 114 text = replace_texte(text, 'ó', unescape('%F3')); 115 text = replace_texte(text, 'ô', unescape('%F4')); 116 text = replace_texte(text, 'õ', unescape('%F5')); 117 text = replace_texte(text, 'ö', unescape('%F6')); 118 text = replace_texte(text, '÷', unescape('%F7')); 119 text = replace_texte(text, 'ø', unescape('%F8')); 120 text = replace_texte(text, 'ù', unescape('%F9')); 121 text = replace_texte(text, 'ú', unescape('%FA')); 122 text = replace_texte(text, 'û', unescape('%FB')); 123 text = replace_texte(text, 'ü', unescape('%FC')); 124 text = replace_texte(text, 'ý', unescape('%FD')); 125 text = replace_texte(text, 'þ', unescape('%FE')); 126 text = replace_texte(text, 'ÿ', unescape('%FF')); 127 return text; 128 129} 130 131function html_entities(text) { 132 133 text = replace_texte(text, unescape('%22'), '"'); 134 text = replace_texte(text, unescape('%26'), '&'); 135 text = replace_texte(text, unescape('%3C'), '<'); 136 text = replace_texte(text, unescape('%3E'), '>'); 137 text = replace_texte(text, unescape('%A0'), ' '); 138 text = replace_texte(text, unescape('%A1'), '¡'); 139 text = replace_texte(text, unescape('%A2'), '¢'); 140 text = replace_texte(text, unescape('%A3'), '£'); 141 text = replace_texte(text, unescape('%A5'), '¥'); 142 text = replace_texte(text, unescape('%A6'), '¦'); 143 text = replace_texte(text, unescape('%A7'), '§'); 144 text = replace_texte(text, unescape('%A8'), '¨'); 145 text = replace_texte(text, unescape('%A9'), '©'); 146 text = replace_texte(text, unescape('%AA'), 'ª'); 147 text = replace_texte(text, unescape('%AB'), '«'); 148 text = replace_texte(text, unescape('%AC'), '¬'); 149 text = replace_texte(text, unescape('%AD'), '­'); 150 text = replace_texte(text, unescape('%AE'), '®'); 151 text = replace_texte(text, unescape('%AF'), '¯'); 152 text = replace_texte(text, unescape('%B0'), '°'); 153 text = replace_texte(text, unescape('%B1'), '±'); 154 text = replace_texte(text, unescape('%B2'), '²'); 155 text = replace_texte(text, unescape('%B3'), '³'); 156 text = replace_texte(text, unescape('%B4'), '´'); 157 text = replace_texte(text, unescape('%B5'), 'µ'); 158 text = replace_texte(text, unescape('%B6'), '¶'); 159 text = replace_texte(text, unescape('%B7'), '·'); 160 text = replace_texte(text, unescape('%B8'), '¸'); 161 text = replace_texte(text, unescape('%B9'), '¹'); 162 text = replace_texte(text, unescape('%BA'), 'º'); 163 text = replace_texte(text, unescape('%BB'), '»'); 164 text = replace_texte(text, unescape('%BC'), '¼'); 165 text = replace_texte(text, unescape('%BD'), '½'); 166 text = replace_texte(text, unescape('%BE'), '¾'); 167 text = replace_texte(text, unescape('%BF'), '¿'); 168 text = replace_texte(text, unescape('%C0'), 'À'); 169 text = replace_texte(text, unescape('%C1'), 'Á'); 170 text = replace_texte(text, unescape('%C2'), 'Â'); 171 text = replace_texte(text, unescape('%C3'), 'Ã'); 172 text = replace_texte(text, unescape('%C4'), 'Ä'); 173 text = replace_texte(text, unescape('%C5'), 'Å'); 174 text = replace_texte(text, unescape('%C6'), 'Æ'); 175 text = replace_texte(text, unescape('%C7'), 'Ç'); 176 text = replace_texte(text, unescape('%C8'), 'È'); 177 text = replace_texte(text, unescape('%C9'), 'É'); 178 text = replace_texte(text, unescape('%CA'), 'Ê'); 179 text = replace_texte(text, unescape('%CB'), 'Ë'); 180 text = replace_texte(text, unescape('%CC'), 'Ì'); 181 text = replace_texte(text, unescape('%CD'), 'Í'); 182 text = replace_texte(text, unescape('%CE'), 'Î'); 183 text = replace_texte(text, unescape('%CF'), 'Ï'); 184 text = replace_texte(text, unescape('%D0'), 'Ð'); 185 text = replace_texte(text, unescape('%D1'), 'Ñ'); 186 text = replace_texte(text, unescape('%D2'), 'Ò'); 187 text = replace_texte(text, unescape('%D3'), 'Ó'); 188 text = replace_texte(text, unescape('%D4'), 'Ô'); 189 text = replace_texte(text, unescape('%D5'), 'Õ'); 190 text = replace_texte(text, unescape('%D6'), 'Ö'); 191 text = replace_texte(text, unescape('%D7'), '×'); 192 text = replace_texte(text, unescape('%D8'), 'Ø'); 193 text = replace_texte(text, unescape('%D9'), 'Ù'); 194 text = replace_texte(text, unescape('%DA'), 'Ú'); 195 text = replace_texte(text, unescape('%DB'), 'Û'); 196 text = replace_texte(text, unescape('%DC'), 'Ü'); 197 text = replace_texte(text, unescape('%DD'), 'Ý'); 198 text = replace_texte(text, unescape('%DE'), 'Þ'); 199 text = replace_texte(text, unescape('%DF'), 'ß'); 200 text = replace_texte(text, unescape('%E0'), 'à'); 201 text = replace_texte(text, unescape('%E1'), 'á'); 202 text = replace_texte(text, unescape('%E2'), 'â'); 203 text = replace_texte(text, unescape('%E3'), 'ã'); 204 text = replace_texte(text, unescape('%E4'), 'ä'); 205 text = replace_texte(text, unescape('%E5'), 'å'); 206 text = replace_texte(text, unescape('%E6'), 'æ'); 207 text = replace_texte(text, unescape('%E7'), 'ç'); 208 text = replace_texte(text, unescape('%E8'), 'è'); 209 text = replace_texte(text, unescape('%E9'), 'é'); 210 text = replace_texte(text, unescape('%EA'), 'ê'); 211 text = replace_texte(text, unescape('%EB'), 'ë'); 212 text = replace_texte(text, unescape('%EC'), 'ì'); 213 text = replace_texte(text, unescape('%ED'), 'í'); 214 text = replace_texte(text, unescape('%EE'), 'î'); 215 text = replace_texte(text, unescape('%EF'), 'ï'); 216 text = replace_texte(text, unescape('%F0'), 'ð'); 217 text = replace_texte(text, unescape('%F1'), 'ñ'); 218 text = replace_texte(text, unescape('%F2'), 'ò'); 219 text = replace_texte(text, unescape('%F3'), 'ó'); 220 text = replace_texte(text, unescape('%F4'), 'ô'); 221 text = replace_texte(text, unescape('%F5'), 'õ'); 222 text = replace_texte(text, unescape('%F6'), 'ö'); 223 text = replace_texte(text, unescape('%F7'), '÷'); 224 text = replace_texte(text, unescape('%F8'), 'ø'); 225 text = replace_texte(text, unescape('%F9'), 'ù'); 226 text = replace_texte(text, unescape('%FA'), 'ú'); 227 text = replace_texte(text, unescape('%FB'), 'û'); 228 text = replace_texte(text, unescape('%FC'), 'ü'); 229 text = replace_texte(text, unescape('%FD'), 'ý'); 230 text = replace_texte(text, unescape('%FE'), 'þ'); 231 text = replace_texte(text, unescape('%FF'), 'ÿ'); 232 return text; 233 234} 235 236function empty_dojo_calendar_by_id(id) { 237 require(["dijit/registry"], function (registry) { registry.byId(id).set('value', null); }); 238} 239 240function closeCurrentEnv(what) { 241 window.parent.require(["dojo/topic"], 242 function (topic) { 243 var evtArgs = []; 244 if (what) { 245 evtArgs.what = what; 246 } 247 topic.publish("SelectorTab", "SelectorTab", "closeCurrentTab", evtArgs); 248 } 249 ); 250} 251 252function set_parent_value(f_caller, id, value) { 253 if (window.opener != null) { 254 window.opener.document.forms[f_caller].elements[id].value = value; 255 } else { 256 parent.document.forms[f_caller].elements[id].value = value; 257 } 258} 259 260function get_parent_value(f_caller, id) { 261 if (window.opener != null) { 262 return window.opener.document.forms[f_caller].elements[id].value; 263 } else { 264 return parent.document.forms[f_caller].elements[id].value; 265 } 266} 267 268function set_parent_focus(f_caller, id) { 269 window.opener.document.forms[f_caller].elements[id].focus(); 270} 271 272/** 273 * Tester la validit� d'un email 274 */ 275function is_valid_mail(mail) { 276 /** 277 * Exemple : 278 * 279 * Valide mail : 280 * [email protected] 281 * [email protected] 282 * [email protected] 283 * 284 * Invalide mail :
285 * [email protected]:7777 286 * %@mail.com 287 * '@mail.com 288 * "............"@mail.com 289 */ 290 var regex = /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@[0-9a-z]([a-z0-9\-_\.]+)*[0-9a-z]$/; 291 var result = mail.match(regex); 292 if (null == result) { 293 return false; 294 } 295 return true; 296} 297 298/* -------------------------------------------------------------------------------------- 299 * Fonction addLoadEvent 300 * Empile les differentes fonctions a appeler quand la page est chargee 301 */ 302function addLoadEvent(func) { 303 if (window.addEventListener) 304 window.addEventListener("load", func, false); 305 else if (window.attachEvent) 306 window.attachEvent("onload", func); 307 else { // fallback 308 var old = window.onload; 309 window.onload = function () { 310 if (old) old(); 311 func(); 312 }; 313 } 314} 315 316/* -------------------------------------------------------------------------------------- 317 * Fonction togglepassword 318 * affiche / masque les champs password 319 */ 320function toggle_password(caller, id) { 321 322 try { 323 var i = document.getElementById(id); 324 switch (i.type) { 325 case 'text': 326 i.type = 'password'; 327 caller.setAttribute('aria-checked', 'false'); 328 caller.setAttribute('class', 'fa fa-eye'); 329 break;; 330 case 'password': 331 i.type = 'text'; 332 caller.setAttribute('aria-checked', 'true'); 333 caller.setAttribute('class', 'fa fa-eye-slash'); 334 break; 335 } 336 337 } catch (e) { } 338} 339 340/** 341 * Masque un élément html si tous ces enfants sont non visibles 342 */ 343function hide_element_by_its_hidden_children(element_id) { 344 var element = document.getElementById(element_id); 345 if (element) { 346 for (let child of element.children) { 347 if (window.getComputedStyle(child).display != "none") { 348 return; 349 } 350 } 351 element.style.display = "none"; 352 } 353} 354 355/** 356 * methode pour inclure des fichiers js et eviter les balises <script type='text/javascript' src='nom_fichier.js'></script> 357 */ 358function pmb_include(file) { 359 if (typeof window.filesList == 'undefined') { 360 window['filesList'] = []; 361 } 362 if (window.filesList.includes(file)) { 363 return; 364 } 365 let script = document.createElement('script'); 366 script.src = file; 367 script.type = 'text/javascript'; 368 script.defer = true; 369 370 document.getElementsByTagName('head').item(0).appendChild(script); 371 window.filesList.push(file); 372} 373 374/** 375 * Permet de transforme un noeud html en boutton 376 * 377 * @param {Node} node Noeud HTML 378 * @param {function} functionClick fonction appele au click 379 */ 380function convertToRGAAButton(node, functionClick) { 381 382 if (!(node instanceof Node)) { 383 return false; 384 } 385 386 node.setAttribute('role', 'button'); 387 node.setAttribute('tabindex', '0'); 388 node.setAttribute('aria-pressed', 'false'); 389 390 node.addEventListener('keydown', (event) => { 391 if ( 392 event instanceof KeyboardEvent && 393 event.key !== "Enter" && 394 event.key !== " " 395 ) { 396 return; 397 } 398 399 event.preventDefault(); 400 node.setAttribute('aria-pressed', 'true'); 401 functionClick(event); 402 }); 403 404 node.addEventListener('keyup', (event) => { 405 if ( 406 event instanceof KeyboardEvent && 407 event.key !== "Enter" && 408 event.key !== " " 409 ) { 410 return; 411 } 412 413 event.preventDefault(); 414 node.setAttribute('aria-pressed', 'false'); 415 }); 416} 417 418/** 419 * G�re l'attribut aria-expanded / title des disclosures sur le bouton de detail d'une notice 420 * @param {Node} button 421 */ 422function detailButtonRGAA(button) { 423 if(button) { 424 let expand = pmbDojo.messages.getMessage('opac', 'rgaa_expand'); 425 let collapse = pmbDojo.messages.getMessage('opac', 'rgaa_collapse'); 426 427 let isExpanded = button.getAttribute("aria-expanded"); 428 429 button.setAttribute("aria-expanded", !isExpanded); 430 button.setAttribute("title", isExpanded == "true" ? expand : collapse); 431 432 let span = button.querySelector(".visually-hidden"); 433 if(span) { 434 span.innerHTML = isExpanded == "true" ? expand : collapse; 435 } 436 } 437} 438 439/* 440 * Focus trap : permet de bloquer le focus dans un container spécifique (RGAA) 441 */ 442 443function focus_trap(containerElement) { 444 if (!containerElement || !containerElement.id) { 445 return; 446 } 447 var container = document.getElementById(containerElement.id); 448 if (container) { 449 var focusableElements = get_focusable_elements(container); 450 if (focusableElements.length == 0) { 451 return; 452 } 453 // Le focus ne prend pas sans delay 454 setTimeout(() => { 455 if (focusableElements.first) { 456 focusableElements.first.focus(); 457 } 458 }, 0); 459 460 container.addEventListener('keydown', function (event) { 461 if (event.key === 'Tab' || event.key === 'ArrowDown') { 462 if (event.shiftKey) { 463 if (document.activeElement === focusableElements.first) { 464 event.preventDefault(); 465 focusableElements.last.focus(); 466 } 467 } else { 468 if (document.activeElement === focusableElements.last) { 469 event.preventDefault(); 470 focusableElements.first.focus(); 471 } 472 } 473 } 474 }) 475 document.onmousedown = function(event) { 476 if (!container.contains(event.target)) { 477 event.preventDefault(); 478 479 setTimeout(() => { 480 if (focusableElements.first) { 481 focusableElements.first.focus(); 482 } 483 }, 0); 484 } 485 } 486 } 487} 488 489/* 490 * Focus trap : permet de lister la liste des éléments focussables situés dans un élément spécifique 491 * Retourne le premier et le dernier élément de la liste 492 */ 493 494function get_focusable_elements(element) { 495 var focusableElementsList = element.querySelectorAll('a[href], button, input, textarea, select, details,[tabindex]:not
495([tabindex="-1"])'); 496 var focusableElementsArray = Array.from(focusableElementsList); 497 focusableElementsArray = focusableElementsArray.filter((el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden')); 498 var focusableElementsObject = { 499 first: focusableElementsArray[0], 500 last:focusableElementsArray[focusableElementsArray.length - 1] 501 } 502 503 return focusableElementsObject; 504}
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.