From 126e569e4a45607988539355eab3bcf0f5814c1d Mon Sep 17 00:00:00 2001 From: guiastrennec Date: Mon, 16 Mar 2020 22:26:17 +0100 Subject: [PATCH 1/5] Fix for ggplot 3.3.0 --- data/xpdb_ex_pk.rda | Bin 117588 -> 117744 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/xpdb_ex_pk.rda b/data/xpdb_ex_pk.rda index 0968195ba37a962382cf569b2366a113a2b5ddbd..eb5405bc4345c3c2eb823d5e8189e9a2efce4764 100755 GIT binary patch literal 117744 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

Make the changes to the code on your fork.

  • Use the tidyverse coding style.
  • -
  • Any new function should have Roxygen documentation. Internal functions should contain #' @keywords internal. Add examples to new functions. Make sure to update the documentation with devtools::document() before submitting the pull request.
  • +
  • Any new function should have Roxygen documentation. Internal functions should contain #' @keywords internal. Add examples to new functions. Make sure to update the documentation with devtools::document() before submitting the pull request.
  • Tests should be added under tests/testthat/ to ensure for proper code coverage.
  • New plots should be created using the generic xplot_scatter(), xplot_distrib() or xplot_qq(). Check for example the code of R/plot_gof.R to see how it should be done.
  • @@ -207,7 +207,7 @@

  • Add a brief description of your contribution to NEWS.md using bullets. Make sure to list it under the most recent xpose version and to add your name as (@<your_github_username>). e.g. `* Added support for multiple pages plots (@guiastrennec). In addition, if your pull request addresses one or several issues, please reference them using the # sign e.g.* Added support for multiple pages plots (@guiastrennec, #3)`
