From a351f1a2c8c29e249a89fa02afcfce73f742b087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Fiv=C3=A9?= Date: Thu, 14 Jan 2016 08:23:45 +0100 Subject: [PATCH] add retina image thumbnails to mediabundle --- Resources/config/liip_imagine.yml | 8 +- .../ui/vendor_bower/picturefill/.bower.json | 43 + .../ui/vendor_bower/picturefill/Authors.txt | 43 + .../vendor_bower/picturefill/CONTRIBUTING.md | 60 + Resources/ui/vendor_bower/picturefill/LICENSE | 21 + .../ui/vendor_bower/picturefill/README.md | 53 + .../ui/vendor_bower/picturefill/bower.json | 33 + .../ui/vendor_bower/picturefill/composer.json | 18 + .../picturefill/dist/picturefill.js | 1511 +++++++++++++++++ .../picturefill/dist/picturefill.min.js | 5 + .../intrinsic-dimension/pf.intrinsic.js | 147 ++ .../intrinsic-dimension/pf.intrinsic.min.js | 5 + .../dist/plugins/mutation/pf.mutation.js | 429 +++++ .../dist/plugins/mutation/pf.mutation.min.js | 5 + .../dist/plugins/oldie/pf.oldie.js | 37 + .../dist/plugins/oldie/pf.oldie.min.js | 5 + .../dist/plugins/print/pf.print.js | 63 + .../dist/plugins/print/pf.print.min.js | 5 + .../dist/plugins/typesupport/pf.type.js | 89 + .../dist/plugins/typesupport/pf.type.min.js | 5 + .../ui/vendor_bower/picturefill/gruntfile.js | 130 ++ .../ui/vendor_bower/picturefill/index.html | 295 ++++ .../picturefill/logos/bocoup-lg.png | Bin 0 -> 31957 bytes .../picturefill/logos/bocoup-sm.png | Bin 0 -> 31223 bytes .../vendor_bower/picturefill/logos/fg-lg.png | Bin 0 -> 12723 bytes .../vendor_bower/picturefill/logos/fg-sm.png | Bin 0 -> 12723 bytes .../picturefill/logos/ricg-seal.png | Bin 0 -> 57789 bytes .../ui/vendor_bower/picturefill/package.json | 42 + .../vendor_bower/picturefill/picturefill.json | 22 + .../picturefill/src/picturefill.js | 1438 ++++++++++++++++ .../plugins/gecko-picture/pf.gecko-picture.js | 68 + .../intrinsic-dimension/pf.intrinsic.js | 147 ++ .../src/plugins/mutation/pf.mutation.js | 429 +++++ .../picturefill/src/plugins/oldie/pf.oldie.js | 37 + .../picturefill/src/plugins/print/pf.print.js | 63 + .../src/plugins/typesupport/pf.type.js | 89 + .../views/Chooser/chooserShowFolder.html.twig | 3 +- Resources/views/Default/layout.html.twig | 1 + Resources/views/Folder/show.html.twig | 4 +- Resources/views/Form/formWidgets.html.twig | 3 +- bower.json | 3 +- 41 files changed, 5354 insertions(+), 5 deletions(-) create mode 100644 Resources/ui/vendor_bower/picturefill/.bower.json create mode 100644 Resources/ui/vendor_bower/picturefill/Authors.txt create mode 100644 Resources/ui/vendor_bower/picturefill/CONTRIBUTING.md create mode 100644 Resources/ui/vendor_bower/picturefill/LICENSE create mode 100644 Resources/ui/vendor_bower/picturefill/README.md create mode 100644 Resources/ui/vendor_bower/picturefill/bower.json create mode 100644 Resources/ui/vendor_bower/picturefill/composer.json create mode 100644 Resources/ui/vendor_bower/picturefill/dist/picturefill.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.js create mode 100644 Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.min.js create mode 100644 Resources/ui/vendor_bower/picturefill/gruntfile.js create mode 100644 Resources/ui/vendor_bower/picturefill/index.html create mode 100644 Resources/ui/vendor_bower/picturefill/logos/bocoup-lg.png create mode 100644 Resources/ui/vendor_bower/picturefill/logos/bocoup-sm.png create mode 100644 Resources/ui/vendor_bower/picturefill/logos/fg-lg.png create mode 100644 Resources/ui/vendor_bower/picturefill/logos/fg-sm.png create mode 100644 Resources/ui/vendor_bower/picturefill/logos/ricg-seal.png create mode 100644 Resources/ui/vendor_bower/picturefill/package.json create mode 100644 Resources/ui/vendor_bower/picturefill/picturefill.json create mode 100644 Resources/ui/vendor_bower/picturefill/src/picturefill.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/gecko-picture/pf.gecko-picture.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/intrinsic-dimension/pf.intrinsic.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/mutation/pf.mutation.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/oldie/pf.oldie.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/print/pf.print.js create mode 100644 Resources/ui/vendor_bower/picturefill/src/plugins/typesupport/pf.type.js diff --git a/Resources/config/liip_imagine.yml b/Resources/config/liip_imagine.yml index cf9a4b54..04a20e08 100644 --- a/Resources/config/liip_imagine.yml +++ b/Resources/config/liip_imagine.yml @@ -7,7 +7,13 @@ liip_imagine: media_list_thumbnail: quality: 75 filters: - thumbnail: { size: [210, 150], mode: inset } + thumbnail: { size: [210, 150], mode: outbound } + relative_resize: { widen: 210 } + media_list_thumbnail_retina: + quality: 85 + filters: + thumbnail: { size: [420, 300], mode: outbound } + relative_resize: { widen: 420 } media_detail_thumbnail: quality: 75 filters: diff --git a/Resources/ui/vendor_bower/picturefill/.bower.json b/Resources/ui/vendor_bower/picturefill/.bower.json new file mode 100644 index 00000000..29aaf1f5 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/.bower.json @@ -0,0 +1,43 @@ +{ + "name": "picturefill", + "repo": "scottjehl/picturefill", + "description": "A polyfill for responsive images (http://picture.responsiveimages.org/) that you can use today.", + "main": "dist/picturefill.js", + "scripts": [ + "dist/picturefill.js" + ], + "license": "MIT", + "homepage": "http://scottjehl.github.com/picturefill/", + "authors": [ + "Scott Jehl " + ], + "moduleType": [ + "amd", + "globals", + "node" + ], + "keywords": [ + "picture", + "srcset", + "polyfill" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "examples", + "perf-test" + ], + "version": "3.0.1", + "_release": "3.0.1", + "_resolution": { + "type": "version", + "tag": "3.0.1", + "commit": "87597fca6842c7df9e4f16da3ffda89ccf2351b6" + }, + "_source": "git://github.com/scottjehl/picturefill.git", + "_target": "~3.0.1", + "_originalSource": "picturefill" +} \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/Authors.txt b/Resources/ui/vendor_bower/picturefill/Authors.txt new file mode 100644 index 00000000..4ee556dd --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/Authors.txt @@ -0,0 +1,43 @@ +External authors, ordered by first contribution. + +David Beesley, @davebeesley +Gordon Brander, @gordonbrander +Max Klenk, @maxklenk +@ignasio +Dennis Gaebel, @grayghostvisuals +@codekipple +@jelmerdemaat +Brandon Belvin, @pizzabrandon +Jonathan Goldsmith, @goldsmith +Aaron Raimist, @aaronraimist +@floriangouy +John Albin Wilkins, @JohnAlbin +Maxime Thirouin, @MoOx +William Turrell, @wturrell +Brian Muenzenmeyer, @bmuenzenmeyer +Bryan Burgers, @bryanburgers +@michaelgilley +Tina Holly, @tinacious +Travis Northcutt, @tnorthcutt +@Zearin +Samy Al Zahrani, @salzhrani +Shawn Jansepar, @jansepar +John Bender, @johnbender +Thorsten Lorenz, @thlorenz +@gBokiau +Andy Matthews, @commadelimited +James Kerr, @jkerr838 +Pascal Borreli, @pborreli +Christoph Rohrer, @crohrer +Krister Kari, @kristerkari +Zoltan Hawryluk, @zoltan-dulac + +The Picturefill core team + +Scott Jehl, @scottjehl +Mat Marquis, @wilto +Mike Engel, @beardfury +Alex Jegtnes, @jegtnes +Sarah Forst, @quoo +Alexander Farkas, @aFarkas +Alex Bell, @albell diff --git a/Resources/ui/vendor_bower/picturefill/CONTRIBUTING.md b/Resources/ui/vendor_bower/picturefill/CONTRIBUTING.md new file mode 100644 index 00000000..873e2b55 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/CONTRIBUTING.md @@ -0,0 +1,60 @@ +# Contributing + +## Project Scope +Picturefill aims to polyfill the standard features of the `picture` element and related `srcset`, `sizes`, `type`, and `media` attributes (some of which work on `img` elements without a `picture` parent as well). Issues and contributions that fall outside of this scope are not likely to be accepted by the project. Some exceptions include workarounds that improve browser support for standard features. + +## Code License + +Picturefill is an open source project falling under the MIT License. By using, distributing, or contributing to this project, you accept and agree that all code within the Picturefill project are licensed under MIT license. + +## Working on Picturefill + +### Issue Discussion + +General Picturefill discussion takes place in Slack, at [http://picturefill.slack.com](http://picturefill.slack.com). To join, send an email to `picturefill` at `ricg.io`. Discussion of issues pertaining to the responsive images specifications takes place in the [RICG IRC channel](irc://irc.w3.org:6665/#respimg) and [issue tracker](https://github.com/responsiveimagescg/picture-element/issues/). + +You can connect to the Picturefill Slack channel [via IRC](https://slack.zendesk.com/hc/en-us/articles/201727913-Connecting-to-Slack-over-IRC-and-XMPP) (SSL enabled). + +### Modifying the code +First, ensure that you have the latest [Node.js](http://nodejs.org/) or [io.js](http://iojs.org) and [npm](http://npmjs.org/) installed. + +Test that Grunt's CLI is installed by running `grunt --version`. If the command isn't found, run `npm install -g grunt-cli`. For more information about installing Grunt, see the [getting started guide](http://gruntjs.com/getting-started). + +1. Fork and clone the repo. +1. Run `npm install` to install all dependencies (including Grunt). +1. Run `grunt` to grunt this project. + +Assuming that you don't see any red, you're ready to go. Just be sure to run `grunt` after making any changes, to ensure that nothing is broken. + +### Development Workflow + +**Note**: The `master` branch now represents the publishing branch. Anything on master should be publishable to npm and bower. When something goes into master, it gets published. Minor version branches (`2.2`, `2.3`, etc) also exist to capture in-progress work on a particular version of picturefill. Once work on a version branch is complete, it gets merged into master to be published. + +1. If no issue already exists for the work you’ll be doing, create one to document the problem(s) being solved and self-assign. +1. Create a new branch based off of the minor version branch you're fixing (`2.3`, `2.2`, etc) — please don't work in the `master` branch directly. We recommend naming the branch to match the issue being addressed (`issue-777`). +1. Add failing tests for the change you want to make. Run `grunt` to see the tests fail. +1. Fix stuff. +1. Run `grunt` to see if the tests pass. Repeat steps 2-4 until done. +1. Open `test/*.html` unit test file(s) in actual browsers to ensure tests pass everywhere. +1. Update the documentation to reflect any changes. +1. Push to your fork or push your issue-specific branch to the main repo, then submit a pull request against the minor version branch you're fixing. `2.2`, `2.3`, etc. +1. Once tested and +1’d by another team member (with no outstanding objections), self-merge into the branch specified in the pull request. +1. Once ready to release to the public, merge the minor version branch into master and publish to npm and create a tag for bower. + +### Versioning + +The rules of [semver](http://semver.org/) don’t necessarily apply here in the case of major releases (as a polyfill for a stable spec, we _shouldn’t_ have breaking changes), so we’re using the following: + +1. MAJOR versions at maintaners’ discretion following significant changes to the codebase (e.g. refactoring core) +1. MINOR versions for backwards-compatible enhancements (e.g. performance improvements) +1. PATCH versions for backwards-compatible bug fixes (e.g. spec compliance bugs, support issues) + +### Important notes + +Please don't edit files in the `dist` subdirectory as they are generated via Grunt. You'll find source code in the `src` subdirectory! + +#### Code style +Regarding code style like indentation and whitespace, **follow the conventions you see used in the source already.** + +#### PhantomJS +While Grunt can run the included unit tests via [PhantomJS](http://phantomjs.org/), this shouldn't be considered a substitute for the real thing. Please be sure to test the `test/*.html` unit test file(s) in _actual_ browsers. diff --git a/Resources/ui/vendor_bower/picturefill/LICENSE b/Resources/ui/vendor_bower/picturefill/LICENSE new file mode 100644 index 00000000..fcb0ced2 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Filament Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Resources/ui/vendor_bower/picturefill/README.md b/Resources/ui/vendor_bower/picturefill/README.md new file mode 100644 index 00000000..1a7bced8 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/README.md @@ -0,0 +1,53 @@ +# Picturefill +A [responsive image](http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content.html#embedded-content) polyfill. +* Authors: See [Authors.txt](https://raw.githubusercontent.com/scottjehl/picturefill/master/Authors.txt) +* License: MIT + +[![build-status](https://api.travis-ci.org/scottjehl/picturefill.svg)](https://travis-ci.org/scottjehl/picturefill) [Join Slack channel](https://pf-slackin.herokuapp.com/) + +Picturefill has three versions: + +* Version 1 mimics the Picture element pattern with `span` elements. It is no longer maintained. +* Version 2 is a lightweight polyfill of the [Picture element draft specification](http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content.html#embedded-content). +* Version 3.0.0 is the current stable release. + +## Usage, Demos, Docs +To find out how to use Picturefill, visit the [project site](http://scottjehl.github.com/picturefill/). + +## The gotchas +Be it browser issues, the responsive images specifications, or Picturefill itself, there are a couple gotchas you should be aware of when working with Picturefill: + +- Firefox 38 and 39 has some bugs [[1]](https://bugzilla.mozilla.org/show_bug.cgi?id=1139560) [[2]](https://bugzilla.mozilla.org/show_bug.cgi?id=1139554) [[3]](https://bugzilla.mozilla.org/show_bug.cgi?id=1135812) where images won't update on screen resize. These issues are addressed by Picturefill 3.0.0, and should be fixed in Firefox 41. + +- Per the `picture` spec, using `%` _isn't_ allowed in the `sizes` attribute. Using `%` will fallback to `100vw`. + +- Trying to use the `src` attribute in a browser that _doesn't_ support `picture` natively can result in a double download. To avoid this, don't use the `src` attribute on the `img` tag: + +```html + + + Sample pic + +``` + +- If you only want to have an image show up at certain sizes, and not show up at others, you will need to use a transparent placeholder gif: + +```html + + + Sample pic + +``` + +## Contributing +For information on how to contribute code to Picturefill, check out [`CONTRIBUTING.md`](CONTRIBUTING.md) + +## Issues +If you find a bug in Picturefill, please add it to [the issue tracker](https://github.com/scottjehl/picturefill/issues) + +## Discussion +Picturefill discussion takes place via Slack. For an invitation, visit [https://pf-slackin.herokuapp.com/](https://pf-slackin.herokuapp.com/) + +## Support +There are currently no known unsupported browsers, provided that you use the markup patterns provided. diff --git a/Resources/ui/vendor_bower/picturefill/bower.json b/Resources/ui/vendor_bower/picturefill/bower.json new file mode 100644 index 00000000..02fffd73 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/bower.json @@ -0,0 +1,33 @@ +{ + "name": "picturefill", + "repo": "scottjehl/picturefill", + "description": "A polyfill for responsive images (http://picture.responsiveimages.org/) that you can use today.", + "main": "dist/picturefill.js", + "scripts": [ + "dist/picturefill.js" + ], + "license": "MIT", + "homepage": "http://scottjehl.github.com/picturefill/", + "authors": [ + "Scott Jehl " + ], + "moduleType": [ + "amd", + "globals", + "node" + ], + "keywords": [ + "picture", + "srcset", + "polyfill" + ], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "examples", + "perf-test" + ] +} \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/composer.json b/Resources/ui/vendor_bower/picturefill/composer.json new file mode 100644 index 00000000..785430f8 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/composer.json @@ -0,0 +1,18 @@ +{ + "name": "scottjehl/picturefill", + "description": "A responsive image polyfill for , srcset, sizes, and more.", + "type": "component", + "homepage": "http://scottjehl.github.com/picturefill/", + "license": "MIT", + "extra": { + "component": { + "scripts": [ + "dist/picturefill.js" + ], + "files": [ + "dist/picturefill.min.js", + "extensions/ie8-mq-shim.js" + ] + } + } +} diff --git a/Resources/ui/vendor_bower/picturefill/dist/picturefill.js b/Resources/ui/vendor_bower/picturefill/dist/picturefill.js new file mode 100644 index 00000000..aa9a34a7 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/picturefill.js @@ -0,0 +1,1511 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +/*! Gecko-Picture - v1.0 + * https://github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture + * Firefox's early picture implementation (prior to FF41) is static and does + * not react to viewport changes. This tiny module fixes this. + */ +(function(window) { + /*jshint eqnull:true */ + var ua = navigator.userAgent; + + if ( window.HTMLPictureElement && ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 < 41) ) { + addEventListener("resize", (function() { + var timer; + + var dummySrc = document.createElement("source"); + + var fixRespimg = function(img) { + var source, sizes; + var picture = img.parentNode; + + if (picture.nodeName.toUpperCase() === "PICTURE") { + source = dummySrc.cloneNode(); + + picture.insertBefore(source, picture.firstElementChild); + setTimeout(function() { + picture.removeChild(source); + }); + } else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) { + img._pfLastSize = img.offsetWidth; + sizes = img.sizes; + img.sizes += ",100vw"; + setTimeout(function() { + img.sizes = sizes; + }); + } + }; + + var findPictureImgs = function() { + var i; + var imgs = document.querySelectorAll("picture > img, img[srcset][sizes]"); + for (i = 0; i < imgs.length; i++) { + fixRespimg(imgs[i]); + } + }; + var onResize = function() { + clearTimeout(timer); + timer = setTimeout(findPictureImgs, 99); + }; + var mq = window.matchMedia && matchMedia("(orientation: landscape)"); + var init = function() { + onResize(); + + if (mq && mq.addListener) { + mq.addListener(onResize); + } + }; + + dummySrc.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + + if (/^[c|i]|d$/.test(document.readyState || "")) { + init(); + } else { + document.addEventListener("DOMContentLoaded", init); + } + + return onResize; + })()); + } +})(window); + +/*! Picturefill - v3.0.1 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; + * License: MIT + */ + +(function( window, document, undefined ) { + // Enable strict mode + "use strict"; + + // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround) + document.createElement( "picture" ); + + var warn, eminpx, alwaysCheckWDescriptor, evalId; + // local object for method references and testing exposure + var pf = {}; + var noop = function() {}; + var image = document.createElement( "img" ); + var getImgAttr = image.getAttribute; + var setImgAttr = image.setAttribute; + var removeImgAttr = image.removeAttribute; + var docElem = document.documentElement; + var types = {}; + var cfg = { + //resource selection: + algorithm: "" + }; + var srcAttr = "data-pfsrc"; + var srcsetAttr = srcAttr + "set"; + // ua sniffing is done for undetectable img loading features, + // to do some non crucial perf optimizations + var ua = navigator.userAgent; + var supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35 ); + var curSrcProp = "currentSrc"; + var regWDesc = /\s+\+?\d+(e\d+)?w/; + var regSize = /(\([^)]+\))?\s*(.+)/; + var setOptions = window.picturefillCFG; + /** + * Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests ) + */ + // baseStyle also used by getEmValue (i.e.: width: 1em is important) + var 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)"; + var fsCss = "font-size:100%!important;"; + var isVwDirty = true; + + var cssCache = {}; + var sizeLengthCache = {}; + var DPR = window.devicePixelRatio; + var units = { + px: 1, + "in": 96 + }; + var anchor = document.createElement( "a" ); + /** + * alreadyRun flag used for setOptions. is it true setOptions will reevaluate + * @type {boolean} + */ + var alreadyRun = false; + + // Reusable, non-"g" Regexes + + // (Don't use \s, to avoid matching non-breaking space.) + var regexLeadingSpaces = /^[ \t\n\r\u000c]+/, + regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/, + regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/, + regexTrailingCommas = /[,]+$/, + regexNonNegativeInteger = /^\d+$/, + + // ( Positive or negative or unsigned integers or decimals, without or without exponents. + // Must include at least one digit. + // According to spec tests any decimal point must be followed by a digit. + // No leading plus sign is allowed.) + // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number + regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/; + + var on = function(obj, evt, fn, capture) { + if ( obj.addEventListener ) { + obj.addEventListener(evt, fn, capture || false); + } else if ( obj.attachEvent ) { + obj.attachEvent( "on" + evt, fn); + } + }; + + /** + * simple memoize function: + */ + + var memoize = function(fn) { + var cache = {}; + return function(input) { + if ( !(input in cache) ) { + cache[ input ] = fn(input); + } + return cache[ input ]; + }; + }; + + // UTILITY FUNCTIONS + + // Manual is faster than RegEx + // http://jsperf.com/whitespace-character/5 + function isSpace(c) { + return (c === "\u0020" || // space + c === "\u0009" || // horizontal tab + c === "\u000A" || // new line + c === "\u000C" || // form feed + c === "\u000D"); // carriage return + } + + /** + * gets a mediaquery and returns a boolean or gets a css length and returns a number + * @param css mediaqueries or css length + * @returns {boolean|number} + * + * based on: https://gist.github.com/jonathantneal/db4f77009b155f083738 + */ + var evalCSS = (function() { + + var regLength = /^([\d\.]+)(em|vw|px)$/; + var replace = function() { + var args = arguments, index = 0, string = args[0]; + while (++index in args) { + string = string.replace(args[index], args[++index]); + } + return string; + }; + + var buildStr = memoize(function(css) { + + return "return " + replace((css || "").toLowerCase(), + // interpret `and` + /\band\b/g, "&&", + + // interpret `,` + /,/g, "||", + + // interpret `min-` as >= + /min-([a-z-\s]+):/g, "e.$1>=", + + // interpret `max-` as <= + /max-([a-z-\s]+):/g, "e.$1<=", + + //calc value + /calc([^)]+)/g, "($1)", + + // interpret css values + /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", + //make eval less evil + /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig, "" + ) + ";"; + }); + + return function(css, length) { + var parsedLength; + if (!(css in cssCache)) { + cssCache[css] = false; + if (length && (parsedLength = css.match( regLength ))) { + cssCache[css] = parsedLength[ 1 ] * units[parsedLength[ 2 ]]; + } else { + /*jshint evil:true */ + try{ + cssCache[css] = new Function("e", buildStr(css))(units); + } catch(e) {} + /*jshint evil:false */ + } + } + return cssCache[css]; + }; + })(); + + var setResolution = function( candidate, sizesattr ) { + if ( candidate.w ) { // h = means height: || descriptor.type === 'h' do not handle yet... + candidate.cWidth = pf.calcListLength( sizesattr || "100vw" ); + candidate.res = candidate.w / candidate.cWidth ; + } else { + candidate.res = candidate.d; + } + return candidate; + }; + + /** + * + * @param opt + */ + var picturefill = function( opt ) { + var elements, i, plen; + + var options = opt || {}; + + if ( options.elements && options.elements.nodeType === 1 ) { + if ( options.elements.nodeName.toUpperCase() === "IMG" ) { + options.elements = [ options.elements ]; + } else { + options.context = options.elements; + options.elements = null; + } + } + + elements = options.elements || pf.qsa( (options.context || document), ( options.reevaluate || options.reselect ) ? pf.sel : pf.selShort ); + + if ( (plen = elements.length) ) { + + pf.setupRun( options ); + alreadyRun = true; + + // Loop through all elements + for ( i = 0; i < plen; i++ ) { + pf.fillImg(elements[ i ], options); + } + + pf.teardownRun( options ); + } + }; + + /** + * outputs a warning for the developer + * @param {message} + * @type {Function} + */ + warn = ( window.console && console.warn ) ? + function( message ) { + console.warn( message ); + } : + noop + ; + + if ( !(curSrcProp in image) ) { + curSrcProp = "src"; + } + + // Add support for standard mime types. + types[ "image/jpeg" ] = true; + types[ "image/gif" ] = true; + types[ "image/png" ] = true; + + function detectTypeSupport( type, typeUri ) { + // based on Modernizr's lossless img-webp test + // note: asynchronous + var image = new window.Image(); + image.onerror = function() { + types[ type ] = false; + picturefill(); + }; + image.onload = function() { + types[ type ] = image.width === 1; + picturefill(); + }; + image.src = typeUri; + return "pending"; + } + + // test svg support + types[ "image/svg+xml" ] = document.implementation.hasFeature( "http://wwwindow.w3.org/TR/SVG11/feature#Image", "1.1" ); + + /** + * updates the internal vW property with the current viewport width in px + */ + function updateMetrics() { + + isVwDirty = false; + DPR = window.devicePixelRatio; + cssCache = {}; + sizeLengthCache = {}; + + pf.DPR = DPR || 1; + + units.width = Math.max(window.innerWidth || 0, docElem.clientWidth); + units.height = Math.max(window.innerHeight || 0, docElem.clientHeight); + + units.vw = units.width / 100; + units.vh = units.height / 100; + + evalId = [ units.height, units.width, DPR ].join("-"); + + units.em = pf.getEmValue(); + units.rem = units.em; + } + + function chooseLowRes( lowerValue, higherValue, dprValue, isCached ) { + var bonusFactor, tooMuch, bonus, meanDensity; + + //experimental + if (cfg.algorithm === "saveData" ){ + if ( lowerValue > 2.7 ) { + meanDensity = dprValue + 1; + } else { + tooMuch = higherValue - dprValue; + bonusFactor = Math.pow(lowerValue - 0.6, 1.5); + + bonus = tooMuch * bonusFactor; + + if (isCached) { + bonus += 0.1 * bonusFactor; + } + + meanDensity = lowerValue + bonus; + } + } else { + meanDensity = (dprValue > 1) ? + Math.sqrt(lowerValue * higherValue) : + lowerValue; + } + + return meanDensity > dprValue; + } + + function applyBestCandidate( img ) { + var srcSetCandidates; + var matchingSet = pf.getSet( img ); + var evaluated = false; + if ( matchingSet !== "pending" ) { + evaluated = evalId; + if ( matchingSet ) { + srcSetCandidates = pf.setRes( matchingSet ); + pf.applySetCandidate( srcSetCandidates, img ); + } + } + img[ pf.ns ].evaled = evaluated; + } + + function ascendingSort( a, b ) { + return a.res - b.res; + } + + function setSrcToCur( img, src, set ) { + var candidate; + if ( !set && src ) { + set = img[ pf.ns ].sets; + set = set && set[set.length - 1]; + } + + candidate = getCandidateForSrc(src, set); + + if ( candidate ) { + src = pf.makeUrl(src); + img[ pf.ns ].curSrc = src; + img[ pf.ns ].curCan = candidate; + + if ( !candidate.res ) { + setResolution( candidate, candidate.set.sizes ); + } + } + return candidate; + } + + function getCandidateForSrc( src, set ) { + var i, candidate, candidates; + if ( src && set ) { + candidates = pf.parseSet( set ); + src = pf.makeUrl(src); + for ( i = 0; i < candidates.length; i++ ) { + if ( src === pf.makeUrl(candidates[ i ].url) ) { + candidate = candidates[ i ]; + break; + } + } + } + return candidate; + } + + function getAllSourceElements( picture, candidates ) { + var i, len, source, srcset; + + // SPEC mismatch intended for size and perf: + // actually only source elements preceding the img should be used + // also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector + var sources = picture.getElementsByTagName( "source" ); + + for ( i = 0, len = sources.length; i < len; i++ ) { + source = sources[ i ]; + source[ pf.ns ] = true; + srcset = source.getAttribute( "srcset" ); + + // if source does not have a srcset attribute, skip + if ( srcset ) { + candidates.push( { + srcset: srcset, + media: source.getAttribute( "media" ), + type: source.getAttribute( "type" ), + sizes: source.getAttribute( "sizes" ) + } ); + } + } + } + + /** + * Srcset Parser + * By Alex Bell | MIT License + * + * @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...] + * + * Based super duper closely on the reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute + */ + + // 1. Let input be the value passed to this algorithm. + // (TO-DO : Explain what "set" argument is here. Maybe choose a more + // descriptive & more searchable name. Since passing the "set" in really has + // nothing to do with parsing proper, I would prefer this assignment eventually + // go in an external fn.) + function parseSrcset(input, set) { + + function collectCharacters(regEx) { + var chars, + match = regEx.exec(input.substring(pos)); + if (match) { + chars = match[ 0 ]; + pos += chars.length; + return chars; + } + } + + var inputLength = input.length, + url, + descriptors, + currentDescriptor, + state, + c, + + // 2. Let position be a pointer into input, initially pointing at the start + // of the string. + pos = 0, + + // 3. Let candidates be an initially empty source set. + candidates = []; + + /** + * Adds descriptor properties to a candidate, pushes to the candidates array + * @return undefined + */ + // (Declared outside of the while loop so that it's only created once. + // (This fn is defined before it is used, in order to pass JSHINT. + // Unfortunately this breaks the sequencing of the spec comments. :/ ) + function parseDescriptors() { + + // 9. Descriptor parser: Let error be no. + var pError = false, + + // 10. Let width be absent. + // 11. Let density be absent. + // 12. Let future-compat-h be absent. (We're implementing it now as h) + w, d, h, i, + candidate = {}, + desc, lastChar, value, intVal, floatVal; + + // 13. For each descriptor in descriptors, run the appropriate set of steps + // from the following list: + for (i = 0 ; i < descriptors.length; i++) { + desc = descriptors[ i ]; + + lastChar = desc[ desc.length - 1 ]; + value = desc.substring(0, desc.length - 1); + intVal = parseInt(value, 10); + floatVal = parseFloat(value); + + // If the descriptor consists of a valid non-negative integer followed by + // a U+0077 LATIN SMALL LETTER W character + if (regexNonNegativeInteger.test(value) && (lastChar === "w")) { + + // If width and density are not both absent, then let error be yes. + if (w || d) {pError = true;} + + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. + // Otherwise, let width be the result. + if (intVal === 0) {pError = true;} else {w = intVal;} + + // If the descriptor consists of a valid floating-point number followed by + // a U+0078 LATIN SMALL LETTER X character + } else if (regexFloatingPoint.test(value) && (lastChar === "x")) { + + // If width, density and future-compat-h are not all absent, then let error + // be yes. + if (w || d || h) {pError = true;} + + // Apply the rules for parsing floating-point number values to the descriptor. + // If the result is less than zero, let error be yes. Otherwise, let density + // be the result. + if (floatVal < 0) {pError = true;} else {d = floatVal;} + + // If the descriptor consists of a valid non-negative integer followed by + // a U+0068 LATIN SMALL LETTER H character + } else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) { + + // If height and density are not both absent, then let error be yes. + if (h || d) {pError = true;} + + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. Otherwise, let future-compat-h + // be the result. + if (intVal === 0) {pError = true;} else {h = intVal;} + + // Anything else, Let error be yes. + } else {pError = true;} + } // (close step 13 for loop) + + // 15. If error is still no, then append a new image source to candidates whose + // URL is url, associated with a width width if not absent and a pixel + // density density if not absent. Otherwise, there is a parse error. + if (!pError) { + candidate.url = url; + + if (w) { candidate.w = w;} + if (d) { candidate.d = d;} + if (h) { candidate.h = h;} + if (!h && !d && !w) {candidate.d = 1;} + if (candidate.d === 1) {set.has1x = true;} + candidate.set = set; + + candidates.push(candidate); + } + } // (close parseDescriptors fn) + + /** + * Tokenizes descriptor properties prior to parsing + * Returns undefined. + * (Again, this fn is defined before it is used, in order to pass JSHINT. + * Unfortunately this breaks the logical sequencing of the spec comments. :/ ) + */ + function tokenize() { + + // 8.1. Descriptor tokeniser: Skip whitespace + collectCharacters(regexLeadingSpaces); + + // 8.2. Let current descriptor be the empty string. + currentDescriptor = ""; + + // 8.3. Let state be in descriptor. + state = "in descriptor"; + + while (true) { + + // 8.4. Let c be the character at position. + c = input.charAt(pos); + + // Do the following depending on the value of state. + // For the purpose of this step, "EOF" is a special character representing + // that position is past the end of input. + + // In descriptor + if (state === "in descriptor") { + // Do the following, depending on the value of c: + + // Space character + // If current descriptor is not empty, append current descriptor to + // descriptors and let current descriptor be the empty string. + // Set state to after descriptor. + if (isSpace(c)) { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + currentDescriptor = ""; + state = "after descriptor"; + } + + // U+002C COMMA (,) + // Advance position to the next character in input. If current descriptor + // is not empty, append current descriptor to descriptors. Jump to the step + // labeled descriptor parser. + } else if (c === ",") { + pos += 1; + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; + + // U+0028 LEFT PARENTHESIS (() + // Append c to current descriptor. Set state to in parens. + } else if (c === "\u0028") { + currentDescriptor = currentDescriptor + c; + state = "in parens"; + + // EOF + // If current descriptor is not empty, append current descriptor to + // descriptors. Jump to the step labeled descriptor parser. + } else if (c === "") { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; + + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } + // (end "in descriptor" + + // In parens + } else if (state === "in parens") { + + // U+0029 RIGHT PARENTHESIS ()) + // Append c to current descriptor. Set state to in descriptor. + if (c === ")") { + currentDescriptor = currentDescriptor + c; + state = "in descriptor"; + + // EOF + // Append current descriptor to descriptors. Jump to the step labeled + // descriptor parser. + } else if (c === "") { + descriptors.push(currentDescriptor); + parseDescriptors(); + return; + + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } + + // After descriptor + } else if (state === "after descriptor") { + + // Do the following, depending on the value of c: + // Space character: Stay in this state. + if (isSpace(c)) { + + // EOF: Jump to the step labeled descriptor parser. + } else if (c === "") { + parseDescriptors(); + return; + + // Anything else + // Set state to in descriptor. Set position to the previous character in input. + } else { + state = "in descriptor"; + pos -= 1; + + } + } + + // Advance position to the next character in input. + pos += 1; + + // Repeat this step. + } // (close while true loop) + } + + // 4. Splitting loop: Collect a sequence of characters that are space + // characters or U+002C COMMA characters. If any U+002C COMMA characters + // were collected, that is a parse error. + while (true) { + collectCharacters(regexLeadingCommasOrSpaces); + + // 5. If position is past the end of input, return candidates and abort these steps. + if (pos >= inputLength) { + return candidates; // (we're done, this is the sole return path) + } + + // 6. Collect a sequence of characters that are not space characters, + // and let that be url. + url = collectCharacters(regexLeadingNotSpaces); + + // 7. Let descriptors be a new empty list. + descriptors = []; + + // 8. If url ends with a U+002C COMMA character (,), follow these substeps: + // (1). Remove all trailing U+002C COMMA characters from url. If this removed + // more than one character, that is a parse error. + if (url.slice(-1) === ",") { + url = url.replace(regexTrailingCommas, ""); + // (Jump ahead to step 9 to skip tokenization and just push the candidate). + parseDescriptors(); + + // Otherwise, follow these substeps: + } else { + tokenize(); + } // (close else of step 8) + + // 16. Return to the step labeled splitting loop. + } // (Close of big while loop.) + } + + /* + * Sizes Parser + * + * By Alex Bell | MIT License + * + * Non-strict but accurate and lightweight JS Parser for the string value + * + * Reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute + * + * Most comments are copied in directly from the spec + * (except for comments in parens). + * + * Grammar is: + * = # [ , ]? | + * = + * = + * http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes + * + * E.g. "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw" + * or "(min-width: 30em), calc(30vw - 15px)" or just "30vw" + * + * Returns the first valid with a media condition that evaluates to true, + * or "100vw" if all valid media conditions evaluate to false. + * + */ + + function parseSizes(strValue) { + + // (Percentage CSS lengths are not allowed in this case, to avoid confusion: + // https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list + // CSS allows a single optional plus or minus sign: + // http://www.w3.org/TR/CSS2/syndata.html#numbers + // CSS is ASCII case-insensitive: + // http://www.w3.org/TR/CSS2/syndata.html#characters ) + // Spec allows exponential notation for type: + // http://dev.w3.org/csswg/css-values/#numbers + var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i; + + // (This is a quick and lenient test. Because of optional unlimited-depth internal + // grouping parens and strict spacing rules, this could get very complicated.) + var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i; + + var i; + var unparsedSizesList; + var unparsedSizesListLength; + var unparsedSize; + var lastComponentValue; + var size; + + // UTILITY FUNCTIONS + + // (Toy CSS parser. The goals here are: + // 1) expansive test coverage without the weight of a full CSS parser. + // 2) Avoiding regex wherever convenient. + // Quick tests: http://jsfiddle.net/gtntL4gr/3/ + // Returns an array of arrays.) + function parseComponentValues(str) { + var chrctr; + var component = ""; + var componentArray = []; + var listArray = []; + var parenDepth = 0; + var pos = 0; + var inComment = false; + + function pushComponent() { + if (component) { + componentArray.push(component); + component = ""; + } + } + + function pushComponentArray() { + if (componentArray[0]) { + listArray.push(componentArray); + componentArray = []; + } + } + + // (Loop forwards from the beginning of the string.) + while (true) { + chrctr = str.charAt(pos); + + if (chrctr === "") { // ( End of string reached.) + pushComponent(); + pushComponentArray(); + return listArray; + } else if (inComment) { + if ((chrctr === "*") && (str[pos + 1] === "/")) { // (At end of a comment.) + inComment = false; + pos += 2; + pushComponent(); + continue; + } else { + pos += 1; // (Skip all characters inside comments.) + continue; + } + } else if (isSpace(chrctr)) { + // (If previous character in loop was also a space, or if + // at the beginning of the string, do not add space char to + // component.) + if ( (str.charAt(pos - 1) && isSpace( str.charAt(pos - 1) ) ) || !component ) { + pos += 1; + continue; + } else if (parenDepth === 0) { + pushComponent(); + pos +=1; + continue; + } else { + // (Replace any space character with a plain space for legibility.) + chrctr = " "; + } + } else if (chrctr === "(") { + parenDepth += 1; + } else if (chrctr === ")") { + parenDepth -= 1; + } else if (chrctr === ",") { + pushComponent(); + pushComponentArray(); + pos += 1; + continue; + } else if ( (chrctr === "/") && (str.charAt(pos + 1) === "*") ) { + inComment = true; + pos += 2; + continue; + } + + component = component + chrctr; + pos += 1; + } + } + + function isValidNonNegativeSourceSizeValue(s) { + if (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) {return true;} + if (regexCssCalc.test(s)) {return true;} + // ( http://www.w3.org/TR/CSS2/syndata.html#numbers says: + // "-0 is equivalent to 0 and is not a negative number." which means that + // unitless zero and unitless negative zero must be accepted as special cases.) + if ((s === "0") || (s === "-0") || (s === "+0")) {return true;} + return false; + } + + // When asked to parse a sizes attribute from an element, parse a + // comma-separated list of component values from the value of the element's + // sizes attribute (or the empty string, if the attribute is absent), and let + // unparsed sizes list be the result. + // http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values + + unparsedSizesList = parseComponentValues(strValue); + unparsedSizesListLength = unparsedSizesList.length; + + // For each unparsed size in unparsed sizes list: + for (i = 0; i < unparsedSizesListLength; i++) { + unparsedSize = unparsedSizesList[i]; + + // 1. Remove all consecutive s from the end of unparsed size. + // ( parseComponentValues() already omits spaces outside of parens. ) + + // If unparsed size is now empty, that is a parse error; continue to the next + // iteration of this algorithm. + // ( parseComponentValues() won't push an empty array. ) + + // 2. If the last component value in unparsed size is a valid non-negative + // , let size be its value and remove the component value + // from unparsed size. Any CSS function other than the calc() function is + // invalid. Otherwise, there is a parse error; continue to the next iteration + // of this algorithm. + // http://dev.w3.org/csswg/css-syntax/#parse-component-value + lastComponentValue = unparsedSize[unparsedSize.length - 1]; + + if (isValidNonNegativeSourceSizeValue(lastComponentValue)) { + size = lastComponentValue; + unparsedSize.pop(); + } else { + continue; + } + + // 3. Remove all consecutive s from the end of unparsed + // size. If unparsed size is now empty, return size and exit this algorithm. + // If this was not the last item in unparsed sizes list, that is a parse error. + if (unparsedSize.length === 0) { + return size; + } + + // 4. Parse the remaining component values in unparsed size as a + // . If it does not parse correctly, or it does parse + // correctly but the evaluates to false, continue to the + // next iteration of this algorithm. + // (Parsing all possible compound media conditions in JS is heavy, complicated, + // and the payoff is unclear. Is there ever an situation where the + // media condition parses incorrectly but still somehow evaluates to true? + // Can we just rely on the browser/polyfill to do it?) + unparsedSize = unparsedSize.join(" "); + if (!(pf.matchesMedia( unparsedSize ) ) ) { + continue; + } + + // 5. Return size and exit this algorithm. + return size; + } + + // If the above algorithm exhausts unparsed sizes list without returning a + // size value, return 100vw. + return "100vw"; + } + + // namespace + pf.ns = ("pf" + new Date().getTime()).substr(0, 9); + + // srcset support test + pf.supSrcset = "srcset" in image; + pf.supSizes = "sizes" in image; + pf.supPicture = !!window.HTMLPictureElement; + + if (pf.supSrcset && pf.supPicture && !pf.supSizes) { + (function(image2) { + image.srcset = "data:,a"; + image2.src = "data:,a"; + pf.supSrcset = image.complete === image2.complete; + pf.supPicture = pf.supSrcset && pf.supPicture; + })(document.createElement("img")); + } + + // using pf.qsa instead of dom traversing does scale much better, + // especially on sites mixing responsive and non-responsive images + pf.selShort = "picture>img,img[srcset]"; + pf.sel = pf.selShort; + pf.cfg = cfg; + + if ( pf.supSrcset ) { + pf.sel += ",img[" + srcsetAttr + "]"; + } + + /** + * Shortcut property for `devicePixelRatio` ( for easy overriding in tests ) + */ + pf.DPR = (DPR || 1 ); + pf.u = units; + + // container of supported mime types that one might need to qualify before using + pf.types = types; + + alwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes; + + pf.setSize = noop; + + /** + * Gets a string and returns the absolute URL + * @param src + * @returns {String} absolute URL + */ + + pf.makeUrl = memoize(function(src) { + anchor.href = src; + return anchor.href; + }); + + /** + * Gets a DOM element or document and a selctor and returns the found matches + * Can be extended with jQuery/Sizzle for IE7 support + * @param context + * @param sel + * @returns {NodeList} + */ + pf.qsa = function(context, sel) { + return context.querySelectorAll(sel); + }; + + /** + * Shortcut method for matchMedia ( for easy overriding in tests ) + * wether native or pf.mMQ is used will be decided lazy on first call + * @returns {boolean} + */ + pf.matchesMedia = function() { + if ( window.matchMedia && (matchMedia( "(min-width: 0.1em)" ) || {}).matches ) { + pf.matchesMedia = function( media ) { + return !media || ( matchMedia( media ).matches ); + }; + } else { + pf.matchesMedia = pf.mMQ; + } + + return pf.matchesMedia.apply( this, arguments ); + }; + + /** + * A simplified matchMedia implementation for IE8 and IE9 + * handles only min-width/max-width with px or em values + * @param media + * @returns {boolean} + */ + pf.mMQ = function( media ) { + return media ? evalCSS(media) : true; + }; + + /** + * Returns the calculated length in css pixel from the given sourceSizeValue + * http://dev.w3.org/csswg/css-values-3/#length-value + * intended Spec mismatches: + * * Does not check for invalid use of CSS functions + * * Does handle a computed length of 0 the same as a negative and therefore invalid value + * @param sourceSizeValue + * @returns {Number} + */ + pf.calcLength = function( sourceSizeValue ) { + + var value = evalCSS(sourceSizeValue, true) || false; + if (value < 0) { + value = false; + } + + return value; + }; + + /** + * Takes a type string and checks if its supported + */ + + pf.supportsType = function( type ) { + return ( type ) ? types[ type ] : true; + }; + + /** + * Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length) + * @param sourceSizeStr + * @returns {*} + */ + pf.parseSize = memoize(function( sourceSizeStr ) { + var match = ( sourceSizeStr || "" ).match(regSize); + return { + media: match && match[1], + length: match && match[2] + }; + }); + + pf.parseSet = function( set ) { + if ( !set.cands ) { + set.cands = parseSrcset(set.srcset, set); + } + return set.cands; + }; + + /** + * returns 1em in css px for html/body default size + * function taken from respondjs + * @returns {*|number} + */ + pf.getEmValue = function() { + var body; + if ( !eminpx && (body = document.body) ) { + var div = document.createElement( "div" ), + originalHTMLCSS = docElem.style.cssText, + originalBodyCSS = body.style.cssText; + + div.style.cssText = baseStyle; + + // 1em in a media query is the value of the default font size of the browser + // reset docElem and body to ensure the correct value is returned + docElem.style.cssText = fsCss; + body.style.cssText = fsCss; + + body.appendChild( div ); + eminpx = div.offsetWidth; + body.removeChild( div ); + + //also update eminpx before returning + eminpx = parseFloat( eminpx, 10 ); + + // restore the original values + docElem.style.cssText = originalHTMLCSS; + body.style.cssText = originalBodyCSS; + + } + return eminpx || 16; + }; + + /** + * Takes a string of sizes and returns the width in pixels as a number + */ + pf.calcListLength = function( sourceSizeListStr ) { + // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33% + // + // or (min-width:30em) calc(30% - 15px) + if ( !(sourceSizeListStr in sizeLengthCache) || cfg.uT ) { + var winningLength = pf.calcLength( parseSizes( sourceSizeListStr ) ); + + sizeLengthCache[ sourceSizeListStr ] = !winningLength ? units.width : winningLength; + } + + return sizeLengthCache[ sourceSizeListStr ]; + }; + + /** + * Takes a candidate object with a srcset property in the form of url/ + * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or + * "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or + * "images/pic-small.png" + * Get an array of image candidates in the form of + * {url: "/foo/bar.png", resolution: 1} + * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value + * If sizes is specified, res is calculated + */ + pf.setRes = function( set ) { + var candidates; + if ( set ) { + + candidates = pf.parseSet( set ); + + for ( var i = 0, len = candidates.length; i < len; i++ ) { + setResolution( candidates[ i ], set.sizes ); + } + } + return candidates; + }; + + pf.setRes.res = setResolution; + + pf.applySetCandidate = function( candidates, img ) { + if ( !candidates.length ) {return;} + var candidate, + i, + j, + length, + bestCandidate, + curSrc, + curCan, + candidateSrc, + abortCurSrc; + + var imageData = img[ pf.ns ]; + var dpr = pf.DPR; + + curSrc = imageData.curSrc || img[curSrcProp]; + + curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set); + + // if we have a current source, we might either become lazy or give this source some advantage + if ( curCan && curCan.set === candidates[ 0 ].set ) { + + // if browser can abort image request and the image has a higher pixel density than needed + // and this image isn't downloaded yet, we skip next part and try to save bandwidth + abortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr); + + if ( !abortCurSrc ) { + curCan.cached = true; + + // if current candidate is "best", "better" or "okay", + // set it to bestCandidate + if ( curCan.res >= dpr ) { + bestCandidate = curCan; + } + } + } + + if ( !bestCandidate ) { + + candidates.sort( ascendingSort ); + + length = candidates.length; + bestCandidate = candidates[ length - 1 ]; + + for ( i = 0; i < length; i++ ) { + candidate = candidates[ i ]; + if ( candidate.res >= dpr ) { + j = i - 1; + + // we have found the perfect candidate, + // but let's improve this a little bit with some assumptions ;-) + if (candidates[ j ] && + (abortCurSrc || curSrc !== pf.makeUrl( candidate.url )) && + chooseLowRes(candidates[ j ].res, candidate.res, dpr, candidates[ j ].cached)) { + + bestCandidate = candidates[ j ]; + + } else { + bestCandidate = candidate; + } + break; + } + } + } + + if ( bestCandidate ) { + + candidateSrc = pf.makeUrl( bestCandidate.url ); + + imageData.curSrc = candidateSrc; + imageData.curCan = bestCandidate; + + if ( candidateSrc !== curSrc ) { + pf.setSrc( img, bestCandidate ); + } + pf.setSize( img ); + } + }; + + pf.setSrc = function( img, bestCandidate ) { + var origWidth; + img.src = bestCandidate.url; + + // although this is a specific Safari issue, we don't want to take too much different code paths + if ( bestCandidate.set.type === "image/svg+xml" ) { + origWidth = img.style.width; + img.style.width = (img.offsetWidth + 1) + "px"; + + // next line only should trigger a repaint + // if... is only done to trick dead code removal + if ( img.offsetWidth + 1 ) { + img.style.width = origWidth; + } + } + }; + + pf.getSet = function( img ) { + var i, set, supportsType; + var match = false; + var sets = img [ pf.ns ].sets; + + for ( i = 0; i < sets.length && !match; i++ ) { + set = sets[i]; + + if ( !set.srcset || !pf.matchesMedia( set.media ) || !(supportsType = pf.supportsType( set.type )) ) { + continue; + } + + if ( supportsType === "pending" ) { + set = supportsType; + } + + match = set; + break; + } + + return match; + }; + + pf.parseSets = function( element, parent, options ) { + var srcsetAttribute, imageSet, isWDescripor, srcsetParsed; + + var hasPicture = parent && parent.nodeName.toUpperCase() === "PICTURE"; + var imageData = element[ pf.ns ]; + + if ( imageData.src === undefined || options.src ) { + imageData.src = getImgAttr.call( element, "src" ); + if ( imageData.src ) { + setImgAttr.call( element, srcAttr, imageData.src ); + } else { + removeImgAttr.call( element, srcAttr ); + } + } + + if ( imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset ) { + srcsetAttribute = getImgAttr.call( element, "srcset" ); + imageData.srcset = srcsetAttribute; + srcsetParsed = true; + } + + imageData.sets = []; + + if ( hasPicture ) { + imageData.pic = true; + getAllSourceElements( parent, imageData.sets ); + } + + if ( imageData.srcset ) { + imageSet = { + srcset: imageData.srcset, + sizes: getImgAttr.call( element, "sizes" ) + }; + + imageData.sets.push( imageSet ); + + isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || ""); + + // add normal src as candidate, if source has no w descriptor + if ( !isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x ) { + imageSet.srcset += ", " + imageData.src; + imageSet.cands.push({ + url: imageData.src, + d: 1, + set: imageSet + }); + } + + } else if ( imageData.src ) { + imageData.sets.push( { + srcset: imageData.src, + sizes: null + } ); + } + + imageData.curCan = null; + imageData.curSrc = undefined; + + // if img has picture or the srcset was removed or has a srcset and does not support srcset at all + // or has a w descriptor (and does not support sizes) set support to false to evaluate + imageData.supported = !( hasPicture || ( imageSet && !pf.supSrcset ) || isWDescripor ); + + if ( srcsetParsed && pf.supSrcset && !imageData.supported ) { + if ( srcsetAttribute ) { + setImgAttr.call( element, srcsetAttr, srcsetAttribute ); + element.srcset = ""; + } else { + removeImgAttr.call( element, srcsetAttr ); + } + } + + if (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) { + if (imageData.src === null) { + element.removeAttribute("src"); + } else { + element.src = imageData.src; + } + } + + imageData.parsed = true; + }; + + pf.fillImg = function(element, options) { + var imageData; + var extreme = options.reselect || options.reevaluate; + + // expando for caching data on the img + if ( !element[ pf.ns ] ) { + element[ pf.ns ] = {}; + } + + imageData = element[ pf.ns ]; + + // if the element has already been evaluated, skip it + // unless `options.reevaluate` is set to true ( this, for example, + // is set to true when running `picturefill` on `resize` ). + if ( !extreme && imageData.evaled === evalId ) { + return; + } + + if ( !imageData.parsed || options.reevaluate ) { + pf.parseSets( element, element.parentNode, options ); + } + + if ( !imageData.supported ) { + applyBestCandidate( element ); + } else { + imageData.evaled = evalId; + } + }; + + pf.setupRun = function() { + if ( !alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio) ) { + updateMetrics(); + } + }; + + // If picture is supported, well, that's awesome. + if ( pf.supPicture ) { + picturefill = noop; + pf.fillImg = noop; + } else { + + // Set up picture polyfill by polling the document + (function() { + var isDomReady; + var regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/; + + var run = function() { + var readyState = document.readyState || ""; + + timerId = setTimeout(run, readyState === "loading" ? 200 : 999); + if ( document.body ) { + pf.fillImgs(); + isDomReady = isDomReady || regReady.test(readyState); + if ( isDomReady ) { + clearTimeout( timerId ); + } + + } + }; + + var timerId = setTimeout(run, document.body ? 9 : 99); + + // Also attach picturefill on resize and readystatechange + // http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html + var debounce = function(func, wait) { + var timeout, timestamp; + var later = function() { + var last = (new Date()) - timestamp; + + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + func(); + } + }; + + return function() { + timestamp = new Date(); + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + }; + var lastClientWidth = docElem.clientHeight; + var onResize = function() { + isVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth; + lastClientWidth = docElem.clientHeight; + if ( isVwDirty ) { + pf.fillImgs(); + } + }; + + on( window, "resize", debounce(onResize, 99 ) ); + on( document, "readystatechange", run ); + })(); + } + + pf.picturefill = picturefill; + //use this internally for easy monkey patching/performance testing + pf.fillImgs = picturefill; + pf.teardownRun = noop; + + /* expose methods for testing */ + picturefill._ = pf; + + window.picturefillCFG = { + pf: pf, + push: function(args) { + var name = args.shift(); + if (typeof pf[name] === "function") { + pf[name].apply(pf, args); + } else { + cfg[name] = args[0]; + if (alreadyRun) { + pf.fillImgs( { reselect: true } ); + } + } + } + }; + + while (setOptions && setOptions.length) { + window.picturefillCFG.push(setOptions.shift()); + } + + /* expose picturefill */ + window.picturefill = picturefill; + + /* expose picturefill */ + if ( typeof module === "object" && typeof module.exports === "object" ) { + // CommonJS, just export + module.exports = picturefill; + } else if ( typeof define === "function" && define.amd ) { + // AMD support + define( "picturefill", function() { return picturefill; } ); + } + + // IE8 evals this sync, so it must be the last thing we do + if ( !pf.supPicture ) { + types[ "image/webp" ] = detectTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==" ); + } + +} )( window, document ); diff --git a/Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js b/Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js new file mode 100644 index 00000000..5bb1dd8a --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){var b=navigator.userAgent;a.HTMLPictureElement&&/ecko/.test(b)&&b.match(/rv\:(\d+)/)&&RegExp.$1<41&&addEventListener("resize",function(){var b,c=document.createElement("source"),d=function(a){var b,d,e=a.parentNode;"PICTURE"===e.nodeName.toUpperCase()?(b=c.cloneNode(),e.insertBefore(b,e.firstElementChild),setTimeout(function(){e.removeChild(b)})):(!a._pfLastSize||a.offsetWidth>a._pfLastSize)&&(a._pfLastSize=a.offsetWidth,d=a.sizes,a.sizes+=",100vw",setTimeout(function(){a.sizes=d}))},e=function(){var a,b=document.querySelectorAll("picture > img, img[srcset][sizes]");for(a=0;a2.7?h=c+1:(f=b-c,e=Math.pow(a-.6,1.5),g=f*e,d&&(g+=.1*e),h=a+g):h=c>1?Math.sqrt(a*b):a,h>c}function h(a){var b,c=s.getSet(a),d=!1;"pending"!==c&&(d=r,c&&(b=s.setRes(c),s.applySetCandidate(b,a))),a[s.ns].evaled=d}function i(a,b){return a.res-b.res}function j(a,b,c){var d;return!c&&b&&(c=a[s.ns].sets,c=c&&c[c.length-1]),d=k(b,c),d&&(b=s.makeUrl(b),a[s.ns].curSrc=b,a[s.ns].curCan=d,d.res||_(d,d.set.sizes)),d}function k(a,b){var c,d,e;if(a&&b)for(e=s.parseSet(b),a=s.makeUrl(a),c=0;cc;c++)e=g[c],e[s.ns]=!0,f=e.getAttribute("srcset"),f&&b.push({srcset:f,media:e.getAttribute("media"),type:e.getAttribute("type"),sizes:e.getAttribute("sizes")})}function m(a,b){function c(b){var c,d=b.exec(a.substring(m));return d?(c=d[0],m+=c.length,c):void 0}function e(){var a,c,d,e,f,i,j,k,l,m=!1,o={};for(e=0;el?m=!0:c=l):W.test(j)&&"h"===i?((d||c)&&(m=!0),0===k?m=!0:d=k):m=!0;m||(o.url=g,a&&(o.w=a),c&&(o.d=c),d&&(o.h=d),d||c||a||(o.d=1),1===o.d&&(b.has1x=!0),o.set=b,n.push(o))}function f(){for(c(S),i="",j="in descriptor";;){if(k=a.charAt(m),"in descriptor"===j)if(d(k))i&&(h.push(i),i="",j="after descriptor");else{if(","===k)return m+=1,i&&h.push(i),void e();if("("===k)i+=k,j="in parens";else{if(""===k)return i&&h.push(i),void e();i+=k}}else if("in parens"===j)if(")"===k)i+=k,j="in descriptor";else{if(""===k)return h.push(i),void e();i+=k}else if("after descriptor"===j)if(d(k));else{if(""===k)return void e();j="in descriptor",m-=1}m+=1}}for(var g,h,i,j,k,l=a.length,m=0,n=[];;){if(c(T),m>=l)return n;g=c(U),h=[],","===g.slice(-1)?(g=g.replace(V,""),e()):f()}}function n(a){function b(a){function b(){f&&(g.push(f),f="")}function c(){g[0]&&(h.push(g),g=[])}for(var e,f="",g=[],h=[],i=0,j=0,k=!1;;){if(e=a.charAt(j),""===e)return b(),c(),h;if(k){if("*"===e&&"/"===a[j+1]){k=!1,j+=2,b();continue}j+=1}else{if(d(e)){if(a.charAt(j-1)&&d(a.charAt(j-1))||!f){j+=1;continue}if(0===i){b(),j+=1;continue}e=" "}else if("("===e)i+=1;else if(")"===e)i-=1;else{if(","===e){b(),c(),j+=1;continue}if("/"===e&&"*"===a.charAt(j+1)){k=!0,j+=2;continue}}f+=e,j+=1}}}function c(a){return k.test(a)&&parseFloat(a)>=0?!0:l.test(a)?!0:"0"===a||"-0"===a||"+0"===a?!0:!1}var e,f,g,h,i,j,k=/^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i,l=/^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;for(f=b(a),g=f.length,e=0;g>e;e++)if(h=f[e],i=h[h.length-1],c(i)){if(j=i,h.pop(),0===h.length)return j;if(h=h.join(" "),s.matchesMedia(h))return j}return"100vw"}b.createElement("picture");var o,p,q,r,s={},t=function(){},u=b.createElement("img"),v=u.getAttribute,w=u.setAttribute,x=u.removeAttribute,y=b.documentElement,z={},A={algorithm:""},B="data-pfsrc",C=B+"set",D=navigator.userAgent,E=/rident/.test(D)||/ecko/.test(D)&&D.match(/rv\:(\d+)/)&&RegExp.$1>35,F="currentSrc",G=/\s+\+?\d+(e\d+)?w/,H=/(\([^)]+\))?\s*(.+)/,I=a.picturefillCFG,J="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)",K="font-size:100%!important;",L=!0,M={},N={},O=a.devicePixelRatio,P={px:1,"in":96},Q=b.createElement("a"),R=!1,S=/^[ \t\n\r\u000c]+/,T=/^[, \t\n\r\u000c]+/,U=/^[^ \t\n\r\u000c]+/,V=/[,]+$/,W=/^\d+$/,X=/^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,Y=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d||!1):a.attachEvent&&a.attachEvent("on"+b,c)},Z=function(a){var b={};return function(c){return c in b||(b[c]=a(c)),b[c]}},$=function(){var a=/^([\d\.]+)(em|vw|px)$/,b=function(){for(var a=arguments,b=0,c=a[0];++b in a;)c=c.replace(a[b],a[++b]);return c},c=Z(function(a){return"return "+b((a||"").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,"")+";"});return function(b,d){var e;if(!(b in M))if(M[b]=!1,d&&(e=b.match(a)))M[b]=e[1]*P[e[2]];else try{M[b]=new Function("e",c(b))(P)}catch(f){}return M[b]}}(),_=function(a,b){return a.w?(a.cWidth=s.calcListLength(b||"100vw"),a.res=a.w/a.cWidth):a.res=a.d,a},aa=function(a){var c,d,e,f=a||{};if(f.elements&&1===f.elements.nodeType&&("IMG"===f.elements.nodeName.toUpperCase()?f.elements=[f.elements]:(f.context=f.elements,f.elements=null)),c=f.elements||s.qsa(f.context||b,f.reevaluate||f.reselect?s.sel:s.selShort),e=c.length){for(s.setupRun(f),R=!0,d=0;e>d;d++)s.fillImg(c[d],f);s.teardownRun(f)}};o=a.console&&console.warn?function(a){console.warn(a)}:t,F in u||(F="src"),z["image/jpeg"]=!0,z["image/gif"]=!0,z["image/png"]=!0,z["image/svg+xml"]=b.implementation.hasFeature("http://wwwindow.w3.org/TR/SVG11/feature#Image","1.1"),s.ns=("pf"+(new Date).getTime()).substr(0,9),s.supSrcset="srcset"in u,s.supSizes="sizes"in u,s.supPicture=!!a.HTMLPictureElement,s.supSrcset&&s.supPicture&&!s.supSizes&&!function(a){u.srcset="data:,a",a.src="data:,a",s.supSrcset=u.complete===a.complete,s.supPicture=s.supSrcset&&s.supPicture}(b.createElement("img")),s.selShort="picture>img,img[srcset]",s.sel=s.selShort,s.cfg=A,s.supSrcset&&(s.sel+=",img["+C+"]"),s.DPR=O||1,s.u=P,s.types=z,q=s.supSrcset&&!s.supSizes,s.setSize=t,s.makeUrl=Z(function(a){return Q.href=a,Q.href}),s.qsa=function(a,b){return a.querySelectorAll(b)},s.matchesMedia=function(){return a.matchMedia&&(matchMedia("(min-width: 0.1em)")||{}).matches?s.matchesMedia=function(a){return!a||matchMedia(a).matches}:s.matchesMedia=s.mMQ,s.matchesMedia.apply(this,arguments)},s.mMQ=function(a){return a?$(a):!0},s.calcLength=function(a){var b=$(a,!0)||!1;return 0>b&&(b=!1),b},s.supportsType=function(a){return a?z[a]:!0},s.parseSize=Z(function(a){var b=(a||"").match(H);return{media:b&&b[1],length:b&&b[2]}}),s.parseSet=function(a){return a.cands||(a.cands=m(a.srcset,a)),a.cands},s.getEmValue=function(){var a;if(!p&&(a=b.body)){var c=b.createElement("div"),d=y.style.cssText,e=a.style.cssText;c.style.cssText=J,y.style.cssText=K,a.style.cssText=K,a.appendChild(c),p=c.offsetWidth,a.removeChild(c),p=parseFloat(p,10),y.style.cssText=d,a.style.cssText=e}return p||16},s.calcListLength=function(a){if(!(a in N)||A.uT){var b=s.calcLength(n(a));N[a]=b?b:P.width}return N[a]},s.setRes=function(a){var b;if(a){b=s.parseSet(a);for(var c=0,d=b.length;d>c;c++)_(b[c],a.sizes)}return b},s.setRes.res=_,s.applySetCandidate=function(a,b){if(a.length){var c,d,e,f,h,k,l,m,n,o=b[s.ns],p=s.DPR;if(k=o.curSrc||b[F],l=o.curCan||j(b,k,a[0].set),l&&l.set===a[0].set&&(n=E&&!b.complete&&l.res-.1>p,n||(l.cached=!0,l.res>=p&&(h=l))),!h)for(a.sort(i),f=a.length,h=a[f-1],d=0;f>d;d++)if(c=a[d],c.res>=p){e=d-1,h=a[e]&&(n||k!==s.makeUrl(c.url))&&g(a[e].res,c.res,p,a[e].cached)?a[e]:c;break}h&&(m=s.makeUrl(h.url),o.curSrc=m,o.curCan=h,m!==k&&s.setSrc(b,h),s.setSize(b))}},s.setSrc=function(a,b){var c;a.src=b.url,"image/svg+xml"===b.set.type&&(c=a.style.width,a.style.width=a.offsetWidth+1+"px",a.offsetWidth+1&&(a.style.width=c))},s.getSet=function(a){var b,c,d,e=!1,f=a[s.ns].sets;for(b=0;bf?c=setTimeout(e,b-f):(c=null,a())};return function(){d=new Date,c||(c=setTimeout(e,b))}},h=y.clientHeight,i=function(){L=Math.max(a.innerWidth||0,y.clientWidth)!==P.width||y.clientHeight!==h,h=y.clientHeight,L&&s.fillImgs()};Y(a,"resize",g(i,99)),Y(b,"readystatechange",e)}(),s.picturefill=aa,s.fillImgs=aa,s.teardownRun=t,aa._=s,a.picturefillCFG={pf:s,push:function(a){var b=a.shift();"function"==typeof s[b]?s[b].apply(s,a):(A[b]=a[0],R&&s.fillImgs({reselect:!0}))}};for(;I&&I.length;)a.picturefillCFG.push(I.shift());a.picturefill=aa,"object"==typeof module&&"object"==typeof module.exports?module.exports=aa:"function"==typeof define&&define.amd&&define("picturefill",function(){return aa}),s.supPicture||(z["image/webp"]=e("image/webp","data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA=="))}(window,document); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.js new file mode 100644 index 00000000..91247054 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.js @@ -0,0 +1,147 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill, undefined ) { + "use strict"; + + var document = window.document; + var pf = picturefill._; + var knownWidths = {}; + var cfg = pf.cfg; + var curSrcProp = "currentSrc"; + var setSize = function(width, img, data) { + var curCandidate = data.curCan; + + if ( width ) { + img.setAttribute( "width", parseInt(width / curCandidate.res, 10) ); + } + }; + var loadBg = function(url, img, data) { + var bgImg, curCandidate, clear; + + if (url in knownWidths) { + setSize(knownWidths[url], img, data); + } else { + clear = function() { + data.pendingURLSize = null; + bgImg.onload = null; + bgImg.onerror = null; + img = null; + bgImg = null; + }; + + data.pendingURLSize = url; + curCandidate = data.curCan; + + if (curCandidate.w) { + setSize(curCandidate.w, img, data); + } + + bgImg = document.createElement("img"); + + bgImg.onload = function() { + knownWidths[url] = bgImg.naturalWidth || bgImg.width; + if (!knownWidths[url]) { + try { + document.body.appendChild(bgImg); + knownWidths[url] = bgImg.offsetWidth || bgImg.naturalWidth || bgImg.width; + document.body.removeChild(bgImg); + } catch (e) {} + } + if (url === img[curSrcProp]) { + setSize(knownWidths[url], img, data); + } + clear(); + }; + bgImg.onerror = clear; + + bgImg.src = url; + + if (bgImg && bgImg.complete) { + bgImg.onload(); + } + } + + }; + var reeval = (function() { + var running, timer; + + var run = function() { + var i, len, imgData; + var imgs = document.getElementsByTagName("img"); + var options = { elements: [] }; + + pf.setupRun(options); + + running = false; + clearTimeout(timer); + + for (i = 0, len = imgs.length; i < len; i++) { + imgData = imgs[i][pf.ns]; + + if (imgData && imgData.curCan) { + pf.setRes.res(imgData.curCan, imgData.curCan.set.sizes); + pf.setSize(imgs[i]); + } + } + + pf.teardownRun( options ); + }; + + return function() { + if (!running && cfg.addSize) { + running = true; + clearTimeout(timer); + timer = setTimeout(run); + } + }; + + })(); + + if ( !(curSrcProp in document.createElement("img")) ) { + curSrcProp = "src"; + } + + pf.setSize = function( img ) { + var url; + var data = img[ pf.ns ]; + var curCandidate = data.curCan; + + if ( data.dims === undefined ) { + data.dims = img.getAttribute( "height" ) && img.getAttribute( "width" ); + } + + if ( !cfg.addSize || !curCandidate || data.dims ) {return;} + url = pf.makeUrl(curCandidate.url); + + if (url === img[curSrcProp] && url !== data.pendingURLSize) { + loadBg(url, img, data); + } + }; + + if (window.addEventListener && !pf.supPicture) { + addEventListener("resize", reeval, false); + } + + if (!("addSize" in cfg)) { + cfg.addSize = true; + } else { + cfg.addSize = !!cfg.addSize; + } + + reeval(); +})); diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.min.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.min.js new file mode 100644 index 00000000..5a5bc1f1 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/intrinsic-dimension/pf.intrinsic.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){"use strict";var b,c=0,d=function(){window.picturefill&&a(window.picturefill),(window.picturefill||c>9999)&&clearInterval(b),c++};b=setInterval(d,8),d()}(function(a,b){"use strict";var c=window.document,d=a._,e={},f=d.cfg,g="currentSrc",h=function(a,b,c){var d=c.curCan;a&&b.setAttribute("width",parseInt(a/d.res,10))},i=function(a,b,d){var f,i,j;a in e?h(e[a],b,d):(j=function(){d.pendingURLSize=null,f.onload=null,f.onerror=null,b=null,f=null},d.pendingURLSize=a,i=d.curCan,i.w&&h(i.w,b,d),f=c.createElement("img"),f.onload=function(){if(e[a]=f.naturalWidth||f.width,!e[a])try{c.body.appendChild(f),e[a]=f.offsetWidth||f.naturalWidth||f.width,c.body.removeChild(f)}catch(i){}a===b[g]&&h(e[a],b,d),j()},f.onerror=j,f.src=a,f&&f.complete&&f.onload())},j=function(){var a,b,e=function(){var e,f,g,h=c.getElementsByTagName("img"),i={elements:[]};for(d.setupRun(i),a=!1,clearTimeout(b),e=0,f=h.length;f>e;e++)g=h[e][d.ns],g&&g.curCan&&(d.setRes.res(g.curCan,g.curCan.set.sizes),d.setSize(h[e]));d.teardownRun(i)};return function(){!a&&f.addSize&&(a=!0,clearTimeout(b),b=setTimeout(e))}}();g in c.createElement("img")||(g="src"),d.setSize=function(a){var c,e=a[d.ns],h=e.curCan;e.dims===b&&(e.dims=a.getAttribute("height")&&a.getAttribute("width")),f.addSize&&h&&!e.dims&&(c=d.makeUrl(h.url),c===a[g]&&c!==e.pendingURLSize&&i(c,a,e))},window.addEventListener&&!d.supPicture&&addEventListener("resize",j,!1),"addSize"in f?f.addSize=!!f.addSize:f.addSize=!0,j()}); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.js new file mode 100644 index 00000000..b0174c99 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.js @@ -0,0 +1,429 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var document = window.document; + var Element = window.Element; + var MutationObserver = window.MutationObserver; + var noop = function() {}; + var pfObserver = { + disconnect: noop, + take: noop, + observe: noop, + start: noop, + stop: noop, + connected: false + }; + var isReady = /^loade|^c|^i/.test(document.readyState || ""); + var pf = picturefill._; + pf.mutationSupport = false; + pf.observer = pfObserver; + if ( !Object.keys || !window.HTMLSourceElement || !document.addEventListener) { + return; + } + var matches, observer, allowConnect, addMutation; + + var observeProps = { src: 1, srcset: 1, sizes: 1, media: 1 }; + var attrFilter = Object.keys( observeProps ); + var config = { attributes: true, childList: true, subtree: true, attributeFilter: attrFilter }; + var elemProto = Element && Element.prototype; + var sup = {}; + var monkeyPatch = function( name, fn ) { + sup[ name ] = pf[ name ]; + pf[ name ] = fn; + }; + + if ( elemProto && !elemProto.matches ) { + elemProto.matches = elemProto.matchesSelector || elemProto.mozMatchesSelector || elemProto.webkitMatchesSelector || elemProto.msMatchesSelector; + } + + if ( elemProto && elemProto.matches ) { + matches = function( elem, sel ) { + return elem.matches( sel ); + }; + pf.mutationSupport = !!( Object.create && Object.defineProperties ); + } + + if ( !pf.mutationSupport ) { + return; + } + + pfObserver.observe = function() { + if ( allowConnect ) { + pfObserver.connected = true; + if ( observer ) { + observer.observe( document.documentElement, config ); + } + } + }; + + pfObserver.disconnect = function() { + pfObserver.connected = false; + if ( observer ) { + observer.disconnect(); + } + }; + + pfObserver.take = function() { + if ( observer ) { + pf.onMutations( observer.takeRecords() ); + } else if ( addMutation ) { + addMutation.take(); + } + }; + + pfObserver.start = function() { + allowConnect = true; + pfObserver.observe(); + }; + + pfObserver.stop = function() { + allowConnect = false; + pfObserver.disconnect(); + }; + + monkeyPatch( "setupRun", function() { + pfObserver.disconnect(); + return sup.setupRun.apply( this, arguments ); + }); + + monkeyPatch( "teardownRun", function() { + var ret = sup.setupRun.apply( this, arguments ); + pfObserver.observe(); + return ret; + }); + + monkeyPatch( "setSrc", function() { + var ret; + var wasConnected = pfObserver.connected; + pfObserver.disconnect(); + ret = sup.setSrc.apply( this, arguments ); + if ( wasConnected ) { + pfObserver.observe(); + } + return ret; + }); + + pf.onMutations = function( mutations ) { + var i, len; + var modifiedImgs = []; + + for (i = 0, len = mutations.length; i < len; i++) { + if ( isReady && mutations[i].type === "childList" ) { + pf.onSubtreeChange( mutations[i], modifiedImgs ); + } else if ( mutations[i].type === "attributes" ) { + pf.onAttrChange( mutations[i], modifiedImgs ); + } + } + + if ( modifiedImgs.length ) { + + pf.fillImgs({ + elements: modifiedImgs, + reevaluate: true + }); + } + }; + + pf.onSubtreeChange = function( mutations, imgs ) { + pf.findAddedMutations( mutations.addedNodes, imgs ); + pf.findRemovedMutations( mutations.removedNodes, mutations.target, imgs ); + }; + + pf.findAddedMutations = function( nodes, imgs ) { + var i, len, node, nodeName; + for ( i = 0, len = nodes.length; i < len; i++ ){ + node = nodes[i]; + if ( node.nodeType !== 1 ) {continue;} + + nodeName = node.nodeName.toUpperCase(); + + if ( nodeName === "PICTURE" ) { + pf.addToElements( node.getElementsByTagName( "img" )[0], imgs ); + } else if ( nodeName === "IMG" && matches( node, pf.selShort ) ){ + pf.addToElements( node, imgs ); + } else if ( nodeName === "SOURCE" ) { + pf.addImgForSource( node, node.parentNode, imgs ); + } else { + pf.addToElements( pf.qsa( node, pf.selShort ), imgs ); + } + } + }; + + pf.findRemovedMutations = function( nodes, target, imgs ) { + var i, len, node; + for ( i = 0, len = nodes.length; i < len; i++ ) { + node = nodes[i]; + if ( node.nodeType !== 1 ) {continue;} + if ( node.nodeName.toUpperCase() === "SOURCE" ) { + pf.addImgForSource( node, target, imgs ); + } + } + }; + + pf.addImgForSource = function( node, parent, imgs ) { + if ( parent && ( parent.nodeName || "" ).toUpperCase() !== "PICTURE" ) { + parent = parent.parentNode; + + if (!parent || ( parent.nodeName || "" ).toUpperCase() !== "PICTURE" ) { + parent = null; + } + } + + if (parent) { + pf.addToElements( parent.getElementsByTagName( "img" )[0], imgs ); + } + }; + + pf.addToElements = function( img, imgs ) { + var i, len; + if ( img ) { + if ( ("length" in img) && !img.nodeType ){ + for ( i = 0, len = img.length; i < len; i++ ) { + pf.addToElements( img[i], imgs ); + } + } else if ( img.parentNode && imgs.indexOf(img) === -1 ) { + imgs.push( img ); + } + } + }; + + pf.onAttrChange = function( mutation, modifiedImgs ) { + var nodeName; + var riData = mutation.target[ pf.ns ]; + + if ( !riData && + mutation.attributeName === "srcset" && + (nodeName = mutation.target.nodeName.toUpperCase()) === "IMG" ) { + pf.addToElements( mutation.target, modifiedImgs ); + } else if ( riData ) { + if (!nodeName) { + nodeName = mutation.target.nodeName.toUpperCase(); + } + + if ( nodeName === "IMG" ) { + if ( mutation.attributeName in riData ) { + riData[ mutation.attributeName ] = undefined; + } + pf.addToElements( mutation.target, modifiedImgs ); + } else if ( nodeName === "SOURCE" ) { + pf.addImgForSource( mutation.target, mutation.target.parentNode, modifiedImgs ); + } + } + }; + + if ( !pf.supPicture ) { + + if ( MutationObserver && !pf.testMutationEvents ) { + observer = new MutationObserver( pf.onMutations ); + } else { + + addMutation = (function() { + var running = false; + var mutations = []; + var setImmediate = window.setImmediate || window.setTimeout; + return function(mutation) { + if ( !running ) { + running = true; + if ( !addMutation.take ) { + addMutation.take = function() { + if ( mutations.length ) { + pf.onMutations( mutations ); + mutations = []; + } + running = false; + }; + } + setImmediate( addMutation.take ); + } + mutations.push( mutation ); + }; + })(); + + document.documentElement.addEventListener( "DOMNodeInserted", function( e ) { + if ( pfObserver.connected && isReady ) { + addMutation( { type: "childList", addedNodes: [ e.target ], removedNodes: [] } ); + } + }, true); + + document.documentElement.addEventListener( "DOMNodeRemoved", function( e ) { + + if ( pfObserver.connected && isReady && (e.target || {}).nodeName === "SOURCE") { + addMutation( { type: "childList", addedNodes: [], removedNodes: [ e.target ], target: e.target.parentNode } ); + } + }, true); + + document.documentElement.addEventListener( "DOMAttrModified", function( e ) { + if ( pfObserver.connected && observeProps[e.attrName] ) { + addMutation( { type: "attributes", target: e.target, attributeName: e.attrName } ); + } + }, true); + } + + if ( window.HTMLImageElement && Object.defineProperties ) { + + (function() { + + var image = document.createElement( "img" ); + var imgIdls = []; + var getImgAttr = image.getAttribute; + var setImgAttr = image.setAttribute; + var GETIMGATTRS = { + src: 1 + }; + + if ( pf.supSrcset && !pf.supSizes ) { + GETIMGATTRS.srcset = 1; + } + + Object.defineProperties(HTMLImageElement.prototype, { + getAttribute: { + value: function( attr ) { + var internal; + if ( GETIMGATTRS[ attr ] && (internal = this[ pf.ns ]) && ( internal[attr] !== undefined ) ) { + return internal[ attr ]; + } + return getImgAttr.apply( this, arguments ); + }, + writeable: true, + enumerable: true, + configurable: true + } + }); + + if (!pf.supSrcset) { + imgIdls.push("srcset"); + } + + if (!pf.supSizes) { + imgIdls.push("sizes"); + } + + imgIdls.forEach(function(idl) { + Object.defineProperty(HTMLImageElement.prototype, idl, { + set: function( value ) { + setImgAttr.call( this, idl, value ); + }, + get: function() { + return getImgAttr.call( this, idl ) || ""; + }, + enumerable: true, + configurable: true + }); + }); + + if (!("currentSrc" in image)) { + (function() { + var ascendingSort; + var updateCurSrc = function(elem, src) { + if (src == null) { + src = elem.src || ""; + } + + Object.defineProperty(elem, "pfCurrentSrc", { + value: src, + writable: true + }); + }; + var baseUpdateCurSrc = updateCurSrc; + + if (pf.supSrcset && window.devicePixelRatio) { + ascendingSort = function( a, b ) { + var aRes = a.d || a.w || a.res; + var bRes = b.d || b.w || b.res; + return aRes - bRes; + }; + + updateCurSrc = function(elem) { + var i, cands, length, ret; + var imageData = elem[ pf.ns ]; + + if ( imageData && imageData.supported && imageData.srcset && imageData.sets && (cands = pf.parseSet(imageData.sets[0])) && cands.sort) { + + cands.sort( ascendingSort ); + length = cands.length; + ret = cands[ length - 1 ]; + + for (i = 0; i < length; i++) { + if (cands[i].d >= window.devicePixelRatio) { + ret = cands[i]; + break; + } + } + + if (ret) { + ret = pf.makeUrl(ret.url); + } + } + baseUpdateCurSrc(elem, ret); + }; + } + + document.addEventListener("load", function(e) { + if (e.target.nodeName.toUpperCase() === "IMG") { + updateCurSrc(e.target); + } + }, true); + + Object.defineProperty(HTMLImageElement.prototype, "currentSrc", { + set: function() { + if (window.console && console.warn) { + console.warn("currentSrc can't be set on img element"); + } + }, + get: function() { + if (this.complete) { + updateCurSrc(this); + } + //IE is never complete if no src/srcset available + return (!this.src && !this.srcset) ? "" : this.pfCurrentSrc || ""; + }, + enumerable: true, + configurable: true + }); + })(); + } + + if (window.HTMLSourceElement && !("srcset" in document.createElement("source"))) { + + [ "srcset", "sizes" ].forEach(function(idl) { + Object.defineProperty(window.HTMLSourceElement.prototype, idl, { + set: function( value ) { + this.setAttribute( idl, value ); + }, + get: function() { + return this.getAttribute( idl ) || ""; + }, + enumerable: true, + configurable: true + }); + }); + } + + })(); + } + + pfObserver.start(); + } + if ( !isReady ) { + document.addEventListener("DOMContentLoaded", function() { + isReady = true; + }); + } +})); diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.min.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.min.js new file mode 100644 index 00000000..0f4a545b --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/mutation/pf.mutation.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){"use strict";var b,c=0,d=function(){window.picturefill&&a(window.picturefill),(window.picturefill||c>9999)&&clearInterval(b),c++};b=setInterval(d,8),d()}(function(a){"use strict";var b=window.document,c=window.Element,d=window.MutationObserver,e=function(){},f={disconnect:e,take:e,observe:e,start:e,stop:e,connected:!1},g=/^loade|^c|^i/.test(b.readyState||""),h=a._;if(h.mutationSupport=!1,h.observer=f,Object.keys&&window.HTMLSourceElement&&b.addEventListener){var i,j,k,l,m={src:1,srcset:1,sizes:1,media:1},n=Object.keys(m),o={attributes:!0,childList:!0,subtree:!0,attributeFilter:n},p=c&&c.prototype,q={},r=function(a,b){q[a]=h[a],h[a]=b};p&&!p.matches&&(p.matches=p.matchesSelector||p.mozMatchesSelector||p.webkitMatchesSelector||p.msMatchesSelector),p&&p.matches&&(i=function(a,b){return a.matches(b)},h.mutationSupport=!(!Object.create||!Object.defineProperties)),h.mutationSupport&&(f.observe=function(){k&&(f.connected=!0,j&&j.observe(b.documentElement,o))},f.disconnect=function(){f.connected=!1,j&&j.disconnect()},f.take=function(){j?h.onMutations(j.takeRecords()):l&&l.take()},f.start=function(){k=!0,f.observe()},f.stop=function(){k=!1,f.disconnect()},r("setupRun",function(){return f.disconnect(),q.setupRun.apply(this,arguments)}),r("teardownRun",function(){var a=q.setupRun.apply(this,arguments);return f.observe(),a}),r("setSrc",function(){var a,b=f.connected;return f.disconnect(),a=q.setSrc.apply(this,arguments),b&&f.observe(),a}),h.onMutations=function(a){var b,c,d=[];for(b=0,c=a.length;c>b;b++)g&&"childList"===a[b].type?h.onSubtreeChange(a[b],d):"attributes"===a[b].type&&h.onAttrChange(a[b],d);d.length&&h.fillImgs({elements:d,reevaluate:!0})},h.onSubtreeChange=function(a,b){h.findAddedMutations(a.addedNodes,b),h.findRemovedMutations(a.removedNodes,a.target,b)},h.findAddedMutations=function(a,b){var c,d,e,f;for(c=0,d=a.length;d>c;c++)e=a[c],1===e.nodeType&&(f=e.nodeName.toUpperCase(),"PICTURE"===f?h.addToElements(e.getElementsByTagName("img")[0],b):"IMG"===f&&i(e,h.selShort)?h.addToElements(e,b):"SOURCE"===f?h.addImgForSource(e,e.parentNode,b):h.addToElements(h.qsa(e,h.selShort),b))},h.findRemovedMutations=function(a,b,c){var d,e,f;for(d=0,e=a.length;e>d;d++)f=a[d],1===f.nodeType&&"SOURCE"===f.nodeName.toUpperCase()&&h.addImgForSource(f,b,c)},h.addImgForSource=function(a,b,c){b&&"PICTURE"!==(b.nodeName||"").toUpperCase()&&(b=b.parentNode,b&&"PICTURE"===(b.nodeName||"").toUpperCase()||(b=null)),b&&h.addToElements(b.getElementsByTagName("img")[0],c)},h.addToElements=function(a,b){var c,d;if(a)if("length"in a&&!a.nodeType)for(c=0,d=a.length;d>c;c++)h.addToElements(a[c],b);else a.parentNode&&-1===b.indexOf(a)&&b.push(a)},h.onAttrChange=function(a,b){var c,d=a.target[h.ns];d||"srcset"!==a.attributeName||"IMG"!==(c=a.target.nodeName.toUpperCase())?d&&(c||(c=a.target.nodeName.toUpperCase()),"IMG"===c?(a.attributeName in d&&(d[a.attributeName]=void 0),h.addToElements(a.target,b)):"SOURCE"===c&&h.addImgForSource(a.target,a.target.parentNode,b)):h.addToElements(a.target,b)},h.supPicture||(d&&!h.testMutationEvents?j=new d(h.onMutations):(l=function(){var a=!1,b=[],c=window.setImmediate||window.setTimeout;return function(d){a||(a=!0,l.take||(l.take=function(){b.length&&(h.onMutations(b),b=[]),a=!1}),c(l.take)),b.push(d)}}(),b.documentElement.addEventListener("DOMNodeInserted",function(a){f.connected&&g&&l({type:"childList",addedNodes:[a.target],removedNodes:[]})},!0),b.documentElement.addEventListener("DOMNodeRemoved",function(a){f.connected&&g&&"SOURCE"===(a.target||{}).nodeName&&l({type:"childList",addedNodes:[],removedNodes:[a.target],target:a.target.parentNode})},!0),b.documentElement.addEventListener("DOMAttrModified",function(a){f.connected&&m[a.attrName]&&l({type:"attributes",target:a.target,attributeName:a.attrName})},!0)),window.HTMLImageElement&&Object.defineProperties&&!function(){var a=b.createElement("img"),c=[],d=a.getAttribute,e=a.setAttribute,f={src:1};h.supSrcset&&!h.supSizes&&(f.srcset=1),Object.defineProperties(HTMLImageElement.prototype,{getAttribute:{value:function(a){var b;return f[a]&&(b=this[h.ns])&&void 0!==b[a]?b[a]:d.apply(this,arguments)},writeable:!0,enumerable:!0,configurable:!0}}),h.supSrcset||c.push("srcset"),h.supSizes||c.push("sizes"),c.forEach(function(a){Object.defineProperty(HTMLImageElement.prototype,a,{set:function(b){e.call(this,a,b)},get:function(){return d.call(this,a)||""},enumerable:!0,configurable:!0})}),"currentSrc"in a||!function(){var a,c=function(a,b){null==b&&(b=a.src||""),Object.defineProperty(a,"pfCurrentSrc",{value:b,writable:!0})},d=c;h.supSrcset&&window.devicePixelRatio&&(a=function(a,b){var c=a.d||a.w||a.res,d=b.d||b.w||b.res;return c-d},c=function(b){var c,e,f,g,i=b[h.ns];if(i&&i.supported&&i.srcset&&i.sets&&(e=h.parseSet(i.sets[0]))&&e.sort){for(e.sort(a),f=e.length,g=e[f-1],c=0;f>c;c++)if(e[c].d>=window.devicePixelRatio){g=e[c];break}g&&(g=h.makeUrl(g.url))}d(b,g)}),b.addEventListener("load",function(a){"IMG"===a.target.nodeName.toUpperCase()&&c(a.target)},!0),Object.defineProperty(HTMLImageElement.prototype,"currentSrc",{set:function(){window.console&&console.warn&&console.warn("currentSrc can't be set on img element")},get:function(){return this.complete&&c(this),this.src||this.srcset?this.pfCurrentSrc||"":""},enumerable:!0,configurable:!0})}(),!window.HTMLSourceElement||"srcset"in b.createElement("source")||["srcset","sizes"].forEach(function(a){Object.defineProperty(window.HTMLSourceElement.prototype,a,{set:function(b){this.setAttribute(a,b)},get:function(){return this.getAttribute(a)||""},enumerable:!0,configurable:!0})})}(),f.start()),g||b.addEventListener("DOMContentLoaded",function(){g=!0}))}}); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.js new file mode 100644 index 00000000..2e9e5c93 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.js @@ -0,0 +1,37 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var pf = picturefill._; + var jQuery = window.jQuery || window.$; + + if (!document.querySelector) { + pf.qsa = function(context, sel) { + return jQuery(sel, context); + }; + + var anchor = document.createElement("a"); + + pf.makeUrl = function(src) { + jQuery.attr(anchor, "href", src + "" ); + return jQuery.prop(anchor, "href"); + }; + } + +})); diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.min.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.min.js new file mode 100644 index 00000000..823a1f9f --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/oldie/pf.oldie.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){"use strict";var b,c=0,d=function(){window.picturefill&&a(window.picturefill),(window.picturefill||c>9999)&&clearInterval(b),c++};b=setInterval(d,8),d()}(function(a){"use strict";var b=a._,c=window.jQuery||window.$;if(!document.querySelector){b.qsa=function(a,b){return c(b,a)};var d=document.createElement("a");b.makeUrl=function(a){return c.attr(d,"href",a+""),c.prop(d,"href")}}}); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.js new file mode 100644 index 00000000..38d785cf --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.js @@ -0,0 +1,63 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + if (!window.addEventListener) {return;} + var oldMatches, oldXQant, oldDPR; + var printMedia = window.matchMedia && matchMedia("print") || { matches: false }; + var pf = picturefill._; + var resetMedia = function(media) { + if (!media) {return true;} + if (media.indexOf("print") !== -1) {return true;} + if (oldMatches) {return oldMatches.apply(this, arguments);} + }; + var beforeprint = function() { + if (!printMedia.matches && !oldMatches) { + oldMatches = pf.matchesMedia; + pf.matchesMedia = resetMedia; + } + + if (!oldXQant && !oldDPR && pf.DPR < 1.5 && pf.cfg.xQuant < 1.5) { + oldXQant = pf.cfg.xQuant; + oldDPR = pf.DPR; + pf.DPR = 1.5; + pf.cfg.xQuant = 1.5; + } + picturefill({ reselect: true }); + }; + var afterprint = function() { + if (oldMatches) { + pf.matchesMedia = oldMatches; + oldMatches = false; + } + if (oldXQant) { + pf.cfg.xQuant = oldXQant; + oldXQant = false; + } + if (oldDPR) { + pf.DPR = oldDPR; + oldDPR = false; + } + picturefill({ reselect: true }); + }; + + if ("onbeforeprint" in window) { + addEventListener("beforeprint", beforeprint, false); + addEventListener("afterprint", afterprint, false); + } +})); diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.min.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.min.js new file mode 100644 index 00000000..4a667f1c --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/print/pf.print.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){"use strict";var b,c=0,d=function(){window.picturefill&&a(window.picturefill),(window.picturefill||c>9999)&&clearInterval(b),c++};b=setInterval(d,8),d()}(function(a){"use strict";if(window.addEventListener){var b,c,d,e=window.matchMedia&&matchMedia("print")||{matches:!1},f=a._,g=function(a){return a?-1!==a.indexOf("print")?!0:b?b.apply(this,arguments):void 0:!0},h=function(){e.matches||b||(b=f.matchesMedia,f.matchesMedia=g),!c&&!d&&f.DPR<1.5&&f.cfg.xQuant<1.5&&(c=f.cfg.xQuant,d=f.DPR,f.DPR=1.5,f.cfg.xQuant=1.5),a({reselect:!0})},i=function(){b&&(f.matchesMedia=b,b=!1),c&&(f.cfg.xQuant=c,c=!1),d&&(f.DPR=d,d=!1),a({reselect:!0})};"onbeforeprint"in window&&(addEventListener("beforeprint",h,!1),addEventListener("afterprint",i,!1))}}); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.js new file mode 100644 index 00000000..6555154f --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.js @@ -0,0 +1,89 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var pf = picturefill._; + var runningTests = 0; + var setTypeValue = function(types, value) { + var i; + for (i = 0; i < types.length; i++) { + pf.types[types[i]] = value; + } + }; + + if (pf.supPicture && !pf.cfg.uT) { + picturefill.testTypeSupport = function() {}; + return; + } + + pf.types["image/bmp"] = true; + pf.types["image/x-bmp"] = true; + + picturefill.testTypeSupport = function(types, url, width, useCanvas) { + if (typeof types === "string") { + types = types.split(/\s*\,*\s+/g); + } + var canvas; + var supports = "pending"; + var img = document.createElement("img"); + var onComplete = function() { + runningTests--; + setTypeValue(types, supports); + if (runningTests < 1) { + picturefill({ reselect: true }); + } + }; + + if (useCanvas) { + canvas = document.createElement("canvas"); + if (!canvas.getContext) { + setTypeValue(types, false); + return; + } + } + + img.onload = function() { + var ctx; + supports = true; + if (width) { + supports = img.width === width; + } + + if (useCanvas) { + ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + supports = ctx.getImageData(0, 0, 1, 1).data[3] === 0; + } + onComplete(); + }; + + img.onerror = function() { + supports = false; + onComplete(); + }; + runningTests++; + setTypeValue(types, "pending"); + img.src = url; + }; + + picturefill.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); + picturefill.testTypeSupport("image/vnd.ms-photo", "data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==", 1); + picturefill.testTypeSupport("video/vnd.mozilla.apng video/apng image/vnd.mozilla.apng video/x-apng video/x-mng video/x-png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==", false, true); + +})); diff --git a/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.min.js b/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.min.js new file mode 100644 index 00000000..e6a8b30b --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/dist/plugins/typesupport/pf.type.min.js @@ -0,0 +1,5 @@ +/*! Picturefill - v3.0.1 - 2015-09-30 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT + */ +!function(a){"use strict";var b,c=0,d=function(){window.picturefill&&a(window.picturefill),(window.picturefill||c>9999)&&clearInterval(b),c++};b=setInterval(d,8),d()}(function(a){"use strict";var b=a._,c=0,d=function(a,c){var d;for(d=0;dc&&a({reselect:!0})};return g&&(h=document.createElement("canvas"),!h.getContext)?void d(b,!1):(j.onload=function(){var a;i=!0,f&&(i=j.width===f),g&&(a=h.getContext("2d"),a.drawImage(j,0,0),i=0===a.getImageData(0,0,1,1).data[3]),k()},j.onerror=function(){i=!1,k()},c++,d(b,"pending"),void(j.src=e))},a.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),a.testTypeSupport("image/vnd.ms-photo","data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==",1),void a.testTypeSupport("video/vnd.mozilla.apng video/apng image/vnd.mozilla.apng video/x-apng video/x-mng video/x-png","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==",!1,!0))}); \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/gruntfile.js b/Resources/ui/vendor_bower/picturefill/gruntfile.js new file mode 100644 index 00000000..338d7623 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/gruntfile.js @@ -0,0 +1,130 @@ +/*global module:true*/ +(function() { + "use strict"; + + var pkg; + module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + // Metadata. + pkg: pkg = grunt.file.readJSON("picturefill.json"), + banner: "/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - " + + "<%= grunt.template.today('yyyy-mm-dd') %>\n" + + "<%= pkg.homepage ? ' * ' + pkg.homepage + '\\n' : '' %>" + + " * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" + + " Licensed <%= _.pluck(pkg.licenses, 'type').join(', ') %>\n */\n", + // Task configuration. + clean: { + files: [ "dist" ] + }, + copy: { + plugins: { + files: [ + { + expand: true, + cwd: "src/plugins/", + src: [ "**", "!gecko-picture/*" ], + dest: "dist/plugins/", + filter: "isFile" + } + ], + }, + }, + concat: { + + dist: { + options: { + banner: "<%= banner %>", + stripBanners: true + }, + src: [ "src/plugins/gecko-picture/pf.gecko-picture.js", "src/picturefill.js" ], + dest: "dist/picturefill.js" + } + }, + uglify: { + options: { + banner: "<%= banner %>" + }, + dist: { + files: [ + { + expand: true, + cwd: "dist/", + src: [ "**/*.js", "!*.min.js", "!**/*.min.js" ], + dest: "dist/", + ext: ".min.js", + extDot: "last" + } + ] + } + }, + + qunit: { + files: [ "tests/*.html" ] + }, + jshint: { + all: { + options: { + jshintrc: true + }, + src: [ "Gruntfile.js", "src/**/*.js" ] + } + }, + jscs: { + all: { + src: "<%= jshint.all.src %>" + } + }, + "gh-pages": { + options: { + base: "." + }, + src: [ "**/*", "!node_modules/**/*", "!test/**/*", "!src/**/*" ] + }, + release: { + options: { + commitMessage: "Picturefill <%= version %>", + tagMessage: "Picturefill <%= version %>", + afterRelease: [ "gh-pages" ] + } + }, + watch: { + gruntfile: { + files: [ "Gruntfile.js", "src/*.js", "src/includes/*.js", "tests/*.js" ], + tasks: [ "default" ], + options: { + spawn: false + } + } + } + }); + + // because the compress plugin is insane + grunt.task.registerTask( "compress", "compress the dist folder", function() { + var childProc = require("child_process"); + var done = this.async(); + + childProc.exec( "zip -r dist-" + pkg.version + ".zip dist", function() { + done(); + }); + }); + + // These plugins provide necessary tasks. + grunt.loadNpmTasks("grunt-contrib-clean"); + grunt.loadNpmTasks("grunt-contrib-copy"); + grunt.loadNpmTasks("grunt-contrib-concat"); + grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-qunit"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-watch"); + grunt.loadNpmTasks("grunt-jscs-checker"); + grunt.loadNpmTasks("grunt-gh-pages"); + grunt.loadNpmTasks("grunt-release"); + + // Default task. + grunt.registerTask("default", [ "jscs", "test", "clean", "concat", "copy", "uglify" ]); + grunt.registerTask("test", [ "jscs", "jshint", "qunit" ]); + grunt.registerTask("publish", [ "gh-pages" ]); + }; +})(); diff --git a/Resources/ui/vendor_bower/picturefill/index.html b/Resources/ui/vendor_bower/picturefill/index.html new file mode 100644 index 00000000..dfd8a12c --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/index.html @@ -0,0 +1,295 @@ + + + + + + Picturefill + + + + + + + + + + + +
+

