webshims-rails 1.15.5 → 1.15.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- /*! respimage - v1.1.6 - 2014-11-20
1
+ /*! respimage - v1.2.1 - 2014-12-23
2
2
  Licensed MIT */
3
3
  !function(window, document, undefined) {
4
4
  "use strict";
@@ -7,31 +7,18 @@
7
7
  }
8
8
  function updateMetrics() {
9
9
  var dprM;
10
- (isVwDirty || DPR != window.devicePixelRatio) && (isVwDirty = !1, DPR = window.devicePixelRatio,
11
- cssCache = {}, sizeLengthCache = {}, dprM = (DPR || 1) * cfg.xQuant, cfg.uT || (dprM = Math.min(dprM, 3),
12
- dprM > 1.4 && (dprM = Math.round(dprM / (1 + (dprM - 1.4) / 12) * 100) / 100), ri.DPR = dprM),
13
- tLow = cfg.tLow * dprM, greed = cfg.greed / 2, greed += greed * dprM, tHigh = cfg.tHigh,
14
- tMemory = 2 + dprM, units.width = Math.max(window.innerWidth || 0, docElem.clientWidth),
15
- units.height = Math.max(window.innerHeight || 0, docElem.clientHeight), isLandscape = units.width > units.height,
16
- units.vw = units.width / 100, units.vh = units.height / 100, units.em = ri.getEmValue(),
17
- units.rem = units.em);
18
- }
19
- function parseDescriptor(descriptor) {
20
- if (!(descriptor in memDescriptor)) {
21
- var descriptorObj = {
22
- val: 1,
23
- type: "x"
24
- }, parsedDescriptor = trim(descriptor || "");
25
- parsedDescriptor && (parsedDescriptor = parsedDescriptor.replace(regHDesc, ""),
26
- parsedDescriptor.match(regDescriptor) ? (descriptorObj.val = 1 * RegExp.$1, descriptorObj.type = RegExp.$2) : descriptorObj = !1),
27
- memDescriptor[descriptor] = descriptorObj;
28
- }
29
- return memDescriptor[descriptor];
10
+ isVwDirty = !1, DPR = window.devicePixelRatio, cssCache = {}, sizeLengthCache = {},
11
+ dprM = (DPR || 1) * cfg.xQuant, cfg.uT || (cfg.maxX = Math.max(1.3, cfg.maxX), dprM = Math.min(dprM, cfg.maxX),
12
+ ri.DPR = dprM), units.width = Math.max(window.innerWidth || 0, docElem.clientWidth),
13
+ units.height = Math.max(window.innerHeight || 0, docElem.clientHeight), units.vw = units.width / 100,
14
+ units.vh = units.height / 100, units.em = ri.getEmValue(), units.rem = units.em,
15
+ lazyFactor = cfg.lazyFactor / 2, lazyFactor = lazyFactor * dprM + lazyFactor, substractCurRes = .1 * dprM,
16
+ lowTreshHold = .5 + .2 * dprM, partialLowTreshHold = .5 + .25 * dprM, tMemory = dprM + 1.3,
17
+ (isLandscape = units.width > units.height) || (lazyFactor *= .9), supportAbort && (lazyFactor *= .9);
30
18
  }
31
19
  function chooseLowRes(lowRes, diff, dpr) {
32
- var add = diff * greed * lowRes;
33
- return isLandscape || (add /= 1.5), lowRes += add, diff > tHigh && (lowRes += tLow),
34
- lowRes > dpr;
20
+ var add = diff * Math.pow(lowRes, 2);
21
+ return isLandscape || (add /= 1.3), lowRes += add, lowRes > dpr;
35
22
  }
36
23
  function inView(el) {
37
24
  if (!el.getBoundingClientRect) return !0;
@@ -61,20 +48,6 @@
61
48
  }
62
49
  return candidate;
63
50
  }
64
- function hasOneX(set) {
65
- var i, ret, candidates, desc;
66
- if (set) for (candidates = ri.parseSet(set), i = 0; i < candidates.length; i++) if (desc = candidates[i].desc,
67
- "x" == desc.type && 1 == desc.val) {
68
- ret = !0;
69
- break;
70
- }
71
- return ret;
72
- }
73
- function hasWDescripor(set) {
74
- if (!set) return !1;
75
- var candidates = ri.parseSet(set);
76
- return candidates[0] && "w" == candidates[0].desc.type;
77
- }
78
51
  function getAllSourceElements(picture, candidates) {
79
52
  var i, len, source, srcset, sources = picture.getElementsByTagName("source");
80
53
  for (i = 0, len = sources.length; len > i; i++) source = sources[i], source[ri.ns] = !0,
@@ -85,57 +58,31 @@
85
58
  sizes: source.getAttribute("sizes")
86
59
  });
87
60
  }
88
- function setResolution(candidate, sizesattr) {
89
- var descriptor = candidate.desc;
90
- return "w" == descriptor.type ? (candidate.cWidth = ri.calcListLength(sizesattr || "100vw"),
91
- candidate.res = descriptor.val / candidate.cWidth) : candidate.res = descriptor.val,
92
- candidate;
93
- }
94
61
  document.createElement("picture");