-
  • Run devtools::check() on your fork and ensure the absence of any errors, warnings and notes.

  • +
  • Run devtools::check() on your fork and ensure the absence of any errors, warnings and notes.

  • Create a pull request to the dev branch of the UUPharmacometrics/xpose repository.

      diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index c88cd31c..59590fb2 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -78,7 +78,7 @@ xpose - 0.4.7 + 0.4.8 diff --git a/docs/articles/about.html b/docs/articles/about.html index a3cb75b7..c0853107 100644 --- a/docs/articles/about.html +++ b/docs/articles/about.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -127,7 +127,7 @@

      About xpose

      Benjamin Guiastrennec

      -

      04 February, 2020

      +

      17 March, 2020

      Source: vignettes/about.Rmd diff --git a/docs/articles/access_xpdb_data.html b/docs/articles/access_xpdb_data.html index 11bd6848..661ad60f 100644 --- a/docs/articles/access_xpdb_data.html +++ b/docs/articles/access_xpdb_data.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -127,7 +127,7 @@

      Access the xpdb data

      Benjamin Guiastrennec

      -

      04 February, 2020

      +

      17 March, 2020

      Source: vignettes/access_xpdb_data.Rmd diff --git a/docs/articles/customize_plots.html b/docs/articles/customize_plots.html index 417d78d6..ddf32add 100644 --- a/docs/articles/customize_plots.html +++ b/docs/articles/customize_plots.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -127,7 +127,7 @@

      Customize plots

      Benjamin Guiastrennec

      -

      04 February, 2020

      +

      17 March, 2020

      Source: vignettes/customize_plots.Rmd diff --git a/docs/articles/faq.html b/docs/articles/faq.html index 908c0151..bc6ffb8f 100644 --- a/docs/articles/faq.html +++ b/docs/articles/faq.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -127,7 +127,7 @@

      Frequently Asked Questions

      Benjamin Guiastrennec

      -

      04 February, 2020

      +

      17 March, 2020

      Source: vignettes/faq.Rmd @@ -152,7 +152,7 @@

      From github (current development version)

      1. Make sure you have the devtools package installed
      2. -
      3. Install/update xpose with the following command:
        devtools::install_github('UUPharmacometrics/xpose') +
      4. Install/update xpose with the following command:
        devtools::install_github('UUPharmacometrics/xpose')
      diff --git a/docs/articles/import_model_outputs.html b/docs/articles/import_model_outputs.html index 59ce9582..c237c87e 100644 --- a/docs/articles/import_model_outputs.html +++ b/docs/articles/import_model_outputs.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -127,7 +127,7 @@

      Import model outputs

      Benjamin Guiastrennec

      -

      04 February, 2020

      +

      17 March, 2020

      Source: vignettes/import_model_outputs.Rmd diff --git a/docs/articles/index.html b/docs/articles/index.html index 67222102..0df977c4 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -78,7 +78,7 @@ xpose - 0.4.7 + 0.4.8 diff --git a/docs/articles/interactive_plots.html b/docs/articles/interactive_plots.html index 78891667..f427bb96 100644 --- a/docs/articles/interactive_plots.html +++ b/docs/articles/interactive_plots.html @@ -39,7 +39,7 @@ xpose - 0.4.7 + 0.4.8 @@ -121,15 +121,15 @@ - - -
      + + +

      @@ -185,8 +185,8 @@

      xpdb_ex_pk %>% 
         eta_distrib(title = 'Eta distribution') %>% 
         plotly::ggplotly()
      -
      - +
      +

      @@ -195,8 +195,8 @@

      vpc_data() %>% vpc(title = 'Visual predictive checks', type = 'alpr') %>% plotly::ggplotly()

      -
      - +
      +
      diff --git a/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/css/crosstalk.css b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/css/crosstalk.css new file mode 100644 index 00000000..46befd2e --- /dev/null +++ b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/css/crosstalk.css @@ -0,0 +1,27 @@ +/* Adjust margins outwards, so column contents line up with the edges of the + parent of container-fluid. */ +.container-fluid.crosstalk-bscols { + margin-left: -30px; + margin-right: -30px; + white-space: normal; +} + +/* But don't adjust the margins outwards if we're directly under the body, + i.e. we were the top-level of something at the console. */ +body > .container-fluid.crosstalk-bscols { + margin-left: auto; + margin-right: auto; +} + +.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: inline-block; + padding-right: 12px; + vertical-align: top; +} + +@media only screen and (max-width:480px) { + .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column { + display: block; + padding-right: inherit; + } +} diff --git a/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js new file mode 100644 index 00000000..fd9eb53d --- /dev/null +++ b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js @@ -0,0 +1,1474 @@ +(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o b) { + return 1; + } +} + +/** + * @private + */ + +var FilterSet = function () { + function FilterSet() { + _classCallCheck(this, FilterSet); + + this.reset(); + } + + _createClass(FilterSet, [{ + key: "reset", + value: function reset() { + // Key: handle ID, Value: array of selected keys, or null + this._handles = {}; + // Key: key string, Value: count of handles that include it + this._keys = {}; + this._value = null; + this._activeHandles = 0; + } + }, { + key: "update", + value: function update(handleId, keys) { + if (keys !== null) { + keys = keys.slice(0); // clone before sorting + keys.sort(naturalComparator); + } + + var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys), + added = _diffSortedLists.added, + removed = _diffSortedLists.removed; + + this._handles[handleId] = keys; + + for (var i = 0; i < added.length; i++) { + this._keys[added[i]] = (this._keys[added[i]] || 0) + 1; + } + for (var _i = 0; _i < removed.length; _i++) { + this._keys[removed[_i]]--; + } + + this._updateValue(keys); + } + + /** + * @param {string[]} keys Sorted array of strings that indicate + * a superset of possible keys. + * @private + */ + + }, { + key: "_updateValue", + value: function _updateValue() { + var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys; + + var handleCount = Object.keys(this._handles).length; + if (handleCount === 0) { + this._value = null; + } else { + this._value = []; + for (var i = 0; i < keys.length; i++) { + var count = this._keys[keys[i]]; + if (count === handleCount) { + this._value.push(keys[i]); + } + } + } + } + }, { + key: "clear", + value: function clear(handleId) { + if (typeof this._handles[handleId] === "undefined") { + return; + } + + var keys = this._handles[handleId]; + if (!keys) { + keys = []; + } + + for (var i = 0; i < keys.length; i++) { + this._keys[keys[i]]--; + } + delete this._handles[handleId]; + + this._updateValue(); + } + }, { + key: "value", + get: function get() { + return this._value; + } + }, { + key: "_allKeys", + get: function get() { + var allKeys = Object.keys(this._keys); + allKeys.sort(naturalComparator); + return allKeys; + } + }]); + + return FilterSet; +}(); + +exports.default = FilterSet; + +},{"./util":11}],4:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.default = group; + +var _var2 = require("./var"); + +var _var3 = _interopRequireDefault(_var2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +// Use a global so that multiple copies of crosstalk.js can be loaded and still +// have groups behave as singletons across all copies. +global.__crosstalk_groups = global.__crosstalk_groups || {}; +var groups = global.__crosstalk_groups; + +function group(groupName) { + if (groupName && typeof groupName === "string") { + if (!groups.hasOwnProperty(groupName)) { + groups[groupName] = new Group(groupName); + } + return groups[groupName]; + } else if ((typeof groupName === "undefined" ? "undefined" : _typeof(groupName)) === "object" && groupName._vars && groupName.var) { + // Appears to already be a group object + return groupName; + } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === "string") { + return group(groupName[0]); + } else { + throw new Error("Invalid groupName argument"); + } +} + +var Group = function () { + function Group(name) { + _classCallCheck(this, Group); + + this.name = name; + this._vars = {}; + } + + _createClass(Group, [{ + key: "var", + value: function _var(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name); + return this._vars[name]; + } + }, { + key: "has", + value: function has(name) { + if (!name || typeof name !== "string") { + throw new Error("Invalid var name"); + } + + return this._vars.hasOwnProperty(name); + } + }]); + + return Group; +}(); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./var":12}],5:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _selection = require("./selection"); + +var _filter = require("./filter"); + +var _input = require("./input"); + +require("./input_selectize"); + +require("./input_checkboxgroup"); + +require("./input_slider"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultGroup = (0, _group2.default)("default"); + +function var_(name) { + return defaultGroup.var(name); +} + +function has(name) { + return defaultGroup.has(name); +} + +if (global.Shiny) { + global.Shiny.addCustomMessageHandler("update-client-value", function (message) { + if (typeof message.group === "string") { + (0, _group2.default)(message.group).var(message.name).set(message.value); + } else { + var_(message.name).set(message.value); + } + }); +} + +var crosstalk = { + group: _group2.default, + var: var_, + has: has, + SelectionHandle: _selection.SelectionHandle, + FilterHandle: _filter.FilterHandle, + bind: _input.bind +}; + +/** + * @namespace crosstalk + */ +exports.default = crosstalk; + +global.crosstalk = crosstalk; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./group":4,"./input":6,"./input_checkboxgroup":7,"./input_selectize":8,"./input_slider":9,"./selection":10}],6:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.register = register; +exports.bind = bind; +var $ = global.jQuery; + +var bindings = {}; + +function register(reg) { + bindings[reg.className] = reg; + if (global.document && global.document.readyState !== "complete") { + $(function () { + bind(); + }); + } else if (global.document) { + setTimeout(bind, 100); + } +} + +function bind() { + Object.keys(bindings).forEach(function (className) { + var binding = bindings[className]; + $("." + binding.className).not(".crosstalk-input-bound").each(function (i, el) { + bindInstance(binding, el); + }); + }); +} + +// Escape jQuery identifier +function $escape(val) { + return val.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); +} + +function bindEl(el) { + var $el = $(el); + Object.keys(bindings).forEach(function (className) { + if ($el.hasClass(className) && !$el.hasClass("crosstalk-input-bound")) { + var binding = bindings[className]; + bindInstance(binding, el); + } + }); +} + +function bindInstance(binding, el) { + var jsonEl = $(el).find("script[type='application/json'][data-for='" + $escape(el.id) + "']"); + var data = JSON.parse(jsonEl[0].innerText); + + var instance = binding.factory(el, data); + $(el).data("crosstalk-instance", instance); + $(el).addClass("crosstalk-input-bound"); +} + +if (global.Shiny) { + var inputBinding = new global.Shiny.InputBinding(); + var _$ = global.jQuery; + _$.extend(inputBinding, { + find: function find(scope) { + return _$(scope).find(".crosstalk-input"); + }, + initialize: function initialize(el) { + if (!_$(el).hasClass("crosstalk-input-bound")) { + bindEl(el); + } + }, + getId: function getId(el) { + return el.id; + }, + getValue: function getValue(el) {}, + setValue: function setValue(el, value) {}, + receiveMessage: function receiveMessage(el, data) {}, + subscribe: function subscribe(el, callback) { + _$(el).data("crosstalk-instance").resume(); + }, + unsubscribe: function unsubscribe(el) { + _$(el).data("crosstalk-instance").suspend(); + } + }); + global.Shiny.inputBindings.register(inputBinding, "crosstalk.inputBinding"); +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],7:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-checkboxgroup", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + var $el = $(el); + $el.on("change", "input[type='checkbox']", function () { + var checked = $el.find("input[type='checkbox']:checked"); + if (checked.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + checked.each(function () { + data.map[this.value].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],8:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; + +input.register({ + className: "crosstalk-input-select", + + factory: function factory(el, data) { + /* + * items: {value: [...], label: [...]} + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + + var first = [{ value: "", label: "(All)" }]; + var items = util.dataframeToD3(data.items); + var opts = { + options: first.concat(items), + valueField: "value", + labelField: "label", + searchField: "label" + }; + + var select = $(el).find("select")[0]; + + var selectize = $(select).selectize(opts)[0].selectize; + + var ctHandle = new _filter.FilterHandle(data.group); + + var lastKnownKeys = void 0; + selectize.on("change", function () { + if (selectize.items.length === 0) { + lastKnownKeys = null; + ctHandle.clear(); + } else { + var keys = {}; + selectize.items.forEach(function (group) { + data.map[group].forEach(function (key) { + keys[key] = true; + }); + }); + var keyArray = Object.keys(keys); + keyArray.sort(); + lastKnownKeys = keyArray; + ctHandle.set(keyArray); + } + }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6,"./util":11}],9:[function(require,module,exports){ +(function (global){ +"use strict"; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _input = require("./input"); + +var input = _interopRequireWildcard(_input); + +var _filter = require("./filter"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +var $ = global.jQuery; +var strftime = global.strftime; + +input.register({ + className: "crosstalk-input-slider", + + factory: function factory(el, data) { + /* + * map: {"groupA": ["keyA", "keyB", ...], ...} + * group: "ct-groupname" + */ + var ctHandle = new _filter.FilterHandle(data.group); + + var opts = {}; + var $el = $(el).find("input"); + var dataType = $el.data("data-type"); + var timeFormat = $el.data("time-format"); + var round = $el.data("round"); + var timeFormatter = void 0; + + // Set up formatting functions + if (dataType === "date") { + timeFormatter = strftime.utc(); + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "datetime") { + var timezone = $el.data("timezone"); + if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime; + + opts.prettify = function (num) { + return timeFormatter(timeFormat, new Date(num)); + }; + } else if (dataType === "number") { + if (typeof round !== "undefined") opts.prettify = function (num) { + var factor = Math.pow(10, round); + return Math.round(num * factor) / factor; + }; + } + + $el.ionRangeSlider(opts); + + function getValue() { + var result = $el.data("ionRangeSlider").result; + + // Function for converting numeric value from slider to appropriate type. + var convert = void 0; + var dataType = $el.data("data-type"); + if (dataType === "date") { + convert = function convert(val) { + return formatDateUTC(new Date(+val)); + }; + } else if (dataType === "datetime") { + convert = function convert(val) { + // Convert ms to s + return +val / 1000; + }; + } else { + convert = function convert(val) { + return +val; + }; + } + + if ($el.data("ionRangeSlider").options.type === "double") { + return [convert(result.from), convert(result.to)]; + } else { + return convert(result.from); + } + } + + var lastKnownKeys = null; + + $el.on("change.crosstalkSliderInput", function (event) { + if (!$el.data("updating") && !$el.data("animating")) { + var _getValue = getValue(), + _getValue2 = _slicedToArray(_getValue, 2), + from = _getValue2[0], + to = _getValue2[1]; + + var keys = []; + for (var i = 0; i < data.values.length; i++) { + var val = data.values[i]; + if (val >= from && val <= to) { + keys.push(data.keys[i]); + } + } + keys.sort(); + ctHandle.set(keys); + lastKnownKeys = keys; + } + }); + + // let $el = $(el); + // $el.on("change", "input[type="checkbox"]", function() { + // let checked = $el.find("input[type="checkbox"]:checked"); + // if (checked.length === 0) { + // ctHandle.clear(); + // } else { + // let keys = {}; + // checked.each(function() { + // data.map[this.value].forEach(function(key) { + // keys[key] = true; + // }); + // }); + // let keyArray = Object.keys(keys); + // keyArray.sort(); + // ctHandle.set(keyArray); + // } + // }); + + return { + suspend: function suspend() { + ctHandle.clear(); + }, + resume: function resume() { + if (lastKnownKeys) ctHandle.set(lastKnownKeys); + } + }; + } +}); + +// Convert a number to a string with leading zeros +function padZeros(n, digits) { + var str = n.toString(); + while (str.length < digits) { + str = "0" + str; + }return str; +} + +// Given a Date object, return a string in yyyy-mm-dd format, using the +// UTC date. This may be a day off from the date in the local time zone. +function formatDateUTC(date) { + if (date instanceof Date) { + return date.getUTCFullYear() + "-" + padZeros(date.getUTCMonth() + 1, 2) + "-" + padZeros(date.getUTCDate(), 2); + } else { + return null; + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./filter":2,"./input":6}],10:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SelectionHandle = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +var _group = require("./group"); + +var _group2 = _interopRequireDefault(_group); + +var _util = require("./util"); + +var util = _interopRequireWildcard(_util); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Use this class to read and write (and listen for changes to) the selection + * for a Crosstalk group. This is intended to be used for linked brushing. + * + * If two (or more) `SelectionHandle` instances in the same webpage share the + * same group name, they will share the same state. Setting the selection using + * one `SelectionHandle` instance will result in the `value` property instantly + * changing across the others, and `"change"` event listeners on all instances + * (including the one that initiated the sending) will fire. + * + * @param {string} [group] - The name of the Crosstalk group, or if none, + * null or undefined (or any other falsy value). This can be changed later + * via the [SelectionHandle#setGroup](#setGroup) method. + * @param {Object} [extraInfo] - An object whose properties will be copied to + * the event object whenever an event is emitted. + */ +var SelectionHandle = exports.SelectionHandle = function () { + function SelectionHandle() { + var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + + _classCallCheck(this, SelectionHandle); + + this._eventRelay = new _events2.default(); + this._emitter = new util.SubscriptionTracker(this._eventRelay); + + // Name of the group we're currently tracking, if any. Can change over time. + this._group = null; + // The Var we're currently tracking, if any. Can change over time. + this._var = null; + // The event handler subscription we currently have on var.on("change"). + this._varOnChangeSub = null; + + this._extraInfo = util.extend({ sender: this }, extraInfo); + + this.setGroup(group); + } + + /** + * Changes the Crosstalk group membership of this SelectionHandle. The group + * being switched away from (if any) will not have its selection value + * modified as a result of calling `setGroup`, even if this handle was the + * most recent handle to set the selection of the group. + * + * The group being switched to (if any) will also not have its selection value + * modified as a result of calling `setGroup`. If you want to set the + * selection value of the new group, call `set` explicitly. + * + * @param {string} group - The name of the Crosstalk group, or null (or + * undefined) to clear the group. + */ + + + _createClass(SelectionHandle, [{ + key: "setGroup", + value: function setGroup(group) { + var _this = this; + + // If group is unchanged, do nothing + if (this._group === group) return; + // Treat null, undefined, and other falsy values the same + if (!this._group && !group) return; + + if (this._var) { + this._var.off("change", this._varOnChangeSub); + this._var = null; + this._varOnChangeSub = null; + } + + this._group = group; + + if (group) { + this._var = (0, _group2.default)(group).var("selection"); + var sub = this._var.on("change", function (e) { + _this._eventRelay.trigger("change", e, _this); + }); + this._varOnChangeSub = sub; + } + } + + /** + * Retrieves the current selection for the group represented by this + * `SelectionHandle`. + * + * - If no selection is active, then this value will be falsy. + * - If a selection is active, but no data points are selected, then this + * value will be an empty array. + * - If a selection is active, and data points are selected, then the keys + * of the selected data points will be present in the array. + */ + + }, { + key: "_mergeExtraInfo", + + + /** + * Combines the given `extraInfo` (if any) with the handle's default + * `_extraInfo` (if any). + * @private + */ + value: function _mergeExtraInfo(extraInfo) { + // Important incidental effect: shallow clone is returned + return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see + * {@link SelectionHandle#value}). + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any options that were + * passed into the `SelectionHandle` constructor). + */ + + }, { + key: "set", + value: function set(selectedKeys, extraInfo) { + if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo)); + } + + /** + * Overwrites the current selection for the group, and raises the `"change"` + * event among all of the group's '`SelectionHandle` instances (including + * this one). + * + * @fires SelectionHandle#change + * @param {Object} [extraInfo] - Extra properties to be included on the event + * object that's passed to listeners (in addition to any that were passed + * into the `SelectionHandle` constructor). + */ + + }, { + key: "clear", + value: function clear(extraInfo) { + if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo)); + } + + /** + * Subscribes to events on this `SelectionHandle`. + * + * @param {string} eventType - Indicates the type of events to listen to. + * Currently, only `"change"` is supported. + * @param {SelectionHandle~listener} listener - The callback function that + * will be invoked when the event occurs. + * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel + * this subscription. + */ + + }, { + key: "on", + value: function on(eventType, listener) { + return this._emitter.on(eventType, listener); + } + + /** + * Cancels event subscriptions created by {@link SelectionHandle#on}. + * + * @param {string} eventType - The type of event to unsubscribe. + * @param {string|SelectionHandle~listener} listener - Either the callback + * function previously passed into {@link SelectionHandle#on}, or the + * string that was returned from {@link SelectionHandle#on}. + */ + + }, { + key: "off", + value: function off(eventType, listener) { + return this._emitter.off(eventType, listener); + } + + /** + * Shuts down the `SelectionHandle` object. + * + * Removes all event listeners that were added through this handle. + */ + + }, { + key: "close", + value: function close() { + this._emitter.removeAllListeners(); + this.setGroup(null); + } + }, { + key: "value", + get: function get() { + return this._var ? this._var.get() : null; + } + }]); + + return SelectionHandle; +}(); + +/** + * @callback SelectionHandle~listener + * @param {Object} event - An object containing details of the event. For + * `"change"` events, this includes the properties `value` (the new + * value of the selection, or `undefined` if no selection is active), + * `oldValue` (the previous value of the selection), and `sender` (the + * `SelectionHandle` instance that made the change). + */ + +/** + * @event SelectionHandle#change + * @type {object} + * @property {object} value - The new value of the selection, or `undefined` + * if no selection is active. + * @property {object} oldValue - The previous value of the selection. + * @property {SelectionHandle} sender - The `SelectionHandle` instance that + * changed the value. + */ + +},{"./events":1,"./group":4,"./util":11}],11:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.extend = extend; +exports.checkSorted = checkSorted; +exports.diffSortedLists = diffSortedLists; +exports.dataframeToD3 = dataframeToD3; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function extend(target) { + for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + for (var i = 0; i < sources.length; i++) { + var src = sources[i]; + if (typeof src === "undefined" || src === null) continue; + + for (var key in src) { + if (src.hasOwnProperty(key)) { + target[key] = src[key]; + } + } + } + return target; +} + +function checkSorted(list) { + for (var i = 1; i < list.length; i++) { + if (list[i] <= list[i - 1]) { + throw new Error("List is not sorted or contains duplicate"); + } + } +} + +function diffSortedLists(a, b) { + var i_a = 0; + var i_b = 0; + + if (!a) a = []; + if (!b) b = []; + + var a_only = []; + var b_only = []; + + checkSorted(a); + checkSorted(b); + + while (i_a < a.length && i_b < b.length) { + if (a[i_a] === b[i_b]) { + i_a++; + i_b++; + } else if (a[i_a] < b[i_b]) { + a_only.push(a[i_a++]); + } else { + b_only.push(b[i_b++]); + } + } + + if (i_a < a.length) a_only = a_only.concat(a.slice(i_a)); + if (i_b < b.length) b_only = b_only.concat(b.slice(i_b)); + return { + removed: a_only, + added: b_only + }; +} + +// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... } +// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ] +function dataframeToD3(df) { + var names = []; + var length = void 0; + for (var name in df) { + if (df.hasOwnProperty(name)) names.push(name); + if (_typeof(df[name]) !== "object" || typeof df[name].length === "undefined") { + throw new Error("All fields must be arrays"); + } else if (typeof length !== "undefined" && length !== df[name].length) { + throw new Error("All fields must be arrays of the same length"); + } + length = df[name].length; + } + var results = []; + var item = void 0; + for (var row = 0; row < length; row++) { + item = {}; + for (var col = 0; col < names.length; col++) { + item[names[col]] = df[names[col]][row]; + } + results.push(item); + } + return results; +} + +/** + * Keeps track of all event listener additions/removals and lets all active + * listeners be removed with a single operation. + * + * @private + */ + +var SubscriptionTracker = exports.SubscriptionTracker = function () { + function SubscriptionTracker(emitter) { + _classCallCheck(this, SubscriptionTracker); + + this._emitter = emitter; + this._subs = {}; + } + + _createClass(SubscriptionTracker, [{ + key: "on", + value: function on(eventType, listener) { + var sub = this._emitter.on(eventType, listener); + this._subs[sub] = eventType; + return sub; + } + }, { + key: "off", + value: function off(eventType, listener) { + var sub = this._emitter.off(eventType, listener); + if (sub) { + delete this._subs[sub]; + } + return sub; + } + }, { + key: "removeAllListeners", + value: function removeAllListeners() { + var _this = this; + + var current_subs = this._subs; + this._subs = {}; + Object.keys(current_subs).forEach(function (sub) { + _this._emitter.off(current_subs[sub], sub); + }); + } + }]); + + return SubscriptionTracker; +}(); + +},{}],12:[function(require,module,exports){ +(function (global){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _events = require("./events"); + +var _events2 = _interopRequireDefault(_events); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Var = function () { + function Var(group, name, /*optional*/value) { + _classCallCheck(this, Var); + + this._group = group; + this._name = name; + this._value = value; + this._events = new _events2.default(); + } + + _createClass(Var, [{ + key: "get", + value: function get() { + return this._value; + } + }, { + key: "set", + value: function set(value, /*optional*/event) { + if (this._value === value) { + // Do nothing; the value hasn't changed + return; + } + var oldValue = this._value; + this._value = value; + // Alert JavaScript listeners that the value has changed + var evt = {}; + if (event && (typeof event === "undefined" ? "undefined" : _typeof(event)) === "object") { + for (var k in event) { + if (event.hasOwnProperty(k)) evt[k] = event[k]; + } + } + evt.oldValue = oldValue; + evt.value = value; + this._events.trigger("change", evt, this); + + // TODO: Make this extensible, to let arbitrary back-ends know that + // something has changed + if (global.Shiny && global.Shiny.onInputChange) { + global.Shiny.onInputChange(".clientValue-" + (this._group.name !== null ? this._group.name + "-" : "") + this._name, typeof value === "undefined" ? null : value); + } + } + }, { + key: "on", + value: function on(eventType, listener) { + return this._events.on(eventType, listener); + } + }, { + key: "off", + value: function off(eventType, listener) { + return this._events.off(eventType, listener); + } + }]); + + return Var; +}(); + +exports.default = Var; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./events":1}]},{},[5]) +//# sourceMappingURL=crosstalk.js.map diff --git a/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js.map b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js.map new file mode 100644 index 00000000..cff94f08 --- /dev/null +++ b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js.map @@ -0,0 +1,37 @@ +{ + "version": 3, + "sources": [ + "node_modules/browser-pack/_prelude.js", + "javascript/src/events.js", + "javascript/src/filter.js", + "javascript/src/filterset.js", + "javascript/src/group.js", + "javascript/src/index.js", + "javascript/src/input.js", + "javascript/src/input_checkboxgroup.js", + "javascript/src/input_selectize.js", + "javascript/src/input_slider.js", + "javascript/src/selection.js", + "javascript/src/util.js", + "javascript/src/var.js" + ], + "names": [], + "mappings": "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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n", + "import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n", + "import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n", + "import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n", + "let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n", + "import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n", + "import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n", + "export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n", + "import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n" + ] +} \ No newline at end of file diff --git a/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.min.js b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.min.js new file mode 100644 index 00000000..b7ec0ac9 --- /dev/null +++ b/docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.min.js @@ -0,0 +1,2 @@ +!function o(u,a,l){function s(n,e){if(!a[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(f)return f(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=a[n]={exports:{}};u[n][0].call(i.exports,function(e){var t=u[n][1][e];return s(t||e)},i,i.exports,o,u,a,l)}return a[n].exports}for(var f="function"==typeof require&&require,e=0;e?@[\\\]^`{|}~])/g,"\\$1")+"']"),r=JSON.parse(n[0].innerText),i=e.factory(t,r);o(t).data("crosstalk-instance",i),o(t).addClass("crosstalk-input-bound")}if(t.Shiny){var e=new t.Shiny.InputBinding,u=t.jQuery;u.extend(e,{find:function(e){return u(e).find(".crosstalk-input")},initialize:function(e){var t,n;u(e).hasClass("crosstalk-input-bound")||(n=o(t=e),Object.keys(r).forEach(function(e){n.hasClass(e)&&!n.hasClass("crosstalk-input-bound")&&i(r[e],t)}))},getId:function(e){return e.id},getValue:function(e){},setValue:function(e,t){},receiveMessage:function(e,t){},subscribe:function(e,t){u(e).data("crosstalk-instance").resume()},unsubscribe:function(e){u(e).data("crosstalk-instance").suspend()}}),t.Shiny.inputBindings.register(e,"crosstalk.inputBinding")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],7:[function(r,e,t){(function(e){"use strict";var t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(r("./input")),n=r("./filter");var a=e.jQuery;t.register({className:"crosstalk-input-checkboxgroup",factory:function(e,r){var i=new n.FilterHandle(r.group),o=void 0,u=a(e);return u.on("change","input[type='checkbox']",function(){var e=u.find("input[type='checkbox']:checked");if(0===e.length)o=null,i.clear();else{var t={};e.each(function(){r.map[this.value].forEach(function(e){t[e]=!0})});var n=Object.keys(t);n.sort(),o=n,i.set(n)}}),{suspend:function(){i.clear()},resume:function(){o&&i.set(o)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6}],8:[function(r,e,t){(function(e){"use strict";var t=n(r("./input")),l=n(r("./util")),s=r("./filter");function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}var f=e.jQuery;t.register({className:"crosstalk-input-select",factory:function(e,n){var t=l.dataframeToD3(n.items),r={options:[{value:"",label:"(All)"}].concat(t),valueField:"value",labelField:"label",searchField:"label"},i=f(e).find("select")[0],o=f(i).selectize(r)[0].selectize,u=new s.FilterHandle(n.group),a=void 0;return o.on("change",function(){if(0===o.items.length)a=null,u.clear();else{var t={};o.items.forEach(function(e){n.map[e].forEach(function(e){t[e]=!0})});var e=Object.keys(t);e.sort(),a=e,u.set(e)}}),{suspend:function(){u.clear()},resume:function(){a&&u.set(a)}}}})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./filter":2,"./input":6,"./util":11}],9:[function(n,e,t){(function(e){"use strict";var d=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var u,a=e[Symbol.iterator]();!(r=(u=a.next()).done)&&(n.push(u.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},t=function(e){{if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}}(n("./input")),a=n("./filter");var v=e.jQuery,p=e.strftime;function y(e,t){for(var n=e.toString();n.length {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Combine the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Close the handle. This clears this handle's contribution to the filter set,\n * and unsubscribes all event listeners.\n */\n close() {\n this._emitter.removeAllListeners();\n this.clear();\n this.setGroup(null);\n }\n\n /**\n * Clear this handle's contribution to the filter set.\n *\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n clear(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.clear(this._id);\n this._onChange(extraInfo);\n }\n\n /**\n * Set this handle's contribution to the filter set. This array should consist\n * of the keys of the rows that _should_ be displayed; any keys that are not\n * present in the array will be considered _filtered out_. Note that multiple\n * `FilterHandle` instances in the group may each contribute an array of keys,\n * and only those keys that appear in _all_ of the arrays make it through the\n * filter.\n *\n * @param {string[]} keys - Empty array, or array of keys. To clear the\n * filter, don't pass an empty array; instead, use the\n * {@link FilterHandle#clear} method.\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `FilterHandle` constructor).\n * \n * @fires FilterHandle#change\n */\n set(keys, extraInfo) {\n if (!this._filterSet)\n return;\n this._filterSet.update(this._id, keys);\n this._onChange(extraInfo);\n }\n\n /**\n * @return {string[]|null} - Either: 1) an array of keys that made it through\n * all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n * is being applied (all data should be displayed).\n */\n get filteredKeys() {\n return this._filterSet ? this._filterSet.value : null;\n }\n\n /**\n * Subscribe to events on this `FilterHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {FilterHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancel event subscriptions created by {@link FilterHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|FilterHandle~listener} listener - Either the callback\n * function previously passed into {@link FilterHandle#on}, or the\n * string that was returned from {@link FilterHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n _onChange(extraInfo) {\n if (!this._filterSet)\n return;\n this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * @callback FilterHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the filter set, or `null` if no filter set is active),\n * `oldValue` (the previous value of the filter set), and `sender` (the\n * `FilterHandle` instance that made the change).\n */\n\n}\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n * if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n * changed the value.\n */\n","import { diffSortedLists } from \"./util\";\n\nfunction naturalComparator(a, b) {\n if (a === b) {\n return 0;\n } else if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n}\n\n/**\n * @private\n */\nexport default class FilterSet {\n constructor() {\n this.reset();\n }\n\n reset() {\n // Key: handle ID, Value: array of selected keys, or null\n this._handles = {};\n // Key: key string, Value: count of handles that include it\n this._keys = {};\n this._value = null;\n this._activeHandles = 0;\n }\n\n get value() {\n return this._value;\n }\n\n update(handleId, keys) {\n if (keys !== null) {\n keys = keys.slice(0); // clone before sorting\n keys.sort(naturalComparator);\n }\n\n let {added, removed} = diffSortedLists(this._handles[handleId], keys);\n this._handles[handleId] = keys;\n\n for (let i = 0; i < added.length; i++) {\n this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n }\n for (let i = 0; i < removed.length; i++) {\n this._keys[removed[i]]--;\n }\n\n this._updateValue(keys);\n }\n\n /**\n * @param {string[]} keys Sorted array of strings that indicate\n * a superset of possible keys.\n * @private\n */\n _updateValue(keys = this._allKeys) {\n let handleCount = Object.keys(this._handles).length;\n if (handleCount === 0) {\n this._value = null;\n } else {\n this._value = [];\n for (let i = 0; i < keys.length; i++) {\n let count = this._keys[keys[i]];\n if (count === handleCount) {\n this._value.push(keys[i]);\n }\n }\n }\n }\n\n clear(handleId) {\n if (typeof(this._handles[handleId]) === \"undefined\") {\n return;\n }\n\n let keys = this._handles[handleId];\n if (!keys) {\n keys = [];\n }\n\n for (let i = 0; i < keys.length; i++) {\n this._keys[keys[i]]--;\n }\n delete this._handles[handleId];\n\n this._updateValue();\n }\n\n get _allKeys() {\n let allKeys = Object.keys(this._keys);\n allKeys.sort(naturalComparator);\n return allKeys;\n }\n}\n","import Var from \"./var\";\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nlet groups = global.__crosstalk_groups;\n\nexport default function group(groupName) {\n if (groupName && typeof(groupName) === \"string\") {\n if (!groups.hasOwnProperty(groupName)) {\n groups[groupName] = new Group(groupName);\n }\n return groups[groupName];\n } else if (typeof(groupName) === \"object\" && groupName._vars && groupName.var) {\n // Appears to already be a group object\n return groupName;\n } else if (Array.isArray(groupName) &&\n groupName.length == 1 &&\n typeof(groupName[0]) === \"string\") {\n return group(groupName[0]);\n } else {\n throw new Error(\"Invalid groupName argument\");\n }\n}\n\nclass Group {\n constructor(name) {\n this.name = name;\n this._vars = {};\n }\n\n var(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n if (!this._vars.hasOwnProperty(name))\n this._vars[name] = new Var(this, name);\n return this._vars[name];\n }\n\n has(name) {\n if (!name || typeof(name) !== \"string\") {\n throw new Error(\"Invalid var name\");\n }\n\n return this._vars.hasOwnProperty(name);\n }\n}\n","import group from \"./group\";\nimport { SelectionHandle } from \"./selection\";\nimport { FilterHandle } from \"./filter\";\nimport { bind } from \"./input\";\nimport \"./input_selectize\";\nimport \"./input_checkboxgroup\";\nimport \"./input_slider\";\n\nconst defaultGroup = group(\"default\");\n\nfunction var_(name) {\n return defaultGroup.var(name);\n}\n\nfunction has(name) {\n return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n global.Shiny.addCustomMessageHandler(\"update-client-value\", function(message) {\n if (typeof(message.group) === \"string\") {\n group(message.group).var(message.name).set(message.value);\n } else {\n var_(message.name).set(message.value);\n }\n });\n}\n\nconst crosstalk = {\n group: group,\n var: var_,\n has: has,\n SelectionHandle: SelectionHandle,\n FilterHandle: FilterHandle,\n bind: bind\n};\n\n/**\n * @namespace crosstalk\n */\nexport default crosstalk;\nglobal.crosstalk = crosstalk;\n","let $ = global.jQuery;\n\nlet bindings = {};\n\nexport function register(reg) {\n bindings[reg.className] = reg;\n if (global.document && global.document.readyState !== \"complete\") {\n $(() => {\n bind();\n });\n } else if (global.document) {\n setTimeout(bind, 100);\n }\n}\n\nexport function bind() {\n Object.keys(bindings).forEach(function(className) {\n let binding = bindings[className];\n $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function(i, el) {\n bindInstance(binding, el);\n });\n });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n let $el = $(el);\n Object.keys(bindings).forEach(function(className) {\n if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n let binding = bindings[className];\n bindInstance(binding, el);\n }\n });\n}\n\nfunction bindInstance(binding, el) {\n let jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n let data = JSON.parse(jsonEl[0].innerText);\n\n let instance = binding.factory(el, data);\n $(el).data(\"crosstalk-instance\", instance);\n $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n let inputBinding = new global.Shiny.InputBinding();\n let $ = global.jQuery;\n $.extend(inputBinding, {\n find: function(scope) {\n return $(scope).find(\".crosstalk-input\");\n },\n initialize: function(el) {\n if (!$(el).hasClass(\"crosstalk-input-bound\")) {\n bindEl(el);\n }\n },\n getId: function(el) {\n return el.id;\n },\n getValue: function(el) {\n\n },\n setValue: function(el, value) {\n\n },\n receiveMessage: function(el, data) {\n\n },\n subscribe: function(el, callback) {\n $(el).data(\"crosstalk-instance\").resume();\n },\n unsubscribe: function(el) {\n $(el).data(\"crosstalk-instance\").suspend();\n }\n });\n global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-checkboxgroup\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n let $el = $(el);\n $el.on(\"change\", \"input[type='checkbox']\", function() {\n let checked = $el.find(\"input[type='checkbox']:checked\");\n if (checked.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n checked.each(function() {\n data.map[this.value].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport * as util from \"./util\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\n\ninput.register({\n className: \"crosstalk-input-select\",\n\n factory: function(el, data) {\n /*\n * items: {value: [...], label: [...]}\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n\n let first = [{value: \"\", label: \"(All)\"}];\n let items = util.dataframeToD3(data.items);\n let opts = {\n options: first.concat(items),\n valueField: \"value\",\n labelField: \"label\",\n searchField: \"label\"\n };\n\n let select = $(el).find(\"select\")[0];\n\n let selectize = $(select).selectize(opts)[0].selectize;\n\n let ctHandle = new FilterHandle(data.group);\n\n let lastKnownKeys;\n selectize.on(\"change\", function() {\n if (selectize.items.length === 0) {\n lastKnownKeys = null;\n ctHandle.clear();\n } else {\n let keys = {};\n selectize.items.forEach(function(group) {\n data.map[group].forEach(function(key) {\n keys[key] = true;\n });\n });\n let keyArray = Object.keys(keys);\n keyArray.sort();\n lastKnownKeys = keyArray;\n ctHandle.set(keyArray);\n }\n });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n","import * as input from \"./input\";\nimport { FilterHandle } from \"./filter\";\n\nlet $ = global.jQuery;\nlet strftime = global.strftime;\n\ninput.register({\n className: \"crosstalk-input-slider\",\n\n factory: function(el, data) {\n /*\n * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n * group: \"ct-groupname\"\n */\n let ctHandle = new FilterHandle(data.group);\n\n let opts = {};\n let $el = $(el).find(\"input\");\n let dataType = $el.data(\"data-type\");\n let timeFormat = $el.data(\"time-format\");\n let round = $el.data(\"round\");\n let timeFormatter;\n\n // Set up formatting functions\n if (dataType === \"date\") {\n timeFormatter = strftime.utc();\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n\n } else if (dataType === \"datetime\") {\n let timezone = $el.data(\"timezone\");\n if (timezone)\n timeFormatter = strftime.timezone(timezone);\n else\n timeFormatter = strftime;\n\n opts.prettify = function(num) {\n return timeFormatter(timeFormat, new Date(num));\n };\n } else if (dataType === \"number\") {\n if (typeof round !== \"undefined\")\n opts.prettify = function(num) {\n let factor = Math.pow(10, round);\n return Math.round(num * factor) / factor;\n };\n }\n\n $el.ionRangeSlider(opts);\n\n function getValue() {\n let result = $el.data(\"ionRangeSlider\").result;\n\n // Function for converting numeric value from slider to appropriate type.\n let convert;\n let dataType = $el.data(\"data-type\");\n if (dataType === \"date\") {\n convert = function(val) {\n return formatDateUTC(new Date(+val));\n };\n } else if (dataType === \"datetime\") {\n convert = function(val) {\n // Convert ms to s\n return +val / 1000;\n };\n } else {\n convert = function(val) { return +val; };\n }\n\n if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n return [convert(result.from), convert(result.to)];\n } else {\n return convert(result.from);\n }\n }\n\n let lastKnownKeys = null;\n\n $el.on(\"change.crosstalkSliderInput\", function(event) {\n if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n let [from, to] = getValue();\n let keys = [];\n for (let i = 0; i < data.values.length; i++) {\n let val = data.values[i];\n if (val >= from && val <= to) {\n keys.push(data.keys[i]);\n }\n }\n keys.sort();\n ctHandle.set(keys);\n lastKnownKeys = keys;\n }\n });\n\n\n // let $el = $(el);\n // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n // let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n // if (checked.length === 0) {\n // ctHandle.clear();\n // } else {\n // let keys = {};\n // checked.each(function() {\n // data.map[this.value].forEach(function(key) {\n // keys[key] = true;\n // });\n // });\n // let keyArray = Object.keys(keys);\n // keyArray.sort();\n // ctHandle.set(keyArray);\n // }\n // });\n\n return {\n suspend: function() {\n ctHandle.clear();\n },\n resume: function() {\n if (lastKnownKeys)\n ctHandle.set(lastKnownKeys);\n }\n };\n }\n});\n\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n let str = n.toString();\n while (str.length < digits)\n str = \"0\" + str;\n return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n if (date instanceof Date) {\n return date.getUTCFullYear() + \"-\" +\n padZeros(date.getUTCMonth()+1, 2) + \"-\" +\n padZeros(date.getUTCDate(), 2);\n\n } else {\n return null;\n }\n}\n","import Events from \"./events\";\nimport grp from \"./group\";\nimport * as util from \"./util\";\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n * null or undefined (or any other falsy value). This can be changed later\n * via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n * the event object whenever an event is emitted.\n */\nexport class SelectionHandle {\n\n constructor(group = null, extraInfo = null) {\n this._eventRelay = new Events();\n this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n // Name of the group we're currently tracking, if any. Can change over time.\n this._group = null;\n // The Var we're currently tracking, if any. Can change over time.\n this._var = null;\n // The event handler subscription we currently have on var.on(\"change\").\n this._varOnChangeSub = null;\n\n this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n this.setGroup(group);\n }\n\n /**\n * Changes the Crosstalk group membership of this SelectionHandle. The group\n * being switched away from (if any) will not have its selection value\n * modified as a result of calling `setGroup`, even if this handle was the\n * most recent handle to set the selection of the group.\n *\n * The group being switched to (if any) will also not have its selection value\n * modified as a result of calling `setGroup`. If you want to set the\n * selection value of the new group, call `set` explicitly.\n *\n * @param {string} group - The name of the Crosstalk group, or null (or\n * undefined) to clear the group.\n */\n setGroup(group) {\n // If group is unchanged, do nothing\n if (this._group === group)\n return;\n // Treat null, undefined, and other falsy values the same\n if (!this._group && !group)\n return;\n\n if (this._var) {\n this._var.off(\"change\", this._varOnChangeSub);\n this._var = null;\n this._varOnChangeSub = null;\n }\n\n this._group = group;\n\n if (group) {\n this._var = grp(group).var(\"selection\");\n let sub = this._var.on(\"change\", (e) => {\n this._eventRelay.trigger(\"change\", e, this);\n });\n this._varOnChangeSub = sub;\n }\n }\n\n /**\n * Retrieves the current selection for the group represented by this\n * `SelectionHandle`.\n *\n * - If no selection is active, then this value will be falsy.\n * - If a selection is active, but no data points are selected, then this\n * value will be an empty array.\n * - If a selection is active, and data points are selected, then the keys\n * of the selected data points will be present in the array.\n */\n get value() {\n return this._var ? this._var.get() : null;\n }\n\n /**\n * Combines the given `extraInfo` (if any) with the handle's default\n * `_extraInfo` (if any).\n * @private\n */\n _mergeExtraInfo(extraInfo) {\n // Important incidental effect: shallow clone is returned\n return util.extend({},\n this._extraInfo ? this._extraInfo : null,\n extraInfo ? extraInfo : null);\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n * {@link SelectionHandle#value}).\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any options that were\n * passed into the `SelectionHandle` constructor).\n */\n set(selectedKeys, extraInfo) {\n if (this._var)\n this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Overwrites the current selection for the group, and raises the `\"change\"`\n * event among all of the group's '`SelectionHandle` instances (including\n * this one).\n *\n * @fires SelectionHandle#change\n * @param {Object} [extraInfo] - Extra properties to be included on the event\n * object that's passed to listeners (in addition to any that were passed\n * into the `SelectionHandle` constructor).\n */\n clear(extraInfo) {\n if (this._var)\n this.set(void 0, this._mergeExtraInfo(extraInfo));\n }\n\n /**\n * Subscribes to events on this `SelectionHandle`.\n *\n * @param {string} eventType - Indicates the type of events to listen to.\n * Currently, only `\"change\"` is supported.\n * @param {SelectionHandle~listener} listener - The callback function that\n * will be invoked when the event occurs.\n * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n * this subscription.\n */\n on(eventType, listener) {\n return this._emitter.on(eventType, listener);\n }\n\n /**\n * Cancels event subscriptions created by {@link SelectionHandle#on}.\n *\n * @param {string} eventType - The type of event to unsubscribe.\n * @param {string|SelectionHandle~listener} listener - Either the callback\n * function previously passed into {@link SelectionHandle#on}, or the\n * string that was returned from {@link SelectionHandle#on}.\n */\n off(eventType, listener) {\n return this._emitter.off(eventType, listener);\n }\n\n /**\n * Shuts down the `SelectionHandle` object.\n *\n * Removes all event listeners that were added through this handle.\n */\n close() {\n this._emitter.removeAllListeners();\n this.setGroup(null);\n }\n}\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n * `\"change\"` events, this includes the properties `value` (the new\n * value of the selection, or `undefined` if no selection is active),\n * `oldValue` (the previous value of the selection), and `sender` (the\n * `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n * if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n * changed the value.\n */\n","export function extend(target, ...sources) {\n for (let i = 0; i < sources.length; i++) {\n let src = sources[i];\n if (typeof(src) === \"undefined\" || src === null)\n continue;\n\n for (let key in src) {\n if (src.hasOwnProperty(key)) {\n target[key] = src[key];\n }\n }\n }\n return target;\n}\n\nexport function checkSorted(list) {\n for (let i = 1; i < list.length; i++) {\n if (list[i] <= list[i-1]) {\n throw new Error(\"List is not sorted or contains duplicate\");\n }\n }\n}\n\nexport function diffSortedLists(a, b) {\n let i_a = 0;\n let i_b = 0;\n\n if (!a) a = [];\n if (!b) b = [];\n\n let a_only = [];\n let b_only = [];\n\n checkSorted(a);\n checkSorted(b);\n\n while (i_a < a.length && i_b < b.length) {\n if (a[i_a] === b[i_b]) {\n i_a++;\n i_b++;\n } else if (a[i_a] < b[i_b]) {\n a_only.push(a[i_a++]);\n } else {\n b_only.push(b[i_b++]);\n }\n }\n\n if (i_a < a.length)\n a_only = a_only.concat(a.slice(i_a));\n if (i_b < b.length)\n b_only = b_only.concat(b.slice(i_b));\n return {\n removed: a_only,\n added: b_only\n };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nexport function dataframeToD3(df) {\n let names = [];\n let length;\n for (let name in df) {\n if (df.hasOwnProperty(name))\n names.push(name);\n if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n throw new Error(\"All fields must be arrays\");\n } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n throw new Error(\"All fields must be arrays of the same length\");\n }\n length = df[name].length;\n }\n let results = [];\n let item;\n for (let row = 0; row < length; row++) {\n item = {};\n for (let col = 0; col < names.length; col++) {\n item[names[col]] = df[names[col]][row];\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\nexport class SubscriptionTracker {\n constructor(emitter) {\n this._emitter = emitter;\n this._subs = {};\n }\n\n on(eventType, listener) {\n let sub = this._emitter.on(eventType, listener);\n this._subs[sub] = eventType;\n return sub;\n }\n\n off(eventType, listener) {\n let sub = this._emitter.off(eventType, listener);\n if (sub) {\n delete this._subs[sub];\n }\n return sub;\n }\n\n removeAllListeners() {\n let current_subs = this._subs;\n this._subs = {};\n Object.keys(current_subs).forEach((sub) => {\n this._emitter.off(current_subs[sub], sub);\n });\n }\n}\n","import Events from \"./events\";\n\nexport default class Var {\n constructor(group, name, /*optional*/ value) {\n this._group = group;\n this._name = name;\n this._value = value;\n this._events = new Events();\n }\n\n get() {\n return this._value;\n }\n\n set(value, /*optional*/ event) {\n if (this._value === value) {\n // Do nothing; the value hasn't changed\n return;\n }\n let oldValue = this._value;\n this._value = value;\n // Alert JavaScript listeners that the value has changed\n let evt = {};\n if (event && typeof(event) === \"object\") {\n for (let k in event) {\n if (event.hasOwnProperty(k))\n evt[k] = event[k];\n }\n }\n evt.oldValue = oldValue;\n evt.value = value;\n this._events.trigger(\"change\", evt, this);\n\n // TODO: Make this extensible, to let arbitrary back-ends know that\n // something has changed\n if (global.Shiny && global.Shiny.onInputChange) {\n global.Shiny.onInputChange(\n \".clientValue-\" +\n (this._group.name !== null ? this._group.name + \"-\" : \"\") +\n this._name,\n typeof(value) === \"undefined\" ? null : value\n );\n }\n }\n\n on(eventType, listener) {\n return this._events.on(eventType, listener);\n }\n\n off(eventType, listener) {\n return this._events.off(eventType, listener);\n }\n}\n"]} \ No newline at end of file diff --git a/docs/articles/interactive_plots_files/jquery-1.11.3/jquery-AUTHORS.txt b/docs/articles/interactive_plots_files/jquery-1.11.3/jquery-AUTHORS.txt index 14a0e68b..1f4beb60 100644 --- a/docs/articles/interactive_plots_files/jquery-1.11.3/jquery-AUTHORS.txt +++ b/docs/articles/interactive_plots_files/jquery-1.11.3/jquery-AUTHORS.txt @@ -6,10 +6,10 @@ Michael Geary Stefan Petre Yehuda Katz Corey Jewett -Klaus Hartl +Klaus Hartl Franck Marcia Jörn Zaefferer -Paul Bakaus +Paul Bakaus Brandon Aaron Mike Alsup Dave Methvin @@ -36,7 +36,7 @@ Justin Meyer Ben Alman James Padolsey David Petersen -Batiste Bieler +Batiste Bieler Alexander Farkas Rick Waldron Filipe Fortes @@ -47,7 +47,7 @@ Matt Curry Michael Monteleone Noah Sloan Tom Viner -Douglas Neiner +Douglas Neiner Adam J. Sontag Dave Reed Ralph Whitbeck @@ -57,7 +57,7 @@ J. Ryan Stinnett unknown temp01 Heungsub Lee -Colin Snover +Colin Snover Ryan W Tenney Pinhook Ron Otten @@ -69,7 +69,7 @@ Henri Wiechers Russell Holbrook Julian Aubourg Gianni Alessandro Chiappetta -Scott Jehl +Scott Jehl James Burke Jonas Pfenniger Xavi Ramirez @@ -77,11 +77,11 @@ Jared Grippe Sylvester Keil Brandon Sterne Mathias Bynens -Timmy Willison -Corey Frang +Timmy Willison <4timmywil@gmail.com> +Corey Frang Digitalxero Anton Kovalyov -David Murdoch +David Murdoch Josh Varner Charles McNulty Jordan Boesch @@ -139,7 +139,7 @@ Chris Faulkner Elijah Manor Daniel Chatfield Nikita Govorov -Wesley Walser +Wesley Walser Mike Pennisi Markus Staab Dave Riddle @@ -170,6 +170,8 @@ Paul Ramos Rod Vagg Bennett Sorbo Sebastian Burkhard +Zachary Adam Kaplan +nanto_vi nanto Danil Somsikov Ryunosuke SATO @@ -177,41 +179,147 @@ Jean Boussier Adam Coulombe Andrew Plummer Mark Raddatz -Dmitry Gusev -Michał Gołębiowski +Isaac Z. Schlueter +Karl Sieburg +Pascal Borreli Nguyen Phuc Lam +Dmitry Gusev +Michał Gołębiowski-Owczarek +Li Xudong +Steven Benner Tom H Fuertes -Brandon Johnson +Renato Oliveira dos Santos +ros3cin Jason Bedard Kyle Robinson Young -Renato Oliveira dos Santos Chris Talkington Eddie Monge Terry Jones Jason Merino Jeremy Dunck Chris Price +Guy Bedford Amey Sakhadeo +Mike Sidorov Anthony Ryan Dominik D. Geyer George Kats Lihan Li Ronny Springer -Marian Sollmann -Corey Frang Chris Antaki -Noah Hamann +Marian Sollmann +njhamann +Ilya Kantor David Hong +John Paul Jakob Stoeck -Christopher Jones +Christopher Jones Forbes Lindesay -John Paul S. Andrew Sheppard Leonardo Balter Roman Reiß Benjy Cui Rodrigo Rosenfeld Rosas John Hoven +Philip Jägenstedt Christian Kosmowski Liang Peng TJ VanToll +Senya Pugach +Aurelio De Rosa +Nazar Mokrynskyi +Amit Merchant +Jason Bedard +Arthur Verschaeve +Dan Hart +Bin Xin +David Corbacho +Veaceslav Grimalschi +Daniel Husar +Frederic Hemberger +Ben Toews +Aditya Raghavan +Victor Homyakov +Shivaji Varma +Nicolas HENRY +Anne-Gaelle Colom +George Mauer +Leonardo Braga +Stephen Edgar +Thomas Tortorini +Winston Howes +Jon Hester +Alexander O'Mara +Bastian Buchholz +Arthur Stolyar +Calvin Metcalf +Mu Haibao +Richard McDaniel +Chris Rebert +Gabriel Schulhof +Gilad Peleg +Martin Naumann +Marek Lewandowski +Bruno Pérel +Reed Loden +Daniel Nill +Yongwoo Jeon +Sean Henderson +Richard Kraaijenhagen +Connor Atherton +Gary Ye +Christian Grete +Liza Ramo +Julian Alexander Murillo +Joelle Fleurantin +Jae Sung Park +Jun Sun +Josh Soref +Henry Wong +Jon Dufresne +Martijn W. van der Lee +Devin Wilson +Steve Mao +Zack Hall +Bernhard M. Wiedemann +Todor Prikumov +Jha Naman +William Robinet +Alexander Lisianoi +Vitaliy Terziev +Joe Trumbull +Alexander K +Damian Senn +Ralin Chimev +Felipe Sateler +Christophe Tafani-Dereeper +Manoj Kumar +David Broder-Rodgers +Alex Louden +Alex Padilla +南漂一卒 +karan-96 +Boom Lee +Andreas Solleder +CDAGaming +Pierre Spring +Shashanka Nataraj +Erik Lax +Matan Kotler-Berkowitz <205matan@gmail.com> +Jordan Beland +Henry Zhu +Saptak Sengupta +Nilton Cesar +basil.belokon +tmybr11 +Luis Emilio Velasco Sanchez +Ed S +Bert Zhang +Andrei Fangli +Marja Hölttä +abnud1 +buddh4 +Pat O'Callaghan +Ahmed.S.ElAfifi +Wonseop Kim +Christian Oliff diff --git a/docs/articles/interactive_plots_files/jquery-1.11.3/jquery.js b/docs/articles/interactive_plots_files/jquery-1.11.3/jquery.js index 6feb1108..773ad95c 100644 --- a/docs/articles/interactive_plots_files/jquery-1.11.3/jquery.js +++ b/docs/articles/interactive_plots_files/jquery-1.11.3/jquery.js @@ -1,27 +1,29 @@ /*! - * jQuery JavaScript Library v1.11.3 - * http://jquery.com/ + * jQuery JavaScript Library v3.4.1 + * https://jquery.com/ * * Includes Sizzle.js - * http://sizzlejs.com/ + * https://sizzlejs.com/ * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Copyright JS Foundation and other contributors * Released under the MIT license - * http://jquery.org/license + * https://jquery.org/license * - * Date: 2015-04-28T16:19Z + * Date: 2019-05-01T21:04Z */ +( function( global, factory ) { -(function( global, factory ) { + "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper window is present, - // execute the factory and get jQuery - // For environments that do not inherently posses a window with a document - // (such as Node.js), expose a jQuery-making factory as module.exports - // This accentuates the need for the creation of a real window + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info + // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { @@ -35,23 +37,27 @@ } // Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -// +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; -var deletedIds = []; +var getProto = Object.getPrototypeOf; -var slice = deletedIds.slice; +var slice = arr.slice; -var concat = deletedIds.concat; +var concat = arr.concat; -var push = deletedIds.push; +var push = arr.push; -var indexOf = deletedIds.indexOf; +var indexOf = arr.indexOf; var class2type = {}; @@ -59,42 +65,104 @@ var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + var support = {}; +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + var - version = "1.11.3", + version = "3.4.1", // Define a local copy of jQuery jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, - // Support: Android<4.1, IE<9 + // Support: Android <=4.0 only // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used jquery: version, constructor: jQuery, - // Start with an empty selector - selector: "", - // The default length of a jQuery object is 0 length: 0, @@ -105,13 +173,14 @@ jQuery.fn = jQuery.prototype = { // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { - return num != null ? - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } - // Return all the elements in a clean array - slice.call( this ); + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack @@ -123,23 +192,20 @@ jQuery.fn = jQuery.prototype = { // Add the old object onto the stack (as a reference) ret.prevObject = this; - ret.context = this.context; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); + each: function( callback ) { + return jQuery.each( this, callback ); }, map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); - })); + } ) ); }, slice: function() { @@ -157,23 +223,23 @@ jQuery.fn = jQuery.prototype = { eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { - return this.prevObject || this.constructor(null); + return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, - sort: deletedIds.sort, - splice: deletedIds.splice + sort: arr.sort, + splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; @@ -182,44 +248,51 @@ jQuery.extend = jQuery.fn.extend = function() { if ( typeof target === "boolean" ) { deep = target; - // skip the boolean and the target + // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } - // extend jQuery itself if only one argument is passed + // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { + if ( ( options = arguments[ i ] ) != null ) { + // Extend the base object for ( name in options ) { - src = target[ name ]; copy = options[ name ]; + // Prevent Object.prototype pollution // Prevent never-ending loop - if ( target === copy ) { + if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; + clone = src; } + copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); @@ -236,7 +309,8 @@ jQuery.extend = jQuery.fn.extend = function() { return target; }; -jQuery.extend({ +jQuery.extend( { + // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), @@ -249,151 +323,55 @@ jQuery.extend({ noop: function() {}, - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - isPlainObject: function( obj ) { - var key; + var proto, Ctor; - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } + proto = getProto( obj ); - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( support.ownLast ) { - for ( key in obj ) { - return hasOwn.call( obj, key ); - } + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; } - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, + isEmptyObject: function( obj ) { + var name; - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); + for ( name in obj ) { + return false; } + return true; }, - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + // Evaluates a script in a global context + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); }, - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); + each: function( obj, callback ) { + var length, i = 0; - if ( value === false ) { - break; - } + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; } } - - // A special, fast, case for the most common use of each } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; } } } @@ -401,7 +379,7 @@ jQuery.extend({ return obj; }, - // Support: Android<4.1, IE<9 + // Support: Android <=4.0 only trim: function( text ) { return text == null ? "" : @@ -413,7 +391,7 @@ jQuery.extend({ var ret = results || []; if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { + if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr @@ -427,42 +405,18 @@ jQuery.extend({ }, inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( indexOf ) { - return indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; + return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; - while ( j < len ) { - first[ i++ ] = second[ j++ ]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if ( len !== len ) { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; } first.length = i; @@ -491,14 +445,13 @@ jQuery.extend({ // arg is for internal usage only map: function( elems, callback, arg ) { - var value, + var length, value, i = 0, - length = elems.length, - isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values - if ( isArray ) { + if ( isArrayLike( elems ) ) { + length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); @@ -525,79 +478,47 @@ jQuery.extend({ // A global GUID counter for objects guid: 1, - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: function() { - return +( new Date() ); - }, - // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support -}); +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} // Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); +} ); -function isArraylike( obj ) { +function isArrayLike( obj ) { - // Support: iOS 8.2 (not reproducible in simulator) + // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE - var length = "length" in obj && obj.length, - type = jQuery.type( obj ); + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); - if ( type === "function" || jQuery.isWindow( obj ) ) { + if ( isFunction( obj ) || isWindow( obj ) ) { return false; } - if ( obj.nodeType === 1 && length ) { - return true; - } - return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.2.0-pre - * http://sizzlejs.com/ + * Sizzle CSS Selector Engine v2.3.4 + * https://sizzlejs.com/ * - * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Copyright JS Foundation and other contributors * Released under the MIT license - * http://jquery.org/license + * https://js.foundation/ * - * Date: 2014-12-16 + * Date: 2019-04-08 */ (function( window ) { @@ -631,6 +552,7 @@ var i, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), + nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; @@ -638,9 +560,6 @@ var i, return 0; }, - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], @@ -649,7 +568,7 @@ var i, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 + // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; @@ -665,25 +584,21 @@ var i, // Regular expressions - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", - pseudos = ":(" + characterEncoding + ")(?:\\((" + + pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + @@ -699,16 +614,15 @@ var i, rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + @@ -721,6 +635,7 @@ var i, whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, + rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, @@ -730,9 +645,9 @@ var i, rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, - rescape = /'|\\/g, - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; @@ -748,13 +663,39 @@ var i, String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); - }; + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); // Optimize for push.apply( _, NodeList ) try { @@ -786,103 +727,131 @@ try { } function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; - context = context || document; results = results || []; - nodeType = context.nodeType; + // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } - if ( !seed && documentIsHTML ) { - - // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { return results; } + + // Element context } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } } - } - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } } - } - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType !== 1 && selector; + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) && - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); + // Support: IE 8 only + // Exclude object elements + (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; + newSelector = selector; + newContext = context; - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; - } catch(qsaError) { + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); } finally { - if ( !old ) { - context.removeAttribute("id"); + if ( nid === expando ) { + context.removeAttribute( "id" ); } } } @@ -895,7 +864,7 @@ function Sizzle( selector, context, results, seed ) { /** * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ @@ -924,22 +893,22 @@ function markFunction( fn ) { /** * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result + * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { - var div = document.createElement("div"); + var el = document.createElement("fieldset"); try { - return !!fn( div ); + return !!fn( el ); } catch (e) { return false; } finally { // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); + if ( el.parentNode ) { + el.parentNode.removeChild( el ); } // release memory in IE - div = null; + el = null; } } @@ -950,7 +919,7 @@ function assert( fn ) { */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), - i = attrs.length; + i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; @@ -966,8 +935,7 @@ function addHandle( attrs, handler ) { function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); + a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { @@ -1008,6 +976,62 @@ function createButtonPseudo( type ) { }; } +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + /** * Returns a function to use in pseudos for positionals * @param {Function} fn @@ -1048,10 +1072,13 @@ support = Sizzle.support = {}; * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; + var namespace = elem.namespaceURI, + docElem = (elem.ownerDocument || elem).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** @@ -1060,96 +1087,119 @@ isXML = Sizzle.isXML = function( elem ) { * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, + var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; - // If no document and documentElement is available, return + // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } - // Set our document + // Update global variables document = doc; - docElem = doc.documentElement; - parent = doc.defaultView; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); } } - /* Support tests - ---------------------------------------------------------------------- */ - documentIsHTML = !isXML( doc ); - /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; }); // Support: IE<9 - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, + // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; }); - // ID find and filter + // ID filter and find if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); return node && node.value === attrId; }; }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; } // Tag @@ -1186,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( documentIsHTML ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; @@ -1203,77 +1253,87 @@ setDocument = Sizzle.setDocument = function( node ) { // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 + // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini - assert(function( div ) { + assert(function( el ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { + if ( !el.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } - // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { + if ( !el.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); - assert(function( div ) { + assert(function( el ) { + el.innerHTML = "" + + ""; + // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); + var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); + el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { + if ( el.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); + el.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } @@ -1284,14 +1344,14 @@ setDocument = Sizzle.setDocument = function( node ) { docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { - assert(function( div ) { + assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); + support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); + matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } @@ -1304,7 +1364,7 @@ setDocument = Sizzle.setDocument = function( node ) { hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another - // Purposefully does not implement inclusive descendent + // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { @@ -1358,10 +1418,10 @@ setDocument = Sizzle.setDocument = function( node ) { (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } @@ -1389,8 +1449,8 @@ setDocument = Sizzle.setDocument = function( node ) { // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : + return a === document ? -1 : + b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? @@ -1427,7 +1487,7 @@ setDocument = Sizzle.setDocument = function( node ) { 0; }; - return doc; + return document; }; Sizzle.matches = function( expr, elements ) { @@ -1440,10 +1500,8 @@ Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); } - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { @@ -1457,7 +1515,9 @@ Sizzle.matchesSelector = function( elem, expr ) { elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch (e) {} + } catch (e) { + nonnativeSelectorCache( expr, true ); + } } return Sizzle( expr, document, null, [ elem ] ).length > 0; @@ -1492,6 +1552,10 @@ Sizzle.attr = function( elem, name ) { null; }; +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; @@ -1717,11 +1781,12 @@ Expr = Sizzle.selectors = { } : function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, + var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; + useCache = !xml && !ofType, + diff = false; if ( parent ) { @@ -1730,7 +1795,10 @@ Expr = Sizzle.selectors = { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + return false; } } @@ -1744,11 +1812,21 @@ Expr = Sizzle.selectors = { // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { + // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || @@ -1758,29 +1836,55 @@ Expr = Sizzle.selectors = { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } - if ( node === elem ) { - break; + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } } } } @@ -1872,7 +1976,7 @@ Expr = Sizzle.selectors = { "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; }), @@ -1919,13 +2023,8 @@ Expr = Sizzle.selectors = { }, // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements @@ -2016,7 +2115,11 @@ Expr = Sizzle.selectors = { }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } @@ -2127,7 +2230,9 @@ function toSelector( tokens ) { function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? @@ -2138,14 +2243,15 @@ function addCombinator( matcher, combinator, base ) { return matcher( elem, context, xml ); } } + return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { - var oldCache, outerCache, + var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { @@ -2158,14 +2264,21 @@ function addCombinator( matcher, combinator, base ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; + uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { @@ -2175,6 +2288,7 @@ function addCombinator( matcher, combinator, base ) { } } } + return false; }; } @@ -2390,18 +2504,21 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { len = elems.length; if ( outermost ) { - outermostContext = context !== document && context; + outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { + if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } @@ -2425,8 +2542,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } } - // Apply set filters to unmatched elements + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { @@ -2518,14 +2644,14 @@ select = Sizzle.select = function( selector, context, results, seed ) { results = results || []; - // Try to minimize operations if there is no seed and only one group + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) if ( match.length === 1 ) { - // Take a shortcut and set the context if the root selector is an ID + // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { @@ -2576,7 +2702,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { context, !documentIsHTML, results, - rsibling.test( selector ) && testContext( context.parentNode ) || context + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; @@ -2595,17 +2721,17 @@ setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { +support.sortDetached = assert(function( el ) { // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { @@ -2616,10 +2742,10 @@ if ( !assert(function( div ) { // Support: IE<9 // Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { @@ -2630,8 +2756,8 @@ if ( !support.attributes || !assert(function( div ) { // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; @@ -2652,50 +2778,84 @@ return Sizzle; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + var rneedsContext = jQuery.expr.match.needsContext; -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + -var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { + if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; - }); - + } ); } + // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; - }); - + } ); } - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); } - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { @@ -2705,44 +2865,44 @@ jQuery.filter = function( expr, elems, not ) { expr = ":not(" + expr + ")"; } - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); }; -jQuery.fn.extend({ +jQuery.fn.extend( { find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; + var i, ret, + len = this.length, + self = this; if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { + return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } - }) ); + } ) ); } + ret = this.pushStack( [] ); + for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; + return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); + return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); + return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( @@ -2756,7 +2916,7 @@ jQuery.fn.extend({ false ).length; } -}); +} ); // Initialize a jQuery object @@ -2765,15 +2925,13 @@ jQuery.fn.extend({ // A central reference to the root jQuery(document) var rootjQuery, - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - init = jQuery.fn.init = function( selector, context ) { + init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) @@ -2781,9 +2939,16 @@ var rootjQuery, return this; } + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + // Handle HTML strings if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; @@ -2792,25 +2957,26 @@ var rootjQuery, } // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { + if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; - // scripts is true for back-compat + // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( - match[1], + match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { + // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { + if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes @@ -2824,30 +2990,20 @@ var rootjQuery, // HANDLE: $(#id) } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { - // Otherwise, we inject the element directly into the jQuery object + // Inject the element directly into the jQuery object + this[ 0 ] = elem; this.length = 1; - this[0] = elem; } - - this.context = document; - this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); + return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) @@ -2857,24 +3013,20 @@ var rootjQuery, // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { - this.context = this[0] = selector; + this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + // Execute immediately if ready is not present selector( jQuery ); } - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - return jQuery.makeArray( selector, this ); }; @@ -2886,7 +3038,8 @@ rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set + + // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, @@ -2894,46 +3047,19 @@ var rparentsprev = /^(?:parents|prev(?:Until|All))/, prev: true }; -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -jQuery.fn.extend({ +jQuery.fn.extend( { has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; + var targets = jQuery( target, this ), + l = targets.length; - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } - }); + } ); }, closest: function( selectors, context ) { @@ -2941,52 +3067,55 @@ jQuery.fn.extend({ i = 0, l = this.length, matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; + targets = typeof selectors !== "string" && jQuery( selectors ); - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : - matched.push( cur ); - break; + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } } } } - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, - // Determine the position of an element within - // the matched set of elements + // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } - // index in selector + // Index in selector if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); + return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element - return jQuery.inArray( + return indexOf.call( this, + // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); + elem.jquery ? elem[ 0 ] : elem + ); }, add: function( selector, context ) { return this.pushStack( - jQuery.unique( + jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); @@ -2994,29 +3123,26 @@ jQuery.fn.extend({ addBack: function( selector ) { return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) + this.prevObject : this.prevObject.filter( selector ) ); } -}); +} ); function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } -jQuery.each({ +jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); + return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); + return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); @@ -3025,68 +3151,75 @@ jQuery.each({ return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); + return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); + return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); + return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); + return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { - return jQuery.sibling( elem.firstChild ); + return siblings( elem.firstChild ); }, contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); + if ( typeof elem.contentDocument !== "undefined" ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); + var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); + matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { + // Remove duplicates if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); + jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); + matched.reverse(); } } - return this.pushStack( ret ); + return this.pushStack( matched ); }; -}); -var rnotwhite = (/\S+/g); +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache +// Convert String-formatted options into Object-formatted ones function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; - }); + } ); return object; } @@ -3117,156 +3250,186 @@ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : + createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, - // Last fire value (for non-forgettable lists) + + // Last fire value for non-forgettable lists memory, + // Flag to know if list was already fired fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, + + // Flag to prevent firing + locked, + // Actual callback list list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } } } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { list = []; + + // Otherwise, this object is spent } else { - self.disable(); + list = ""; } } }, + // Actual Callbacks object self = { + // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { + if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } - } else if ( arg && arg.length && type !== "string" ) { + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + // Inspect recursively add( arg ); } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); } } return this; }, + // Remove a callback from the list remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; } - }); - } + } + } ); return this; }, + // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; }, + // Remove all callbacks from the list empty: function() { - list = []; - firingLength = 0; + if ( list ) { + list = []; + } return this; }, - // Have the list do nothing anymore + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values disable: function() { - list = stack = memory = undefined; + locked = queue = []; + list = memory = ""; return this; }, - // Is it disabled? disabled: function() { return !list; }, - // Lock the list in its current state + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; } return this; }, - // Is it locked? locked: function() { - return !stack; + return !!locked; }, + // Call all callbacks with the given context and arguments fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { + if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); + queue.push( args ); + if ( !firing ) { + fire(); } } return this; }, + // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, + // To know if the callbacks have already been called at least once fired: function() { return !!fired; @@ -3277,14 +3440,59 @@ jQuery.Callbacks = function( options ) { }; -jQuery.extend({ +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { Deferred: function( func ) { var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { @@ -3295,27 +3503,206 @@ jQuery.extend({ deferred.done( arguments ).fail( arguments ); return this; }, - then: function( /* fnDone, fnFail, fnProgress */ ) { + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; - return jQuery.Deferred(function( newDefer ) { + + return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { + if ( returned && isFunction( returned.promise ) ) { returned.promise() + .progress( newDefer.notify ) .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); + .fail( newDefer.reject ); } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); } - }); - }); + } ); + } ); fns = null; - }).promise(); + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); }, + // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { @@ -3324,34 +3711,60 @@ jQuery.extend({ }, deferred = {}; - // Keep pipe for back-compat - promise.pipe = promise.then; - // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], - stateString = tuple[ 3 ]; + stateString = tuple[ 5 ]; - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; + list.add( + function() { - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); } - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); // Make the deferred a promise promise.promise( deferred ); @@ -3366,71 +3779,101 @@ jQuery.extend({ }, // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, + when: function( singleValue ) { + var - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + // count of uncompleted subordinates + remaining = arguments.length, - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + // count of unprocessed arguments + i = remaining, - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), - } else if ( !(--remaining) ) { - deferred.resolveWith( contexts, values ); + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); } }; - }, + }; - progressValues, progressContexts, resolveContexts; + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); } } - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } - return deferred.promise(); + return master.promise(); } -}); +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + // The deferred used on DOM ready -var readyList; +var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); return this; }; -jQuery.extend({ +jQuery.extend( { + // Is the DOM ready to be used? Set to true once it occurs. isReady: false, @@ -3438,15 +3881,6 @@ jQuery.extend({ // the ready event fires. See #6781 readyWait: 1, - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - // Handle when the DOM is ready ready: function( wait ) { @@ -3455,11 +3889,6 @@ jQuery.extend({ return; } - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - // Remember that the DOM is ready jQuery.isReady = true; @@ -3470,486 +3899,398 @@ jQuery.extend({ // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } } -}); - -/** - * Clean-up method for dom ready events - */ -function detach() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); +} ); - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } -} +jQuery.ready.then = readyList.then; -/** - * The ready event handler and self cleanup method - */ +// The ready event handler and self cleanup method function completed() { - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); } -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - readyList = jQuery.Deferred(); + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); +} else { - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } - // detach all dom ready events - detach(); + // Sets one value + } else if ( value !== undefined ) { + chainable = true; - // and execute any waiting functions - jQuery.ready(); - } - })(); - } + if ( !isFunction( value ) ) { + raw = true; } - } - return readyList.promise( obj ); -}; + if ( bulk ) { -var strundefined = typeof undefined; - - - -// Support: IE<9 -// Iteration over object's inherited properties before its own -var i; -for ( i in jQuery( support ) ) { - break; -} -support.ownLast = i !== "0"; + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; -// Note: most support tests are defined in their respective modules. -// false until the test is run -support.inlineBlockNeedsLayout = false; + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } -// Execute ASAP in case we need to set body.style.zoom -jQuery(function() { - // Minified: var a,b,c,d - var val, div, body, container; + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } - body = document.getElementsByTagName( "body" )[ 0 ]; - if ( !body || !body.style ) { - // Return for frameset docs that don't have a body - return; + if ( chainable ) { + return elems; } - // Setup - div = document.createElement( "div" ); - container = document.createElement( "div" ); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild( container ).appendChild( div ); + // Gets + if ( bulk ) { + return fn.call( elems ); + } - if ( typeof div.style.zoom !== strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if ( val ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - body.removeChild( container ); -}); +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; -(function() { - var div = document.createElement( "div" ); - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - } - // Null elements to avoid leaks in IE. - div = null; -})(); +function Data() { + this.expando = jQuery.expando + Data.uid++; +} +Data.uid = 1; -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( elem ) { - var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], - nodeType = +elem.nodeType || 1; +Data.prototype = { - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : + cache: function( owner ) { - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute("classid") === noData; -}; + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + // If not, create one + if ( !value ) { + value = {}; -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } - data = elem.getAttribute( name ); + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); + cache[ camelCase( data ) ] = value; + // Handle: [ owner, { properties } ] args } else { - data = undefined; + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } } - } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : - return data; -} + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; + return this.get( owner, key ); } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -function internalData( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); - var ret, thisCache, - internalKey = jQuery.expando, + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, + if ( cache === undefined ) { + return; + } - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, + if ( key !== undefined ) { - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } + i = key.length; - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + while ( i-- ) { + delete cache[ key[ i ] ]; + } } - } - thisCache = cache[ id ]; + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); } +}; +var dataPriv = new Data(); - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { +var dataUser = new Data(); - // First Try to find as-is property data - ret = thisCache[ name ]; - // Test for null|undefined property data - if ( ret == null ) { - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - return ret; -} +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; +function getData( data ) { + if ( data === "true" ) { + return true; } - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; + if ( data === "false" ) { + return false; } - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } + if ( data === "null" ) { + return null; + } - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } + if ( rbrace.test( data ) ) { + return JSON.parse( data ); } - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; + return data; +} - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } +function dataAttr( elem, key, data ) { + var name; - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} - // When all else fails, null - } else { - cache[ id ] = null; + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } } + return data; } -jQuery.extend({ - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - +jQuery.extend( { hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { - return internalData( elem, name, data ); + return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { - return internalRemoveData( elem, name ); + dataUser.remove( elem, name ); }, - // For internal use only. + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); + return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); + dataPriv.remove( elem, name ); } -}); +} ); -jQuery.fn.extend({ +jQuery.fn.extend( { data: function( key, value ) { var i, name, data, - elem = this[0], + elem = this[ 0 ], attrs = elem && elem.attributes; - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - // Gets all values if ( key === undefined ) { if ( this.length ) { - data = jQuery.data( elem ); + data = dataUser.get( elem ); - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { - // Support: IE11+ + // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); + name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } - jQuery._data( elem, "parsedAttrs", true ); + dataPriv.set( elem, "hasDataAttrs", true ); } } @@ -3958,43 +4299,68 @@ jQuery.fn.extend({ // Sets multiple values if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); + return this.each( function() { + dataUser.set( this, key ); + } ); } - return arguments.length > 1 ? + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : + // Set the data... + this.each( function() { - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); + return this.each( function() { + dataUser.remove( this, key ); + } ); } -}); +} ); -jQuery.extend({ +jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); + queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } @@ -4028,7 +4394,7 @@ jQuery.extend({ queue.unshift( "inprogress" ); } - // clear up the last queue stop function + // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } @@ -4038,19 +4404,18 @@ jQuery.extend({ } }, - // not intended for public consumption - generates a queueHooks object, or returns the current one + // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); } -}); +} ); -jQuery.fn.extend({ +jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; @@ -4061,30 +4426,31 @@ jQuery.fn.extend({ } if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); + return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : - this.each(function() { + this.each( function() { var queue = jQuery.queue( this, type, data ); - // ensure a hooks for this queue + // Ensure a hooks for this queue jQuery._queueHooks( this, type ); - if ( type === "fx" && queue[0] !== "inprogress" ) { + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } - }); + } ); }, dequeue: function( type ) { - return this.each(function() { + return this.each( function() { jQuery.dequeue( this, type ); - }); + } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, + // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { @@ -4106,7 +4472,7 @@ jQuery.fn.extend({ type = type || "fx"; while ( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); @@ -4115,186 +4481,518 @@ jQuery.fn.extend({ resolve(); return defer.promise( obj ); } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; +var documentElement = document.documentElement; -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; - // Sets one value - } else if ( value !== undefined ) { - chainable = true; + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && - if ( !jQuery.isFunction( value ) ) { - raw = true; - } + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; + jQuery.css( elem, "display" ) === "none"; + }; - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; } - return chainable ? - elems : + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; + return ret; }; -var rcheckableType = (/^(?:checkbox|radio)$/i); -(function() { - // Minified: var a,b,c - var input = document.createElement( "input" ), - div = document.createElement( "div" ), - fragment = document.createDocumentFragment(); - // Setup - div.innerHTML = "
      a"; +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName( "tbody" ).length; + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild( input ); - support.appendChecked = input.checked; + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + while ( maxIterations-- ) { - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild( div ); - div.innerHTML = ""; + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + } - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - support.noCloneEvent = true; - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); - div.cloneNode( true ).click(); + // Make sure we update the tween properties later on + valueParts = valueParts || []; } - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; } } -})(); + return adjusted; +} -(function() { - var i, eventName, - div = document.createElement( "div" ); +var defaultDisplayMap = {}; - // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) - for ( i in { submit: true, change: true, focusin: true }) { - eventName = "on" + i; +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; - if ( !(support[ i + "Bubbles" ] = eventName in window) ) { - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute( eventName, "t" ); - support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; - } + if ( display ) { + return display; } - // Null elements to avoid leaks in IE. - div = null; -})(); + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + temp.parentNode.removeChild( temp ); -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; -function returnTrue() { - return true; + return display; } -function returnFalse() { - return false; -} +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; -function safeActiveElement() { - try { + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { return document.activeElement; } catch ( err ) { } } +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. @@ -4304,10 +5002,11 @@ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { @@ -4321,34 +5020,38 @@ jQuery.event = { selector = handleObjIn.selector; } + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { + if ( !( events = elemData.events ) ) { events = elemData.events = {}; } - if ( !(eventHandle = elemData.handle) ) { + if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; } // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { @@ -4365,7 +5068,7 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers - handleObj = jQuery.extend({ + handleObj = jQuery.extend( { type: type, origType: origType, data: data, @@ -4373,22 +5076,20 @@ jQuery.event = { guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") + namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { + if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); } } } @@ -4412,29 +5113,27 @@ jQuery.event = { jQuery.event.global[ type ] = true; } - // Nullify elem to prevent memory leaks in IE - elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - if ( !elemData || !(events = elemData.events) ) { + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { @@ -4447,7 +5146,8 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; @@ -4457,7 +5157,8 @@ jQuery.event = { if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { @@ -4472,7 +5173,9 @@ jQuery.event = { // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); } @@ -4480,400 +5183,220 @@ jQuery.event = { } } - // Remove the expando if it's no longer used + // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); + dataPriv.remove( elem, "handle events" ); } }, - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + dispatch: function( nativeEvent ) { - cur = tmp = elem = elem || document; + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; } - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; } - ontype = type.indexOf(":") < 0 && "on" + type; - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } + event.handleObj = handleObj; + event.data = handleObj.data; - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } } + } - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { - var sel, handleObj, matches, i, + var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ + for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } - if ( matches[ sel ] ) { - matches.push( handleObj ); + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); } } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers + cur = this; if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); } - - return event; - } + } ); }, - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); }, special: { load: { + // Prevent triggered image.load events from bubbling to window.load noBubble: true }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); } + + // Return false to allow normal processing in the caller + return false; }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); } + + // Return non-false to allow normal event-path propagation + return true; }, - // For cross-browser consistency, don't fire native .click() on links + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); } }, @@ -4887,56 +5410,108 @@ jQuery.event = { } } } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } } }; -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); } - } : - function( elem, type, handle ) { - var name = "on" + type; + return; + } - if ( elem.detachEvent ) { + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === strundefined ) { - elem[ name ] = null; - } + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { - elem.detachEvent( name, handle ); + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } } - }; + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { + if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } @@ -4949,11 +5524,22 @@ jQuery.Event = function( src, props ) { // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && - // Support: IE < 9, Android < 4.0 + + // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + // Event type } else { this.type = src; @@ -4965,59 +5551,45 @@ jQuery.Event = function( src, props ) { } // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); + this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { + constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, + isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { + if ( e && !this.isSimulated ) { e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { + + if ( e && !this.isSimulated ) { e.stopPropagation(); } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; - if ( e && e.stopImmediatePropagation ) { + if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } @@ -5025,8 +5597,104 @@ jQuery.Event.prototype = { } }; +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + // Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", @@ -5042,9 +5710,9 @@ jQuery.each({ related = event.relatedTarget, handleObj = event.handleObj; - // For mousenter/leave call the handler if related is outside the target. + // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; @@ -5052,226 +5720,41 @@ jQuery.each({ return ret; } }; -}); - -// IE submit delegation -if ( !support.submitBubbles ) { +} ); - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } +jQuery.fn.extend( { - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); + return this; } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !support.changeBubbles ) { + if ( selector === false || typeof selector === "function" ) { - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - jQuery._removeData( doc, fix ); - } else { - jQuery._data( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; @@ -5279,263 +5762,238 @@ jQuery.fn.extend({ if ( fn === false ) { fn = returnFalse; } - return this.each(function() { + return this.each( function() { jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } + } ); } -}); +} ); -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); +var - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} + /* eslint-disable max-len */ -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
      ", "
      " ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
      " ], - tr: [ 2, "", "
      " ], - col: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
      ", "
      " ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; + /* eslint-enable */ -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } -} -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; + return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); } else { - elem.removeAttribute("type"); + elem.removeAttribute( "type" ); } - return elem; -} -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } + return elem; } function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + if ( dest.nodeType !== 1 ) { return; } - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; - if ( events ) { - delete curData.handle; - curData.events = {}; + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } } } } - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); } } -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; } +} - nodeName = dest.nodeName.toLowerCase(); +function domManip( collection, args, callback, ignored ) { - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); + // Flatten any nested arrays + args = concat.apply( [], args ); - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); } - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; + if ( fragment.childNodes.length === 1 ) { + fragment = first; } - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; - } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; - dest.defaultChecked = dest.checked = src.checked; + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; + callback.call( collection[ i ], node, i ); + } - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + } ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } } + + return collection; } -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; - if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, - if ( (!support.noCloneEvent || !support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); } } @@ -5545,8 +6003,8 @@ jQuery.extend({ srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); @@ -5559,276 +6017,112 @@ jQuery.extend({ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } - destElements = srcElements = node = null; - // Return the cloned set return clone; }, - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, i = 0; - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
      " && !rtbody.test( elem ) ? - tmp : - 0; + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); } } } - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; } } } + } +} ); - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } + remove: function( selector ) { + return remove( this, selector ); + }, - i = 0; - while ( (elem = nodes[ i++ ]) ) { + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); } + } ); + }, - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); } + } ); + }, - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); } - } - - tmp = null; + } ); + }, - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - deletedIds.push( id ); - } - } - } - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); }, empty: function() { var elem, i = 0; - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks + for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; + // Remove any remaining nodes + elem.textContent = ""; } } @@ -5839,9 +6133,9 @@ jQuery.fn.extend({ dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - return this.map(function() { + return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); + } ); }, html: function( value ) { @@ -5850,24 +6144,21 @@ jQuery.fn.extend({ i = 0, l = this.length; - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - value = value.replace( rxhtmlTag, "<$1>" ); + value = jQuery.htmlPrefilter( value ); try { - for (; i < l; i++ ) { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + // Remove element nodes and prevent memory leaks - elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; @@ -5877,7 +6168,7 @@ jQuery.fn.extend({ elem = 0; // If using innerHTML throws an exception, use the fallback method - } catch(e) {} + } catch ( e ) {} } if ( elem ) { @@ -5887,117 +6178,25 @@ jQuery.fn.extend({ }, replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, + var ignored = []; - domManip: function( args, callback ) { + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; - // Flatten any nested arrays - args = concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; } - } - return this; + // Force callback invocation + }, ignored ); } -}); +} ); -jQuery.each({ +jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", @@ -6006,638 +6205,411 @@ jQuery.each({ }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, - i = 0, ret = [], insert = jQuery( selector ), - last = insert.length - 1; + last = insert.length - 1, + i = 0; for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optmization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "
  • 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�M=RSC7^_N;hZ76*U{g07WU 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 J00001Sz0z`T)F@N From 728bae615a2ae97d26e390cfcb6b6030c8d2c0f3 Mon Sep 17 00:00:00 2001 From: guiastrennec Date: Mon, 16 Mar 2020 23:33:03 +0100 Subject: [PATCH 2/5] Fixes for tibble 3.0.0 --- R/fetch_data.R | 2 +- R/read_nm_files.R | 9 +++++++-- tests/testthat/test-fetch_data.R | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/R/fetch_data.R b/R/fetch_data.R index bf9f4d65..cac95322 100755 --- a/R/fetch_data.R +++ b/R/fetch_data.R @@ -62,7 +62,7 @@ only_obs <- function(xpdb, .problem, quiet) { string <- c('Filtering data by ', mdv_var, ' == 0') body(fun) <- bquote({ msg(.(string), .(quiet)) - x[x[, .(mdv_var)] == 0, ] + x[as.vector(x[, .(mdv_var)] == 0), ] }) } else { string <- c('No `evid` or `mdv` variable available to filter the data.') diff --git a/R/read_nm_files.R b/R/read_nm_files.R index 991aa76a..b8b23a45 100755 --- a/R/read_nm_files.R +++ b/R/read_nm_files.R @@ -96,8 +96,13 @@ parse_nm_files <- function(dat, quiet) { if (length(unlist(dat$raw)) == 0) { tab_rows <- NULL } else { - x <- dplyr::tibble(raw = unlist(dat$raw), problem = NA, - subprob = NA, method = NA, header = FALSE) + x <- dplyr::tibble( + raw = unlist(dat$raw), + problem = NA_character_, + subprob = NA_character_, + method = NA_character_, + header = FALSE + ) tab_rows <- which(stringr::str_detect(x$raw, '^\\s*TABLE NO')) } diff --git a/tests/testthat/test-fetch_data.R b/tests/testthat/test-fetch_data.R index 748c6757..2ef13780 100755 --- a/tests/testthat/test-fetch_data.R +++ b/tests/testthat/test-fetch_data.R @@ -42,7 +42,7 @@ test_that('fetch_data can get simple data', { test_that('fetch_data can tidy data', { imported_tidy_data <- fetch_data(xpdb_ex_pk, .problem = 1, .source = 'data', simtab = FALSE, filter = function(x) { - x[x[, 'EVID'] == 0, c('ID', 'TIME', 'IPRED', 'PRED', 'DV')]}, + x[as.vector(x[, 'EVID'] == 0), c('ID', 'TIME', 'IPRED', 'PRED', 'DV')]}, tidy = TRUE, value_col = c('IPRED','PRED', 'DV')) # Check output From 1ab531152f1bfd8df0fc7bca8c119fee6c112d22 Mon Sep 17 00:00:00 2001 From: guiastrennec Date: Mon, 16 Mar 2020 23:41:21 +0100 Subject: [PATCH 3/5] Prepare for new CRAN release --- DESCRIPTION | 2 +- NEWS.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index adf695d5..77ccdd16 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: xpose Type: Package Title: Diagnostics for Pharmacometric Models -Version: 0.4.7 +Version: 0.4.8 Authors@R: c( person('Benjamin', 'Guiastrennec', role = c('aut', 'cre', 'cph'), diff --git a/NEWS.md b/NEWS.md index c10521cc..fdf88940 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +# xpose 0.4.8 +* Compatibility fix for ggplot 3.3.0 and tibble 3.0.0 + # xpose 0.4.7 * Fixed error in documentation check fail in R 4.0.0 From 1ac1033e3cdc3b8cea17d50bde17e6cb90489e72 Mon Sep 17 00:00:00 2001 From: guiastrennec Date: Tue, 17 Mar 2020 00:47:11 +0100 Subject: [PATCH 4/5] Fixed error in example under devel --- DESCRIPTION | 2 +- R/plot_amt.R | 2 +- man/amt_vs_idv.Rd | 2 +- man/minimization_plots.Rd | 6 ++++-- man/xpdb_ex_pk.Rd | 4 +++- vignettes/plot_list.Rmd | 2 +- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 77ccdd16..fe63926d 100755 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -54,4 +54,4 @@ BugReports: https://github.com/UUPharmacometrics/xpose/issues Encoding: UTF-8 LazyData: true VignetteBuilder: knitr -RoxygenNote: 7.0.2 +RoxygenNote: 7.1.0 diff --git a/R/plot_amt.R b/R/plot_amt.R index f2949475..7b92b281 100755 --- a/R/plot_amt.R +++ b/R/plot_amt.R @@ -11,7 +11,7 @@ #' @inheritSection xplot_scatter Template titles #' @seealso \code{\link{xplot_scatter}} #' @examples -#' amt_vs_idv(xpdb_ex_pk) +#' amt_vs_idv(xpdb_ex_pk, nrow = 2, ncol = 1) #' #' @export amt_vs_idv <- function(xpdb, diff --git a/man/amt_vs_idv.Rd b/man/amt_vs_idv.Rd index 9f9478be..9da3f8e9 100755 --- a/man/amt_vs_idv.Rd +++ b/man/amt_vs_idv.Rd @@ -108,7 +108,7 @@ are listed under \code{\link{template_titles}}. } \examples{ -amt_vs_idv(xpdb_ex_pk) +amt_vs_idv(xpdb_ex_pk, nrow = 2, ncol = 1) } \seealso{ diff --git a/man/minimization_plots.Rd b/man/minimization_plots.Rd index 6ca549cc..76cf4fc5 100755 --- a/man/minimization_plots.Rd +++ b/man/minimization_plots.Rd @@ -12,7 +12,8 @@ prm_vs_iteration( group = "variable", type = "l", title = "Parameter @y vs. @x | @run", - subtitle = "Method: @method, minimization time: @runtime\\nTermination message: @term", + + subtitle = "Method: @method, minimization time: @runtime\\nTermination message: @term", caption = "@dir", tag = NULL, log = NULL, @@ -31,7 +32,8 @@ grd_vs_iteration( group = "variable", type = "l", title = "Gradient @y vs. @x | @run", - subtitle = "Method: @method, minimization time: @runtime\\nTermination message: @term", + + subtitle = "Method: @method, minimization time: @runtime\\nTermination message: @term", caption = "@dir", tag = NULL, log = NULL, diff --git a/man/xpdb_ex_pk.Rd b/man/xpdb_ex_pk.Rd index 72b0140c..f52551ff 100755 --- a/man/xpdb_ex_pk.Rd +++ b/man/xpdb_ex_pk.Rd @@ -3,7 +3,9 @@ \name{xpdb_ex_pk} \alias{xpdb_ex_pk} \title{\code{xpose_data} examples} -\format{An \code{xpose_data} object} +\format{ +An \code{xpose_data} object +} \source{ \href{http://link.springer.com/article/10.1023/A:1020561807903}{Moxonidine model}: Assumption Testing in Population Pharmacokinetic Models: Illustrated with an Analysis of diff --git a/vignettes/plot_list.Rmd b/vignettes/plot_list.Rmd index ceae9f9c..ece47b50 100755 --- a/vignettes/plot_list.Rmd +++ b/vignettes/plot_list.Rmd @@ -76,7 +76,7 @@ cov_qq(xpdb_ex_pk) ## Kinetic plots ### Compartment's amount ```{r} -amt_vs_idv(xpdb_ex_pk) +amt_vs_idv(xpdb_ex_pk, nrow = 2, ncol = 1) ``` ## Visual predictive checks (VPC) From 9a05b16ea3cd91b3330a717ab68cf6a575edfa31 Mon Sep 17 00:00:00 2001 From: guiastrennec Date: Tue, 17 Mar 2020 00:52:05 +0100 Subject: [PATCH 5/5] Website: updated --- docs/404.html | 2 +- docs/CODE_OF_CONDUCT.html | 2 +- docs/CONTRIBUTING.html | 6 +- docs/LICENSE-text.html | 2 +- docs/articles/about.html | 4 +- docs/articles/access_xpdb_data.html | 4 +- docs/articles/customize_plots.html | 4 +- docs/articles/faq.html | 6 +- docs/articles/import_model_outputs.html | 4 +- docs/articles/index.html | 2 +- docs/articles/interactive_plots.html | 22 +- .../crosstalk-1.1.0.1/css/crosstalk.css | 27 + .../crosstalk-1.1.0.1/js/crosstalk.js | 1474 +++ .../crosstalk-1.1.0.1/js/crosstalk.js.map | 37 + .../crosstalk-1.1.0.1/js/crosstalk.min.js | 2 + .../crosstalk-1.1.0.1/js/crosstalk.min.js.map | 1 + .../jquery-1.11.3/jquery-AUTHORS.txt | 146 +- .../jquery-1.11.3/jquery.js | 9759 +++++++++-------- .../jquery-1.11.3/jquery.min.js | 7 +- .../jquery-1.11.3/jquery.min.map | 2 +- .../plotly-binding-4.9.2/plotly.js | 935 ++ .../plotly-htmlwidgets.css | 9 + .../plotly-main-1.52.2/plotly-latest.min.js | 7 + docs/articles/introduction.html | 4 +- docs/articles/multiple_pages.html | 4 +- docs/articles/plot_list.html | 6 +- .../figure-html/unnamed-chunk-9-1.png | Bin 128405 -> 339341 bytes docs/articles/vpc.html | 4 +- docs/authors.html | 2 +- docs/index.html | 4 +- docs/news/index.html | 13 +- docs/reference/add_facet_var.html | 2 +- docs/reference/aes_c.html | 2 +- docs/reference/aes_filter.html | 2 +- docs/reference/aes_rename.html | 2 +- docs/reference/all_data_problem.html | 2 +- docs/reference/all_file_problem.html | 2 +- docs/reference/amt_vs_idv-1.png | Bin 104291 -> 263923 bytes docs/reference/amt_vs_idv.html | 4 +- docs/reference/append_suffix.html | 2 +- docs/reference/as.ctime.html | 2 +- docs/reference/as.nm.table.list.html | 2 +- docs/reference/as.xpdb.html | 2 +- docs/reference/as.xpose.plot.html | 2 +- docs/reference/as.xpose.theme.html | 2 +- docs/reference/check_plot_type.html | 2 +- docs/reference/check_problem.html | 2 +- docs/reference/check_quo_vars.html | 2 +- docs/reference/check_scales.html | 2 +- docs/reference/check_xpdb.html | 2 +- docs/reference/combine_tables.html | 2 +- docs/reference/data_opt.html | 2 +- docs/reference/default_plot_problem.html | 2 +- docs/reference/distrib_plot.html | 2 +- docs/reference/drop_fixed_cols.html | 2 +- docs/reference/dv_vs_pred.html | 6 +- docs/reference/edit_xpose_data.html | 2 +- docs/reference/fetch_data.html | 2 +- docs/reference/file_path.html | 2 +- docs/reference/filter_xp_theme.html | 2 +- docs/reference/get_code.html | 2 +- docs/reference/get_data.html | 2 +- docs/reference/get_extension.html | 2 +- docs/reference/get_file.html | 2 +- docs/reference/get_prm.html | 2 +- .../get_prm_transformation_formulas.html | 2 +- docs/reference/get_special.html | 2 +- docs/reference/get_summary.html | 2 +- docs/reference/gg_themes.html | 6 +- docs/reference/grab_iter.html | 2 +- docs/reference/ind_plots.html | 2 +- docs/reference/index.html | 2 +- docs/reference/index_table.html | 2 +- docs/reference/irep.html | 2 +- docs/reference/is.formula.html | 2 +- docs/reference/is.nm.model.html | 2 +- docs/reference/is.nm.table.list.html | 2 +- docs/reference/is.xpdb.html | 2 +- docs/reference/is.xpose.plot.html | 2 +- docs/reference/is.xpose.theme.html | 2 +- docs/reference/last_data_problem.html | 2 +- docs/reference/last_file_method.html | 2 +- docs/reference/last_file_problem.html | 2 +- docs/reference/last_file_subprob.html | 2 +- docs/reference/list_nm_tables.html | 2 +- docs/reference/list_nm_tables_manual.html | 2 +- docs/reference/list_vars.html | 2 +- docs/reference/list_xpdb.html | 2 +- docs/reference/make_extension.html | 2 +- docs/reference/manual_nm_import.html | 2 +- docs/reference/merge_firstonly.html | 2 +- docs/reference/minimization_plots.html | 8 +- docs/reference/modify_xpdb.html | 6 +- docs/reference/msg.html | 2 +- docs/reference/only_distinct.html | 2 +- docs/reference/only_obs.html | 2 +- docs/reference/parse_arg.html | 2 +- docs/reference/parse_nm_files.html | 2 +- docs/reference/parse_title.html | 2 +- docs/reference/pred_vs_idv.html | 10 +- docs/reference/print.xpose_data.html | 2 +- docs/reference/print.xpose_plot.html | 6 +- docs/reference/prm_table.html | 2 +- docs/reference/qq_plot.html | 2 +- docs/reference/raw_to_tibble.html | 2 +- docs/reference/read_args.html | 2 +- docs/reference/read_funs.html | 2 +- docs/reference/read_nm_files.html | 2 +- docs/reference/read_nm_model.html | 2 +- docs/reference/read_nm_tables.html | 2 +- docs/reference/reexports.html | 2 +- docs/reference/reorder_factors.html | 2 +- docs/reference/res_vs_idv.html | 6 +- docs/reference/res_vs_pred.html | 6 +- docs/reference/set_vars.html | 2 +- docs/reference/software.html | 2 +- docs/reference/subset_xpdb.html | 8 +- docs/reference/summarise_xpdb.html | 2 +- docs/reference/summary.xpose_data.html | 2 +- docs/reference/template_titles.html | 6 +- docs/reference/tidyr_new_interface.html | 2 +- docs/reference/transform_prm.html | 2 +- docs/reference/update_args.html | 2 +- docs/reference/update_extension.html | 2 +- docs/reference/update_themes.html | 6 +- docs/reference/vpc.html | 2 +- docs/reference/vpc_data.html | 2 +- docs/reference/vpc_opt.html | 2 +- docs/reference/xp_geoms.html | 2 +- docs/reference/xp_map.html | 2 +- docs/reference/xp_themes.html | 6 +- docs/reference/xp_var.html | 2 +- docs/reference/xpdb_ex_pk.html | 2 +- docs/reference/xpdb_index_update.html | 2 +- docs/reference/xplot_distrib.html | 2 +- docs/reference/xplot_qq.html | 2 +- docs/reference/xplot_scatter.html | 4 +- docs/reference/xpose-package.html | 2 +- docs/reference/xpose_data.html | 2 +- docs/reference/xpose_panels.html | 2 +- docs/reference/xpose_save.html | 2 +- 141 files changed, 7817 insertions(+), 4962 deletions(-) create mode 100644 docs/articles/interactive_plots_files/crosstalk-1.1.0.1/css/crosstalk.css create mode 100644 docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js create mode 100644 docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.js.map create mode 100644 docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.min.js create mode 100644 docs/articles/interactive_plots_files/crosstalk-1.1.0.1/js/crosstalk.min.js.map create mode 100644 docs/articles/interactive_plots_files/plotly-binding-4.9.2/plotly.js create mode 100644 docs/articles/interactive_plots_files/plotly-htmlwidgets-css-1.52.2/plotly-htmlwidgets.css create mode 100644 docs/articles/interactive_plots_files/plotly-main-1.52.2/plotly-latest.min.js diff --git a/docs/404.html b/docs/404.html index 8a2fae17..ce9bfcdb 100644 --- a/docs/404.html +++ b/docs/404.html @@ -78,7 +78,7 @@ xpose - 0.4.7 + 0.4.8 diff --git a/docs/CODE_OF_CONDUCT.html b/docs/CODE_OF_CONDUCT.html index f9f27c8b..b8be45c9 100644 --- a/docs/CODE_OF_CONDUCT.html +++ b/docs/CODE_OF_CONDUCT.html @@ -78,7 +78,7 @@ xpose - 0.4.7 + 0.4.8 diff --git a/docs/CONTRIBUTING.html b/docs/CONTRIBUTING.html index f354c5de..3af76d13 100644 --- a/docs/CONTRIBUTING.html +++ b/docs/CONTRIBUTING.html @@ -78,7 +78,7 @@ xpose - 0.4.7 + 0.4.8 @@ -198,7 +198,7 @@