PageSourceSearch

https://www.amstetten.at/wp2021/wp-content/plugins/ewww-image-opti…/includes/load-webp.js?ts=6ab58ff48af322026

js amstetten.at collected 2026-09-24 23:53:25 UTC 32,483 bytes, 688 lines download raw bytes

1/*globals jQuery,Window,HTMLElement,HTMLDocument,HTMLCollection,NodeList,MutationObserver */
2/*exported Arrive*/
3/*jshint latedef:false */
4
5/*
6 * arrive.js
7 * v2.4.1
8 * https://github.com/uzairfarooq/arrive
9 * MIT licensed
10 *
11 * Copyright (c) 2014-2017 Uzair Farooq
12 */
13var Arrive = (function(window, $, undefined) {
14
15        "use strict";
16
17        if(!window.MutationObserver || typeof HTMLElement === 'undefined'){
18                return; //for unsupported browsers
19        }
20
21        var arriveUniqueId = 0;
22
23        var utils = (function() {
24                var matches = HTMLElement.prototype.matches || HTMLElement.prototype.webkitMatchesSelector || HTMLElement.prototype.mozMatchesSelector
25                || HTMLElement.prototype.msMatchesSelector;
26
27                return {
28                        matchesSelector: function(elem, selector) {
29                                return elem instanceof HTMLElement && matches.call(elem, selector);
30                        },
31                        // to enable function overloading - By John Resig (MIT Licensed)
32                        addMethod: function (object, name, fn) {
33                                var old = object[ name ];
34                                object[ name ] = function(){
35                                        if ( fn.length == arguments.length ) {
36                                                return fn.apply( this, arguments );
37                                        }
38                                        else if ( typeof old == 'function' ) {
39                                                return old.apply( this, arguments );
40                                        }
41                                };
42                        },
43                        callCallbacks: function(callbacksToBeCalled, registrationData) {
44                                if (registrationData && registrationData.options.onceOnly && registrationData.firedElems.length == 1) {
45                                        // as onlyOnce param is true, make sure we fire the event for only one item
46                                        callbacksToBeCalled = [callbacksToBeCalled[0]];
47                                }
48
49                                for (var i = 0, cb; (cb = callbacksToBeCalled[i]); i++) {
50                                        if (cb && cb.callback) {
51                                                cb.callback.call(cb.elem, cb.elem);
52                                        }
53                                }
54
55                                if (registrationData && registrationData.options.onceOnly && registrationData.firedElems.length == 1) {
56                                        // unbind event after first callback as onceOnly is true.
57                                        registrationData.me.unbindEventWithSelectorAndCallback.call(
58                                                registrationData.target, registrationData.selector, registrationData.callback
59                                        );
60                                }
61                        },
62                        // traverse through all descendants of a node to check if event should be fired for any descendant
63                        checkChildNodesRecursively: function(nodes, registrationData, matchFunc, callbacksToBeCalled) {
64                                // check each new node if it matches the selector
65                                for (var i=0, node; (node = nodes[i]); i++) {
66                                        if (matchFunc(node, registrationData, callbacksToBeCalled)) {
67                                                callbacksToBeCalled.push({ callback: registrationData.callback, elem: node });
68                                        }
69
70                                        if (node.childNodes.length > 0) {
71                                                utils.checkChildNodesRecursively(node.childNodes, registrationData, matchFunc, callbacksToBeCalled);
72                                        }
73                                }
74                        },
75                        mergeArrays: function(firstArr, secondArr){
76                                // Overwrites default options with user-defined options.
77                                var options = {},
78                                attrName;
79                                for (attrName in firstArr) {
80                                        if (firstArr.hasOwnProperty(attrName)) {
81                                                options[attrName] = firstArr[attrName];
82                                        }
83                                }
84                                for (attrName in secondArr) {
85                                        if (secondArr.hasOwnProperty(attrName)) {
86                                                options[attrName] = secondArr[attrName];
87                                        }
88                                }
89                                return options;
90                        },
91                        toElementsArray: function (elements) {
92                                // check if object is an array (or array like object)
93                                // Note: window object has .length property but it's not array of elements so don't consider it an array
94                                if (typeof elements !== 'undefined' && (typeof elements.length !== 'number' || elements === window)) {
95                                        elements = [elements];
96                                }
97                                return elements;
98                        }
99                };
100        })();
101
102
103        // Class to maintain state of all registered events of a single type
104        var EventsBucket = (function() {
105                var EventsBucket = function() {
106                        // holds all the events
107
108                        this._eventsBucket    = [];
109                        // function to be called while adding an event, the function should do the event initialization/registration
110                        this._beforeAdding    = null;
111                        // function to be called while removing an event, the function should do the event destruction
112                        this._beforeRemoving  = null;
113                };
114
115                EventsBucket.prototype.addEvent = function(target, selector, options, callback) {
116                        var newEvent = {
117                                target:             target,
118                                selector:           selector,
119                                options:            options,
120                                callback:           callback,
121                                firedElems:         []
122                        };
123
124                        if (this._beforeAdding) {
125                                this._beforeAdding(newEvent);
126                        }
127
128                        this._eventsBucket.push(newEvent);
129                        return newEvent;
130                };
131
132                EventsBucket.prototype.removeEvent = function(compareFunction) {
133                        for (var i=this._eventsBucket.length - 1, registeredEvent; (registeredEvent = this._eventsBucket[i]); i--) {
134                                if (compareFunction(registeredEvent)) {
135                                        if (this._beforeRemoving) {
136                                                this._beforeRemoving(registeredEvent);
137                                        }
138
139                                        // mark callback as null so that even if an event mutation was already triggered it does not call callback
140                                        var removedEvents = this._eventsBucket.splice(i, 1);
141                                        if (removedEvents && removedEvents.length) {
142                                                removedEvents[0].callback = null;
143                                        }
144                                }
145                        }
146                };
147
148                EventsBucket.prototype.beforeAdding = function(beforeAdding) {
149                        this._beforeAdding = beforeAdding;
150                };
151
152                EventsBucket.prototype.beforeRemoving = function(beforeRemoving) {
153                        this._beforeRemoving = beforeRemoving;
154                };
155
156                return EventsBucket;
157        })();
158
159
160        /**
161        * @constructor
162        * General class for binding/unbinding arrive and leave events
163        */
164        var MutationEvents = function(getObserverConfig, onMutation) {
165                var eventsBucket    = new EventsBucket(),
166                me              = this;
167
168                var defaultOptions = {
169                        fireOnAttributesModification: false
170                };
171
172                // actual event registration before adding it to bucket
173                eventsBucket.beforeAdding(function(registrationData) {
174                        var
175                        target    = registrationData.target,
176                        observer;
177
178                        // mutation observer does not work on window or document
179                        if (target === window.document || target === window) {
180                                target = document.getElementsByTagName("html")[0];
181                        }
182
183                        // Create an observer instance
184                        observer = new MutationObserver(function(e) {
185                                onMutation.call(this, e, registrationData);
186                        });
187
188                        var config = getObserverConfig(registrationData.options);
189
190                        observer.observe(target, config);
191
192                        registrationData.observer = observer;
193                        registrationData.me = me;
194                });
195
196                // cleanup/unregister before removing an event
197                eventsBucket.beforeRemoving(function (eventData) {
198                        eventData.observer.disconnect();
199                });
200
201                this.bindEvent = function(selector, options, callback) {
202                        options = utils.mergeArrays(defaultOptions, options);
203
204                        var elements = utils.toElementsArray(this);
205
206                        for (var i = 0; i < elements.length; i++) {
207                                eventsBucket.addEvent(elements[i], selector, options, callback);
208                        }
209                };
210
211                this.unbindEvent = function() {
212                        var elements = utils.toElementsArray(this);
213                        eventsBucket.removeEvent(function(eventObj) {
214                                for (var i = 0; i < elements.length; i++) {
215                                        if (this === undefined || eventObj.target === elements[i]) {
216                                                return true;
217                                        }
218                                }
219                                return false;
220                        });
221                };
222
223                this.unbindEventWithSelectorOrCallback = function(selector) {
224                        var elements = utils.toElementsArray(this),
225                        callback = selector,
226                        compareFunction;
227
228                        if (typeof selector === "function") {
229                                compareFunction = function(eventObj) {
230                                        for (var i = 0; i < elements.length; i++) {
231                                                if ((this === undefined || eventObj.target === elements[i]) && eventObj.callback === callback) {
232                                                        return true;
233                                                }
234                                        }
235                                        return false;
236                                };
237                        }
238                        else {
239                                compareFunction = function(eventObj) {
240                                        for (var i = 0; i < elements.length; i++) {
241                                                if ((this === undefined || eventObj.target === elements[i]) && eventObj.selector === selector) {
242                                                        return true;
243                                                }
244                                        }
245                                        return false;
246                                };
247                        }
248                        eventsBucket.removeEvent(compareFunction);
249                };
250
251                this.unbindEventWithSelectorAndCallback = function(selector, callback) {
252                        var elements = utils.toElementsArray(this);
253                        eventsBucket.removeEvent(function(eventObj) {
254                                for (var i = 0; i < elements.length; i++) {
255                                        if ((this === undefined || eventObj.target === elements[i]) && eventObj.selector === selector && eventObj.callback === callback) {
256                                                return true;
257                                        }
258                                }
259                                return false;
260                        });
261                };
262
263                return this;
264        };
265
266
267        /**
268        * @constructor
269        * Processes 'arrive' events
270        */
271        var ArriveEvents = function() {
272                // Default options for 'arrive' event
273                var arriveDefaultOptions = {
274                        fireOnAttributesModification: false,
275                        onceOnly: false,
276                        existing: false
277                };
278
279                function getArriveObserverConfig(options) {
280                        var config = {
281                                attributes: false,
282                                childList: true,
283                                subtree: true
284                        };
285
286                        if (options.fireOnAttributesModification) {
287                                config.attributes = true;
288                        }
289
290                        return config;
291                }
292
293                function onArriveMutation(mutations, registrationData) {
294                        mutations.forEach(function( mutation ) {
295                                var newNodes    = mutation.addedNodes,
296                                targetNode = mutation.target,
297                                callbacksToBeCalled = [],
298                                node;
299
300                                // If new nodes are added
301                                if( newNodes !== null && newNodes.length > 0 ) {
302                                        utils.checkChildNodesRecursively(newNodes, registrationData, nodeMatchFunc, callbacksToBeCalled);
303                                }
304                                else if (mutation.type === "attributes") {
305                                        if (nodeMatchFunc(targetNode, registrationData, callbacksToBeCalled)) {
306                                                callbacksToBeCalled.push({ callback: registrationData.callback, elem: targetNode });
307                                        }
308                                }
309
310                                utils.callCallbacks(callbacksToBeCalled, registrationData);
311                        });
312                }
313
314                function nodeMatchFunc(node, registrationData, callbacksToBeCalled) {
315                        // check a single node to see if it matches the selector
316                        if (utils.matchesSelector(node, registrationData.selector)) {
317                                if(node._id === undefined) {
318                                        node._id = arriveUniqueId++;
319                                }
320                                // make sure the arrive event is not already fired for the element
321                                if (registrationData.firedElems.indexOf(node._id) == -1) {
322                                        registrationData.firedElems.push(node._id);
323
324                                        return true;
325                                }
326                        }
327
328                        return false;
329                }
330
331                arriveEvents = new MutationEvents(getArriveObserverConfig, onArriveMutation);
332
333                var mutationBindEvent = arriveEvents.bindEvent;
334
335                // override bindEvent function
336                arriveEvents.bindEvent = function(selector, options, callback) {
337
338                        if (typeof callback === "undefined") {
339                                callback = options;
340                                options = arriveDefaultOptions;
341                        } else {
342                                options = utils.mergeArrays(arriveDefaultOptions, options);
343                        }
344
345                        var elements = utils.toElementsArray(this);
346
347                        if (options.existing) {
348                                var existing = [];
349
350                                for (var i = 0; i < elements.length; i++) {
351                                        var nodes = elements[i].querySelectorAll(selector);
352                                        for (var j = 0; j < nodes.length; j++) {
353                                                existing.push({ callback: callback, elem: nodes[j] });
354                                        }
355                                }
356
357                                // no need to bind event if the callback has to be fired only once and we have already found the element
358                                if (options.onceOnly && existing.length) {
359                                        return callback.call(existing[0].elem, existing[0].elem);
360                                }
361
362                                setTimeout(utils.callCallbacks, 1, existing);
363                        }
364
365                        mutationBindEvent.call(this, selector, options, callback);
366                };
367
368                return arriveEvents;
369        };
370
371
372        /**
373        * @constructor
374        * Processes 'leave' events
375        */
376        var LeaveEvents = function() {
377                // Default options for 'leave' event
378                var leaveDefaultOptions = {};
379
380                function getLeaveObserverConfig() {
381                        var config = {
382                                childList: true,
383                                subtree: true
384                        };
385
386                        return config;
387                }
388
389                function onLeaveMutation(mutations, registrationData) {
390                        mutations.forEach(function( mutation ) {
391                                var removedNodes  = mutation.removedNodes,
392                                callbacksToBeCalled = [];
393
394                                if( removedNodes !== null && removedNodes.length > 0 ) {
395                                        utils.checkChildNodesRecursively(removedNodes, registrationData, nodeMatchFunc, callbacksToBeCalled);
396                                }
397
398                                utils.callCallbacks(callbacksToBeCalled, registrationData);
399                        });
400                }
401
402                function nodeMatchFunc(node, registrationData) {
403                        return utils.matchesSelector(node, registrationData.selector);
404                }
405
406                leaveEvents = new MutationEvents(getLeaveObserverConfig, onLeaveMutation);
407
408                var mutationBindEvent = leaveEvents.bindEvent;
409
410                // override bindEvent function
411                leaveEvents.bindEvent = function(selector, options, callback) {
412
413                        if (typeof callback === "undefined") {
414                                callback = options;
415                                options = leaveDefaultOptions;
416                        } else {
417                                options = utils.mergeArrays(leaveDefaultOptions, options);
418                        }
419
420                        mutationBindEvent.call(this, selector, options, callback);
421                };
422
423                return leaveEvents;
424        };
425
426
427        var arriveEvents = new ArriveEvents(),
428        leaveEvents  = new LeaveEvents();
429
430        function exposeUnbindApi(eventObj, exposeTo, funcName) {
431                // expose unbind function with function overriding
432                utils.addMethod(exposeTo, funcName, eventObj.unbindEvent);
433                utils.addMethod(exposeTo, funcName, eventObj.unbindEventWithSelectorOrCallback);
434                utils.addMethod(exposeTo, funcName, eventObj.unbindEventWithSelectorAndCallback);
435        }
436
437        /*** expose APIs ***/
438        function exposeApi(exposeTo) {
439                exposeTo.arrive = arriveEvents.bindEvent;
440                exposeUnbindApi(arriveEvents, exposeTo, "unbindArrive");
441
442                exposeTo.leave = leaveEvents.bindEvent;
443                exposeUnbindApi(leaveEvents, exposeTo, "unbindLeave");
444        }
445
446        exposeApi(HTMLElement.prototype);
447        exposeApi(NodeList.prototype);
448        exposeApi(HTMLCollection.prototype);
449        exposeApi(HTMLDocument.prototype);
450        exposeApi(Window.prototype);
451
452        var Arrive = {};
453        // expose functions to unbind all arrive/leave events
454        exposeUnbindApi(arriveEvents, Arrive, "unbindAllArrive");
455        exposeUnbindApi(leaveEvents, Arrive, "unbindAllLeave");
456
457        return Arrive;
458
459})(window, null, undefined);
460
461var ewww_webp_supported = false;
462// webp detection adapted from https://developers.google.com/speed/webp/faq#how_can_i_detect_browser_support_using_javascript
463function check_webp_feature(feature, callback) {
464	if (ewww_webp_supported) {
465		callback(ewww_webp_supported);
466		return;
467	}
468	var kTestImages = {
469		alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
470		animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
471	};
472	var img = new Image();
473	img.onload = function () {
474		ewww_webp_supported = (img.width > 0) && (img.height > 0);
475		callback(ewww_webp_supported);
476	};
477	img.onerror = function () {
478		callback(false);
479	};
480	img.src = "data:image/webp;base64," + kTestImages[feature];
481}
482function ewwwLoadImages(ewww_webp_supported) {
483	if (ewww_webp_supported) {
484		var nggImages = document.querySelectorAll('.batch-image img, .image-wrapper a, .ngg-pro-masonry-item a, .ngg-galleria-offscreen-seo-wrapper a');
485		for (var i = 0, len = nggImages.length; i < len; i++){
486			ewwwAttr(nggImages[i], 'data-src', nggImages[i].getAttribute('data-webp'));
487			ewwwAttr(nggImages[i], 'data-thumbnail', nggImages[i].getAttribute('data-webp-thumbnail'));
488		}
489		var wooImages = document.querySelectorAll('div.woocommerce-product-gallery__image');
490		for (var i = 0, len = wooImages.length; i < len; i++){
491			ewwwAttr(wooImages[i], 'data-thumb', wooImages[i].getAttribute('data-webp-thumb'));
492		}
493	}
494        var videos = document.querySelectorAll('video');
495	for (var i = 0, len = videos.length; i < len; i++){
496		if (ewww_webp_supported) {
497			ewwwAttr(videos[i], 'poster', videos[i].getAttribute('data-poster-webp'));
498		} else {
499			ewwwAttr(videos[i], 'poster', videos[i].getAttribute('data-poster-image'));
500		}
501	}
502	var lazies = document.querySelectorAll('img.ewww_webp_lazy_load');
503	for (var i = 0, len = lazies.length; i < len; i++){
504		console.log('parsing an image: ' + lazies[i].getAttribute('data-src'));
505		if (ewww_webp_supported) {
506			console.log('webp good');
507			ewwwAttr(lazies[i], 'data-lazy-srcset', lazies[i].getAttribute('data-lazy-srcset-webp'));
508			ewwwAttr(lazies[i], 'data-srcset', lazies[i].getAttribute('data-srcset-webp'));
509			ewwwAttr(lazies[i], 'data-lazy-src', lazies[i].getAttribute('data-lazy-src-webp'));
510			ewwwAttr(lazies[i], 'data-src', lazies[i].getAttribute('data-src-webp'));
511			ewwwAttr(lazies[i], 'data-orig-file', lazies[i].getAttribute('data-webp-orig-file'));
512			ewwwAttr(lazies[i], 'data-medium-file', lazies[i].getAttribute('data-webp-medium-file'));
513			ewwwAttr(lazies[i], 'data-large-file', lazies[i].getAttribute('data-webp-large-file'));
514			var jpsrcset = lazies[i].getAttribute('srcset');
515			if (jpsrcset != null && jpsrcset !== false && jpsrcset.includes('R0lGOD')) {
516				ewwwAttr(lazies[i], 'src', lazies[i].getAttribute('data-lazy-src-webp'));
517			}
518		}
519		lazies[i].className = lazies[i].className.replace(/\bewww_webp_lazy_load\b/, '');
520	}
521	var elems = document.querySelectorAll('.ewww_webp');
522	for (var i = 0, len = elems.length; i < len; i++){
523		console.log('parsing an image: ' + elems[i].getAttribute('data-src'));
524		if (ewww_webp_supported) {
525			ewwwAttr(elems[i], 'srcset', elems[i].getAttribute('data-srcset-webp'));
526			ewwwAttr(elems[i], 'src', elems[i].getAttribute('data-src-webp'));
527			ewwwAttr(elems[i], 'data-orig-file', elems[i].getAttribute('data-webp-orig-file'));
528			ewwwAttr(elems[i], 'data-medium-file', elems[i].getAttribute('data-webp-medium-file'));
529			ewwwAttr(elems[i], 'data-large-file', elems[i].getAttribute('data-webp-large-file'));
530			ewwwAttr(elems[i], 'data-large_image', elems[i].getAttribute('data-webp-large_image'));
531			ewwwAttr(elems[i], 'data-src', elems[i].getAttribute('data-webp-src'));
532		} else {
533			ewwwAttr(elems[i], 'srcset', elems[i].getAttribute('data-srcset-img'));
534			ewwwAttr(elems[i], 'src', elems[i].getAttribute('data-src-img'));
535		}
536		elems[i].className = elems[i].className.replace(/\bewww_webp\b/, 'ewww_webp_loaded');
537	}
538  	if (window.jQuery && jQuery.fn.isotope && jQuery.fn.imagesLoaded) {
539		jQuery('.fusion-posts-container-infinite').imagesLoaded( function() {
540			if ( jQuery( '.fusion-posts-container-infinite' ).hasClass( 'isotope' ) ) {
541				jQuery( '.fusion-posts-container-infinite' ).isotope();
542			}
543		});
544		jQuery('.fusion-portfolio:not(.fusion-recent-works) .fusion-portfolio-wrapper').imagesLoaded( function() {
545			jQuery( '.fusion-portfolio:not(.fusion-recent-works) .fusion-portfolio-wrapper' ).isotope();
546		});
547	}
548}
549check_webp_feature('alpha', ewwwWebPInit);
550function ewwwWebPInit(ewww_webp_supported) {
551        ewwwLoadImages(ewww_webp_supported);
552        ewwwNggLoadGalleries(ewww_webp_supported);
553        document.arrive('.ewww_webp', function() {
554			ewwwLoadImages(ewww_webp_supported);
555        });
556        document.arrive('.ewww_webp_lazy_load', function() {
557			ewwwLoadImages(ewww_webp_supported);
558        });
559        document.arrive('videos', function() {
560			ewwwLoadImages(ewww_webp_supported);
561        });
562        if (document.readyState == 'loading') {
563		console.log('deferring ewwwJSONParserInit until DOMContentLoaded')
564		document.addEventListener('DOMContentLoaded', ewwwJSONParserInit);
565        } else {
566		console.log(document.readyState);
567		console.log('running JSON parsers post haste')
568		if ( typeof galleries !== 'undefined' ) {
569			console.log('galleries found, parsing')
570			ewwwNggParseGalleries(ewww_webp_supported);
571		}
572		ewwwWooParseVariations(ewww_webp_supported);
573	}
574}
575function ewwwAttr(elem, attr, value) {
576	if (value != null && value !== false) {
577		elem.setAttribute(attr, value);
578	}
579}
580function ewwwJSONParserInit() {
581	if ( typeof galleries !== 'undefined' ) {
582		check_webp_feature('alpha', ewwwNggParseGalleries);
583	}
584	check_webp_feature('alpha', ewwwWooParseVariations);
585}
586function ewwwWooParseVariations(ewww_webp_supported) {
587	if (!ewww_webp_supported) {
588		return;
589	}
590	var elems = document.querySelectorAll('form.variations_form');
591	for (var i = 0, len = elems.length; i < len; i++){
592		var variations = elems[i].getAttribute('data-product_variations');
593		var variations_changed = false;
594		try {
595			variations = JSON.parse(variations);
596			//console.log(variations);
597			console.log('parsing WC variations');
598			for ( var num in variations ) {
599				if (variations[ num ] !== undefined && variations[ num ].image !== undefined) {
600					console.log(variations[num].image);
601					if (variations[num].image.src_webp !== undefined) {
602						variations[num].image.src = variations[num].image.src_webp;
603						variations_changed = true;
604					}
605					if (variations[num].image.srcset_webp !== undefined) {
606						variations[num].image.srcset = variations[num].image.srcset_webp;
607						variations_changed = true;
608					}
609					if (variations[num].image.full_src_webp !== undefined) {
610						variations[num].image.full_src = variations[num].image.full_src_webp;
611						variations_changed = true;
612					}
613					if (variations[num].image.gallery_thumbnail_src_webp !== undefined) {
614						variations[num].image.gallery_thumbnail_src = variations[num].image.gallery_thumbnail_src_webp;
615						variations_changed = true;
616					}
617					if (variations[num].image.thumb_src_webp !== undefined) {
618						variations[num].image.thumb_src = variations[num].image.thumb_src_webp;
619						variations_changed = true;
620					}
621				}
622			}
623			if (variations_changed) {
624				ewwwAttr(elems[i], 'data-product_variations', JSON.stringify(variations));
625			}
626		} catch (err) {
627			console.log(err);
628			console.log(response);
629		}
630	}
631}
632function ewwwNggParseGalleries(ewww_webp_supported) {
633	if (ewww_webp_supported) {
634		for(var galleryIndex in galleries) {
635			var gallery = galleries[galleryIndex];
636			galleries[galleryIndex].images_list = ewwwNggParseImageList(gallery.images_list);
637		}
638	}
639}
640function ewwwNggLoadGalleries(ewww_webp_supported) {
641        if (ewww_webp_supported) {
642                document.addEventListener('ngg.galleria.themeadded', function(event, themename){
643                        window.ngg_galleria._create_backup = window.ngg_galleria.create;
644                        window.ngg_galleria.create = function(gallery_parent, themename) {
645                                var gallery_id = $(gallery_parent).data('id');
646                                galleries['gallery_' + gallery_id].images_list = ewwwNggParseImageList(galleries['gallery_' + gallery_id].images_list);
647                                return window.ngg_galleria._create_backup(gallery_parent, themename);
648                        };
649                });
650        }
651}
652function ewwwNggParseImageList(images_list) {
653        console.log('parsing gallery images');
654        for(var nggIndex in images_list) {
655                var nggImage = images_list[nggIndex];
656                if (typeof nggImage['image-webp'] !== typeof undefined) {
657                        images_list[nggIndex]['image'] = nggImage['image-webp'];
658                        delete images_list[nggIndex]['image-webp'];
659                }
660                if (typeof nggImage['thumb-webp'] !== typeof undefined) {
661                        images_list[nggIndex]['thumb'] = nggImage['thumb-webp'];
662                        delete images_list[nggIndex]['thumb-webp'];
663                }
664                if (typeof nggImage['full_image_webp'] !== typeof undefined) {
665                        images_list[nggIndex]['full_image'] = nggImage['full_image_webp'];
666                        delete images_list[nggIndex]['full_image_webp'];
667                }
668                if (typeof nggImage['srcsets'] !== typeof undefined) {
669                        for(var nggSrcsetIndex in nggImage['srcsets']) {
670                                nggSrcset = nggImage['srcsets'][nggSrcsetIndex];
671                                if (typeof nggImage['srcsets'][nggSrcsetIndex + '-webp'] !== typeof undefined) {
672                                        images_list[nggIndex]['srcsets'][nggSrcsetIndex] = nggImage['srcsets'][nggSrcsetIndex + '-webp'];
673                                        delete images_list[nggIndex]['srcsets'][nggSrcsetIndex + '-webp'];
674                                }
675                        }
676                }
677                if (typeof nggImage['full_srcsets'] !== typeof undefined) {
678                        for(var nggFSrcsetIndex in nggImage['full_srcsets']) {
679                                nggFSrcset = nggImage['full_srcsets'][nggFSrcsetIndex];
680                                if (typeof nggImage['full_srcsets'][nggFSrcsetIndex + '-webp'] !== typeof undefined) {
681                                        images_list[nggIndex]['full_srcsets'][nggFSrcsetIndex] = nggImage['full_srcsets'][nggFSrcsetIndex + '-webp'];
682                                        delete images_list[nggIndex]['full_srcsets'][nggFSrcsetIndex + '-webp'];
683                                }
684                        }
685                }
686        }
687        return images_list;
688}

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.