95
- var ri = {}, noop = function() {}, image = document.createElement("img"), getImgAttr = image.getAttribute, setImgAttr = image.setAttribute, removeImgAttr = image.removeAttribute, docElem = document.documentElement, types = {}, cfg = {
62
+ var lowTreshHold, partialLowTreshHold, isLandscape, lazyFactor, tMemory, substractCurRes, eminpx, alwaysCheckWDescriptor, resizeThrottle, ri = {}, noop = function() {}, image = document.createElement("img"), getImgAttr = image.getAttribute, setImgAttr = image.setAttribute, removeImgAttr = image.removeAttribute, docElem = document.documentElement, types = {}, cfg = {
96
63
  xQuant: 1,
97
- tLow: .1,
98
- tHigh: .6,
99
- tLazy: .33,
100
- greed: .5
101
- }, srcAttr = "data-risrc", srcsetAttr = srcAttr + "set", supportAbort = /rident/.test(navigator.userAgent), curSrcProp = "currentSrc";
102
- ri.ns = ("ri" + new Date().getTime()).substr(0, 9), curSrcProp in image || (curSrcProp = "src"),
103
- ri.supSrcset = "srcset" in image, ri.supSizes = "sizes" in image, ri.selShort = "picture>img,img[srcset]",
104
- ri.sel = ri.selShort, ri.cfg = cfg, ri.supSrcset && (ri.sel += ",img[" + srcsetAttr + "]");
105
- var anchor = document.createElement("a");
106
- ri.makeUrl = function(src) {
107
- return anchor.href = src, anchor.href;
108
- }, ri.qsa = function(context, sel) {
109
- return context.querySelectorAll(sel);
110
- };
111
- {
112
- var on = function(obj, evt, fn, capture) {
113
- obj.addEventListener ? obj.addEventListener(evt, fn, capture || !1) : obj.attachEvent && obj.attachEvent("on" + evt, fn);
114
- }, off = function(obj, evt, fn, capture) {
115
- obj.removeEventListener ? obj.removeEventListener(evt, fn, capture || !1) : obj.detachEvent && obj.detachEvent("on" + evt, fn);
116
- };
117
- "https:" == location.protocol;
118
- }
119
- ri.matchesMedia = function() {
120
- return ri.matchesMedia = window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? function(media) {
121
- return !media || matchMedia(media).matches;
122
- } : ri.mMQ, ri.matchesMedia.apply(this, arguments);
123
- };
124
- var tLow, greed, tHigh, tMemory, isWinComplete, isLandscape, isVwDirty = !0, cssCache = {}, sizeLengthCache = {}, DPR = window.devicePixelRatio, units = {
64
+ lazyFactor: .4,
65
+ maxX: 2
66
+ }, srcAttr = "data-risrc", srcsetAttr = srcAttr + "set", reflowBug = "webkitBackfaceVisibility" in docElem.style, ua = navigator.userAgent, supportNativeLQIP = /AppleWebKit/i.test(ua), supportAbort = /rident/.test(ua) || /ecko/.test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35, imgAbortCount = 0, curSrcProp = "currentSrc", regWDesc = /\s+\+?\d+(e\d+)?w/, regSize = /(\([^)]+\))?\s*(.+)/, regDescriptor = /^([\+eE\d\.]+)(w|x)$/, regHDesc = /\s*\d+h\s*/, setOptions = window.respimgCFG, baseStyle = ("https:" == location.protocol,
67
+ "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)"), fsCss = "font-size:100%!important;", isVwDirty = !0, cssCache = {}, sizeLengthCache = {}, DPR = window.devicePixelRatio, units = {
125
68
  px: 1,
126
69
  "in": 96
127
- };
128
- ri.DPR = DPR || 1, ri.u = units, ri.mMQ = function(media) {
129
- return media ? evalCSS(media) : !0;
130
- };
131
- var evalCSS = function() {
132
- var cache = {}, regLength = /^([\d\.]+)(em|vw|px)$/, replace = function() {
70
+ }, anchor = document.createElement("a"), alreadyRun = !1, on = function(obj, evt, fn, capture) {
71
+ obj.addEventListener ? obj.addEventListener(evt, fn, capture || !1) : obj.attachEvent && obj.attachEvent("on" + evt, fn);
72
+ }, off = function(obj, evt, fn, capture) {
73
+ obj.removeEventListener ? obj.removeEventListener(evt, fn, capture || !1) : obj.detachEvent && obj.detachEvent("on" + evt, fn);
74
+ }, memoize = function(fn) {
75
+ var cache = {};
76
+ return function(input) {
77
+ return input in cache || (cache[input] = fn(input)), cache[input];
78
+ };
79
+ }, evalCSS = function() {
80
+ var regLength = /^([\d\.]+)(em|vw|px)$/, replace = function() {
133
81
  for (var args = arguments, index = 0, string = args[0]; ++index in args; ) string = string.replace(args[index], args[++index]);
134
82
  return string;
135
- }, buidlStr = function(css) {
136
- return cache[css] || (cache[css] = "return " + replace((css || "").toLowerCase(), /\band\b/g, "&&", /,/g, "||", /min-([a-z-\s]+):/g, "e.$1>=", /max-([a-z-\s]+):/g, "e.$1<=", /calc([^)]+)/g, "($1)", /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi, "") + ";"),
137
- cache[css];
138
- };
83
+ }, buidlStr = memoize(function(css) {
84
+ return "return " + replace((css || "").toLowerCase(), /\band\b/g, "&&", /,/g, "||", /min-([a-z-\s]+):/g, "e.$1>=", /max-([a-z-\s]+):/g, "e.$1<=", /calc([^)]+)/g, "($1)", /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi, "");
85
+ });
139
86
  return function(css, length) {
140
87
  var parsedLength;
141
88
  if (!(css in cssCache)) if (cssCache[css] = !1, length && (parsedLength = css.match(regLength))) cssCache[css] = parsedLength[1] * units[parsedLength[2]]; else try {
@@ -143,41 +90,76 @@
143
90
  } catch (e) {}
144
91
  return cssCache[css];
145
92
  };