Picturefill

+

A responsive image polyfill

+ Officially endorsed by the RICG + +
+

The picture element, srcset and sizes attributes, and associated features allow web developers to deliver an appropriate image to every user depending on a variety of conditions like screen size, viewport size, screen resolution, and more. Picturefill enables support for the picture element and associated features in browsers that do not yet support them, so you can start using them today!

+ +

Picturefill development is sponsored by and , and maintained by the Picturefill Team. Ongoing discussion of the project is conducted via Slack.

+ +

Contributing, Bug Reports, and More information

+ +

For more information on the development of Picturefill and how you can file bugs or contribute fixes, check out the project on GitHub.

+ +
+ +

Downloading Picturefill

+ +

Picturefill Version 3.0.0 (Stable)

+ +

Version 3 is a full rewrite of the Picturefill codebase, featuring optimized performance, better emulation of native behavior, and parsers that adhere much more closely to the specification. It also handles many of the quirks, shortcomings, and edge cases related to first-generation native implementations.

+ +

Feedback on this release is highly welcomed—if you encounter any problems, please file an issue on GitHub.

+ + +

Picturefill Version 2.3.1

+

Picturefill 2 is a lightweight polyfill that may not perfectly match native responsive images behavior. Please note however that because of a recently-fixed bug, you should absolutely not be using any version of Picturefill prior to 2.3.1. If you are, please update immediately. These downloads include the matchMedia polyfill for browsers that need it (like IE9).

