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.