146
- }();
147
- ri.calcLength = function(sourceSizeValue) {
93
+ }(), setResolution = function(candidate, sizesattr) {
94
+ return candidate.w ? (candidate.cWidth = ri.calcListLength(sizesattr || "100vw"),
95
+ candidate.res = candidate.w / candidate.cWidth) : candidate.res = candidate.x, candidate;
96
+ }, respimage = function(opt) {
97
+ var elements, i, plen, options = opt || {};
98
+ if (options.elements && 1 == options.elements.nodeType && ("IMG" == options.elements.nodeName.toUpperCase() ? options.elements = [ options.elements ] : (options.context = options.elements,
99
+ options.elements = null)), elements = options.elements || ri.qsa(options.context || document, options.reevaluate || options.reparse ? ri.sel : ri.selShort),
100
+ plen = elements.length) {
101
+ for (ri.setupRun(options), alreadyRun = !0, i = 0; plen > i; i++) imgAbortCount++,
102
+ 6 > imgAbortCount && !elements[i].complete && imgAbortCount++, ri.fillImg(elements[i], options);
103
+ ri.teardownRun(options), imgAbortCount++;
104
+ }
105
+ }, reevaluateAfterLoad = function() {
106
+ var onload = function() {
107
+ off(this, "load", onload), off(this, "error", onload), ri.fillImgs({
108
+ elements: [ this ]
109
+ });
110
+ };
111
+ return function(img) {
112
+ off(img, "load", onload), off(img, "error", onload), on(img, "error", onload), on(img, "load", onload);
113
+ };
114
+ }(), parseDescriptor = memoize(function(descriptor) {
115
+ var descriptorObj = [ 1, "x" ], parsedDescriptor = trim(descriptor || "");
116
+ return parsedDescriptor && (parsedDescriptor = parsedDescriptor.replace(regHDesc, ""),
117
+ descriptorObj = parsedDescriptor.match(regDescriptor) ? [ 1 * RegExp.$1, RegExp.$2 ] : !1),
118
+ descriptorObj;
119
+ });
120
+ curSrcProp in image || (curSrcProp = "src"), types["image/jpeg"] = !0, types["image/gif"] = !0,
121
+ types["image/png"] = !0, types["image/svg+xml"] = document.implementation.hasFeature("http://wwwindow.w3.org/TR/SVG11/feature#Image", "1.1"),
122
+ ri.ns = ("ri" + new Date().getTime()).substr(0, 9), ri.supSrcset = "srcset" in image,
123
+ ri.supSizes = "sizes" in image, ri.selShort = "picture>img,img[srcset]", ri.sel = ri.selShort,
124
+ ri.cfg = cfg, ri.supSrcset && (ri.sel += ",img[" + srcsetAttr + "]"), ri.DPR = DPR || 1,
125
+ ri.u = units, ri.types = types, alwaysCheckWDescriptor = ri.supSrcset && !ri.supSizes,
126
+ ri.setSize = noop, ri.makeUrl = memoize(function(src) {
127
+ return anchor.href = src, anchor.href;
128
+ }), ri.qsa = function(context, sel) {
129
+ return context.querySelectorAll(sel);
130
+ }, ri.matchesMedia = function() {
131
+ return ri.matchesMedia = window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? function(media) {
132
+ return !media || matchMedia(media).matches;
133
+ } : ri.mMQ, ri.matchesMedia.apply(this, arguments);
134
+ }, ri.mMQ = function(media) {
135
+ return media ? evalCSS(media) : !0;
136
+ }, ri.calcLength = function(sourceSizeValue) {
148
137
  var value = evalCSS(sourceSizeValue, !0) || !1;
149
138
  return 0 > value && (value = !1), value;
150
- }, ri.types = types, types["image/jpeg"] = !0, types["image/gif"] = !0, types["image/png"] = !0,
151
- types["image/svg+xml"] = document.implementation.hasFeature("http://wwwindow.w3.org/TR/SVG11/feature#Image", "1.1"),
152
- ri.supportsType = function(type) {
153
- return type ? types[type] : !0;
139
+ }, ri.supportsType = function(type) {
140
+ return type ? types[type] : !0;
141
+ }, ri.parseSize = memoize(function(sourceSizeStr) {
142
+ var match = (sourceSizeStr || "").match(regSize);
143
+ return {
144
+ media: match && match[1],
145
+ length: match && match[2]
154
146
  };
155
- var regSize = /(\([^)]+\))?\s*(.+)/, memSize = {};
156
- ri.parseSize = function(sourceSizeStr) {
157
- var match;
158
- return memSize[sourceSizeStr] || (match = (sourceSizeStr || "").match(regSize),
159
- memSize[sourceSizeStr] = {
160
- media: match && match[1],
161
- length: match && match[2]
162
- }), memSize[sourceSizeStr];
163
- }, ri.parseSet = function(set) {
147
+ }), ri.parseSet = function(set) {
164
148
  if (!set.cands) {
165
- var pos, url, descriptor, last, descpos, srcset = set.srcset;
149
+ var pos, url, descriptor, last, descpos, can, srcset = set.srcset;
166
150
  for (set.cands = []; srcset; ) srcset = srcset.replace(/^\s+/g, ""), pos = srcset.search(/\s/g),
167
151
  descriptor = null, -1 != pos ? (url = srcset.slice(0, pos), last = url.charAt(url.length - 1),
168
152
  "," != last && url || (url = url.replace(/,+$/, ""), descriptor = ""), srcset = srcset.slice(pos + 1),
169
153
  null == descriptor && (descpos = srcset.indexOf(","), -1 != descpos ? (descriptor = srcset.slice(0, descpos),
170
154
  srcset = srcset.slice(descpos + 1)) : (descriptor = srcset, srcset = ""))) : (url = srcset,
171
- srcset = ""), url && (descriptor = parseDescriptor(descriptor)) && set.cands.push({
155
+ srcset = ""), url && (descriptor = parseDescriptor(descriptor)) && (can = {
172
156
  url: url.replace(/^,+/, ""),
173
- desc: descriptor,
174
157
  set: set
175
- });
158
+ }, can[descriptor[1]] = descriptor[0], "x" == descriptor[1] && 1 == descriptor[0] && (set.has1x = !0),
159
+ set.cands.push(can));
176
160
  }
