PageSourceSearch

https://aduga.org/includes/javascript/misc.js

js aduga.org collected 2026-10-02 06:55:29 UTC 19,534 bytes, 504 lines download raw bytes

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, '&quot;', unescape('%22'));
27  text = replace_texte(text, '&apos;', unescape('%27'));
28  text = replace_texte(text, '&#039;', unescape('%27'));
29  text = replace_texte(text, '&amp;', unescape('%26'));
30  text = replace_texte(text, '&lt;', unescape('%3C'));
31  text = replace_texte(text, '&gt;', unescape('%3E'));
32  text = replace_texte(text, '&nbsp;', unescape('%A0'));
33  text = replace_texte(text, '&iexcl;', unescape('%A1'));
34  text = replace_texte(text, '&cent;', unescape('%A2'));
35  text = replace_texte(text, '&pound;', unescape('%A3'));
36  text = replace_texte(text, '&yen;', unescape('%A5'));
37  text = replace_texte(text, '&brvbar;', unescape('%A6'));
38  text = replace_texte(text, '&sect;', unescape('%A7'));
39  text = replace_texte(text, '&uml;', unescape('%A8'));
40  text = replace_texte(text, '&copy;', unescape('%A9'));
41  text = replace_texte(text, '&ordf;', unescape('%AA'));
42  text = replace_texte(text, '&laquo;', unescape('%AB'));
43  text = replace_texte(text, '&not;', unescape('%AC'));
44  text = replace_texte(text, '&shy;', unescape('%AD'));
45  text = replace_texte(text, '&reg;', unescape('%AE'));
46  text = replace_texte(text, '&macr;', unescape('%AF'));
47  text = replace_texte(text, '&deg;', unescape('%B0'));
48  text = replace_texte(text, '&plusmn;', unescape('%B1'));
49  text = replace_texte(text, '&sup2;', unescape('%B2'));
50  text = replace_texte(text, '&sup3;', unescape('%B3'));
51  text = replace_texte(text, '&acute;', unescape('%B4'));
52  text = replace_texte(text, '&micro;', unescape('%B5'));
53  text = replace_texte(text, '&para;', unescape('%B6'));
54  text = replace_texte(text, '&middot;', unescape('%B7'));
55  text = replace_texte(text, '&cedil;', unescape('%B8'));
56  text = replace_texte(text, '&sup1;', unescape('%B9'));
57  text = replace_texte(text, '&ordm;', unescape('%BA'));
58  text = replace_texte(text, '&raquo;', unescape('%BB'));
59  text = replace_texte(text, '&frac14;', unescape('%BC'));
60  text = replace_texte(text, '&frac12;', unescape('%BD'));
61  text = replace_texte(text, '&frac34;', unescape('%BE'));
62  text = replace_texte(text, '&iquest;', unescape('%BF'));
63  text = replace_texte(text, '&Agrave;', unescape('%C0'));
64  text = replace_texte(text, '&Aacute;', unescape('%C1'));
65  text = replace_texte(text, '&Acirc;', unescape('%C2'));
66  text = replace_texte(text, '&Atilde;', unescape('%C3'));
67  text = replace_texte(text, '&Auml;', unescape('%C4'));
68  text = replace_texte(text, '&Aring;', unescape('%C5'));
69  text = replace_texte(text, '&AElig;', unescape('%C6'));
70  text = replace_texte(text, '&Ccedil;', unescape('%C7'));
71  text = replace_texte(text, '&Egrave;', unescape('%C8'));
72  text = replace_texte(text, '&Eacute;', unescape('%C9'));
73  text = replace_texte(text, '&Ecirc;', unescape('%CA'));
74  text = replace_texte(text, '&Euml;', unescape('%CB'));
75  text = replace_texte(text, '&Igrave;', unescape('%CC'));
76  text = replace_texte(text, '&Iacute;', unescape('%CD'));
77  text = replace_texte(text, '&Icirc;', unescape('%CE'));
78  text = replace_texte(text, '&Iuml;', unescape('%CF'));
79  text = replace_texte(text, '&ETH;', unescape('%D0'));
80  text = replace_texte(text, '&Ntilde;', unescape('%D1'));
81  text = replace_texte(text, '&Ograve;', unescape('%D2'));
82  text = replace_texte(text, '&Oacute;', unescape('%D3'));
83  text = replace_texte(text, '&Ocirc;', unescape('%D4'));
84  text = replace_texte(text, '&Otilde;', unescape('%D5'));
85  text = replace_texte(text, '&Ouml;', unescape('%D6'));
86  text = replace_texte(text, '&times;', unescape('%D7'));
87  text = replace_texte(text, '&Oslash;', unescape('%D8'));
88  text = replace_texte(text, '&Ugrave;', unescape('%D9'));
89  text = replace_texte(text, '&Uacute;', unescape('%DA'));
90  text = replace_texte(text, '&Ucirc;', unescape('%DB'));
91  text = replace_texte(text, '&Uuml;', unescape('%DC'));
92  text = replace_texte(text, '&Yacute;', unescape('%DD'));
93  text = replace_texte(text, '&THORN;', unescape('%DE'));
94  text = replace_texte(text, '&szlig;', unescape('%DF'));
95  text = replace_texte(text, '&agrave;', unescape('%E0'));
96  text = replace_texte(text, '&aacute;', unescape('%E1'));
97  text = replace_texte(text, '&acirc;', unescape('%E2'));
98  text = replace_texte(text, '&atilde;', unescape('%E3'));
99  text = replace_texte(text, '&auml;', unescape('%E4'));
100  text = replace_texte(text, '&aring;', unescape('%E5'));
101  text = replace_texte(text, '&aelig;', unescape('%E6'));
102  text = replace_texte(text, '&ccedil;', unescape('%E7'));
103  text = replace_texte(text, '&egrave;', unescape('%E8'));
104  text = replace_texte(text, '&eacute;', unescape('%E9'));
105  text = replace_texte(text, '&ecirc;', unescape('%EA'));
106  text = replace_texte(text, '&euml;', unescape('%EB'));
107  text = replace_texte(text, '&igrave;', unescape('%EC'));
108  text = replace_texte(text, '&iacute;', unescape('%ED'));
109  text = replace_texte(text, '&icirc;', unescape('%EE'));
110  text = replace_texte(text, '&iuml;', unescape('%EF'));
111  text = replace_texte(text, '&eth;', unescape('%F0'));
112  text = replace_texte(text, '&ntilde;', unescape('%F1'));
113  text = replace_texte(text, '&ograve;', unescape('%F2'));
114  text = replace_texte(text, '&oacute;', unescape('%F3'));
115  text = replace_texte(text, '&ocirc;', unescape('%F4'));
116  text = replace_texte(text, '&otilde;', unescape('%F5'));
117  text = replace_texte(text, '&ouml;', unescape('%F6'));
118  text = replace_texte(text, '&divide;', unescape('%F7'));
119  text = replace_texte(text, '&oslash;', unescape('%F8'));
120  text = replace_texte(text, '&ugrave;', unescape('%F9'));
121  text = replace_texte(text, '&uacute;', unescape('%FA'));
122  text = replace_texte(text, '&ucirc;', unescape('%FB'));
123  text = replace_texte(text, '&uuml;', unescape('%FC'));
124  text = replace_texte(text, '&yacute;', unescape('%FD'));
125  text = replace_texte(text, '&thorn;', unescape('%FE'));
126  text = replace_texte(text, '&yuml;', unescape('%FF'));
127  return text;
128
129}
130
131function html_entities(text) {
132
133  text = replace_texte(text, unescape('%22'), '&quot;');
134  text = replace_texte(text, unescape('%26'), '&amp;');
135  text = replace_texte(text, unescape('%3C'), '&lt;');
136  text = replace_texte(text, unescape('%3E'), '&gt;');
137  text = replace_texte(text, unescape('%A0'), '&nbsp;');
138  text = replace_texte(text, unescape('%A1'), '&iexcl;');
139  text = replace_texte(text, unescape('%A2'), '&cent;');
140  text = replace_texte(text, unescape('%A3'), '&pound;');
141  text = replace_texte(text, unescape('%A5'), '&yen;');
142  text = replace_texte(text, unescape('%A6'), '&brvbar;');
143  text = replace_texte(text, unescape('%A7'), '&sect;');
144  text = replace_texte(text, unescape('%A8'), '&uml;');
145  text = replace_texte(text, unescape('%A9'), '&copy;');
146  text = replace_texte(text, unescape('%AA'), '&ordf;');
147  text = replace_texte(text, unescape('%AB'), '&laquo;');
148  text = replace_texte(text, unescape('%AC'), '&not;');
149  text = replace_texte(text, unescape('%AD'), '&shy;');
150  text = replace_texte(text, unescape('%AE'), '&reg;');
151  text = replace_texte(text, unescape('%AF'), '&macr;');
152  text = replace_texte(text, unescape('%B0'), '&deg;');
153  text = replace_texte(text, unescape('%B1'), '&plusmn;');
154  text = replace_texte(text, unescape('%B2'), '&sup2;');
155  text = replace_texte(text, unescape('%B3'), '&sup3;');
156  text = replace_texte(text, unescape('%B4'), '&acute;');
157  text = replace_texte(text, unescape('%B5'), '&micro;');
158  text = replace_texte(text, unescape('%B6'), '&para;');
159  text = replace_texte(text, unescape('%B7'), '&middot;');
160  text = replace_texte(text, unescape('%B8'), '&cedil;');
161  text = replace_texte(text, unescape('%B9'), '&sup1;');
162  text = replace_texte(text, unescape('%BA'), '&ordm;');
163  text = replace_texte(text, unescape('%BB'), '&raquo;');
164  text = replace_texte(text, unescape('%BC'), '&frac14;');
165  text = replace_texte(text, unescape('%BD'), '&frac12;');
166  text = replace_texte(text, unescape('%BE'), '&frac34;');
167  text = replace_texte(text, unescape('%BF'), '&iquest;');
168  text = replace_texte(text, unescape('%C0'), '&Agrave;');
169  text = replace_texte(text, unescape('%C1'), '&Aacute;');
170  text = replace_texte(text, unescape('%C2'), '&Acirc;');
171  text = replace_texte(text, unescape('%C3'), '&Atilde;');
172  text = replace_texte(text, unescape('%C4'), '&Auml;');
173  text = replace_texte(text, unescape('%C5'), '&Aring;');
174  text = replace_texte(text, unescape('%C6'), '&AElig;');
175  text = replace_texte(text, unescape('%C7'), '&Ccedil;');
176  text = replace_texte(text, unescape('%C8'), '&Egrave;');
177  text = replace_texte(text, unescape('%C9'), '&Eacute;');
178  text = replace_texte(text, unescape('%CA'), '&Ecirc;');
179  text = replace_texte(text, unescape('%CB'), '&Euml;');
180  text = replace_texte(text, unescape('%CC'), '&Igrave;');
181  text = replace_texte(text, unescape('%CD'), '&Iacute;');
182  text = replace_texte(text, unescape('%CE'), '&Icirc;');
183  text = replace_texte(text, unescape('%CF'), '&Iuml;');
184  text = replace_texte(text, unescape('%D0'), '&ETH;');
185  text = replace_texte(text, unescape('%D1'), '&Ntilde;');
186  text = replace_texte(text, unescape('%D2'), '&Ograve;');
187  text = replace_texte(text, unescape('%D3'), '&Oacute;');
188  text = replace_texte(text, unescape('%D4'), '&Ocirc;');
189  text = replace_texte(text, unescape('%D5'), '&Otilde;');
190  text = replace_texte(text, unescape('%D6'), '&Ouml;');
191  text = replace_texte(text, unescape('%D7'), '&times;');
192  text = replace_texte(text, unescape('%D8'), '&Oslash;');
193  text = replace_texte(text, unescape('%D9'), '&Ugrave;');
194  text = replace_texte(text, unescape('%DA'), '&Uacute;');
195  text = replace_texte(text, unescape('%DB'), '&Ucirc;');
196  text = replace_texte(text, unescape('%DC'), '&Uuml;');
197  text = replace_texte(text, unescape('%DD'), '&Yacute;');
198  text = replace_texte(text, unescape('%DE'), '&THORN;');
199  text = replace_texte(text, unescape('%DF'), '&szlig;');
200  text = replace_texte(text, unescape('%E0'), '&agrave;');
201  text = replace_texte(text, unescape('%E1'), '&aacute;');
202  text = replace_texte(text, unescape('%E2'), '&acirc;');
203  text = replace_texte(text, unescape('%E3'), '&atilde;');
204  text = replace_texte(text, unescape('%E4'), '&auml;');
205  text = replace_texte(text, unescape('%E5'), '&aring;');
206  text = replace_texte(text, unescape('%E6'), '&aelig;');
207  text = replace_texte(text, unescape('%E7'), '&ccedil;');
208  text = replace_texte(text, unescape('%E8'), '&egrave;');
209  text = replace_texte(text, unescape('%E9'), '&eacute;');
210  text = replace_texte(text, unescape('%EA'), '&ecirc;');
211  text = replace_texte(text, unescape('%EB'), '&euml;');
212  text = replace_texte(text, unescape('%EC'), '&igrave;');
213  text = replace_texte(text, unescape('%ED'), '&iacute;');
214  text = replace_texte(text, unescape('%EE'), '&icirc;');
215  text = replace_texte(text, unescape('%EF'), '&iuml;');
216  text = replace_texte(text, unescape('%F0'), '&eth;');
217  text = replace_texte(text, unescape('%F1'), '&ntilde;');
218  text = replace_texte(text, unescape('%F2'), '&ograve;');
219  text = replace_texte(text, unescape('%F3'), '&oacute;');
220  text = replace_texte(text, unescape('%F4'), '&ocirc;');
221  text = replace_texte(text, unescape('%F5'), '&otilde;');
222  text = replace_texte(text, unescape('%F6'), '&ouml;');
223  text = replace_texte(text, unescape('%F7'), '&divide;');
224  text = replace_texte(text, unescape('%F8'), '&oslash;');
225  text = replace_texte(text, unescape('%F9'), '&ugrave;');
226  text = replace_texte(text, unescape('%FA'), '&uacute;');
227  text = replace_texte(text, unescape('%FB'), '&ucirc;');
228  text = replace_texte(text, unescape('%FC'), '&uuml;');
229  text = replace_texte(text, unescape('%FD'), '&yacute;');
230  text = replace_texte(text, unescape('%FE'), '&thorn;');
231  text = replace_texte(text, unescape('%FF'), '&yuml;');
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.