+ + +

Getting Started with Picturefill

+ +

To start using Picturefill download one of the files listed above and reference it from the head section of your HTML document with the following code:

+ +
<script src="picturefill.js"></script>
+ +

To allow your page to load more efficiently, we'd recommend adding an async attribute to that script tag as well. This tells the browser that it can load picturefill asynchronously, without waiting for it to finish before loading the rest of the document. If you add this attribute, you'll need to add a line of script before the script tag as well to allow older browsers to recognize picture elements if it encounters them in the page before picturefill has finished loading.

+ +

Reccomended Usage:

+ +
<head>
+  <script>
+    // Picture element HTML5 shiv
+    document.createElement( "picture" );
+  </script>
+  <script src="picturefill.js" async></script>
+</head>
+ +

Note that if you are already including a recent version of the HTML5 Shiv (sometimes packaged with Modernizr), you may not need this line as it is included there as well. Also, more advanced users may not need this may choose to load Picturefill dynamically using a script loader like Require.js, (AMD and CommonJS support is included in the script).

+ +

Markup Patterns

+ +

Once you've included picturefill.js, you can start adding responsive image elements to your site! Picturefill adds support for the the entire suite of responsive image solutions, including the picture element and new img element attributes.

+ +

There are a number of different use cases addressed by some combination of features from the responsive images specification—here are some of the most common ones:

+ + + +

Using the `srcset` attribute

+

The srcset attribute (without sizes) is used to serve larger—but otherwise identical—image sources to high resolution displays only.

+ +
<img srcset="examples/images/large.jpg 1x, examples/images/extralarge.jpg 2x" alt="…">
+ +

Here's how that renders on your display:

+ A giant stone face at The Bayon temple in Angkor Thom, Cambodia + +

The 2x source will be shown at the inherent width of the 1x source—so the two sources will occupy the same space in your layout, but the 2x source will be displayed at double the pixel density. This only applies to the natural size of the img—resizing the image via CSS will behave as expected.

+ +

Modern browsers that support srcset natively may select a cached file that meets the minimum media condition, even if it is “overkill” for the current media condition. For example, a 2x file may be shown on a 1x device, if that 2x file is already in the cache—there’d be no reason to make an additional request when the user will see no discernable difference, after all. This is typically encountered only on sites with multiple versions of the same image displayed in multiple elements at different sizes (like our demo page). The occasional selection of "oversize" resources—depending on the cache—is currently an expected behavior in native implementations and you may encounter it during testing.

+ +

Eventually srcset will be extended to allow the browser to override requests for higher-resolution options based on a bandwidth limitations or a user preference (see #9 in the Responsive Images Use Cases and Requirements).

+ +

Using the `srcset` & `sizes` attributes

+

The srcset and sizes syntaxes are used to provide the browser with a list of image sources that are identical apart from their size (same aspect ratio, same focal point) and how they’ll be displayed, then allow the browser to choose the source best for the user’s current viewport size, display density, and the size of that image in the page layout.

+ +
<img
+  sizes="(min-width: 40em) 80vw, 100vw"
+  srcset="examples/images/medium.jpg 375w,
+          examples/images/large.jpg 480w,
+          examples/images/extralarge.jpg 768w"
+  alt="…">
+ +

Here's how that renders on your display at your current viewport size:

+ + A giant stone face at The Bayon temple in Angkor Thom, Cambodia + Standalone srcset and sizes demo + +

The sizes syntax is used to define the spaces your image will occupy in your layout. srcset then defines a list of images and their inherent widths. This allows the browser to choose the smallest appropriate source for the size available in that part of the layout, rather than the viewport size alone.

+ +

It's beyond the scope of this guide to get into much detail about how to use the new srcset & sizes attributes so we’d highly recommend reading the following post by Eric Portis: Srcset and Sizes. Keep in mind that the same caching behavior is applied to this usage of srcset, as well.

+ +

Using the `picture` element

+

The picture element is used when you need explicit control over which source is shown at set viewport sizes.

+ +

The picture element requires a little more markup than the example above, but it allows you to use features like CSS3 Media Queries to pair image source with varying sizes, zoom levels, and aspect ratios with the layout conditions in your designs. It should not, however, be used to serve radically different image sources—all sources must be described by the alt attribute of the inner img.

+ +
<picture>
+  <source srcset="examples/images/extralarge.jpg" media="(min-width: 1000px)">
+  <source srcset="examples/images/art-large.jpg" media="(min-width: 800px)">
+  <img srcset="examples/images/art-medium.jpg" alt="…">
+</picture>
+ +

Here's how that renders at your current viewport size:

+ + + + + A giant stone face at The Bayon temple in Angkor Thom, Cambodia + + Standalone picture demo + +

Your picture element should contain a series of source elements followed by an img element. Each source element must have a srcset attribute specifying one or more image url sources (which can use expanded srcset syntax if desired for resolution switching), and the img element should have a srcset attribute for fallback purposes as well (some browsers like Android 2.3's won't see the source elements). Additionally, you may add a media attribute containing CSS3 Media Queries, and/or a sizes attribute to pair with srcset.

+ +

The first source with a media attribute that matches the user’s context will determine the src of the img element at the end, so you’ll want to present larger options first when using min-width media queries (like in the examples below), and larger options last when using max-width media queries. Since these image sources are meant to align with layout breakpoints, srcset’s caching behavior and the potential for a bandwidth or user preference override do not apply here.

+ +

Supporting Picture in Internet Explorer 9

+

While most versions of IE (even older ones!) are supported well, IE9 has a little conflict to work around. To support IE9, you will need to wrap a video element wrapper around the source elements in your picture tag. You can do this using conditional comments, like so:

+ +
<picture>
+  <!--[if IE 9]><video style="display: none;"><![endif]-->
+  <source srcset="examples/images/extralarge.jpg" media="(min-width: 1000px)">
+  <source srcset="examples/images/large.jpg" media="(min-width: 800px)">
+  <!--[if IE 9]></video><![endif]-->
+  <img srcset="examples/images/medium.jpg" alt="…">
+</picture>
+ +

`media` and `srcset` syntax:

+

The 1x/2x syntax can be used within source element srcset attributes as a shorthand for more complex resolution media queries.

+ +
<picture>
+  <source srcset="examples/images/large.jpg, examples/images/extralarge.jpg 2x" media="(min-width: 800px)">
+  <img srcset="examples/images/small.jpg, examples/images/medium.jpg 2x" alt="…">
+</picture>
+ + + + + + A giant stone face at The Bayon temple in Angkor Thom, Cambodia + + Standalone extended picture demo + +

The `type` attribute in `picture`

+

The types attribute is used to send an alternate image source format only to browsers that support that format, and a fallback source to browsers that do not. Unlike existing solutions, the picture element makes these negotiations using a single request.

+ +

Picturefill supports SVG and WebP as part of its core, but the following MIME types can be used via the “typesupport” plugin:

+
    +
  • image/bmp
  • +
  • image/xbmp
  • +
  • image/jp2
  • +
  • image/vnd.ms-photo
  • +
  • video/vnd.mozilla.apng
  • +
+ +
<picture>
+  <source srcset="examples/images/large.webp" type="image/webp">
+  <img srcset="examples/images/large.jpg" alt="…">
+</picture>
+ +

Here's how that renders in your browser:

+ + + + A giant stone face at The Bayon temple in Angkor Thom, Cambodia + + Standalone type attribute demo + +

Picturefill JavaScript API

+ +

Under ordinary circumstances, you likely won't need to do more than include picturefill.js in your page, but in some situations you may want to run picturefill's function manually yourself, and there are a few options to keep in mind:

+ +

The Picturefill function

+ +

Picturefill.js exposes a single global function: the picturefill() function. picturefill() is automatically called one or more times while a page is loading, and it also is triggered when the browser window is resized (or on orientation change). You can run the picturefill() function at any time in JavaScript yourself as well, which may be useful after making updates to the DOM, or when conditions relevant to your application change:

+ +
picturefill();
+ +

Picturefill function options

+ +

When running the picturefill() function, you can pass options specifying the following configuration options:

+ +
    +
  • Elements: An array of img elements you'd like picturefill to evaluate. The Default value for options.elements is all img elements in the page that have a srcset attribute or have a picture element as a direct parent. +
    picturefill({
    +  elements: [ document.getElementById( "myImg" ) ]
    +});
    +
  • +
  • Reevaluate: Force picturefill to evaluate all elements in the options.elements array, even if they've already been evaluated. The default is false. This option has to be used, if you dynamically change the srcset/sizes attributes or modify associated source elements. As an alternative the mutation plugin can be used. +
    picturefill({
    +  reevaluate: true,
    +  elements: [ document.getElementById( "myImg" ) ]
    +});
    +
  • +
+ + +

Source selection algorithm option

+ +

By default Picturefill attempts to mimic the resource selection algorithms current native implementations, but Picturefill 3 also includes an optional and experimental custom source selection algorithm. The saveData algorithm skews the resource selection algorithm toward smaller image candidates(2x on extremely high dppx devices (3x and up), to conserve bandwidth in situations where there may be little or no visual difference between sources.

+ +

To use saveData, create a picturefillCFG array that runs before the main plugin: + +

//generating the config array
+window.picturefillCFG = window.picturefillCFG || [];
+picturefillCFG.push([ "algorithm", "saveData" ]);
+ +

Developer feedback on this new algorithm is highly welcomed. We’d love to see some data around potential bandwidth savings, and this data may go on to inform native responsive image implementations in the future.

+ +

Browser Support

+

Picturefill supports a broad range of browsers and devices, provided that you stick with the markup conventions documented above.

+ + + + +

Support caveats

+ +

Picturefill is tested broadly and works in a large number of browsers. That said, it does have some browser support considerations to keep in mind:

+
    +
  • Picturefill 3 includes a small shim that polyfills common media conditions for IE9 and earlier (min-width, max-width, min-height, and max-height). If you need old IE support for other media conditions, such as orientation or aspect-ratio, please additionally include the matchMedia polyfill.
  • + +
  • JS-Disabled Browsers only see alt text: When using the picture element, non-picture supporting browsers will only see alt attribute text as a fallback when JavaScript fails or is disabled. This is because any noscript-based workarounds (such as the one used in Picturefill version 1) will cause future browsers that support the picture element to show two images instead of one when JavaScript is off. Unfortunately, adding a src attribute with an external source to the img element in your picture element isn't a good workaround either, as any browser that exists today will fetch that src url even if it is not going to be used (which is wasteful), and an empty src can result in unexpected requests. For valid markup, the shortest possible value for src (without firing an onerror event or a potential request) is
    src="data:image/gif;base64,R0lGODlhAQABAAAAADs="
  • + +
  • Temporary extra HTTP Requests for picture usage in some browsers: In browsers that natively support srcset but do not yet support the picture element, users may experience a wasted HTTP request for each picture element on a page. This is because the browser's preparser will fetch one of the URLs listed in the picture element's child img's srcset attribute as soon as possible during page load, before the JavaScript can evaluate the potential picture source elements for a better match. This problem will only affect browsers that have implemented srcset but not picture, which will hopefully be short-lived.
  • + +
  • Source element limitations: Browsers like Android 2.3 and Internet Explorer 9 can not see the source elements inside a picture element. For IE, the video tag workaround helps us avoid this problem, but Android will still have no access to source elements. Be sure to provide a srcset attribute on your enclosed img to ensure an image will show in this browser.
  • +
  • Media attribute support requires native media query supportThe picture element (paired with picturefill) works best in browsers that support CSS3 media queries. Picturefill includes the matchMedia polyfill by default, which makes matchMedia work in media query-supporting browsers that don’t support matchMedia.
  • +
+ +
+ +
+

Sponsors

+
+ + +
+
+ + + \ No newline at end of file diff --git a/Resources/ui/vendor_bower/picturefill/logos/bocoup-lg.png b/Resources/ui/vendor_bower/picturefill/logos/bocoup-lg.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2acfd66bfbce98d4ed05e310ff8e0953d5dad5 GIT binary patch literal 31957 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 LNkvXXu0mjfpNiQd literal 0 HcmV?d00001 diff --git a/Resources/ui/vendor_bower/picturefill/logos/bocoup-sm.png b/Resources/ui/vendor_bower/picturefill/logos/bocoup-sm.png new file mode 100644 index 0000000000000000000000000000000000000000..2da251643417fc3aee5965879b1cc6b7625bb0ab GIT binary patch literal 31223 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 literal 0 HcmV?d00001 diff --git a/Resources/ui/vendor_bower/picturefill/package.json b/Resources/ui/vendor_bower/picturefill/package.json new file mode 100644 index 00000000..d708e300 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/package.json @@ -0,0 +1,42 @@ +{ + "name": "picturefill", + "description": "A responsive image polyfill.", + "version": "3.0.1", + "homepage": "https://scottjehl.github.io/picturefill/", + "bugs": "https://github.com/scottjehl/picturefill/issues", + "license": "MIT", + "author": "Scott Jehl ", + "repository": { + "type": "git", + "url": "git@github.com:scottjehl/picturefill.git" + }, + "keywords": [ + "picturefill", + "srcset", + "picture", + "responsive", + "responsive images" + ], + "engines": { + "node": ">= 0.8.0" + }, + "main": "./dist/picturefill", + "scripts": { + "test": "grunt test --verbose" + }, + "devDependencies": { + "grunt": "~0.4.2", + "grunt-cli": "~0.1", + "grunt-contrib-clean": "~0.4.0", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-copy": "^0.8.0", + "grunt-contrib-jshint": "~0.10.0", + "grunt-contrib-qunit": "~0.2.0", + "grunt-contrib-uglify": "~0.2.0", + "grunt-contrib-watch": "~0.6.0", + "grunt-gh-pages": "^0.10.0", + "grunt-insert": "~0.1.0", + "grunt-jscs-checker": "~0.4.3", + "grunt-release": "^0.12.0" + } +} diff --git a/Resources/ui/vendor_bower/picturefill/picturefill.json b/Resources/ui/vendor_bower/picturefill/picturefill.json new file mode 100644 index 00000000..97ded78e --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/picturefill.json @@ -0,0 +1,22 @@ +{ + "name": "Picturefill", + "title": "Picturefill", + "description": "A polyfill for responsive images (http://picture.responsiveimages.org/) that you can use today.", + "version": "3.0.1", + "homepage": "http://scottjehl.github.io/picturefill", + "author": { + "name": "https://github.com/scottjehl/picturefill/blob/master/Authors.txt", + "url": "https://github.com/scottjehl/picturefill" + }, + "repository": { + "type": "git", + "url": "https://github.com/scottjehl/picturefill.git" + }, + "bugs": "https://github.com/scottjehl/picturefill/issues", + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/scottjehl/picturefill/blob/master/LICENSE" + } + ] +} diff --git a/Resources/ui/vendor_bower/picturefill/src/picturefill.js b/Resources/ui/vendor_bower/picturefill/src/picturefill.js new file mode 100644 index 00000000..2f04093e --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/picturefill.js @@ -0,0 +1,1438 @@ +/*! Picturefill - v3.0.1 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; + * License: MIT + */ + +(function( window, document, undefined ) { + // Enable strict mode + "use strict"; + + // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround) + document.createElement( "picture" ); + + var warn, eminpx, alwaysCheckWDescriptor, evalId; + // local object for method references and testing exposure + var pf = {}; + var noop = function() {}; + var image = document.createElement( "img" ); + var getImgAttr = image.getAttribute; + var setImgAttr = image.setAttribute; + var removeImgAttr = image.removeAttribute; + var docElem = document.documentElement; + var types = {}; + var cfg = { + //resource selection: + algorithm: "" + }; + var srcAttr = "data-pfsrc"; + var srcsetAttr = srcAttr + "set"; + // ua sniffing is done for undetectable img loading features, + // to do some non crucial perf optimizations + var ua = navigator.userAgent; + var supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35 ); + var curSrcProp = "currentSrc"; + var regWDesc = /\s+\+?\d+(e\d+)?w/; + var regSize = /(\([^)]+\))?\s*(.+)/; + var setOptions = window.picturefillCFG; + /** + * Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests ) + */ + // baseStyle also used by getEmValue (i.e.: width: 1em is important) + var 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)"; + var fsCss = "font-size:100%!important;"; + var isVwDirty = true; + + var cssCache = {}; + var sizeLengthCache = {}; + var DPR = window.devicePixelRatio; + var units = { + px: 1, + "in": 96 + }; + var anchor = document.createElement( "a" ); + /** + * alreadyRun flag used for setOptions. is it true setOptions will reevaluate + * @type {boolean} + */ + var alreadyRun = false; + + // Reusable, non-"g" Regexes + + // (Don't use \s, to avoid matching non-breaking space.) + var regexLeadingSpaces = /^[ \t\n\r\u000c]+/, + regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/, + regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/, + regexTrailingCommas = /[,]+$/, + regexNonNegativeInteger = /^\d+$/, + + // ( Positive or negative or unsigned integers or decimals, without or without exponents. + // Must include at least one digit. + // According to spec tests any decimal point must be followed by a digit. + // No leading plus sign is allowed.) + // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number + regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/; + + var on = function(obj, evt, fn, capture) { + if ( obj.addEventListener ) { + obj.addEventListener(evt, fn, capture || false); + } else if ( obj.attachEvent ) { + obj.attachEvent( "on" + evt, fn); + } + }; + + /** + * simple memoize function: + */ + + var memoize = function(fn) { + var cache = {}; + return function(input) { + if ( !(input in cache) ) { + cache[ input ] = fn(input); + } + return cache[ input ]; + }; + }; + + // UTILITY FUNCTIONS + + // Manual is faster than RegEx + // http://jsperf.com/whitespace-character/5 + function isSpace(c) { + return (c === "\u0020" || // space + c === "\u0009" || // horizontal tab + c === "\u000A" || // new line + c === "\u000C" || // form feed + c === "\u000D"); // carriage return + } + + /** + * gets a mediaquery and returns a boolean or gets a css length and returns a number + * @param css mediaqueries or css length + * @returns {boolean|number} + * + * based on: https://gist.github.com/jonathantneal/db4f77009b155f083738 + */ + var evalCSS = (function() { + + var regLength = /^([\d\.]+)(em|vw|px)$/; + var replace = function() { + var args = arguments, index = 0, string = args[0]; + while (++index in args) { + string = string.replace(args[index], args[++index]); + } + return string; + }; + + var buildStr = memoize(function(css) { + + return "return " + replace((css || "").toLowerCase(), + // interpret `and` + /\band\b/g, "&&", + + // interpret `,` + /,/g, "||", + + // interpret `min-` as >= + /min-([a-z-\s]+):/g, "e.$1>=", + + // interpret `max-` as <= + /max-([a-z-\s]+):/g, "e.$1<=", + + //calc value + /calc([^)]+)/g, "($1)", + + // interpret css values + /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", + //make eval less evil + /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig, "" + ) + ";"; + }); + + return function(css, length) { + var parsedLength; + if (!(css in cssCache)) { + cssCache[css] = false; + if (length && (parsedLength = css.match( regLength ))) { + cssCache[css] = parsedLength[ 1 ] * units[parsedLength[ 2 ]]; + } else { + /*jshint evil:true */ + try{ + cssCache[css] = new Function("e", buildStr(css))(units); + } catch(e) {} + /*jshint evil:false */ + } + } + return cssCache[css]; + }; + })(); + + var setResolution = function( candidate, sizesattr ) { + if ( candidate.w ) { // h = means height: || descriptor.type === 'h' do not handle yet... + candidate.cWidth = pf.calcListLength( sizesattr || "100vw" ); + candidate.res = candidate.w / candidate.cWidth ; + } else { + candidate.res = candidate.d; + } + return candidate; + }; + + /** + * + * @param opt + */ + var picturefill = function( opt ) { + var elements, i, plen; + + var options = opt || {}; + + if ( options.elements && options.elements.nodeType === 1 ) { + if ( options.elements.nodeName.toUpperCase() === "IMG" ) { + options.elements = [ options.elements ]; + } else { + options.context = options.elements; + options.elements = null; + } + } + + elements = options.elements || pf.qsa( (options.context || document), ( options.reevaluate || options.reselect ) ? pf.sel : pf.selShort ); + + if ( (plen = elements.length) ) { + + pf.setupRun( options ); + alreadyRun = true; + + // Loop through all elements + for ( i = 0; i < plen; i++ ) { + pf.fillImg(elements[ i ], options); + } + + pf.teardownRun( options ); + } + }; + + /** + * outputs a warning for the developer + * @param {message} + * @type {Function} + */ + warn = ( window.console && console.warn ) ? + function( message ) { + console.warn( message ); + } : + noop + ; + + if ( !(curSrcProp in image) ) { + curSrcProp = "src"; + } + + // Add support for standard mime types. + types[ "image/jpeg" ] = true; + types[ "image/gif" ] = true; + types[ "image/png" ] = true; + + function detectTypeSupport( type, typeUri ) { + // based on Modernizr's lossless img-webp test + // note: asynchronous + var image = new window.Image(); + image.onerror = function() { + types[ type ] = false; + picturefill(); + }; + image.onload = function() { + types[ type ] = image.width === 1; + picturefill(); + }; + image.src = typeUri; + return "pending"; + } + + // test svg support + types[ "image/svg+xml" ] = document.implementation.hasFeature( "http://wwwindow.w3.org/TR/SVG11/feature#Image", "1.1" ); + + /** + * updates the internal vW property with the current viewport width in px + */ + function updateMetrics() { + + isVwDirty = false; + DPR = window.devicePixelRatio; + cssCache = {}; + sizeLengthCache = {}; + + pf.DPR = DPR || 1; + + units.width = Math.max(window.innerWidth || 0, docElem.clientWidth); + units.height = Math.max(window.innerHeight || 0, docElem.clientHeight); + + units.vw = units.width / 100; + units.vh = units.height / 100; + + evalId = [ units.height, units.width, DPR ].join("-"); + + units.em = pf.getEmValue(); + units.rem = units.em; + } + + function chooseLowRes( lowerValue, higherValue, dprValue, isCached ) { + var bonusFactor, tooMuch, bonus, meanDensity; + + //experimental + if (cfg.algorithm === "saveData" ){ + if ( lowerValue > 2.7 ) { + meanDensity = dprValue + 1; + } else { + tooMuch = higherValue - dprValue; + bonusFactor = Math.pow(lowerValue - 0.6, 1.5); + + bonus = tooMuch * bonusFactor; + + if (isCached) { + bonus += 0.1 * bonusFactor; + } + + meanDensity = lowerValue + bonus; + } + } else { + meanDensity = (dprValue > 1) ? + Math.sqrt(lowerValue * higherValue) : + lowerValue; + } + + return meanDensity > dprValue; + } + + function applyBestCandidate( img ) { + var srcSetCandidates; + var matchingSet = pf.getSet( img ); + var evaluated = false; + if ( matchingSet !== "pending" ) { + evaluated = evalId; + if ( matchingSet ) { + srcSetCandidates = pf.setRes( matchingSet ); + pf.applySetCandidate( srcSetCandidates, img ); + } + } + img[ pf.ns ].evaled = evaluated; + } + + function ascendingSort( a, b ) { + return a.res - b.res; + } + + function setSrcToCur( img, src, set ) { + var candidate; + if ( !set && src ) { + set = img[ pf.ns ].sets; + set = set && set[set.length - 1]; + } + + candidate = getCandidateForSrc(src, set); + + if ( candidate ) { + src = pf.makeUrl(src); + img[ pf.ns ].curSrc = src; + img[ pf.ns ].curCan = candidate; + + if ( !candidate.res ) { + setResolution( candidate, candidate.set.sizes ); + } + } + return candidate; + } + + function getCandidateForSrc( src, set ) { + var i, candidate, candidates; + if ( src && set ) { + candidates = pf.parseSet( set ); + src = pf.makeUrl(src); + for ( i = 0; i < candidates.length; i++ ) { + if ( src === pf.makeUrl(candidates[ i ].url) ) { + candidate = candidates[ i ]; + break; + } + } + } + return candidate; + } + + function getAllSourceElements( picture, candidates ) { + var i, len, source, srcset; + + // SPEC mismatch intended for size and perf: + // actually only source elements preceding the img should be used + // also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector + var sources = picture.getElementsByTagName( "source" ); + + for ( i = 0, len = sources.length; i < len; i++ ) { + source = sources[ i ]; + source[ pf.ns ] = true; + srcset = source.getAttribute( "srcset" ); + + // if source does not have a srcset attribute, skip + if ( srcset ) { + candidates.push( { + srcset: srcset, + media: source.getAttribute( "media" ), + type: source.getAttribute( "type" ), + sizes: source.getAttribute( "sizes" ) + } ); + } + } + } + + /** + * Srcset Parser + * By Alex Bell | MIT License + * + * @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...] + * + * Based super duper closely on the reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute + */ + + // 1. Let input be the value passed to this algorithm. + // (TO-DO : Explain what "set" argument is here. Maybe choose a more + // descriptive & more searchable name. Since passing the "set" in really has + // nothing to do with parsing proper, I would prefer this assignment eventually + // go in an external fn.) + function parseSrcset(input, set) { + + function collectCharacters(regEx) { + var chars, + match = regEx.exec(input.substring(pos)); + if (match) { + chars = match[ 0 ]; + pos += chars.length; + return chars; + } + } + + var inputLength = input.length, + url, + descriptors, + currentDescriptor, + state, + c, + + // 2. Let position be a pointer into input, initially pointing at the start + // of the string. + pos = 0, + + // 3. Let candidates be an initially empty source set. + candidates = []; + + /** + * Adds descriptor properties to a candidate, pushes to the candidates array + * @return undefined + */ + // (Declared outside of the while loop so that it's only created once. + // (This fn is defined before it is used, in order to pass JSHINT. + // Unfortunately this breaks the sequencing of the spec comments. :/ ) + function parseDescriptors() { + + // 9. Descriptor parser: Let error be no. + var pError = false, + + // 10. Let width be absent. + // 11. Let density be absent. + // 12. Let future-compat-h be absent. (We're implementing it now as h) + w, d, h, i, + candidate = {}, + desc, lastChar, value, intVal, floatVal; + + // 13. For each descriptor in descriptors, run the appropriate set of steps + // from the following list: + for (i = 0 ; i < descriptors.length; i++) { + desc = descriptors[ i ]; + + lastChar = desc[ desc.length - 1 ]; + value = desc.substring(0, desc.length - 1); + intVal = parseInt(value, 10); + floatVal = parseFloat(value); + + // If the descriptor consists of a valid non-negative integer followed by + // a U+0077 LATIN SMALL LETTER W character + if (regexNonNegativeInteger.test(value) && (lastChar === "w")) { + + // If width and density are not both absent, then let error be yes. + if (w || d) {pError = true;} + + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. + // Otherwise, let width be the result. + if (intVal === 0) {pError = true;} else {w = intVal;} + + // If the descriptor consists of a valid floating-point number followed by + // a U+0078 LATIN SMALL LETTER X character + } else if (regexFloatingPoint.test(value) && (lastChar === "x")) { + + // If width, density and future-compat-h are not all absent, then let error + // be yes. + if (w || d || h) {pError = true;} + + // Apply the rules for parsing floating-point number values to the descriptor. + // If the result is less than zero, let error be yes. Otherwise, let density + // be the result. + if (floatVal < 0) {pError = true;} else {d = floatVal;} + + // If the descriptor consists of a valid non-negative integer followed by + // a U+0068 LATIN SMALL LETTER H character + } else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) { + + // If height and density are not both absent, then let error be yes. + if (h || d) {pError = true;} + + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. Otherwise, let future-compat-h + // be the result. + if (intVal === 0) {pError = true;} else {h = intVal;} + + // Anything else, Let error be yes. + } else {pError = true;} + } // (close step 13 for loop) + + // 15. If error is still no, then append a new image source to candidates whose + // URL is url, associated with a width width if not absent and a pixel + // density density if not absent. Otherwise, there is a parse error. + if (!pError) { + candidate.url = url; + + if (w) { candidate.w = w;} + if (d) { candidate.d = d;} + if (h) { candidate.h = h;} + if (!h && !d && !w) {candidate.d = 1;} + if (candidate.d === 1) {set.has1x = true;} + candidate.set = set; + + candidates.push(candidate); + } + } // (close parseDescriptors fn) + + /** + * Tokenizes descriptor properties prior to parsing + * Returns undefined. + * (Again, this fn is defined before it is used, in order to pass JSHINT. + * Unfortunately this breaks the logical sequencing of the spec comments. :/ ) + */ + function tokenize() { + + // 8.1. Descriptor tokeniser: Skip whitespace + collectCharacters(regexLeadingSpaces); + + // 8.2. Let current descriptor be the empty string. + currentDescriptor = ""; + + // 8.3. Let state be in descriptor. + state = "in descriptor"; + + while (true) { + + // 8.4. Let c be the character at position. + c = input.charAt(pos); + + // Do the following depending on the value of state. + // For the purpose of this step, "EOF" is a special character representing + // that position is past the end of input. + + // In descriptor + if (state === "in descriptor") { + // Do the following, depending on the value of c: + + // Space character + // If current descriptor is not empty, append current descriptor to + // descriptors and let current descriptor be the empty string. + // Set state to after descriptor. + if (isSpace(c)) { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + currentDescriptor = ""; + state = "after descriptor"; + } + + // U+002C COMMA (,) + // Advance position to the next character in input. If current descriptor + // is not empty, append current descriptor to descriptors. Jump to the step + // labeled descriptor parser. + } else if (c === ",") { + pos += 1; + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; + + // U+0028 LEFT PARENTHESIS (() + // Append c to current descriptor. Set state to in parens. + } else if (c === "\u0028") { + currentDescriptor = currentDescriptor + c; + state = "in parens"; + + // EOF + // If current descriptor is not empty, append current descriptor to + // descriptors. Jump to the step labeled descriptor parser. + } else if (c === "") { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; + + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } + // (end "in descriptor" + + // In parens + } else if (state === "in parens") { + + // U+0029 RIGHT PARENTHESIS ()) + // Append c to current descriptor. Set state to in descriptor. + if (c === ")") { + currentDescriptor = currentDescriptor + c; + state = "in descriptor"; + + // EOF + // Append current descriptor to descriptors. Jump to the step labeled + // descriptor parser. + } else if (c === "") { + descriptors.push(currentDescriptor); + parseDescriptors(); + return; + + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } + + // After descriptor + } else if (state === "after descriptor") { + + // Do the following, depending on the value of c: + // Space character: Stay in this state. + if (isSpace(c)) { + + // EOF: Jump to the step labeled descriptor parser. + } else if (c === "") { + parseDescriptors(); + return; + + // Anything else + // Set state to in descriptor. Set position to the previous character in input. + } else { + state = "in descriptor"; + pos -= 1; + + } + } + + // Advance position to the next character in input. + pos += 1; + + // Repeat this step. + } // (close while true loop) + } + + // 4. Splitting loop: Collect a sequence of characters that are space + // characters or U+002C COMMA characters. If any U+002C COMMA characters + // were collected, that is a parse error. + while (true) { + collectCharacters(regexLeadingCommasOrSpaces); + + // 5. If position is past the end of input, return candidates and abort these steps. + if (pos >= inputLength) { + return candidates; // (we're done, this is the sole return path) + } + + // 6. Collect a sequence of characters that are not space characters, + // and let that be url. + url = collectCharacters(regexLeadingNotSpaces); + + // 7. Let descriptors be a new empty list. + descriptors = []; + + // 8. If url ends with a U+002C COMMA character (,), follow these substeps: + // (1). Remove all trailing U+002C COMMA characters from url. If this removed + // more than one character, that is a parse error. + if (url.slice(-1) === ",") { + url = url.replace(regexTrailingCommas, ""); + // (Jump ahead to step 9 to skip tokenization and just push the candidate). + parseDescriptors(); + + // Otherwise, follow these substeps: + } else { + tokenize(); + } // (close else of step 8) + + // 16. Return to the step labeled splitting loop. + } // (Close of big while loop.) + } + + /* + * Sizes Parser + * + * By Alex Bell | MIT License + * + * Non-strict but accurate and lightweight JS Parser for the string value + * + * Reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute + * + * Most comments are copied in directly from the spec + * (except for comments in parens). + * + * Grammar is: + * = # [ , ]? | + * = + * = + * http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes + * + * E.g. "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw" + * or "(min-width: 30em), calc(30vw - 15px)" or just "30vw" + * + * Returns the first valid with a media condition that evaluates to true, + * or "100vw" if all valid media conditions evaluate to false. + * + */ + + function parseSizes(strValue) { + + // (Percentage CSS lengths are not allowed in this case, to avoid confusion: + // https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list + // CSS allows a single optional plus or minus sign: + // http://www.w3.org/TR/CSS2/syndata.html#numbers + // CSS is ASCII case-insensitive: + // http://www.w3.org/TR/CSS2/syndata.html#characters ) + // Spec allows exponential notation for type: + // http://dev.w3.org/csswg/css-values/#numbers + var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i; + + // (This is a quick and lenient test. Because of optional unlimited-depth internal + // grouping parens and strict spacing rules, this could get very complicated.) + var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i; + + var i; + var unparsedSizesList; + var unparsedSizesListLength; + var unparsedSize; + var lastComponentValue; + var size; + + // UTILITY FUNCTIONS + + // (Toy CSS parser. The goals here are: + // 1) expansive test coverage without the weight of a full CSS parser. + // 2) Avoiding regex wherever convenient. + // Quick tests: http://jsfiddle.net/gtntL4gr/3/ + // Returns an array of arrays.) + function parseComponentValues(str) { + var chrctr; + var component = ""; + var componentArray = []; + var listArray = []; + var parenDepth = 0; + var pos = 0; + var inComment = false; + + function pushComponent() { + if (component) { + componentArray.push(component); + component = ""; + } + } + + function pushComponentArray() { + if (componentArray[0]) { + listArray.push(componentArray); + componentArray = []; + } + } + + // (Loop forwards from the beginning of the string.) + while (true) { + chrctr = str.charAt(pos); + + if (chrctr === "") { // ( End of string reached.) + pushComponent(); + pushComponentArray(); + return listArray; + } else if (inComment) { + if ((chrctr === "*") && (str[pos + 1] === "/")) { // (At end of a comment.) + inComment = false; + pos += 2; + pushComponent(); + continue; + } else { + pos += 1; // (Skip all characters inside comments.) + continue; + } + } else if (isSpace(chrctr)) { + // (If previous character in loop was also a space, or if + // at the beginning of the string, do not add space char to + // component.) + if ( (str.charAt(pos - 1) && isSpace( str.charAt(pos - 1) ) ) || !component ) { + pos += 1; + continue; + } else if (parenDepth === 0) { + pushComponent(); + pos +=1; + continue; + } else { + // (Replace any space character with a plain space for legibility.) + chrctr = " "; + } + } else if (chrctr === "(") { + parenDepth += 1; + } else if (chrctr === ")") { + parenDepth -= 1; + } else if (chrctr === ",") { + pushComponent(); + pushComponentArray(); + pos += 1; + continue; + } else if ( (chrctr === "/") && (str.charAt(pos + 1) === "*") ) { + inComment = true; + pos += 2; + continue; + } + + component = component + chrctr; + pos += 1; + } + } + + function isValidNonNegativeSourceSizeValue(s) { + if (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) {return true;} + if (regexCssCalc.test(s)) {return true;} + // ( http://www.w3.org/TR/CSS2/syndata.html#numbers says: + // "-0 is equivalent to 0 and is not a negative number." which means that + // unitless zero and unitless negative zero must be accepted as special cases.) + if ((s === "0") || (s === "-0") || (s === "+0")) {return true;} + return false; + } + + // When asked to parse a sizes attribute from an element, parse a + // comma-separated list of component values from the value of the element's + // sizes attribute (or the empty string, if the attribute is absent), and let + // unparsed sizes list be the result. + // http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values + + unparsedSizesList = parseComponentValues(strValue); + unparsedSizesListLength = unparsedSizesList.length; + + // For each unparsed size in unparsed sizes list: + for (i = 0; i < unparsedSizesListLength; i++) { + unparsedSize = unparsedSizesList[i]; + + // 1. Remove all consecutive s from the end of unparsed size. + // ( parseComponentValues() already omits spaces outside of parens. ) + + // If unparsed size is now empty, that is a parse error; continue to the next + // iteration of this algorithm. + // ( parseComponentValues() won't push an empty array. ) + + // 2. If the last component value in unparsed size is a valid non-negative + // , let size be its value and remove the component value + // from unparsed size. Any CSS function other than the calc() function is + // invalid. Otherwise, there is a parse error; continue to the next iteration + // of this algorithm. + // http://dev.w3.org/csswg/css-syntax/#parse-component-value + lastComponentValue = unparsedSize[unparsedSize.length - 1]; + + if (isValidNonNegativeSourceSizeValue(lastComponentValue)) { + size = lastComponentValue; + unparsedSize.pop(); + } else { + continue; + } + + // 3. Remove all consecutive s from the end of unparsed + // size. If unparsed size is now empty, return size and exit this algorithm. + // If this was not the last item in unparsed sizes list, that is a parse error. + if (unparsedSize.length === 0) { + return size; + } + + // 4. Parse the remaining component values in unparsed size as a + // . If it does not parse correctly, or it does parse + // correctly but the evaluates to false, continue to the + // next iteration of this algorithm. + // (Parsing all possible compound media conditions in JS is heavy, complicated, + // and the payoff is unclear. Is there ever an situation where the + // media condition parses incorrectly but still somehow evaluates to true? + // Can we just rely on the browser/polyfill to do it?) + unparsedSize = unparsedSize.join(" "); + if (!(pf.matchesMedia( unparsedSize ) ) ) { + continue; + } + + // 5. Return size and exit this algorithm. + return size; + } + + // If the above algorithm exhausts unparsed sizes list without returning a + // size value, return 100vw. + return "100vw"; + } + + // namespace + pf.ns = ("pf" + new Date().getTime()).substr(0, 9); + + // srcset support test + pf.supSrcset = "srcset" in image; + pf.supSizes = "sizes" in image; + pf.supPicture = !!window.HTMLPictureElement; + + if (pf.supSrcset && pf.supPicture && !pf.supSizes) { + (function(image2) { + image.srcset = "data:,a"; + image2.src = "data:,a"; + pf.supSrcset = image.complete === image2.complete; + pf.supPicture = pf.supSrcset && pf.supPicture; + })(document.createElement("img")); + } + + // using pf.qsa instead of dom traversing does scale much better, + // especially on sites mixing responsive and non-responsive images + pf.selShort = "picture>img,img[srcset]"; + pf.sel = pf.selShort; + pf.cfg = cfg; + + if ( pf.supSrcset ) { + pf.sel += ",img[" + srcsetAttr + "]"; + } + + /** + * Shortcut property for `devicePixelRatio` ( for easy overriding in tests ) + */ + pf.DPR = (DPR || 1 ); + pf.u = units; + + // container of supported mime types that one might need to qualify before using + pf.types = types; + + alwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes; + + pf.setSize = noop; + + /** + * Gets a string and returns the absolute URL + * @param src + * @returns {String} absolute URL + */ + + pf.makeUrl = memoize(function(src) { + anchor.href = src; + return anchor.href; + }); + + /** + * Gets a DOM element or document and a selctor and returns the found matches + * Can be extended with jQuery/Sizzle for IE7 support + * @param context + * @param sel + * @returns {NodeList} + */ + pf.qsa = function(context, sel) { + return context.querySelectorAll(sel); + }; + + /** + * Shortcut method for matchMedia ( for easy overriding in tests ) + * wether native or pf.mMQ is used will be decided lazy on first call + * @returns {boolean} + */ + pf.matchesMedia = function() { + if ( window.matchMedia && (matchMedia( "(min-width: 0.1em)" ) || {}).matches ) { + pf.matchesMedia = function( media ) { + return !media || ( matchMedia( media ).matches ); + }; + } else { + pf.matchesMedia = pf.mMQ; + } + + return pf.matchesMedia.apply( this, arguments ); + }; + + /** + * A simplified matchMedia implementation for IE8 and IE9 + * handles only min-width/max-width with px or em values + * @param media + * @returns {boolean} + */ + pf.mMQ = function( media ) { + return media ? evalCSS(media) : true; + }; + + /** + * Returns the calculated length in css pixel from the given sourceSizeValue + * http://dev.w3.org/csswg/css-values-3/#length-value + * intended Spec mismatches: + * * Does not check for invalid use of CSS functions + * * Does handle a computed length of 0 the same as a negative and therefore invalid value + * @param sourceSizeValue + * @returns {Number} + */ + pf.calcLength = function( sourceSizeValue ) { + + var value = evalCSS(sourceSizeValue, true) || false; + if (value < 0) { + value = false; + } + + return value; + }; + + /** + * Takes a type string and checks if its supported + */ + + pf.supportsType = function( type ) { + return ( type ) ? types[ type ] : true; + }; + + /** + * Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length) + * @param sourceSizeStr + * @returns {*} + */ + pf.parseSize = memoize(function( sourceSizeStr ) { + var match = ( sourceSizeStr || "" ).match(regSize); + return { + media: match && match[1], + length: match && match[2] + }; + }); + + pf.parseSet = function( set ) { + if ( !set.cands ) { + set.cands = parseSrcset(set.srcset, set); + } + return set.cands; + }; + + /** + * returns 1em in css px for html/body default size + * function taken from respondjs + * @returns {*|number} + */ + pf.getEmValue = function() { + var body; + if ( !eminpx && (body = document.body) ) { + var div = document.createElement( "div" ), + originalHTMLCSS = docElem.style.cssText, + originalBodyCSS = body.style.cssText; + + div.style.cssText = baseStyle; + + // 1em in a media query is the value of the default font size of the browser + // reset docElem and body to ensure the correct value is returned + docElem.style.cssText = fsCss; + body.style.cssText = fsCss; + + body.appendChild( div ); + eminpx = div.offsetWidth; + body.removeChild( div ); + + //also update eminpx before returning + eminpx = parseFloat( eminpx, 10 ); + + // restore the original values + docElem.style.cssText = originalHTMLCSS; + body.style.cssText = originalBodyCSS; + + } + return eminpx || 16; + }; + + /** + * Takes a string of sizes and returns the width in pixels as a number + */ + pf.calcListLength = function( sourceSizeListStr ) { + // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33% + // + // or (min-width:30em) calc(30% - 15px) + if ( !(sourceSizeListStr in sizeLengthCache) || cfg.uT ) { + var winningLength = pf.calcLength( parseSizes( sourceSizeListStr ) ); + + sizeLengthCache[ sourceSizeListStr ] = !winningLength ? units.width : winningLength; + } + + return sizeLengthCache[ sourceSizeListStr ]; + }; + + /** + * Takes a candidate object with a srcset property in the form of url/ + * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or + * "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or + * "images/pic-small.png" + * Get an array of image candidates in the form of + * {url: "/foo/bar.png", resolution: 1} + * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value + * If sizes is specified, res is calculated + */ + pf.setRes = function( set ) { + var candidates; + if ( set ) { + + candidates = pf.parseSet( set ); + + for ( var i = 0, len = candidates.length; i < len; i++ ) { + setResolution( candidates[ i ], set.sizes ); + } + } + return candidates; + }; + + pf.setRes.res = setResolution; + + pf.applySetCandidate = function( candidates, img ) { + if ( !candidates.length ) {return;} + var candidate, + i, + j, + length, + bestCandidate, + curSrc, + curCan, + candidateSrc, + abortCurSrc; + + var imageData = img[ pf.ns ]; + var dpr = pf.DPR; + + curSrc = imageData.curSrc || img[curSrcProp]; + + curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set); + + // if we have a current source, we might either become lazy or give this source some advantage + if ( curCan && curCan.set === candidates[ 0 ].set ) { + + // if browser can abort image request and the image has a higher pixel density than needed + // and this image isn't downloaded yet, we skip next part and try to save bandwidth + abortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr); + + if ( !abortCurSrc ) { + curCan.cached = true; + + // if current candidate is "best", "better" or "okay", + // set it to bestCandidate + if ( curCan.res >= dpr ) { + bestCandidate = curCan; + } + } + } + + if ( !bestCandidate ) { + + candidates.sort( ascendingSort ); + + length = candidates.length; + bestCandidate = candidates[ length - 1 ]; + + for ( i = 0; i < length; i++ ) { + candidate = candidates[ i ]; + if ( candidate.res >= dpr ) { + j = i - 1; + + // we have found the perfect candidate, + // but let's improve this a little bit with some assumptions ;-) + if (candidates[ j ] && + (abortCurSrc || curSrc !== pf.makeUrl( candidate.url )) && + chooseLowRes(candidates[ j ].res, candidate.res, dpr, candidates[ j ].cached)) { + + bestCandidate = candidates[ j ]; + + } else { + bestCandidate = candidate; + } + break; + } + } + } + + if ( bestCandidate ) { + + candidateSrc = pf.makeUrl( bestCandidate.url ); + + imageData.curSrc = candidateSrc; + imageData.curCan = bestCandidate; + + if ( candidateSrc !== curSrc ) { + pf.setSrc( img, bestCandidate ); + } + pf.setSize( img ); + } + }; + + pf.setSrc = function( img, bestCandidate ) { + var origWidth; + img.src = bestCandidate.url; + + // although this is a specific Safari issue, we don't want to take too much different code paths + if ( bestCandidate.set.type === "image/svg+xml" ) { + origWidth = img.style.width; + img.style.width = (img.offsetWidth + 1) + "px"; + + // next line only should trigger a repaint + // if... is only done to trick dead code removal + if ( img.offsetWidth + 1 ) { + img.style.width = origWidth; + } + } + }; + + pf.getSet = function( img ) { + var i, set, supportsType; + var match = false; + var sets = img [ pf.ns ].sets; + + for ( i = 0; i < sets.length && !match; i++ ) { + set = sets[i]; + + if ( !set.srcset || !pf.matchesMedia( set.media ) || !(supportsType = pf.supportsType( set.type )) ) { + continue; + } + + if ( supportsType === "pending" ) { + set = supportsType; + } + + match = set; + break; + } + + return match; + }; + + pf.parseSets = function( element, parent, options ) { + var srcsetAttribute, imageSet, isWDescripor, srcsetParsed; + + var hasPicture = parent && parent.nodeName.toUpperCase() === "PICTURE"; + var imageData = element[ pf.ns ]; + + if ( imageData.src === undefined || options.src ) { + imageData.src = getImgAttr.call( element, "src" ); + if ( imageData.src ) { + setImgAttr.call( element, srcAttr, imageData.src ); + } else { + removeImgAttr.call( element, srcAttr ); + } + } + + if ( imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset ) { + srcsetAttribute = getImgAttr.call( element, "srcset" ); + imageData.srcset = srcsetAttribute; + srcsetParsed = true; + } + + imageData.sets = []; + + if ( hasPicture ) { + imageData.pic = true; + getAllSourceElements( parent, imageData.sets ); + } + + if ( imageData.srcset ) { + imageSet = { + srcset: imageData.srcset, + sizes: getImgAttr.call( element, "sizes" ) + }; + + imageData.sets.push( imageSet ); + + isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || ""); + + // add normal src as candidate, if source has no w descriptor + if ( !isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x ) { + imageSet.srcset += ", " + imageData.src; + imageSet.cands.push({ + url: imageData.src, + d: 1, + set: imageSet + }); + } + + } else if ( imageData.src ) { + imageData.sets.push( { + srcset: imageData.src, + sizes: null + } ); + } + + imageData.curCan = null; + imageData.curSrc = undefined; + + // if img has picture or the srcset was removed or has a srcset and does not support srcset at all + // or has a w descriptor (and does not support sizes) set support to false to evaluate + imageData.supported = !( hasPicture || ( imageSet && !pf.supSrcset ) || isWDescripor ); + + if ( srcsetParsed && pf.supSrcset && !imageData.supported ) { + if ( srcsetAttribute ) { + setImgAttr.call( element, srcsetAttr, srcsetAttribute ); + element.srcset = ""; + } else { + removeImgAttr.call( element, srcsetAttr ); + } + } + + if (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) { + if (imageData.src === null) { + element.removeAttribute("src"); + } else { + element.src = imageData.src; + } + } + + imageData.parsed = true; + }; + + pf.fillImg = function(element, options) { + var imageData; + var extreme = options.reselect || options.reevaluate; + + // expando for caching data on the img + if ( !element[ pf.ns ] ) { + element[ pf.ns ] = {}; + } + + imageData = element[ pf.ns ]; + + // if the element has already been evaluated, skip it + // unless `options.reevaluate` is set to true ( this, for example, + // is set to true when running `picturefill` on `resize` ). + if ( !extreme && imageData.evaled === evalId ) { + return; + } + + if ( !imageData.parsed || options.reevaluate ) { + pf.parseSets( element, element.parentNode, options ); + } + + if ( !imageData.supported ) { + applyBestCandidate( element ); + } else { + imageData.evaled = evalId; + } + }; + + pf.setupRun = function() { + if ( !alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio) ) { + updateMetrics(); + } + }; + + // If picture is supported, well, that's awesome. + if ( pf.supPicture ) { + picturefill = noop; + pf.fillImg = noop; + } else { + + // Set up picture polyfill by polling the document + (function() { + var isDomReady; + var regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/; + + var run = function() { + var readyState = document.readyState || ""; + + timerId = setTimeout(run, readyState === "loading" ? 200 : 999); + if ( document.body ) { + pf.fillImgs(); + isDomReady = isDomReady || regReady.test(readyState); + if ( isDomReady ) { + clearTimeout( timerId ); + } + + } + }; + + var timerId = setTimeout(run, document.body ? 9 : 99); + + // Also attach picturefill on resize and readystatechange + // http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html + var debounce = function(func, wait) { + var timeout, timestamp; + var later = function() { + var last = (new Date()) - timestamp; + + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + func(); + } + }; + + return function() { + timestamp = new Date(); + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + }; + var lastClientWidth = docElem.clientHeight; + var onResize = function() { + isVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth; + lastClientWidth = docElem.clientHeight; + if ( isVwDirty ) { + pf.fillImgs(); + } + }; + + on( window, "resize", debounce(onResize, 99 ) ); + on( document, "readystatechange", run ); + })(); + } + + pf.picturefill = picturefill; + //use this internally for easy monkey patching/performance testing + pf.fillImgs = picturefill; + pf.teardownRun = noop; + + /* expose methods for testing */ + picturefill._ = pf; + + window.picturefillCFG = { + pf: pf, + push: function(args) { + var name = args.shift(); + if (typeof pf[name] === "function") { + pf[name].apply(pf, args); + } else { + cfg[name] = args[0]; + if (alreadyRun) { + pf.fillImgs( { reselect: true } ); + } + } + } + }; + + while (setOptions && setOptions.length) { + window.picturefillCFG.push(setOptions.shift()); + } + + /* expose picturefill */ + window.picturefill = picturefill; + + /* expose picturefill */ + if ( typeof module === "object" && typeof module.exports === "object" ) { + // CommonJS, just export + module.exports = picturefill; + } else if ( typeof define === "function" && define.amd ) { + // AMD support + define( "picturefill", function() { return picturefill; } ); + } + + // IE8 evals this sync, so it must be the last thing we do + if ( !pf.supPicture ) { + types[ "image/webp" ] = detectTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==" ); + } + +} )( window, document ); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/gecko-picture/pf.gecko-picture.js b/Resources/ui/vendor_bower/picturefill/src/plugins/gecko-picture/pf.gecko-picture.js new file mode 100644 index 00000000..866e73bf --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/gecko-picture/pf.gecko-picture.js @@ -0,0 +1,68 @@ +/*! Gecko-Picture - v1.0 + * https://github.com/scottjehl/picturefill/tree/3.0/src/plugins/gecko-picture + * Firefox's early picture implementation (prior to FF41) is static and does + * not react to viewport changes. This tiny module fixes this. + */ +(function(window) { + /*jshint eqnull:true */ + var ua = navigator.userAgent; + + if ( window.HTMLPictureElement && ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 < 41) ) { + addEventListener("resize", (function() { + var timer; + + var dummySrc = document.createElement("source"); + + var fixRespimg = function(img) { + var source, sizes; + var picture = img.parentNode; + + if (picture.nodeName.toUpperCase() === "PICTURE") { + source = dummySrc.cloneNode(); + + picture.insertBefore(source, picture.firstElementChild); + setTimeout(function() { + picture.removeChild(source); + }); + } else if (!img._pfLastSize || img.offsetWidth > img._pfLastSize) { + img._pfLastSize = img.offsetWidth; + sizes = img.sizes; + img.sizes += ",100vw"; + setTimeout(function() { + img.sizes = sizes; + }); + } + }; + + var findPictureImgs = function() { + var i; + var imgs = document.querySelectorAll("picture > img, img[srcset][sizes]"); + for (i = 0; i < imgs.length; i++) { + fixRespimg(imgs[i]); + } + }; + var onResize = function() { + clearTimeout(timer); + timer = setTimeout(findPictureImgs, 99); + }; + var mq = window.matchMedia && matchMedia("(orientation: landscape)"); + var init = function() { + onResize(); + + if (mq && mq.addListener) { + mq.addListener(onResize); + } + }; + + dummySrc.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + + if (/^[c|i]|d$/.test(document.readyState || "")) { + init(); + } else { + document.addEventListener("DOMContentLoaded", init); + } + + return onResize; + })()); + } +})(window); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/intrinsic-dimension/pf.intrinsic.js b/Resources/ui/vendor_bower/picturefill/src/plugins/intrinsic-dimension/pf.intrinsic.js new file mode 100644 index 00000000..91247054 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/intrinsic-dimension/pf.intrinsic.js @@ -0,0 +1,147 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill, undefined ) { + "use strict"; + + var document = window.document; + var pf = picturefill._; + var knownWidths = {}; + var cfg = pf.cfg; + var curSrcProp = "currentSrc"; + var setSize = function(width, img, data) { + var curCandidate = data.curCan; + + if ( width ) { + img.setAttribute( "width", parseInt(width / curCandidate.res, 10) ); + } + }; + var loadBg = function(url, img, data) { + var bgImg, curCandidate, clear; + + if (url in knownWidths) { + setSize(knownWidths[url], img, data); + } else { + clear = function() { + data.pendingURLSize = null; + bgImg.onload = null; + bgImg.onerror = null; + img = null; + bgImg = null; + }; + + data.pendingURLSize = url; + curCandidate = data.curCan; + + if (curCandidate.w) { + setSize(curCandidate.w, img, data); + } + + bgImg = document.createElement("img"); + + bgImg.onload = function() { + knownWidths[url] = bgImg.naturalWidth || bgImg.width; + if (!knownWidths[url]) { + try { + document.body.appendChild(bgImg); + knownWidths[url] = bgImg.offsetWidth || bgImg.naturalWidth || bgImg.width; + document.body.removeChild(bgImg); + } catch (e) {} + } + if (url === img[curSrcProp]) { + setSize(knownWidths[url], img, data); + } + clear(); + }; + bgImg.onerror = clear; + + bgImg.src = url; + + if (bgImg && bgImg.complete) { + bgImg.onload(); + } + } + + }; + var reeval = (function() { + var running, timer; + + var run = function() { + var i, len, imgData; + var imgs = document.getElementsByTagName("img"); + var options = { elements: [] }; + + pf.setupRun(options); + + running = false; + clearTimeout(timer); + + for (i = 0, len = imgs.length; i < len; i++) { + imgData = imgs[i][pf.ns]; + + if (imgData && imgData.curCan) { + pf.setRes.res(imgData.curCan, imgData.curCan.set.sizes); + pf.setSize(imgs[i]); + } + } + + pf.teardownRun( options ); + }; + + return function() { + if (!running && cfg.addSize) { + running = true; + clearTimeout(timer); + timer = setTimeout(run); + } + }; + + })(); + + if ( !(curSrcProp in document.createElement("img")) ) { + curSrcProp = "src"; + } + + pf.setSize = function( img ) { + var url; + var data = img[ pf.ns ]; + var curCandidate = data.curCan; + + if ( data.dims === undefined ) { + data.dims = img.getAttribute( "height" ) && img.getAttribute( "width" ); + } + + if ( !cfg.addSize || !curCandidate || data.dims ) {return;} + url = pf.makeUrl(curCandidate.url); + + if (url === img[curSrcProp] && url !== data.pendingURLSize) { + loadBg(url, img, data); + } + }; + + if (window.addEventListener && !pf.supPicture) { + addEventListener("resize", reeval, false); + } + + if (!("addSize" in cfg)) { + cfg.addSize = true; + } else { + cfg.addSize = !!cfg.addSize; + } + + reeval(); +})); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/mutation/pf.mutation.js b/Resources/ui/vendor_bower/picturefill/src/plugins/mutation/pf.mutation.js new file mode 100644 index 00000000..b0174c99 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/mutation/pf.mutation.js @@ -0,0 +1,429 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var document = window.document; + var Element = window.Element; + var MutationObserver = window.MutationObserver; + var noop = function() {}; + var pfObserver = { + disconnect: noop, + take: noop, + observe: noop, + start: noop, + stop: noop, + connected: false + }; + var isReady = /^loade|^c|^i/.test(document.readyState || ""); + var pf = picturefill._; + pf.mutationSupport = false; + pf.observer = pfObserver; + if ( !Object.keys || !window.HTMLSourceElement || !document.addEventListener) { + return; + } + var matches, observer, allowConnect, addMutation; + + var observeProps = { src: 1, srcset: 1, sizes: 1, media: 1 }; + var attrFilter = Object.keys( observeProps ); + var config = { attributes: true, childList: true, subtree: true, attributeFilter: attrFilter }; + var elemProto = Element && Element.prototype; + var sup = {}; + var monkeyPatch = function( name, fn ) { + sup[ name ] = pf[ name ]; + pf[ name ] = fn; + }; + + if ( elemProto && !elemProto.matches ) { + elemProto.matches = elemProto.matchesSelector || elemProto.mozMatchesSelector || elemProto.webkitMatchesSelector || elemProto.msMatchesSelector; + } + + if ( elemProto && elemProto.matches ) { + matches = function( elem, sel ) { + return elem.matches( sel ); + }; + pf.mutationSupport = !!( Object.create && Object.defineProperties ); + } + + if ( !pf.mutationSupport ) { + return; + } + + pfObserver.observe = function() { + if ( allowConnect ) { + pfObserver.connected = true; + if ( observer ) { + observer.observe( document.documentElement, config ); + } + } + }; + + pfObserver.disconnect = function() { + pfObserver.connected = false; + if ( observer ) { + observer.disconnect(); + } + }; + + pfObserver.take = function() { + if ( observer ) { + pf.onMutations( observer.takeRecords() ); + } else if ( addMutation ) { + addMutation.take(); + } + }; + + pfObserver.start = function() { + allowConnect = true; + pfObserver.observe(); + }; + + pfObserver.stop = function() { + allowConnect = false; + pfObserver.disconnect(); + }; + + monkeyPatch( "setupRun", function() { + pfObserver.disconnect(); + return sup.setupRun.apply( this, arguments ); + }); + + monkeyPatch( "teardownRun", function() { + var ret = sup.setupRun.apply( this, arguments ); + pfObserver.observe(); + return ret; + }); + + monkeyPatch( "setSrc", function() { + var ret; + var wasConnected = pfObserver.connected; + pfObserver.disconnect(); + ret = sup.setSrc.apply( this, arguments ); + if ( wasConnected ) { + pfObserver.observe(); + } + return ret; + }); + + pf.onMutations = function( mutations ) { + var i, len; + var modifiedImgs = []; + + for (i = 0, len = mutations.length; i < len; i++) { + if ( isReady && mutations[i].type === "childList" ) { + pf.onSubtreeChange( mutations[i], modifiedImgs ); + } else if ( mutations[i].type === "attributes" ) { + pf.onAttrChange( mutations[i], modifiedImgs ); + } + } + + if ( modifiedImgs.length ) { + + pf.fillImgs({ + elements: modifiedImgs, + reevaluate: true + }); + } + }; + + pf.onSubtreeChange = function( mutations, imgs ) { + pf.findAddedMutations( mutations.addedNodes, imgs ); + pf.findRemovedMutations( mutations.removedNodes, mutations.target, imgs ); + }; + + pf.findAddedMutations = function( nodes, imgs ) { + var i, len, node, nodeName; + for ( i = 0, len = nodes.length; i < len; i++ ){ + node = nodes[i]; + if ( node.nodeType !== 1 ) {continue;} + + nodeName = node.nodeName.toUpperCase(); + + if ( nodeName === "PICTURE" ) { + pf.addToElements( node.getElementsByTagName( "img" )[0], imgs ); + } else if ( nodeName === "IMG" && matches( node, pf.selShort ) ){ + pf.addToElements( node, imgs ); + } else if ( nodeName === "SOURCE" ) { + pf.addImgForSource( node, node.parentNode, imgs ); + } else { + pf.addToElements( pf.qsa( node, pf.selShort ), imgs ); + } + } + }; + + pf.findRemovedMutations = function( nodes, target, imgs ) { + var i, len, node; + for ( i = 0, len = nodes.length; i < len; i++ ) { + node = nodes[i]; + if ( node.nodeType !== 1 ) {continue;} + if ( node.nodeName.toUpperCase() === "SOURCE" ) { + pf.addImgForSource( node, target, imgs ); + } + } + }; + + pf.addImgForSource = function( node, parent, imgs ) { + if ( parent && ( parent.nodeName || "" ).toUpperCase() !== "PICTURE" ) { + parent = parent.parentNode; + + if (!parent || ( parent.nodeName || "" ).toUpperCase() !== "PICTURE" ) { + parent = null; + } + } + + if (parent) { + pf.addToElements( parent.getElementsByTagName( "img" )[0], imgs ); + } + }; + + pf.addToElements = function( img, imgs ) { + var i, len; + if ( img ) { + if ( ("length" in img) && !img.nodeType ){ + for ( i = 0, len = img.length; i < len; i++ ) { + pf.addToElements( img[i], imgs ); + } + } else if ( img.parentNode && imgs.indexOf(img) === -1 ) { + imgs.push( img ); + } + } + }; + + pf.onAttrChange = function( mutation, modifiedImgs ) { + var nodeName; + var riData = mutation.target[ pf.ns ]; + + if ( !riData && + mutation.attributeName === "srcset" && + (nodeName = mutation.target.nodeName.toUpperCase()) === "IMG" ) { + pf.addToElements( mutation.target, modifiedImgs ); + } else if ( riData ) { + if (!nodeName) { + nodeName = mutation.target.nodeName.toUpperCase(); + } + + if ( nodeName === "IMG" ) { + if ( mutation.attributeName in riData ) { + riData[ mutation.attributeName ] = undefined; + } + pf.addToElements( mutation.target, modifiedImgs ); + } else if ( nodeName === "SOURCE" ) { + pf.addImgForSource( mutation.target, mutation.target.parentNode, modifiedImgs ); + } + } + }; + + if ( !pf.supPicture ) { + + if ( MutationObserver && !pf.testMutationEvents ) { + observer = new MutationObserver( pf.onMutations ); + } else { + + addMutation = (function() { + var running = false; + var mutations = []; + var setImmediate = window.setImmediate || window.setTimeout; + return function(mutation) { + if ( !running ) { + running = true; + if ( !addMutation.take ) { + addMutation.take = function() { + if ( mutations.length ) { + pf.onMutations( mutations ); + mutations = []; + } + running = false; + }; + } + setImmediate( addMutation.take ); + } + mutations.push( mutation ); + }; + })(); + + document.documentElement.addEventListener( "DOMNodeInserted", function( e ) { + if ( pfObserver.connected && isReady ) { + addMutation( { type: "childList", addedNodes: [ e.target ], removedNodes: [] } ); + } + }, true); + + document.documentElement.addEventListener( "DOMNodeRemoved", function( e ) { + + if ( pfObserver.connected && isReady && (e.target || {}).nodeName === "SOURCE") { + addMutation( { type: "childList", addedNodes: [], removedNodes: [ e.target ], target: e.target.parentNode } ); + } + }, true); + + document.documentElement.addEventListener( "DOMAttrModified", function( e ) { + if ( pfObserver.connected && observeProps[e.attrName] ) { + addMutation( { type: "attributes", target: e.target, attributeName: e.attrName } ); + } + }, true); + } + + if ( window.HTMLImageElement && Object.defineProperties ) { + + (function() { + + var image = document.createElement( "img" ); + var imgIdls = []; + var getImgAttr = image.getAttribute; + var setImgAttr = image.setAttribute; + var GETIMGATTRS = { + src: 1 + }; + + if ( pf.supSrcset && !pf.supSizes ) { + GETIMGATTRS.srcset = 1; + } + + Object.defineProperties(HTMLImageElement.prototype, { + getAttribute: { + value: function( attr ) { + var internal; + if ( GETIMGATTRS[ attr ] && (internal = this[ pf.ns ]) && ( internal[attr] !== undefined ) ) { + return internal[ attr ]; + } + return getImgAttr.apply( this, arguments ); + }, + writeable: true, + enumerable: true, + configurable: true + } + }); + + if (!pf.supSrcset) { + imgIdls.push("srcset"); + } + + if (!pf.supSizes) { + imgIdls.push("sizes"); + } + + imgIdls.forEach(function(idl) { + Object.defineProperty(HTMLImageElement.prototype, idl, { + set: function( value ) { + setImgAttr.call( this, idl, value ); + }, + get: function() { + return getImgAttr.call( this, idl ) || ""; + }, + enumerable: true, + configurable: true + }); + }); + + if (!("currentSrc" in image)) { + (function() { + var ascendingSort; + var updateCurSrc = function(elem, src) { + if (src == null) { + src = elem.src || ""; + } + + Object.defineProperty(elem, "pfCurrentSrc", { + value: src, + writable: true + }); + }; + var baseUpdateCurSrc = updateCurSrc; + + if (pf.supSrcset && window.devicePixelRatio) { + ascendingSort = function( a, b ) { + var aRes = a.d || a.w || a.res; + var bRes = b.d || b.w || b.res; + return aRes - bRes; + }; + + updateCurSrc = function(elem) { + var i, cands, length, ret; + var imageData = elem[ pf.ns ]; + + if ( imageData && imageData.supported && imageData.srcset && imageData.sets && (cands = pf.parseSet(imageData.sets[0])) && cands.sort) { + + cands.sort( ascendingSort ); + length = cands.length; + ret = cands[ length - 1 ]; + + for (i = 0; i < length; i++) { + if (cands[i].d >= window.devicePixelRatio) { + ret = cands[i]; + break; + } + } + + if (ret) { + ret = pf.makeUrl(ret.url); + } + } + baseUpdateCurSrc(elem, ret); + }; + } + + document.addEventListener("load", function(e) { + if (e.target.nodeName.toUpperCase() === "IMG") { + updateCurSrc(e.target); + } + }, true); + + Object.defineProperty(HTMLImageElement.prototype, "currentSrc", { + set: function() { + if (window.console && console.warn) { + console.warn("currentSrc can't be set on img element"); + } + }, + get: function() { + if (this.complete) { + updateCurSrc(this); + } + //IE is never complete if no src/srcset available + return (!this.src && !this.srcset) ? "" : this.pfCurrentSrc || ""; + }, + enumerable: true, + configurable: true + }); + })(); + } + + if (window.HTMLSourceElement && !("srcset" in document.createElement("source"))) { + + [ "srcset", "sizes" ].forEach(function(idl) { + Object.defineProperty(window.HTMLSourceElement.prototype, idl, { + set: function( value ) { + this.setAttribute( idl, value ); + }, + get: function() { + return this.getAttribute( idl ) || ""; + }, + enumerable: true, + configurable: true + }); + }); + } + + })(); + } + + pfObserver.start(); + } + if ( !isReady ) { + document.addEventListener("DOMContentLoaded", function() { + isReady = true; + }); + } +})); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/oldie/pf.oldie.js b/Resources/ui/vendor_bower/picturefill/src/plugins/oldie/pf.oldie.js new file mode 100644 index 00000000..2e9e5c93 --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/oldie/pf.oldie.js @@ -0,0 +1,37 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var pf = picturefill._; + var jQuery = window.jQuery || window.$; + + if (!document.querySelector) { + pf.qsa = function(context, sel) { + return jQuery(sel, context); + }; + + var anchor = document.createElement("a"); + + pf.makeUrl = function(src) { + jQuery.attr(anchor, "href", src + "" ); + return jQuery.prop(anchor, "href"); + }; + } + +})); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/print/pf.print.js b/Resources/ui/vendor_bower/picturefill/src/plugins/print/pf.print.js new file mode 100644 index 00000000..38d785cf --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/print/pf.print.js @@ -0,0 +1,63 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + if (!window.addEventListener) {return;} + var oldMatches, oldXQant, oldDPR; + var printMedia = window.matchMedia && matchMedia("print") || { matches: false }; + var pf = picturefill._; + var resetMedia = function(media) { + if (!media) {return true;} + if (media.indexOf("print") !== -1) {return true;} + if (oldMatches) {return oldMatches.apply(this, arguments);} + }; + var beforeprint = function() { + if (!printMedia.matches && !oldMatches) { + oldMatches = pf.matchesMedia; + pf.matchesMedia = resetMedia; + } + + if (!oldXQant && !oldDPR && pf.DPR < 1.5 && pf.cfg.xQuant < 1.5) { + oldXQant = pf.cfg.xQuant; + oldDPR = pf.DPR; + pf.DPR = 1.5; + pf.cfg.xQuant = 1.5; + } + picturefill({ reselect: true }); + }; + var afterprint = function() { + if (oldMatches) { + pf.matchesMedia = oldMatches; + oldMatches = false; + } + if (oldXQant) { + pf.cfg.xQuant = oldXQant; + oldXQant = false; + } + if (oldDPR) { + pf.DPR = oldDPR; + oldDPR = false; + } + picturefill({ reselect: true }); + }; + + if ("onbeforeprint" in window) { + addEventListener("beforeprint", beforeprint, false); + addEventListener("afterprint", afterprint, false); + } +})); diff --git a/Resources/ui/vendor_bower/picturefill/src/plugins/typesupport/pf.type.js b/Resources/ui/vendor_bower/picturefill/src/plugins/typesupport/pf.type.js new file mode 100644 index 00000000..6555154f --- /dev/null +++ b/Resources/ui/vendor_bower/picturefill/src/plugins/typesupport/pf.type.js @@ -0,0 +1,89 @@ +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function() { + if ( window.picturefill ) { + factory( window.picturefill ); + } + if (window.picturefill || intervalIndex > 9999) { + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( picturefill ) { + "use strict"; + + var pf = picturefill._; + var runningTests = 0; + var setTypeValue = function(types, value) { + var i; + for (i = 0; i < types.length; i++) { + pf.types[types[i]] = value; + } + }; + + if (pf.supPicture && !pf.cfg.uT) { + picturefill.testTypeSupport = function() {}; + return; + } + + pf.types["image/bmp"] = true; + pf.types["image/x-bmp"] = true; + + picturefill.testTypeSupport = function(types, url, width, useCanvas) { + if (typeof types === "string") { + types = types.split(/\s*\,*\s+/g); + } + var canvas; + var supports = "pending"; + var img = document.createElement("img"); + var onComplete = function() { + runningTests--; + setTypeValue(types, supports); + if (runningTests < 1) { + picturefill({ reselect: true }); + } + }; + + if (useCanvas) { + canvas = document.createElement("canvas"); + if (!canvas.getContext) { + setTypeValue(types, false); + return; + } + } + + img.onload = function() { + var ctx; + supports = true; + if (width) { + supports = img.width === width; + } + + if (useCanvas) { + ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + supports = ctx.getImageData(0, 0, 1, 1).data[3] === 0; + } + onComplete(); + }; + + img.onerror = function() { + supports = false; + onComplete(); + }; + runningTests++; + setTypeValue(types, "pending"); + img.src = url; + }; + + picturefill.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); + picturefill.testTypeSupport("image/vnd.ms-photo", "data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==", 1); + picturefill.testTypeSupport("video/vnd.mozilla.apng video/apng image/vnd.mozilla.apng video/x-apng video/x-mng video/x-png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==", false, true); + +})); diff --git a/Resources/views/Chooser/chooserShowFolder.html.twig b/Resources/views/Chooser/chooserShowFolder.html.twig index f0f24433..9cce92c2 100644 --- a/Resources/views/Chooser/chooserShowFolder.html.twig +++ b/Resources/views/Chooser/chooserShowFolder.html.twig @@ -196,6 +196,7 @@ {% if imageurl|lower|split('.')|last == 'svg' or 'image/svg' in media.contentType %} {% set imageurl = imageurl %} {% else %} + {% set imageuretina = imageurl | imagine_filter('media_list_thumbnail_retina') %} {% set imageurl = imageurl | imagine_filter('media_list_thumbnail') %} {% endif %} {% endif %} @@ -205,7 +206,7 @@
{% if imageurl %} - {{ media.name }} + {{ media.name }} {% else %} {% endif %} diff --git a/Resources/views/Default/layout.html.twig b/Resources/views/Default/layout.html.twig index 9c39151e..6f031d1d 100644 --- a/Resources/views/Default/layout.html.twig +++ b/Resources/views/Default/layout.html.twig @@ -5,6 +5,7 @@ {% javascripts "@KunstmaanMediaBundle/Resources/ui/vendor_bower/plupload/js/plupload.full.min.js" + "@KunstmaanMediaBundle/Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js" "@KunstmaanMediaBundle/Resources/ui/js/_bulk-upload.js" "@KunstmaanMediaBundle/Resources/ui/js/_dnd-upload.js" "@KunstmaanMediaBundle/Resources/ui/js/app.js" diff --git a/Resources/views/Folder/show.html.twig b/Resources/views/Folder/show.html.twig index cda60210..f32c0c3d 100644 --- a/Resources/views/Folder/show.html.twig +++ b/Resources/views/Folder/show.html.twig @@ -196,6 +196,7 @@ {% if imageurl|lower|split('.')|last == 'svg' or 'image/svg' in media.contentType %} {% set imageurl = imageurl %} {% else %} + {% set imageurlretina = imageurl | imagine_filter('media_list_thumbnail_retina') %} {% set imageurl = imageurl | imagine_filter('media_list_thumbnail') %} {% endif %} {% endif %} @@ -204,7 +205,7 @@
{% if imageurl %} - {{ media.name }} + {{ media.name }} {% else %} {% endif %} @@ -289,6 +290,7 @@ {% javascripts "@KunstmaanMediaBundle/Resources/ui/vendor_bower/plupload/js/plupload.full.min.js" + "@KunstmaanMediaBundle/Resources/ui/vendor_bower/picturefill/dist/picturefill.min.js" "@KunstmaanMediaBundle/Resources/ui/js/_bulk-upload.js" "@KunstmaanMediaBundle/Resources/ui/js/_dnd-upload.js" "@KunstmaanMediaBundle/Resources/ui/js/app.js" diff --git a/Resources/views/Form/formWidgets.html.twig b/Resources/views/Form/formWidgets.html.twig index 39abd6d9..61a422e9 100644 --- a/Resources/views/Form/formWidgets.html.twig +++ b/Resources/views/Form/formWidgets.html.twig @@ -64,11 +64,12 @@ {% if imageurl|lower|split('.')|last == 'svg' or 'image/svg' in media.contentType %} {% set imageurl = imageurl %} {% else %} + {% set imageurlretina = imageurl | imagine_filter('media_list_thumbnail_retina') %} {% set imageurl = imageurl | imagine_filter('media_list_thumbnail') %} {% endif %} {% endif %} {% if imageurl %} - {{ media.name }} + {{ media.name }}
{{ media.name }}
diff --git a/bower.json b/bower.json index ad34466a..865cd666 100644 --- a/bower.json +++ b/bower.json @@ -2,6 +2,7 @@ "name": "KunstmaanCMSMediaBundle", "version": "1.0.0", "dependencies": { - "plupload": "~2.1" + "plupload": "~2.1", + "picturefill": "~3.0.1" } }