177
161
  return set.cands;
178
- };
179
- var eminpx, memDescriptor = {}, regDescriptor = /^([\+eE\d\.]+)(w|x)$/, regHDesc = /\s*\d+h\s*/, baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)", fsCss = "font-size:100%!important;";
180
- ri.getEmValue = function() {
162
+ }, ri.getEmValue = function() {
181
163
  var body;
182
164
  if (!eminpx && (body = document.body)) {
183
165
  var div = document.createElement("div"), originalHTMLCSS = docElem.style.cssText, originalBodyCSS = body.style.cssText;
@@ -196,75 +178,64 @@
196
178
  }
197
179
  return sizeLengthCache[sourceSizeListStr];
198
180
  }, ri.setRes = function(set) {
199
- var candidates, candidate;
181
+ var candidates;
200
182
  if (set) {
201
183
  candidates = ri.parseSet(set);
202
- for (var i = 0, len = candidates.length; len > i; i++) candidate = candidates[i],
203
- candidate.descriptor || setResolution(candidate, set.sizes);
184
+ for (var i = 0, len = candidates.length; len > i; i++) setResolution(candidates[i], set.sizes);
204
185
  }
205
186
  return candidates;
206
- }, ri.applySetCandidate = function(candidates, img) {
187
+ }, ri.setRes.res = setResolution, ri.applySetCandidate = function(candidates, img) {
207
188
  if (candidates.length) {
208
- var candidate, dpr, i, j, diff, length, bestCandidate, curSrc, curCan, isSameSet, candidateSrc, oldRes, imageData = img[ri.ns], evaled = !0;
189
+ var candidate, dpr, i, j, diff, length, bestCandidate, curSrc, curCan, isSameSet, candidateSrc, abortCurSrc, oldRes, imageData = img[ri.ns], evaled = !0, lazyF = lazyFactor, sub = substractCurRes;
209
190
  if (curSrc = imageData.curSrc || img[curSrcProp], curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set),
210
- dpr = ri.DPR, curSrc && (curCan && curCan.res < dpr && (oldRes = curCan.res, curCan.res += cfg.tLazy * Math.pow(curCan.res - .1, isLandscape ? 2.2 : 1.9)),
211
- isSameSet = !imageData.pic || curCan && curCan.set == candidates[0].set, curCan && isSameSet && curCan.res >= dpr && (oldRes || tMemory > curCan.res) ? bestCandidate = curCan : supportAbort || img.complete || !getImgAttr.call(img, "src") || img.lazyload || (isSameSet || !inView(img)) && (bestCandidate = curCan,
212
- candidateSrc = curSrc, evaled = "L", isWinComplete && reevaluateAfterLoad(img))),
213
- !bestCandidate) for (oldRes && (curCan.res = curCan.res - (curCan.res - oldRes) / 2),
214
- candidates.sort(ascendingSort), length = candidates.length, bestCandidate = candidates[length - 1],
215
- i = 0; length > i; i++) if (candidate = candidates[i], candidate.res >= dpr) {
216
- j = i - 1, bestCandidate = candidates[j] && (diff = candidate.res - dpr) && curSrc != ri.makeUrl(candidate.url) && chooseLowRes(candidates[j].res, diff, dpr) ? candidates[j] : candidate;
191
+ dpr = ri.DPR, oldRes = curCan && curCan.res, !bestCandidate && curSrc && (abortCurSrc = supportAbort && !img.complete && curCan && oldRes > dpr,
192
+ abortCurSrc || curCan && !(tMemory > oldRes) || (curCan && dpr > oldRes && oldRes > lowTreshHold && (partialLowTreshHold > oldRes && (lazyF *= .87,
193
+ sub += .04 * dpr), curCan.res += lazyF * Math.pow(oldRes - sub, 2)), isSameSet = !imageData.pic || curCan && curCan.set == candidates[0].set,
194
+ curCan && isSameSet && curCan.res >= dpr ? bestCandidate = curCan : supportNativeLQIP || img.complete || !getImgAttr.call(img, "src") || img.lazyload || supportAbort && !(5 > imgAbortCount) || !isSameSet && inView(img) || (bestCandidate = curCan,
195
+ candidateSrc = curSrc, evaled = "L", reevaluateAfterLoad(img)))), !bestCandidate) for (oldRes && (curCan.res = curCan.res - (curCan.res - oldRes) / 2),
196
+ candidates.sort(ascendingSort), length = candidates.length, bestCandidate = candidates[length - 1],
197
+ i = 0; length > i; i++) if (candidate = candidates[i], candidate.res >= dpr) {
198
+ j = i - 1, bestCandidate = candidates[j] && (diff = candidate.res - dpr) && (abortCurSrc || curSrc != ri.makeUrl(candidate.url)) && chooseLowRes(candidates[j].res, diff, dpr) ? candidates[j] : candidate;
217
199
  break;
218
200
  }
219
201
  return oldRes && (curCan.res = oldRes), bestCandidate && (candidateSrc = ri.makeUrl(bestCandidate.url),
220
- imageData.curSrc = candidateSrc, imageData.curCan = bestCandidate, candidateSrc != curSrc ? ri.setSrc(img, bestCandidate) : ri.setSize(img)),
221
- evaled;
202
+ imageData.curSrc = candidateSrc, imageData.curCan = bestCandidate, candidateSrc != curSrc && ri.setSrc(img, bestCandidate),
203
+ ri.setSize(img)), evaled;
222
204
  }
