webshims-rails 1.15.5 → 1.15.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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