PageSourceSearch

https://www.ibs.fr/plugins-dist/mediabox/lity/js/lity.mediabox.js?1790084230

js ibs.fr collected 2026-09-25 02:31:48 UTC 22,977 bytes, 678 lines download raw bytes

1;
2(function ($){
3	/*
4	 *  Implémentation de mediabox basée sur Lity
5	 *  https://sorgalla.com/lity/
6	 */
7
8	var litySpip = {
9		nameSpace: 'mediabox',
10		config: {
11			forceFocusInside: true,
12		},
13		strings: {
14		},
15		callbacks: {
16			onOpen: [],
17			onShow: [],
18			onClose: []
19		},
20		focusedItem: [],
21		isTransition: false,
22		adjustHeight: function(instance) {
23			var $content = instance.content();
24			var $containerHeight = instance.element().find('.lity-container').height();
25			if ($containerHeight) {
26				var h = Math.round($containerHeight) + 'px';
27				$content
28					.css('max-height', h)
29					.find('[data-'+litySpip.nameSpace+'-force-max-height]')
30					.css('max-height', h);
31			}
32		},
33		template: function(cfg, type, groupName, groupPosition, groupLength) {
34			var className = '';
35			if (!!cfg.className){
36				className = ' ' + cfg.className;
37			}
38			if (cfg.transitionOnOpen) {
39				className += ' lity-transition-on-open-'+cfg.transitionOnOpen;
40			}
41			if (!!cfg.noTransition) {
42				className += ' lity-no-transition';
43			}
44			if (!!cfg.slideShow) {
45				className += ' lity-slideshow';
46			}
47
48			var styles = [];
49			var styles_container = '';
50			var styles_content = '';
51			// Offcanvas
52			if (cfg.sideBar) {
53				className += ' lity-sidebar lity-sidebar-' + cfg.sideBar;
54				// Garde-fou : forcer hauteur et largeur
55				if (cfg.sideBar === 'start' || cfg.sideBar === 'end') {
56					className += ' lity-sidebar-inline';
57					cfg.height = '100vh';
58					cfg.maxHeight = '100vh';
59				}
60				if (cfg.sideBar === 'top' || cfg.sideBar === 'bottom') {
61					className += ' lity-sidebar-block';
62					cfg.width = '100vw';
63					cfg.maxWidth = '100vw';
64				}
65			}
66			if (cfg.maxWidth) {
67				styles.push("max-width:" + cfg.maxWidth.replace("%","vw"));
68			}
69			if (cfg.maxHeight) {
70				styles.push("max-height:" + cfg.maxHeight.replace("%","vh"));
71			}
72			if (cfg.width) {
73				styles.push("width:" + cfg.width.replace("%","vw"));
74				className += ' lity-width-set';
75			}
76			if (cfg.height) {
77				styles.push("height:" + cfg.height.replace("%","vh"));
78				className += ' lity-height-set';
79				// si il y a un min-height il faut l'appliquer sur le container aussi du coup
80				if (cfg.minHeight) {
81					styles.push("min-height:" + cfg.minHeight.replace("%","vh"));
82				}
83			}
84			if (styles.length) {
85				styles_container = ' style="' + styles.join(';') + '"';
86			}
87
88			styles = [];
89			var max;
90			if (cfg.minWidth) {
91				max = (cfg.maxWidth ? cfg.maxWidth.replace("%","vw") : '95vw');
92				styles.push("min-width:min(" + max + "," + cfg.minWidth.replace("%","vw") + ')');
93			}
94			if (cfg.minHeight && !cfg.height) {
95				max = (cfg.maxHeight ? cfg.maxHeight.replace("%","vw") : '95vh');
96				styles.push("min-height:min(" + max + "," + cfg.minHeight.replace("%","vh") + ')');
97			}
98			if (styles.length) {
99				styles_content = ' style="' + styles.join(';') + '"';
100			}
101
102			var button_next_prev = '',
103				  button_start_stop = '',
104			    group_info_text = '',
105			    group_info = '';
106			if (groupName && groupLength) {
107				if (groupLength > 1) {
108					var newPosition = (groupPosition <= 0 ? groupLength - 1 : groupPosition - 1);
109					button_next_prev += '<button class="lity-previous" type="button" data-group-name="'+groupName+'" data-group-position="'+newPosition+'" aria-label="' + litySpip.strings.previous + '" data-lity-previous'
110						+'><b title="' + litySpip.strings.previous +'">❮</b></button>';
111					newPosition = (groupPosition >= groupLength - 1 ? 0 : groupPosition + 1);
112					button_next_prev += '<button class="lity-next" type="button" data-group-name="'+groupName+'" data-group-position="'+newPosition+'"  aria-label="' + litySpip.strings.next + '" data-lity-next'
113						+'><b title="' + litySpip.strings.next +'">❯</b></button>';
114				}
115				group_info_text = " " + litySpip.strings.current;
116				group_info_text = group_info_text.replace('{current}',(groupPosition+1)+'');
117				group_info_text = group_info_text.replace('{total}',groupLength+'');
118
119				button_start_stop += '<button class="lity-start-stop" type="button" data-lity-stop-start>'
120					+'<b class="lity-start" aria-label="' + litySpip.strings.slideshowStart + '" title="' + litySpip.strings.slideshowStart +'">▶</b>'
121					+'<b class="lity-stop" aria-label="' + litySpip.strings.slideshowStop + '" title="' + litySpip.strings.slideshowStop +'">□</b>'
122				  +'</button>';
123
124				group_info = '<div class="lity-group-caption">'
125					+ '<span class="lity-group-start-stop">' + button_start_stop + '</span>'
126					+ '<span class="lity-group-current">' + group_info_text + '</span>'
127					+ '<span class="lity-group-next-prev">' + button_next_prev + '</span>'
128					+ '<span class="lity-group-progress-bar"><span class="lity-group-progress-bar-status" style="width:0"></span></span>'
129					+ '</div>';
130			}
131			var close_button_aria_label = litySpip.strings.close + ' (' + litySpip.strings.press_escape + ')' ;
132			var dialog_title = (type === 'image' ? litySpip.strings.dialog_title_med : litySpip.strings.dialog_title_def);
133			dialog_title += group_info_text + ' (' + litySpip.strings.press_escape + ')' ;
134
135			var t =
136				  '<dialog class="box_mediabox box_modalbox lity' + className + '" role="dialog" aria-label="' + dialog_title + '" tabindex="-1">'
137				+   '<div class="lity-wrap"' + (cfg.overlayClose === false ? '' : ' data-lity-close') + ' role="document">'
138				+     '<div class="lity-loader" aria-hidden="true" aria-label="' + litySpip.strings.loading + '"><span class="box-loading"></span></div>'
139				+     '<div class="lity-container"' + styles_container + '>'
140				+       '<button class="lity-close" type="button" aria-label="' + close_button_aria_label + '" data-lity-close><b data-lity-close title="' + litySpip.strings.close +'">&times;</b></button>'
141				+       '<div class="lity-content"' + styles_content + '></div>'
142				+       group_info
143				+     '</div>'
144				+   '</div>'
145				+ '</dialog>';
146			return t;
147		},
148		failHandler: function (target, instance) {
149			return '<div class="error lity-error">Failed loading content</div>';
150		},
151		ajaxHandler: function (target, instance){
152			// prise en charge de la syntaxe "url selector" comme jQuery.load()
153			var selector,
154				off = target.indexOf(" ");
155			if (off> -1){
156				selector = target.slice(off);
157				selector = selector.match(/[^\x20\t\r\n\f]+/g) || [];
158				selector = selector.join(" ");
159				target = target.slice(0, off);
160			}
161
162			if (jQuery.spip.preloaded_urls[target]){
163				//console.log("CACHE for "+target);
164				var content = jQuery.spip.preloaded_urls[target];
165				if (selector){
166					// If a selector was specified, locate the right elements in a dummy div
167					// Exclude scripts to avoid IE 'Permission Denied' errors
168					content = $("<div>").append($.parseHTML(content)).find(selector);
169				}
170				return $('<div class="lity-content-inner"></div>').append(content);
171			}
172
173			var _deferred = $.Deferred;
174			var deferred = _deferred();
175			var failed = function (){
176				deferred.reject($('<span class="error lity-error"></span>').append('Failed loading ajax'));
177			};
178			$.get(target)
179				.done(function (content){
180					jQuery.spip.preloaded_urls[target] = content;
181					if (selector){
182						// If a selector was specified, locate the right elements in a dummy div
183						// Exclude scripts to avoid IE 'Permission Denied' errors
184						content = $("<div>").append($.parseHTML(content)).find(selector);
185					}
186					deferred.resolve($('<div class="lity-content-inner"></div>').append(content));
187				})
188				.fail(failed);
189			return deferred.promise();
190		},
191		imageBuildContent: function(img, desc, longdesc, defaultCaptionClass) {
192			img.attr('alt', desc ? desc : '');
193			desc = (longdesc ? longdesc : desc);
194			if (desc){
195				defaultCaptionClass = (defaultCaptionClass ? defaultCaptionClass : 'expanded');
196				var id = 'lity-image-caption-' + Date.now().toString(36) + Math.random().toString(36).substr(2);
197				img.attr('aria-describedby', id);
198				img = $('<figure class="lity-image-figure"></figure>').append(img).append('<figcaption id="'+id+'" class="lity-image-caption '+defaultCaptionClass+'"><div class="lity-image-caption-text">'+desc+'</div></figcaption>');
199			}
200			else {
201				img = $('<figure class="lity-image-figure"></figure>').append(img);
202			}
203			return img;
204		},
205		imageHandler: function (target, instance){
206			var _deferred = $.Deferred;
207			var desc = '';
208			var longdesc = '';
209			var defaultCaptionClass = (instance.options().defaultCaptionState === 'min' ? 'min' : 'expanded');
210			var opener = instance.opener();
211			if (opener){
212				desc = opener.attr('title') || $('img[alt]', opener).eq(0).attr('alt') || '';
213				var by = opener.attr('aria-describedby') || $('img[aria-describedby]', opener).eq(0).attr('aria-describedby') || '';
214				if (by){
215					longdesc = $('#'+by).html();
216					longdesc = longdesc.trim();
217				}
218				if (!desc){
219					desc = desc || instance.opener().attr('aria-label') || '';
220				}
221				desc = desc.trim();
222			}
223
224			var img;
225			var cache = opener.data('lity-image-cache') || {};
226			if (cache[target]) {
227				//console.log("CACHE for "+target);
228				img = cache[target];
229				img = litySpip.imageBuildContent(img, desc, longdesc, defaultCaptionClass);
230				return img;
231			}
232
233			img = $('<img src="'+target+'" class="lity-image-img" data-'+litySpip.nameSpace+'-force-max-height />');
234			var deferred = _deferred();
235			var failed = function (){
236				deferred.reject($('<span class="error lity-error"></span>').append('Failed loading image'));
237			};
238			img
239				.on('load', function (){
240					if (this.naturalWidth===0){
241						//console.log("image "+target+" naturalWidth=0");
242						// forcons une largeur arbitraire pour rendre l'image visible...
243						img.attr("style", "width:25vw;");
244					}
245					cache[target] = img;
246					opener.data('lity-image-cache', cache);
247
248					deferred.resolve(litySpip.imageBuildContent(img, desc, longdesc, defaultCaptionClass));
249				})
250				.on('error', failed)
251			;
252
253			return deferred.promise();
254		},
255		groupElements: function(groupName) {
256			return $('.lity-enabled[data-'+litySpip.nameSpace+'-group'+'='+groupName+']');
257		},
258		eventSet:{},
259		setEvents: function(what) {
260			if (!litySpip.eventSet[what]) {
261				switch (what) {
262					case 'opener':
263						$(document).on('click', '.lity-enabled', litySpip.onClickOpener);
264						break;
265					case 'listener':
266						$(document).on('click', '.lity-previous,.lity-next', litySpip.onPrevNext);
267						$(document).on('click', '.lity-start-stop', litySpip.onSlideShowToggle);
268						$(window).on('keyup', litySpip.onKeyUp);
269						$(document).on('click', '.lity-image-caption', litySpip.onCaptionToggle);
270						break;
271				}
272				litySpip.eventSet[what] = true;
273			}
274		},
275		onKeyUp: function(event) {
276			var c = {37: "previous", 39: "next"}[event.keyCode];
277			//console.log(['keyup', event.keyCode, c]);
278			if (c) {
279				var current = lity.current();
280				if (current) {
281					jQuery('.lity-' + c, current.element()).trigger('click');
282				}
283			}
284		},
285		onCaptionToggle: function(event) {
286			var $caption = $(this);
287			$caption.toggleClass('min expanded');
288		},
289		openerFromPrevNext($button) {
290			var groupName = $button.data('group-name');
291			var groupPosition = $button.data('group-position');
292			return litySpip.groupElements(groupName).eq(groupPosition);
293		},
294		onPrevNext: function(event) {
295			var $button = $(this);
296			var newEl = litySpip.openerFromPrevNext($button);
297			if (newEl) {
298				var element = lity.current().element();
299				litySpip.isTransition = {oldClosed:false, newOpened:true};
300				element.addClass('lity-no-transition').css('visibility','hidden');
301				litySpip.slideshowStop(element);
302				var options = {transitionOnOpen: $button.is('.lity-next') ? 'slide-from-right' : 'slide-from-left'};
303				if (element.is('.lity-slideshow')) {
304					options.slideShow = true;
305				}
306				lity.current().close();
307				litySpip.elementOpener(newEl, options);
308			}
309		},
310		slideshowStart: function(element) {
311			var $progress = element.find('.lity-group-progress-bar-status');
312			$progress.attr('style','');
313			$progress.css('width','100%');
314			var delay = litySpip.config.slideshowSpeed;
315			setTimeout(function(){
316				$progress.css('transition','width ' + ((delay-200)/1000) + 's linear');
317				$progress.css('width','0');
318			},200);
319			timer = setTimeout(function(){element.find('.lity-next').trigger('click')}, delay);
320			element.data('lity-timer', timer);
321			$('.lity-start', element).attr('aria-hidden', 'true');
322			$('.lity-stop', element).attr('aria-hidden', 'false');
323			jQuery('.lity-start-stop',element).focus();
324		},
325		slideshowStop: function(element) {
326			timer = element.data('lity-timer');
327			if (timer) {
328				clearTimeout(timer);
329			}
330		},
331		onSlideShowToggle: function(event) {
332			var $button = $(this);
333			var element = $button.closest('.lity');
334			var slideShowState = (element.is('.lity-slideshow') ? true : false);
335			var timer;
336
337			if (!slideShowState) {
338				litySpip.slideshowStart(element);
339			}
340			else {
341				litySpip.slideshowStop(element);
342				$('.lity-start', element).attr('aria-hidden', 'false');
343				$('.lity-stop', element).attr('aria-hidden', 'true');
344			}
345			element.toggleClass('lity-slideshow');
346
347		},
348		onClickOpener: function(event) {
349			event.preventDefault();
350
351			var opener = $(this);
352			litySpip.elementOpener(opener);
353		},
354		elementOpener: function(opener, options) {
355			var cfg = opener.data('mediabox-options');
356			if (options) {
357				cfg = $.extend({}, cfg, options);
358			}
359			var target = opener.data('href-popin') || opener.data('href') || opener.attr('href') || opener.attr('src');
360
361			litySpip.lityOpener(target, cfg, opener.get(0));
362		},
363		lityOpener: function(target, cfg, opener) {
364			litySpip.setEvents('listener');
365			if (!litySpip.isTransition) {
366				// routage des callbacks
367				litySpip.callbacks.onOpen.push(cfg.onOpen || false);
368				litySpip.callbacks.onShow.push(cfg.onShow || false);
369				litySpip.callbacks.onClose.push(cfg.onClose || false);
370
371				// memoriser le focus
372				litySpip.focusedItem.push($(document.activeElement));
373			}
374
375			var type = cfg.type || '';
376			if (!type && opener) {
377				type = $(opener).data(litySpip.nameSpace+'-type') || '';
378			}
379
380			var handlers = lity.handlers();
381			// ajouter le handler ajax si besoin
382			if (type==='ajax'){
383				handlers.ajax = litySpip.ajaxHandler;
384			}
385			handlers.image = litySpip.imageHandler;
386			// si on est inline, router sur le handler fail si la cible n'existe pas
387			if (type==='inline'){
388				var el = [];
389				try {
390					el = $(target);
391				} catch (e) {
392					el = [];
393				}
394				if (!el.length){
395					handlers.inline = litySpip.failHandler;
396				}
397			}
398			cfg = $.extend({handlers: handlers}, cfg);
399			if (type && ['image', 'inline', 'ajax', 'iframe'].indexOf(type)!== -1){
400				cfg.handler = type;
401			}
402
403			if (opener && typeof($.parseMediaboxOptions) !== "undefined") {
404				cfg = $.extend(cfg, $.parseMediaboxOptions(litySpip.nameSpace, opener));
405			}
406
407			if (!!cfg.preloadOnly) {
408				litySpip.lityPreLoader(target, cfg, opener);
409			}
410			else {
411				// est-ce une galerie ?
412				var groupPosition = 0;
413				var groupLength = 0;
414				if (opener) {
415					var groupName = cfg.rel || (opener ? $(opener).data(litySpip.nameSpace+'-group') : '');
416					if (groupName) {
417						var elements = litySpip.groupElements(groupName);
418						groupPosition = elements.index($(opener));
419						groupLength = elements.length;
420					}
421					//console.log({type:type, groupName: groupName, groupPosition: groupPosition, groupLength: groupLength});
422				}
423
424				cfg = $.extend({template: litySpip.template(cfg, type, groupName, groupPosition, groupLength)}, cfg);
425				//console.log("Call lity "+cfg.handler+' '+target);
426
427				// est-ce qu'on veut rester sur le meme niveau de popin (pas d'empilage) ?
428				//console.log("samePopin", cfg.samePopin, lity.current());
429				if (cfg.samePopin) {
430					var l = lity.current();
431					if (l) {
432						l.close();
433					}
434				}
435
436				lity(target, cfg, opener);
437			}
438
439		},
440		lityPreLoader: function (target, cfg, opener) {
441			//console.log("lityPreLoader " + target);
442			if (cfg.handler && cfg.handlers[cfg.handler]) {
443				if (cfg.handler === 'image' || cfg.handler === 'ajax') {
444					var instance = {
445						opener: function() { return $(opener);},
446						options: function() { return cfg}
447					};
448					var content = cfg.handlers[cfg.handler](target, instance);
449				}
450			}
451		},
452		// Rechargement ajax d'une liste d'éléments séparés par des virgules
453		ajaxReloadElements: function(elements) {
454			const targets = elements
455				.split(',')
456				.map(s => s.trim())
457				.filter(Boolean);
458			targets.forEach(function(target) {
459				try {
460					// Soit c'est un sélecteur CSS (autre qu'une balise) : .truc #truc [truc]
461					if (/^[.#[]/.test(target)) {
462						const $element = $(target);
463						if ($element.length) {
464							$element.ajaxReload();
465						}
466					// Soit c'est un identifiant ajax
467					} else {
468						ajaxReload(target);
469					}
470				} catch (e) {
471					console.warn("Mediabox ajaxReloadElements : erreur lors du traitement de '" + target + "'.", e);
472				}
473			});
474		}
475	}
476
477	jQuery.fn.extend({
478
479		mediabox: function (options){
480			var cfg = $.extend({}, litySpip.config, options);
481
482
483			if (this===jQuery.fn){
484				var href = cfg.href || ""; // content
485				litySpip.lityOpener(href, cfg, null);
486				return this;
487			} else {
488
489				if (cfg.rel) {
490					this.attr('data-'+litySpip.nameSpace+'-group', cfg.rel);
491				}
492				else {
493					this.each(function() {
494						var rel = $(this).attr('rel');
495						if (rel) {
496							$(this).attr('data-'+litySpip.nameSpace+'-group', rel);
497						}
498					});
499				}
500
501				litySpip.setEvents('opener');
502
503				this
504					.data('mediabox-options', cfg)
505					.addClass('lity-enabled');
506
507				(cfg.preload ? this : this.filter('[data-'+litySpip.nameSpace+'-preload]')).each(function() {
508					litySpip.elementOpener($(this),{preloadOnly: true});
509				});
510
511				return this;
512			}
513		},
514
515		mediaboxClose: function (){
516			var $current = lity.current();
517			if ($current){
518				$current.close();
519				return true;
520			}
521			return false;
522		}
523
524	});
525
526	var initConfig = function (){
527
528		// recuperer les préférences de l'utilisateur
529		var b = typeof (mediabox_settings)=='object' ? mediabox_settings : {};
530		litySpip.nameSpace = b.ns ? b.ns : 'mediabox';
531
532		litySpip.strings.slideshowStart = b.str_ssStart;
533		litySpip.strings.slideshowStop = b.str_ssStop;
534		litySpip.strings.current = b.str_cur;
535		litySpip.strings.previous = b.str_prev;
536		litySpip.strings.next = b.str_next;
537		litySpip.strings.close = b.str_close;
538		litySpip.strings.loading = b.str_loading;
539		litySpip.strings.press_escape = b.str_petc;
540		litySpip.strings.dialog_title_def = b.str_dialTitDef;
541		litySpip.strings.dialog_title_med = b.str_dialTitMed;
542		litySpip.config.slideshowSpeed = (b.lity.slideshow_speed ? b.lity.slideshow_speed : 5000);
543		litySpip.config.defaultCaptionState = (b.lity.defaultCaptionState ? b.lity.defaultCaptionState : 'expanded');
544
545		var styles = {
546			'container': '',
547			'content': '',
548		};
549		var max;
550		if (b.lity.minWidth) {
551			max = (b.lity.maxWidth ? b.lity.maxWidth.replace('%','vw') : '95vw');
552			styles.content += "min-width:min(" + max + ","+b.lity.minWidth.replace('%','vw')+');';
553		}
554		if (b.lity.maxWidth) {
555			styles.container += "max-width:"+b.lity.maxWidth.replace('%','vw')+';';
556		}
557		if (b.lity.minHeight) {
558			max = (b.lity.maxHeight ? b.lity.maxHeight.replace('%','vw') : '95vh');
559			styles.content += "min-height:min(" + max + ","+b.lity.minHeight.replace('%','vh')+');';
560		}
561		if (b.lity.maxHeight) {
562			styles.container += "max-height:"+b.lity.maxHeight.replace('%','vh')+';';
563		}
564		var insert = '';
565		for (let key in styles) {
566			if (styles[key]) {
567				insert += '.box_mediabox .lity-' + key + '{' + styles[key] + '}';
568			}
569		}
570		if (b.lity.opacite) {
571			insert += '.box_mediabox:before{opacity:'+b.lity.opacite+'}';
572		}
573		if (insert) {
574			$('head').append($('<style type="text/css">'+insert+'</style>'));
575		}
576
577
578		$(document).on('lity:open', function(event, instance) {
579			// Si un élément de la page est actuellement en plein écran natif, la box reste invisible
580			// tant qu'elle n'est pas un descendant de cet élément : on la déplace donc dedans
581			if (document.fullscreenElement) {
582				document.fullscreenElement.appendChild(instance.element().get(0));
583			}
584
585			if (!instance.element().is('.lity-slideshow')){
586				jQuery('.lity-close', instance.element()).focus();
587			}
588			if (!litySpip.isTransition){
589				//console.log('Lity opened');
590				//instance.element.is('.lity-no-transition-on-open').removeClass('lity-no-transition-on-open');
591				// placer le focus sur le bouton close
592				var callback = litySpip.callbacks.onOpen.pop();
593				if (callback){
594					callback(event, instance);
595				}
596			}
597		});
598		$(document).on('lity:ready', function(event, instance) {
599			litySpip.adjustHeight(instance);
600			if (jQuery.spip) {
601				jQuery.spip.triggerAjaxLoad(instance.element().get(0))
602			}
603			if (instance.element().addClass('lity-ready').is('.lity-slideshow')) {
604				litySpip.slideshowStart(instance.element());
605			}
606			if (!litySpip.isTransition){
607				//console.log('Lity ready');
608				var callback = litySpip.callbacks.onShow.pop();
609				if (callback){
610					callback(event, instance);
611				}
612			}
613			else {
614				litySpip.isTransition.newOpened = true;
615				if (litySpip.isTransition.oldClosed) {
616					litySpip.isTransition = false; // transition terminee
617				}
618				// trigger un resize, c'est un minimum
619				instance.content().trigger('lity:resize', [instance]);
620			}
621			// preloader le next si on est dans une galerie
622			var $next = instance.element().find('.lity-next');
623			if ($next.length) {
624				$next = litySpip.openerFromPrevNext($next);
625				if ($next) {
626					litySpip.elementOpener($next, {preloadOnly: true});
627				}
628			}
629		});
630		$(document).on('lity:close', function(event, instance) {
631			if (!litySpip.isTransition){
632				//console.log('Lity close');
633				// depiler si la box a ete fermee avant d'etre ready
634				if (litySpip.callbacks.onShow.length > litySpip.callbacks.onOpen.length) {
635					litySpip.callbacks.onShow.pop();
636				}
637				var callback = litySpip.callbacks.onClose.pop();
638				if (callback) {
639					callback(event, instance);
640				}
641				// Option ajaxReloadonClose
642				let options = instance.options();
643				let ajaxReloadArgs = options.ajaxReloadOnClose;
644				if (ajaxReloadArgs && typeof(ajaxReloadArgs) === 'string') {
645					litySpip.ajaxReloadElements(ajaxReloadArgs);
646				}
647			}
648		});
649		$(document).on('lity:remove', function(event, instance) {
650			if (!litySpip.isTransition){
651				//console.log('Lity remove');
652				var focused = litySpip.focusedItem.pop();
653				if (focused){
654					try {
655						focused.focus();
656					} catch (e) {
657						// Ignore exceptions, eg. for SVG elements which can't be
658						// focused in IE11
659					}
660				}
661			}
662			else {
663				litySpip.isTransition.oldClosed = true;
664				if (litySpip.isTransition.newOpened) {
665					litySpip.isTransition = false; // transition terminee
666				}
667			}
668		});
669		$(document).on('lity:resize', function(event, instance) {
670			//console.log('Lity resize');
671			litySpip.adjustHeight(instance);
672		});
673
674	}
675	// on écrase la config juste une fois
676	initConfig();
677
678})(jQuery);

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.