223
- };
224
- ri.setSrc = function(img, bestCandidate) {
225
- var origWidth;
226
- img.src = bestCandidate.url, "image/svg+xml" == bestCandidate.set.type && (origWidth = img.style.width,
227
- img.style.width = img.offsetWidth + 1 + "px", img.offsetWidth + 1 && (img.style.width = origWidth)),
228
- ri.setSize(img);
229
- }, ri.setSize = noop, ri.getSet = function(img) {
205
+ }, ri.setSrc = function(img, bestCandidate) {
206
+ var origStyle;
207
+ img.src = bestCandidate.url, reflowBug && (origStyle = img.style.zoom, img.style.zoom = "0.999",
208
+ img.style.zoom = origStyle);
209
+ }, ri.getSet = function(img) {
230
210
  var i, set, supportsType, match = !1, sets = img[ri.ns].sets;
231
211
  for (i = 0; i < sets.length && !match; i++) if (set = sets[i], set.srcset && ri.matchesMedia(set.media) && (supportsType = ri.supportsType(set.type))) {
232
212
  "pending" == supportsType && (set = supportsType), match = set;
233
213
  break;
234
214
  }
235
215
  return match;
236
- };
237
- var alwaysCheckWDescriptor = ri.supSrcset && !ri.supSizes;
238
- ri.parseSets = function(element, parent) {
239
- var srcsetAttribute, fallbackCandidate, isWDescripor, srcsetParsed, hasPicture = "PICTURE" == parent.nodeName.toUpperCase(), imageData = element[ri.ns];
216
+ }, ri.parseSets = function(element, parent) {
217
+ var srcsetAttribute, imageSet, isWDescripor, srcsetParsed, hasPicture = "PICTURE" == parent.nodeName.toUpperCase(), imageData = element[ri.ns];
240
218
  imageData.src === undefined && (imageData.src = getImgAttr.call(element, "src"),
241
219
  imageData.src ? setImgAttr.call(element, srcAttr, imageData.src) : removeImgAttr.call(element, srcAttr)),
242
220
  imageData.srcset === undefined && (srcsetAttribute = getImgAttr.call(element, "srcset"),
243
221
  imageData.srcset = srcsetAttribute, srcsetParsed = !0), imageData.sets = [], hasPicture && (imageData.pic = !0,
244
- getAllSourceElements(parent, imageData.sets)), imageData.srcset ? (fallbackCandidate = {
222
+ getAllSourceElements(parent, imageData.sets)), imageData.srcset ? (imageSet = {
245
223
  srcset: imageData.srcset,
246
224
  sizes: getImgAttr.call(element, "sizes")
247
- }, imageData.sets.push(fallbackCandidate), isWDescripor = alwaysCheckWDescriptor || imageData.src ? hasWDescripor(fallbackCandidate) : !1,
248
- isWDescripor || !imageData.src || getCandidateForSrc(imageData.src, fallbackCandidate) || hasOneX(fallbackCandidate) || (fallbackCandidate.srcset += ", " + imageData.src,
249
- fallbackCandidate.cands = !1)) : imageData.src && imageData.sets.push({
225
+ }, imageData.sets.push(imageSet), isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || ""),
226
+ isWDescripor || !imageData.src || getCandidateForSrc(imageData.src, imageSet) || imageSet.has1x || (imageSet.srcset += ", " + imageData.src,
227
+ imageSet.cands.push({
228
+ url: imageData.src,
229
+ x: 1,
230
+ set: imageSet
231
+ }))) : imageData.src && imageData.sets.push({
250
232
  srcset: imageData.src,
251
233
  sizes: null
252
- }), imageData.curCan = null, imageData.supported = !(hasPicture || fallbackCandidate && !ri.supSrcset || isWDescripor),
234
+ }), imageData.curCan = null, imageData.supported = !(hasPicture || imageSet && !ri.supSrcset || isWDescripor),
253
235
  srcsetParsed && ri.supSrcset && !imageData.supported && (srcsetAttribute ? (setImgAttr.call(element, srcsetAttr, srcsetAttribute),
254
236
  element.srcset = "") : removeImgAttr.call(element, srcsetAttr)), imageData.supported && !imageData.srcset && (!imageData.src && element.src || element.src != ri.makeUrl(imageData.src)) && (null == imageData.src ? element.removeAttribute("src") : element.src = imageData.src),
