{"version":3,"file":"slimmage.min.js","sources":["slimmage.js"],"sourcesContent":["/* Slimmage 0.2.3-bg, use with ImageResizer. MIT/Apache2 dual licensed by Imazen */\n\n(function (w) { //w==window\n // Enable strict mode\n \"use strict\";\n\n var s = window.slimmage || {};\n /** @expose **/\n window.slimmage = s;\n if (s.verbose === undefined) /** @expose **/ s.verbose = true;\n if (s.tryWebP === undefined) /** @expose **/ s.tryWebP = false;\n if (s.readyCallback === undefined) /** @expose **/ s.readyCallback = null;\n if (s.maxWidth === undefined) /** @expose **/ s.maxWidth = 2048;\n if (s.widthStep === undefined) /** @expose **/ s.widthStep = 160;\n if (s.jpegQuality === undefined) /** @expose **/ s.jpegQuality = 90;\n if (s.jpegRetinaQuality === undefined) /** @expose **/ s.jpegRetinaQuality = 80;\n\n var log = function () { if (w.slimmage.verbose && w.console && w.console.log) try { w.console.log.apply(w.console, arguments); } catch (e) { } };\n s.beginWebPTest = function () {\n if (!s.tryWebP || s._testingWebP) return;\n s._testingWebP = true;\n\n var WebP = new Image();\n WebP.onload = WebP.onerror = function () {\n s.webp = (WebP.height == 2);\n };\n WebP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n };\n\n s.getCssValue = function (target, hyphenProp) {\n var val = typeof (window.getComputedStyle) != \"undefined\" && window.getComputedStyle(target, null).getPropertyValue(hyphenProp);\n if (!val && target.currentStyle) {\n val = target.currentStyle[hyphenProp.replace(/([a-z])\\-([a-z])/, function (a, b, c) { return b + c.toUpperCase(); })] || target.currentStyle[hyphenProp];\n }\n return val;\n };\n\n s.getCssPixels = function (target, hyphenProp) {\n var val = s.getCssValue(target, hyphenProp);\n\n //We can return pixels directly, but not other units\n if (val.slice(-2) == \"px\") return parseFloat(val.slice(0, -2));\n\n // Some browsers (IE8, Firefox 28) read \"none\" when not set. A value of\n // \"none\" is invalid and would cause an exception or be interpreted as 0.\n if (val == \"none\") val = \"\";\n\n\n //Create a temporary sibling div to resolve units into pixels.\n var temp = document.createElement(\"div\");\n temp.style.overflow = temp.style.visibility = \"hidden\";\n temp.style.clear = \"both\";\n target.parentNode.appendChild(temp);\n temp.style.width = val;\n var pixels = temp.offsetWidth;\n target.parentNode.removeChild(temp);\n return pixels;\n };\n\n s.nodesToArray = function (nodeList) {\n var array = [];\n // iterate backwards ensuring that length is an UInt32\n for (var i = nodeList.length >>> 0; i--;) {\n array[i] = nodeList[i];\n }\n return array;\n };\n //Expects virtual, not device pixel width\n s.getImageSrcWithWidth = function (img, originalSrc, width) {\n var data = {\n webp: s.webp,\n width: width,\n dpr: window.devicePixelRatio || 1,\n src: originalSrc\n }\n\n data.requestedWidth = Math.min(s.maxWidth, data.width * data.dpr), //Limit size to maxWidth.\n data.requestedHeight = img.offsetHeight, //get current element height\n data.quality = (data.dpr > 1.49) ? s.jpegRetinaQuality : s.jpegQuality; //Default quality\n if (data.webp) data.quality = data.dpr > 1.49 ? 65 : 78;\n\n //Minimize variants for caching improvements; round up to nearest multiple of widthStep\n data.requestedWidth = data.requestedWidth - (data.requestedWidth % s.widthStep) + s.widthStep; //Will limit to 13 variations\n\n var oldpixels = img.getAttribute(\"data-pixel-width\") | 0;\n\n if (s.adjustImageParameters && typeof (s.adjustImageParameters) === \"function\") {\n s.adjustImageParameters(data);\n }\n\n if (data.requestedWidth > oldpixels) {\n //Never request a smaller image once the larger one has already started loading\n var newSrc = originalSrc.replace(/width=\\d+/i, \"width=\" + data.requestedWidth).replace(/quality=[0-9]+/i, \"quality=\" + data.quality).replace(/height=\\d+/i, \"height=\" + data.requestedHeight);\n if (data.webp) newSrc = newSrc.replace(/format=[a-z]+/i, \"format=webp\");\n img.setAttribute(\"data-pixel-width\", data.requestedWidth);\n log(\"Slimming: updating \" + newSrc);\n return newSrc;\n }\n };\n s.adjustImageSrc = function (img, originalSrc) {\n var newSrc = s.getImageSrcWithWidth(img, originalSrc, s.getCssPixels(img, \"max-width\"));\n if (newSrc) img.src = newSrc;\n };\n s.adjustBackgroundImage = function (elem, originalSrc) {\n var newSrc = s.getImageSrcWithWidth(elem, originalSrc, s.getCssPixels(elem, \"max-width\"));\n if (newSrc) elem.style.backgroundImage = \"url(\" + newSrc + \")\";\n if (!elem.style.backgroundImage) elem.style.backgroundImage = \"url(\" + originalSrc + \")\";\n }\n\n s.checkResponsiveImages = function (delay) {\n if (s.timeoutid > 0) w.clearTimeout(s.timeoutid);\n s.timeoutid = 0;\n if (delay && delay > 0) {\n s.timeoutid = w.setTimeout(s.checkResponsiveImages, delay);\n return;\n }\n var stopwatch = new Date().getTime();\n\n var newImages = 0;\n //1. Copy images out of noscript tags, but hide 'src' attribute as data-src\n var n = s.nodesToArray(w.document.getElementsByTagName(\"noscript\"));\n for (var i = 0, il = n.length; i < il; i++) {\n var ns = n[i];\n if (ns.getAttribute(\"data-slimmage\") !== null) {\n\n var div = w.document.createElement('div');\n var contents = (ns.textContent || ns.innerHTML);\n if (!contents || contents.replace(/[\\s\\t\\r\\n]+/, \"\").length == 0) {\n //IE doesn't let us touch noscript, so we have to use attributes.\n var img = new Image();\n for (var ai = 0; ai < ns.attributes.length; ai++) {\n var a = ns.attributes[ai];\n if (a && a.specified && a.name.indexOf(\"data-img-\") == 0) {\n img.setAttribute(a.name.slice(9 - a.name.length), a.value);\n }\n }\n div.appendChild(img);\n } else {\n //noscript isn't part of DOM, so we have to recreate it, unescaping html, src->data-src \n div.innerHTML = contents.replace(/\\s+src\\s*=\\s*(['\"])/i, \" data-src=$1\").\n replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');\n }\n //Clear source values before we add it back to the dom, ensure data-slimmage is set.\n var childImages = div.getElementsByTagName(\"img\");\n for (var j = 0, jl = childImages.length; j < jl; j++) {\n var ci = childImages[j];\n if (ci.src !== null && ci.src.length > 0) {\n ci.setAttribute(\"data-src\", ci.src);\n ci.src = \"\";\n }\n ci.setAttribute(\"data-slimmage\", true);\n ns.parentNode.insertBefore(ci, ns);\n newImages++;\n }\n //2. Remove old noscript tags\n ns.parentNode.removeChild(ns);\n }\n }\n\n //3. Find images with data-slimmage and run adjustImageSrc.\n var totalImages = 0;\n var images = s.nodesToArray(w.document.getElementsByTagName(\"img\"));\n for (var i = 0, il = images.length; i < il; i++) {\n if (images[i].getAttribute(\"data-slimmage\") !== null) {\n var originalSrc = images[i].getAttribute(\"data-src\") || images[i].src;\n s.adjustImageSrc(images[i], originalSrc);\n totalImages++;\n }\n }\n\n //4. Find elements with data-slimmage-bg and set CSS background-image\n if (w.document.querySelectorAll) {\n var bgImages = s.nodesToArray(w.document.querySelectorAll(\"[data-slimmage-bg]\"))\n for (var i = 0, il = bgImages.length; i < il; i++) {\n var originalBg = bgImages[i].getAttribute(\"data-slimmage-bg\");\n if (originalBg !== null) {\n s.adjustBackgroundImage(bgImages[i], originalBg);\n totalImages++;\n }\n }\n }\n\n //5. Callback when ready\n if (typeof s.readyCallback === 'function') {\n s.readyCallback();\n }\n\n log(\"Slimmage: restored \" + newImages + \" images from noscript tags; sizing \" + totalImages + \" images. \" + (new Date().getTime() - stopwatch) + \"ms\");\n };\n\n var h = s.checkResponsiveImages;\n // Run on resize and domready (w.load as a fallback)\n if (w.addEventListener) {\n w.addEventListener(\"resize\", function () { h(500); }, false);\n w.addEventListener(\"DOMContentLoaded\", function () {\n h();\n // Run once only\n w.removeEventListener(\"load\", h, false);\n }, false);\n w.addEventListener(\"load\", h, false);\n } else if (w.attachEvent) {\n w.attachEvent(\"onload\", h);\n }\n //test for webp support\n s.beginWebPTest();\n}(this));\n"],"names":["w","log","slimmage","verbose","console","apply","arguments","e","s","window","h","undefined","tryWebP","readyCallback","maxWidth","widthStep","jpegQuality","jpegRetinaQuality","beginWebPTest","WebP","_testingWebP","Image","onload","onerror","webp","height","src","getCssValue","target","hyphenProp","val","getComputedStyle","getPropertyValue","currentStyle","replace","a","b","c","toUpperCase","getCssPixels","slice","parseFloat","temp","document","createElement","pixels","style","overflow","visibility","clear","parentNode","appendChild","width","offsetWidth","removeChild","nodesToArray","nodeList","array","i","length","getImageSrcWithWidth","img","originalSrc","data","dpr","devicePixelRatio","oldpixels","requestedWidth","Math","min","requestedHeight","offsetHeight","quality","getAttribute","adjustImageParameters","newSrc","setAttribute","adjustImageSrc","adjustBackgroundImage","elem","backgroundImage","checkResponsiveImages","delay","timeoutid","clearTimeout","setTimeout","stopwatch","Date","getTime","newImages","n","getElementsByTagName","il","ns","div","contents","textContent","innerHTML","ai","attributes","specified","name","indexOf","value","childImages","j","jl","ci","insertBefore","totalImages","images","querySelectorAll","bgImages","originalBg","addEventListener","removeEventListener","attachEvent","this"],"mappings":"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"}