255
237
  imageData.parsed = !0;
256
- };
257
- var reevaluateAfterLoad = function() {
258
- var onload = function() {
259
- off(this, "load", onload), off(this, "error", onload), ri.fillImgs({
260
- elements: [ this ]
261
- });
262
- };
263
- return function(img) {
264
- off(img, "load", onload), off(img, "error", onload), on(img, "error", onload), on(img, "load", onload);
265
- };
266
- }();
267
- ri.fillImg = function(element, options) {
238
+ }, ri.fillImg = function(element, options) {
268
239
  var parent, imageData, extreme = options.reparse || options.reevaluate;
269
240
  if (element[ri.ns] || (element[ri.ns] = {}), imageData = element[ri.ns], "L" == imageData.evaled && element.complete && (imageData.evaled = !1),
270
241
  extreme || !imageData.evaled) {
@@ -274,28 +245,13 @@
274
245
  }
275
246
  imageData.supported ? imageData.evaled = !0 : applyBestCandidate(element);
276
247
  }
277
- };
278
- var resizeThrottle;
279
- ri.setupRun = function(options) {
248
+ }, ri.setupRun = function(options) {
280
249
  (!alreadyRun || options.reevaluate || isVwDirty) && (updateMetrics(), options.elements || options.context || clearTimeout(resizeThrottle));
281
- }, ri.teardownRun = noop;
282
- var alreadyRun = !1, respimage = function(opt) {
283
- var elements, i, plen, options = opt || {};
284
- if (options.elements && 1 == options.elements.nodeType && ("IMG" == options.elements.nodeName.toUpperCase() ? options.elements = [ options.elements ] : (options.context = options.elements,
285
- options.elements = null)), elements = options.elements || ri.qsa(options.context || document, options.reevaluate || options.reparse ? ri.sel : ri.selShort),
286
- plen = elements.length) {
287
- for (ri.setupRun(options), alreadyRun = !0, i = 0; plen > i; i++) ri.fillImg(elements[i], options);
288
- ri.teardownRun(options);
289
- }
290
- };
291
- ri.fillImgs = respimage, window.HTMLPictureElement ? (respimage = noop, ri.fillImg = noop) : !function() {
292
- var lDelay;
293
- lDelay = supportAbort ? 180 : 400;
294
- var run = function() {
250
+ }, window.HTMLPictureElement ? (respimage = noop, ri.fillImg = noop) : !function() {
251
+ var isDomReady, regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/, run = function() {
295
252
  var readyState = document.readyState || "";
296
- clearTimeout(timerId), timerId = setTimeout(run, "loading" == readyState ? lDelay : 2e3),
297
- document.body && (/d$|^c/.test(readyState) && (isWinComplete = !0, clearTimeout(timerId),
298
- off(document, "readystatechange", run)), ri.fillImgs());
253
+ timerId = setTimeout(run, "loading" == readyState ? 200 : 999), document.body && (isDomReady = isDomReady || regReady.test(readyState),
254
+ ri.fillImgs(), isDomReady && (imgAbortCount += 6, clearTimeout(timerId)));
299
255
  }, resizeEval = function() {
300
256
  ri.fillImgs({
301
257
  reevaluate: !0
@@ -304,15 +260,110 @@
304
260
  clearTimeout(resizeThrottle), isVwDirty = !0, resizeThrottle = setTimeout(resizeEval, 99);
305
261
  }, timerId = setTimeout(run, document.body ? 9 : 99);
306
262
  on(window, "resize", onResize), on(document, "readystatechange", run);
307
- }(), respimage._ = ri, respimage.config = function(name, value, value2) {
308
- if ("addType" == name) {
309
- if (types[value] = value2, "pending" == value2) return;
310
- } else cfg[name] = value;
311
- alreadyRun && ri.fillImgs({
312
- reevaluate: !0
313
- });
314
- }, window.respimage = respimage;
263
+ }(), ri.respimage = respimage, ri.fillImgs = respimage, ri.teardownRun = noop, respimage._ = ri,
264
+ window.respimage = respimage, window.respimgCFG = {
265
+ ri: ri,
266
+ push: function(args) {
267
+ var name = args.shift();
268
+ "function" == typeof ri[name] ? ri[name].apply(ri, args) : (cfg[name] = args[0],
269
+ alreadyRun && ri.fillImgs({
270
+ reevaluate: !0
271
+ }));
272
+ }
273
+ };
274
+ for (;setOptions && setOptions.length; ) window.respimgCFG.push(setOptions.shift());
315
275
  }(window, document);
276
+ (function( factory ) {
277
+ "use strict";
278
+ var interValId;
279
+ var intervalIndex = 0;
280
+ var run = function(){
281
+ if ( window.respimage ) {
282
+ factory( window.respimage );
283
+ }
284
+ if(window.respimage || intervalIndex > 9999){
285
+ clearInterval(interValId);
286
+ }
287
+ intervalIndex++;
288
+ };
289
+ interValId = setInterval(run, 8);
290
+
291
+ run();
292
+
293
+ }( function( respimage ) {
294
+ "use strict";
295
+
296
+ var ri = respimage._;
297
+ var runningTests = 0;
298
+ var setTypeValue = function(types, value){
299
+ var i;
300
+ for(i = 0; i < types.length; i++){
301
+ ri.types[types[i]] = value;
302
+ }
303
+ };
304
+
305
+ if(window.HTMLPictureElement && !ri.cfg.uT){
306
+ respimage.testTypeSupport = function(){};
307
+ return;
308
+ }
309
+
310
+ ri.types["image/bmp"] = true;
311
+ ri.types["image/x-bmp"] = true;
312
+
313
+ respimage.testTypeSupport = function(types, url, width, useCanvas){
314
+ if(typeof types == "string"){
315
+ types = types.split(/\s*\,*\s+/g);
316
+ }
317
+ var canvas;
318
+ var supports = "pending";
319
+ var img = document.createElement('img');
320
+ var onComplete = function(){
321
+ runningTests--;
322
+ setTypeValue(types, supports);
323
+ if(runningTests < 1){
324
+ respimage({reevaluate: true});
325
+ }
326
+ };
327
+
328
+ if(useCanvas){
329
+ canvas = document.createElement('canvas');
330
+ if(!canvas.getContext){
331
+ setTypeValue(types, false);
332
+ return;
333
+ }
334
+ }
335
+
336
+ img.onload = function(){
337
+ var ctx;
338
+ supports = true;
339
+ if(width){
340
+ supports = img.width == width;
341
+ }
342
+
343
+ if(useCanvas){
344
+ ctx = canvas.getContext('2d');
345
+ ctx.drawImage(img, 0, 0);
346
+ supports = ctx.getImageData(0, 0, 1, 1).data[3] === 0;
347
+ }
348
+ onComplete();
349
+ };
350
+
351
+ img.onerror = function(){
352
+ supports = false;
353
+ onComplete();
354
+ };
355
+ runningTests++;
356
+ setTypeValue(types, "pending");
357
+ img.src = url;
358
+ };
359
+
360
+
361
+ respimage.testTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==", 1);
362
+ respimage.testTypeSupport("image/jp2 image/jpx image/jpm", "data:image/jp2;base64,/0//UQAyAAAAAAABAAAAAgAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAEBwEBBwEBBwEBBwEB/1IADAAAAAEAAAQEAAH/XAAEQED/ZAAlAAFDcmVhdGVkIGJ5IE9wZW5KUEVHIHZlcnNpb24gMi4wLjD/kAAKAAAAAABYAAH/UwAJAQAABAQAAf9dAAUBQED/UwAJAgAABAQAAf9dAAUCQED/UwAJAwAABAQAAf9dAAUDQED/k8+kEAGvz6QQAa/PpBABr994EAk//9k=", 1);
363
+ respimage.testTypeSupport("image/vnd.ms-photo", "data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==", 1);
364
+ respimage.testTypeSupport("video/png video/apng video/x-mng video/x-png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==", false, true);
365
+
366
+ }));
316
367
 
317
368
  (function( factory ) {
318
369
  "use strict";
@@ -342,41 +393,42 @@
342
393
  var curCandidate = data.curCan;
343
394
 
344
395
  if ( width ) {
345
- if ( curCandidate.desc.type == "x" ) {
346
- img.setAttribute( "width", parseInt( (width / curCandidate.res) / cfg.xQuant, 10) );
347
- } else if ( curCandidate.desc.type == "w" ) {
348
- img.setAttribute( "width", parseInt( curCandidate.cWidth * (width / curCandidate.desc.val), 10) );
349
- }
396
+ img.setAttribute( "width", parseInt(width / curCandidate.res, 10) );
350
397
  }
351
398
  };
352
399
  var loadBg = function(url, img, data){
353
- var bgImg;
354
- var curCandidate;
400
+ var bgImg, curCandidate, clear;
401
+
402
+
355
403
  if(knownWidths[url]){
356
404
  setSize(knownWidths[url], img, data);
357
405
  } else {
406
+ clear = function(){
407
+ data.pendingURLSize = null;
408
+ bgImg.onload = null;
409
+ bgImg.onerror = null;
410
+ img = null;
411
+ bgImg = null;
412
+ };
413
+
414
+ data.pendingURLSize = url;
358
415
  curCandidate = data.curCan;
359
- if(curCandidate.desc.type == 'w'){
360
- setSize(curCandidate.desc.val, img, data);
416
+
417
+ if(curCandidate.w){
418
+ setSize(curCandidate.w, img, data);
361
419
  }
362
420
 
363
421
  bgImg = document.createElement('img');
422
+
364
423
  bgImg.onload = function(){
365
424
  knownWidths[url] = bgImg.naturalWidth || bgImg.width;
366
425
  if(url == img[curSrcProp]){
367
426
  setSize(knownWidths[url], img, data);
368
427
  }
369
- bgImg.onload = null;
370
- bgImg.onerror = null;
371
- img = null;
372
- bgImg = null;
373
- };
374
- bgImg.onerror = function(){
375
- img = null;
376
- bgImg.onload = null;
377
- bgImg.onerror = null;
378
- bgImg = null;
428
+ clear();
379
429
  };
430
+ bgImg.onerror = clear;
431
+
380
432
  bgImg.src = url;
381
433
 
382
434
  if(bgImg && bgImg.complete){
@@ -387,17 +439,34 @@
387
439
  };
388
440
  var reeval = (function(){
389
441
  var running, timer;
442
+
390
443
  var run = function(){
444
+ var i, len, imgData;
445
+ var imgs = document.getElementsByTagName('img');
446
+ var options = {elements: []};
447
+
448
+ ri.setupRun(options);
449
+
391
450
  running = false;
392
451
  clearTimeout(timer);
393
- respimage({reevaluate: true});
452
+
453
+ for(i = 0, len = imgs.length; i < len; i++){
454
+ imgData = imgs[i][ri.ns];
455
+
456
+ if(imgData && imgData.curCan){
457
+ ri.setRes.res(imgData.curCan, imgData.curCan.set.sizes);
458
+ ri.setSize(imgs[i]);
459
+ }
460
+ }
461
+
462
+ ri.teardownRun( options );
394
463
  };
395
464
 
396
465
  return function(){
397
466
  if(!running && cfg.addSize){
398
467
  running = true;
399
468
  clearTimeout(timer);
400
- timer = setTimeout(run, 33);
469
+ timer = setTimeout(run);
401
470
  }
402
471
  };
403
472
 
@@ -407,8 +476,6 @@
407
476
  curSrcProp = "src";
408
477
  }
409
478
 
410
- cfg.addSize = true;
411
-
412
479
  ri.setSize = function( img ) {
413
480
  var url;
414
481
  var data = img[ ri.ns ];
@@ -420,7 +487,8 @@
420
487
 
421
488
  if ( !cfg.addSize || !curCandidate || data.dims ) {return;}
422
489
  url = ri.makeUrl(curCandidate.url);
423
- if(url == img[curSrcProp]){
490
+
491
+ if(url == img[curSrcProp] && url !== data.pendingURLSize){
424
492
  loadBg(url, img, data);
425
493
  }
426
494
  };
@@ -429,99 +497,14 @@
429
497
  if(window.addEventListener){
430
498
  addEventListener('resize', reeval, false);
431
499
  }
432
- respimage({reevaluate: true});
433
- }));
434
-
435
- (function( factory ) {
436
- "use strict";
437
- var interValId;
438
- var intervalIndex = 0;
439
- var run = function(){
440
- if ( window.respimage ) {
441
- factory( window.respimage );
442
- }
443
- if(window.respimage || intervalIndex > 9999){
444
- clearInterval(interValId);
445
- }
446
- intervalIndex++;
447
- };
448
- interValId = setInterval(run, 8);
449
-
450
- run();
451
-
452
- }( function( respimage ) {
453
- "use strict";
454
500
 
455
- var ri = respimage._;
456
- var runningTests = 0;
457
- var setTypeValue = function(types, value){
458
- var i;
459
- for(i = 0; i < types.length; i++){
460
- ri.types[types[i]] = value;
461
- }
462
- };
463
-
464
- if(window.HTMLPictureElement && !ri.cfg.uT){
465
- respimage.testTypeSupport = function(){};
466
- return;
501
+ if(!('addSize' in cfg)){
502
+ cfg.addSize = true;
503
+ } else {
504
+ cfg.addSize = !!cfg.addSize;
467
505
  }
468
506
 
469
- ri.types["image/bmp"] = true;
470
- ri.types["image/x-bmp"] = true;
471
-
472
- respimage.testTypeSupport = function(types, url, width, useCanvas){
473
- if(typeof types == "string"){
474
- types = types.split(/\s*\,*\s+/g);
475
- }
476
- var canvas;
477
- var supports = "pending";
478
- var img = document.createElement('img');
479
- var onComplete = function(){
480
- runningTests--;
481
- setTypeValue(types, supports);
482
- if(runningTests < 1){
483
- respimage({reevaluate: true});
484
- }
485
- };
486
-
487
- if(useCanvas){
488
- canvas = document.createElement('canvas');
489
- if(!canvas.getContext){
490
- setTypeValue(types, false);
491
- return;
492
- }
493
- }
494
-
495
- img.onload = function(){
496
- var ctx;
497
- supports = true;
498
- if(width){
499
- supports = img.width == width;
500
- }
501
-
502
- if(useCanvas){
503
- ctx = canvas.getContext('2d');
504
- ctx.drawImage(img, 0, 0);
505
- supports = ctx.getImageData(0, 0, 1, 1).data[3] === 0;
506
- }
507
- onComplete();
508
- };
509
-
510
- img.onerror = function(){
511
- supports = false;
512
- onComplete();
513
- };
514
- runningTests++;
515
- setTypeValue(types, "pending");
516
- img.src = url;
517
- };
518
-
519
-
520
- respimage.testTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==", 1);
521
- respimage.testTypeSupport("image/jp2 image/jpx image/jpm", "data:image/jp2;base64,/0//UQAyAAAAAAABAAAAAgAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAEBwEBBwEBBwEBBwEB/1IADAAAAAEAAAQEAAH/XAAEQED/ZAAlAAFDcmVhdGVkIGJ5IE9wZW5KUEVHIHZlcnNpb24gMi4wLjD/kAAKAAAAAABYAAH/UwAJAQAABAQAAf9dAAUBQED/UwAJAgAABAQAAf9dAAUCQED/UwAJAwAABAQAAf9dAAUDQED/k8+kEAGvz6QQAa/PpBABr994EAk//9k=", 1);
522
- respimage.testTypeSupport("image/vnd.ms-photo", "data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==", 1);
523
- respimage.testTypeSupport("video/png video/apng video/x-mng video/x-png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==", false, true);
524
-
507
+ reeval();
525
508
  }));
526
509
 
527
510
 
@@ -537,8 +520,7 @@
537
520
  })();
538
521
 
539
522
 
540
- ;/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
541
-
523
+ /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
542
524
  window.matchMedia || (window.matchMedia = function() {
543
525
  "use strict";
544
526