{"version":3,"file":"handsontable.js","sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 03ea9f8d68c97ab90c39","webpack:///src/helpers/dom/element.js","webpack:///src/helpers/array.js","webpack:///src/helpers/object.js","webpack:///./~/core-js/modules/_export.js","webpack:///src/eventManager.js","webpack:///src/plugins.js","webpack:///src/helpers/number.js","webpack:///src/helpers/dom/event.js","webpack:///src/pluginHooks.js","webpack:///src/renderers/index.js","webpack:///./~/core-js/modules/_wks.js","webpack:///src/3rdparty/walkontable/src/index.js","webpack:///src/plugins/_base.js","webpack:///./~/core-js/modules/_global.js","webpack:///src/editors/index.js","webpack:///./~/core-js/modules/_is-object.js","webpack:///src/helpers/unicode.js","webpack:///src/plugins/contextMenu/utils.js","webpack:///./~/core-js/modules/_an-object.js","webpack:///./~/core-js/modules/_object-dp.js","webpack:///src/helpers/mixed.js","webpack:///./~/core-js/modules/_descriptors.js","webpack:///./~/core-js/modules/_has.js","webpack:///./~/core-js/modules/_to-iobject.js","webpack:///./~/core-js/modules/_to-length.js","webpack:///src/helpers/browser.js","webpack:///src/validators/index.js","webpack:///src/helpers/string.js","webpack:///src/3rdparty/walkontable/src/overlay/_base.js","webpack:///./~/core-js/modules/_ctx.js","webpack:///./~/core-js/modules/_defined.js","webpack:///./~/core-js/modules/_fails.js","webpack:///./~/core-js/modules/_hide.js","webpack:///./~/core-js/modules/_redefine.js","webpack:///src/helpers/feature.js","webpack:///src/helpers/function.js","webpack:///src/editors/_baseEditor.js","webpack:///./~/core-js/modules/_add-to-unscopables.js","webpack:///./~/core-js/modules/_cof.js","webpack:///./~/core-js/modules/_object-keys.js","webpack:///./~/core-js/modules/_property-desc.js","webpack:///./~/core-js/modules/_to-object.js","webpack:///src/3rdparty/walkontable/src/cell/coords.js","webpack:///src/editors/textEditor.js","webpack:///./~/core-js/modules/_core.js","webpack:///./~/core-js/modules/_iterators.js","webpack:///./~/core-js/modules/_meta.js","webpack:///./~/core-js/modules/_object-pie.js","webpack:///./~/core-js/modules/_set-to-string-tag.js","webpack:///./~/core-js/modules/_uid.js","webpack:///src/plugins/contextMenu/predefinedItems.js","webpack:///src/utils/staticRegister.js","webpack:///./~/core-js/modules/_an-instance.js","webpack:///./~/core-js/modules/_array-methods.js","webpack:///./~/core-js/modules/_collection.js","webpack:///./~/core-js/modules/_fix-re-wks.js","webpack:///./~/core-js/modules/_for-of.js","webpack:///./~/core-js/modules/_library.js","webpack:///./~/core-js/modules/_object-gops.js","webpack:///./~/core-js/modules/_redefine-all.js","webpack:///./~/core-js/modules/_to-index.js","webpack:///./~/core-js/modules/_to-integer.js","webpack:///external {\"root\":\"moment\",\"commonjs2\":\"moment\",\"commonjs\":\"moment\",\"amd\":\"moment\"}","webpack:///src/cellTypes/index.js","webpack:///src/core.js","webpack:///src/helpers/data.js","webpack:///src/helpers/setting.js","webpack:///src/utils/ghostTable.js","webpack:///./~/core-js/modules/es6.array.iterator.js","webpack:///src/3rdparty/walkontable/src/cell/range.js","webpack:///src/plugins/contextMenu/predefinedItems/separator.js","webpack:///./~/core-js/modules/_a-function.js","webpack:///./~/core-js/modules/_create-property.js","webpack:///./~/core-js/modules/_dom-create.js","webpack:///./~/core-js/modules/_enum-bug-keys.js","webpack:///./~/core-js/modules/_fails-is-regexp.js","webpack:///./~/core-js/modules/_iobject.js","webpack:///./~/core-js/modules/_iter-detect.js","webpack:///./~/core-js/modules/_object-create.js","webpack:///./~/core-js/modules/_object-gopd.js","webpack:///./~/core-js/modules/_object-gopn.js","webpack:///./~/core-js/modules/_shared-key.js","webpack:///./~/core-js/modules/_shared.js","webpack:///./~/core-js/modules/_string-context.js","webpack:///./~/core-js/modules/_task.js","webpack:///./~/core-js/modules/_to-primitive.js","webpack:///external {\"root\":\"numbro\",\"commonjs2\":\"numbro\",\"commonjs\":\"numbro\",\"amd\":\"numbro\"}","webpack:///src/defaultSettings.js","webpack:///src/helpers/date.js","webpack:///./~/core-js/modules/es6.array.copy-within.js","webpack:///./~/core-js/modules/es6.array.fill.js","webpack:///./~/core-js/modules/es6.array.find-index.js","webpack:///./~/core-js/modules/es6.array.find.js","webpack:///./~/core-js/modules/es6.array.from.js","webpack:///./~/core-js/modules/es6.array.of.js","webpack:///./~/core-js/modules/es6.function.name.js","webpack:///./~/core-js/modules/es6.map.js","webpack:///./~/core-js/modules/es6.number.epsilon.js","webpack:///./~/core-js/modules/es6.number.is-finite.js","webpack:///./~/core-js/modules/es6.number.is-integer.js","webpack:///./~/core-js/modules/es6.number.is-nan.js","webpack:///./~/core-js/modules/es6.number.is-safe-integer.js","webpack:///./~/core-js/modules/es6.number.max-safe-integer.js","webpack:///./~/core-js/modules/es6.number.min-safe-integer.js","webpack:///./~/core-js/modules/es6.object.assign.js","webpack:///./~/core-js/modules/es6.object.is.js","webpack:///./~/core-js/modules/es6.object.set-prototype-of.js","webpack:///./~/core-js/modules/es6.promise.js","webpack:///./~/core-js/modules/es6.regexp.flags.js","webpack:///./~/core-js/modules/es6.regexp.match.js","webpack:///./~/core-js/modules/es6.regexp.replace.js","webpack:///./~/core-js/modules/es6.regexp.search.js","webpack:///./~/core-js/modules/es6.regexp.split.js","webpack:///./~/core-js/modules/es6.set.js","webpack:///./~/core-js/modules/es6.string.code-point-at.js","webpack:///./~/core-js/modules/es6.string.ends-with.js","webpack:///./~/core-js/modules/es6.string.from-code-point.js","webpack:///./~/core-js/modules/es6.string.includes.js","webpack:///./~/core-js/modules/es6.string.raw.js","webpack:///./~/core-js/modules/es6.string.repeat.js","webpack:///./~/core-js/modules/es6.string.starts-with.js","webpack:///./~/core-js/modules/es6.symbol.js","webpack:///./~/core-js/modules/es6.weak-map.js","webpack:///./~/core-js/modules/es6.weak-set.js","webpack:///./~/core-js/modules/es7.array.includes.js","webpack:///./~/core-js/modules/es7.object.entries.js","webpack:///./~/core-js/modules/es7.object.get-own-property-descriptors.js","webpack:///./~/core-js/modules/es7.object.values.js","webpack:///./~/core-js/modules/es7.string.pad-end.js","webpack:///./~/core-js/modules/es7.string.pad-start.js","webpack:///./~/core-js/modules/web.dom.iterable.js","webpack:///./~/core-js/modules/web.immediate.js","webpack:///lib/SheetClip/SheetClip.js","webpack:///lib/jsonpatch/json-patch-duplex.js","webpack:///src/3rdparty/walkontable/src/border.js","webpack:///src/3rdparty/walkontable/src/calculator/viewportColumns.js","webpack:///src/3rdparty/walkontable/src/calculator/viewportRows.js","webpack:///src/3rdparty/walkontable/src/core.js","webpack:///src/3rdparty/walkontable/src/event.js","webpack:///src/3rdparty/walkontable/src/filter/column.js","webpack:///src/3rdparty/walkontable/src/filter/row.js","webpack:///src/3rdparty/walkontable/src/overlays.js","webpack:///src/3rdparty/walkontable/src/scroll.js","webpack:///src/3rdparty/walkontable/src/settings.js","webpack:///src/3rdparty/walkontable/src/table.js","webpack:///src/3rdparty/walkontable/src/tableRenderer.js","webpack:///src/3rdparty/walkontable/src/viewport.js","webpack:///src/editors/autocompleteEditor.js","webpack:///src/editors/handsontableEditor.js","webpack:///src/mixins/arrayMapper.js","webpack:///src/mixins/localHooks.js","webpack:///src/plugins/manualColumnMove/ui/_base.js","webpack:///src/plugins/manualRowMove/ui/_base.js","webpack:///src/utils/recordTranslator.js","webpack:///src/utils/samplesGenerator.js","webpack:///./~/core-js/modules/_array-includes.js","webpack:///./~/core-js/modules/_classof.js","webpack:///./~/core-js/modules/_collection-strong.js","webpack:///./~/core-js/modules/_collection-weak.js","webpack:///./~/core-js/modules/_html.js","webpack:///./~/core-js/modules/_ie8-dom-define.js","webpack:///./~/core-js/modules/_is-array-iter.js","webpack:///./~/core-js/modules/_is-array.js","webpack:///./~/core-js/modules/_is-integer.js","webpack:///./~/core-js/modules/_is-regexp.js","webpack:///./~/core-js/modules/_iter-call.js","webpack:///./~/core-js/modules/_iter-define.js","webpack:///./~/core-js/modules/_iter-step.js","webpack:///./~/core-js/modules/_object-assign.js","webpack:///./~/core-js/modules/_object-keys-internal.js","webpack:///./~/core-js/modules/_object-to-array.js","webpack:///./~/core-js/modules/_set-proto.js","webpack:///./~/core-js/modules/_set-species.js","webpack:///./~/core-js/modules/_string-pad.js","webpack:///./~/core-js/modules/_string-repeat.js","webpack:///./~/core-js/modules/_wks-ext.js","webpack:///./~/core-js/modules/core.get-iterator-method.js","webpack:///src/helpers/wrappers/jquery.js","webpack:///src/plugins/index.js","webpack:///./src/css/bootstrap.css","webpack:///./src/css/handsontable.css","webpack:///./src/css/mobile.handsontable.css","webpack:///lib/autoResize/autoResize.js","webpack:///lib/copyPaste/copyPaste.js","webpack:///src/3rdparty/walkontable/src/overlay/debug.js","webpack:///src/3rdparty/walkontable/src/overlay/left.js","webpack:///src/3rdparty/walkontable/src/overlay/top.js","webpack:///src/3rdparty/walkontable/src/overlay/topLeftCorner.js","webpack:///src/3rdparty/walkontable/src/selection.js","webpack:///src/cellTypes/autocompleteType.js","webpack:///src/cellTypes/checkboxType.js","webpack:///src/cellTypes/dateType.js","webpack:///src/cellTypes/dropdownType.js","webpack:///src/cellTypes/handsontableType.js","webpack:///src/cellTypes/numericType.js","webpack:///src/cellTypes/passwordType.js","webpack:///src/cellTypes/textType.js","webpack:///src/cellTypes/timeType.js","webpack:///src/dataMap.js","webpack:///src/dataSource.js","webpack:///src/editorManager.js","webpack:///src/editors/checkboxEditor.js","webpack:///src/editors/dateEditor.js","webpack:///src/editors/dropdownEditor.js","webpack:///src/editors/mobileTextEditor.js","webpack:///src/editors/numericEditor.js","webpack:///src/editors/passwordEditor.js","webpack:///src/editors/selectEditor.js","webpack:///src/index.js","webpack:///src/multiMap.js","webpack:///src/plugins/autoColumnSize/autoColumnSize.js","webpack:///src/plugins/autoRowSize/autoRowSize.js","webpack:///src/plugins/autofill/autofill.js","webpack:///src/plugins/autofill/utils.js","webpack:///src/plugins/columnSorting/columnSorting.js","webpack:///src/plugins/comments/commentEditor.js","webpack:///src/plugins/comments/comments.js","webpack:///src/plugins/contextMenu/commandExecutor.js","webpack:///src/plugins/contextMenu/contextMenu.js","webpack:///src/plugins/contextMenu/cursor.js","webpack:///src/plugins/contextMenu/itemsFactory.js","webpack:///src/plugins/contextMenu/menu.js","webpack:///src/plugins/contextMenu/predefinedItems/alignment.js","webpack:///src/plugins/contextMenu/predefinedItems/clearColumn.js","webpack:///src/plugins/contextMenu/predefinedItems/columnLeft.js","webpack:///src/plugins/contextMenu/predefinedItems/columnRight.js","webpack:///src/plugins/contextMenu/predefinedItems/readOnly.js","webpack:///src/plugins/contextMenu/predefinedItems/redo.js","webpack:///src/plugins/contextMenu/predefinedItems/removeColumn.js","webpack:///src/plugins/contextMenu/predefinedItems/removeRow.js","webpack:///src/plugins/contextMenu/predefinedItems/rowAbove.js","webpack:///src/plugins/contextMenu/predefinedItems/rowBelow.js","webpack:///src/plugins/contextMenu/predefinedItems/undo.js","webpack:///src/plugins/contextMenuCopyPaste/contextMenuCopyPaste.js","webpack:///src/plugins/copyPaste/copyPaste.js","webpack:///src/plugins/customBorders/customBorders.js","webpack:///src/plugins/dragToScroll/dragToScroll.js","webpack:///src/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js","webpack:///src/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js","webpack:///src/plugins/manualColumnFreeze/manualColumnFreeze.js","webpack:///src/plugins/manualColumnMove/columnsMapper.js","webpack:///src/plugins/manualColumnMove/manualColumnMove.js","webpack:///src/plugins/manualColumnMove/ui/backlight.js","webpack:///src/plugins/manualColumnMove/ui/guideline.js","webpack:///src/plugins/manualColumnResize/manualColumnResize.js","webpack:///src/plugins/manualRowMove/manualRowMove.js","webpack:///src/plugins/manualRowMove/rowsMapper.js","webpack:///src/plugins/manualRowMove/ui/backlight.js","webpack:///src/plugins/manualRowMove/ui/guideline.js","webpack:///src/plugins/manualRowResize/manualRowResize.js","webpack:///src/plugins/mergeCells/mergeCells.js","webpack:///src/plugins/multipleSelectionHandles/multipleSelectionHandles.js","webpack:///src/plugins/observeChanges/dataObserver.js","webpack:///src/plugins/observeChanges/observeChanges.js","webpack:///src/plugins/observeChanges/utils.js","webpack:///src/plugins/persistentState/persistentState.js","webpack:///src/plugins/search/search.js","webpack:///src/plugins/touchScroll/touchScroll.js","webpack:///src/plugins/undoRedo/undoRedo.js","webpack:///src/renderers/_cellDecorator.js","webpack:///src/renderers/autocompleteRenderer.js","webpack:///src/renderers/checkboxRenderer.js","webpack:///src/renderers/htmlRenderer.js","webpack:///src/renderers/numericRenderer.js","webpack:///src/renderers/passwordRenderer.js","webpack:///src/renderers/textRenderer.js","webpack:///src/tableView.js","webpack:///src/utils/dataStructures/linkedList.js","webpack:///src/utils/interval.js","webpack:///src/utils/sortingAlgorithms/mergeSort.js","webpack:///src/validators/autocompleteValidator.js","webpack:///src/validators/dateValidator.js","webpack:///src/validators/numericValidator.js","webpack:///src/validators/timeValidator.js","webpack:///./~/core-js/modules/_array-copy-within.js","webpack:///./~/core-js/modules/_array-fill.js","webpack:///./~/core-js/modules/_array-species-constructor.js","webpack:///./~/core-js/modules/_array-species-create.js","webpack:///./~/core-js/modules/_enum-keys.js","webpack:///./~/core-js/modules/_flags.js","webpack:///./~/core-js/modules/_inherit-if-required.js","webpack:///./~/core-js/modules/_invoke.js","webpack:///./~/core-js/modules/_iter-create.js","webpack:///./~/core-js/modules/_keyof.js","webpack:///./~/core-js/modules/_microtask.js","webpack:///./~/core-js/modules/_object-dps.js","webpack:///./~/core-js/modules/_object-gopn-ext.js","webpack:///./~/core-js/modules/_object-gpo.js","webpack:///./~/core-js/modules/_own-keys.js","webpack:///./~/core-js/modules/_same-value.js","webpack:///./~/core-js/modules/_species-constructor.js","webpack:///./~/core-js/modules/_string-at.js","webpack:///./~/core-js/modules/_wks-define.js","webpack:///./src/plugins/comments/comments.css","webpack:///./src/plugins/contextMenu/contextMenu.css","webpack:///./src/plugins/manualColumnFreeze/manualColumnFreeze.css","webpack:///./src/plugins/manualColumnMove/manualColumnMove.css","webpack:///./src/plugins/manualRowMove/manualRowMove.css","webpack:///external {\"root\":\"Pikaday\",\"commonjs2\":\"pikaday\",\"commonjs\":\"pikaday\",\"amd\":\"pikaday\"}","webpack:///external {\"root\":\"ZeroClipboard\",\"commonjs2\":\"zeroclipboard\",\"commonjs\":\"zeroclipboard\",\"amd\":\"zeroclipboard\"}"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"), require(\"zeroclipboard\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Handsontable\", [\"moment\", \"numbro\", \"pikaday\", \"zeroclipboard\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handsontable\"] = factory(require(\"moment\"), require(\"numbro\"), require(\"pikaday\"), require(\"zeroclipboard\"));\n\telse\n\t\troot[\"Handsontable\"] = factory(root[\"moment\"], root[\"numbro\"], root[\"Pikaday\"], root[\"ZeroClipboard\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_62__, __WEBPACK_EXTERNAL_MODULE_86__, __WEBPACK_EXTERNAL_MODULE_299__, __WEBPACK_EXTERNAL_MODULE_300__) {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmony imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 209);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 03ea9f8d68c97ab90c39","import {isIE8, isIE9, isSafari} from '../browser';\nimport {hasCaptionProblem} from '../feature';\n\n/**\n * Get the parent of the specified node in the DOM tree.\n *\n * @param {HTMLElement} element Element from which traversing is started.\n * @param {Number} [level=0] Traversing deep level.\n * @return {HTMLElement|null}\n */\nexport function getParent(element, level = 0) {\n let iteration = -1;\n let parent = null;\n\n while (element != null) {\n if (iteration === level) {\n parent = element;\n break;\n }\n\n if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n element = element.host;\n\n } else {\n iteration++;\n element = element.parentNode;\n }\n }\n\n return parent;\n}\n\n/**\n * Goes up the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n * This method goes up through web components.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nexport function closest(element, nodes, until) {\n while (element != null && element !== until) {\n if (element.nodeType === Node.ELEMENT_NODE && (nodes.indexOf(element.nodeName) > -1 || nodes.indexOf(element) > -1)) {\n return element;\n }\n if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n element = element.host;\n\n } else {\n element = element.parentNode;\n }\n }\n\n return null;\n}\n\n/**\n * Goes \"down\" the DOM tree (including given element) until it finds an element that matches the nodes or nodes name.\n *\n * @param {HTMLElement} element Element from which traversing is started\n * @param {Array} nodes Array of elements or Array of elements name\n * @param {HTMLElement} [until]\n * @returns {HTMLElement|null}\n */\nexport function closestDown(element, nodes, until) {\n const matched = [];\n\n while (element) {\n element = closest(element, nodes, until);\n\n if (!element || (until && !until.contains(element))) {\n break;\n }\n matched.push(element);\n\n if (element.host && element.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n element = element.host;\n\n } else {\n element = element.parentNode;\n }\n }\n const length = matched.length;\n\n return length ? matched[length - 1] : null;\n}\n\n/**\n * Goes up the DOM tree and checks if element is child of another element.\n *\n * @param child Child element\n * @param {Object|String} parent Parent element OR selector of the parent element.\n * If string provided, function returns `true` for the first occurrence of element with that class.\n * @returns {Boolean}\n */\nexport function isChildOf(child, parent) {\n var node = child.parentNode;\n var queriedParents = [];\n\n if (typeof parent === 'string') {\n queriedParents = Array.prototype.slice.call(document.querySelectorAll(parent), 0);\n } else {\n queriedParents.push(parent);\n }\n\n while (node != null) {\n if (queriedParents.indexOf(node) > -1) {\n return true;\n }\n node = node.parentNode;\n }\n\n return false;\n}\n\n/**\n * Check if an element is part of `hot-table` web component.\n *\n * @param {Element} element\n * @returns {Boolean}\n */\nexport function isChildOfWebComponentTable(element) {\n var hotTableName = 'hot-table',\n result = false,\n parentNode;\n\n parentNode = polymerWrap(element);\n\n function isHotTable(element) {\n return element.nodeType === Node.ELEMENT_NODE && element.nodeName === hotTableName.toUpperCase();\n }\n\n while (parentNode != null) {\n if (isHotTable(parentNode)) {\n result = true;\n break;\n } else if (parentNode.host && parentNode.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n result = isHotTable(parentNode.host);\n\n if (result) {\n break;\n }\n parentNode = parentNode.host;\n }\n parentNode = parentNode.parentNode;\n }\n\n return result;\n}\n\n/**\n * Wrap element into polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nexport function polymerWrap(element) {\n /* global Polymer */\n return typeof Polymer !== 'undefined' && typeof wrap === 'function' ? wrap(element) : element;\n}\n\n/**\n * Unwrap element from polymer/webcomponent container if exists\n *\n * @param element\n * @returns {*}\n */\nexport function polymerUnwrap(element) {\n /* global Polymer */\n return typeof Polymer !== 'undefined' && typeof unwrap === 'function' ? unwrap(element) : element;\n}\n\n/**\n * Counts index of element within its parent\n * WARNING: for performance reasons, assumes there are only element nodes (no text nodes). This is true for Walkotnable\n * Otherwise would need to check for nodeType or use previousElementSibling\n *\n * @see http://jsperf.com/sibling-index/10\n * @param {Element} element\n * @return {Number}\n */\nexport function index(element) {\n var i = 0;\n\n if (element.previousSibling) {\n /* eslint-disable no-cond-assign */\n while (element = element.previousSibling) {\n ++i;\n }\n }\n\n return i;\n}\n\n/**\n * Check if the provided overlay contains the provided element\n *\n * @param {String} overlay\n * @param {HTMLElement} element\n * @returns {boolean}\n */\nexport function overlayContainsElement(overlayType, element) {\n let overlayElement = document.querySelector(`.ht_clone_${overlayType}`);\n return overlayElement ? overlayElement.contains(element) : null;\n}\n\nvar classListSupport = !!document.documentElement.classList;\nvar _hasClass,\n _addClass,\n _removeClass;\n\nfunction filterEmptyClassNames(classNames) {\n var len = 0,\n result = [];\n\n if (!classNames || !classNames.length) {\n return result;\n }\n while (classNames[len]) {\n result.push(classNames[len]);\n len++;\n }\n\n return result;\n}\n\nif (classListSupport) {\n var isSupportMultipleClassesArg = (function() {\n var element = document.createElement('div');\n\n element.classList.add('test', 'test2');\n\n return element.classList.contains('test2');\n }());\n\n _hasClass = function _hasClass(element, className) {\n if (className === '') {\n return false;\n }\n\n return element.classList.contains(className);\n };\n\n _addClass = function _addClass(element, className) {\n var len = 0;\n\n if (typeof className === 'string') {\n className = className.split(' ');\n }\n className = filterEmptyClassNames(className);\n\n if (isSupportMultipleClassesArg) {\n element.classList.add.apply(element.classList, className);\n\n } else {\n while (className && className[len]) {\n element.classList.add(className[len]);\n len++;\n }\n }\n };\n\n _removeClass = function _removeClass(element, className) {\n var len = 0;\n\n if (typeof className === 'string') {\n className = className.split(' ');\n }\n className = filterEmptyClassNames(className);\n\n if (isSupportMultipleClassesArg) {\n element.classList.remove.apply(element.classList, className);\n\n } else {\n while (className && className[len]) {\n element.classList.remove(className[len]);\n len++;\n }\n }\n };\n\n} else {\n var createClassNameRegExp = function createClassNameRegExp(className) {\n return new RegExp(`(\\\\s|^)${className}(\\\\s|$)`);\n };\n\n _hasClass = function _hasClass(element, className) {\n // http://snipplr.com/view/3561/addclass-removeclass-hasclass/\n return !!element.className.match(createClassNameRegExp(className));\n };\n\n _addClass = function _addClass(element, className) {\n var len = 0,\n _className = element.className;\n\n if (typeof className === 'string') {\n className = className.split(' ');\n }\n if (_className === '') {\n _className = className.join(' ');\n\n } else {\n while (className && className[len]) {\n if (!createClassNameRegExp(className[len]).test(_className)) {\n _className += ` ${className[len]}`;\n }\n len++;\n }\n }\n element.className = _className;\n };\n\n _removeClass = function _removeClass(element, className) {\n var len = 0,\n _className = element.className;\n\n if (typeof className === 'string') {\n className = className.split(' ');\n }\n while (className && className[len]) {\n // String.prototype.trim is defined in polyfill.js\n _className = _className.replace(createClassNameRegExp(className[len]), ' ').trim();\n len++;\n }\n if (element.className !== _className) {\n element.className = _className;\n }\n };\n}\n\n/**\n * Checks if element has class name\n *\n * @param {HTMLElement} element\n * @param {String} className Class name to check\n * @returns {Boolean}\n */\nexport function hasClass(element, className) {\n return _hasClass(element, className);\n}\n\n/**\n * Add class name to an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nexport function addClass(element, className) {\n return _addClass(element, className);\n}\n\n/**\n * Remove class name from an element\n *\n * @param {HTMLElement} element\n * @param {String|Array} className Class name as string or array of strings\n */\nexport function removeClass(element, className) {\n return _removeClass(element, className);\n}\n\nexport function removeTextNodes(element, parent) {\n if (element.nodeType === 3) {\n parent.removeChild(element); // bye text nodes!\n\n } else if (['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR'].indexOf(element.nodeName) > -1) {\n var childs = element.childNodes;\n for (var i = childs.length - 1; i >= 0; i--) {\n removeTextNodes(childs[i], element);\n }\n }\n}\n\n/**\n * Remove childs function\n * WARNING - this doesn't unload events and data attached by jQuery\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9\n * http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method\n *\n * @param element\n * @returns {void}\n */\n//\nexport function empty(element) {\n var child;\n /* eslint-disable no-cond-assign */\n while (child = element.lastChild) {\n element.removeChild(child);\n }\n}\n\nexport const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;\n\n/**\n * Insert content into element trying avoid innerHTML method.\n * @return {void}\n */\nexport function fastInnerHTML(element, content) {\n if (HTML_CHARACTERS.test(content)) {\n element.innerHTML = content;\n } else {\n fastInnerText(element, content);\n }\n}\n\n/**\n * Insert text content into element\n * @return {void}\n */\n\nvar textContextSupport = !!document.createTextNode('test').textContent;\n\nexport function fastInnerText(element, content) {\n var child = element.firstChild;\n\n if (child && child.nodeType === 3 && child.nextSibling === null) {\n // fast lane - replace existing text node\n\n if (textContextSupport) {\n // http://jsperf.com/replace-text-vs-reuse\n child.textContent = content;\n } else {\n // http://jsperf.com/replace-text-vs-reuse\n child.data = content;\n }\n } else {\n // slow lane - empty element and insert a text node\n empty(element);\n element.appendChild(document.createTextNode(content));\n }\n}\n\n/**\n * Returns true if element is attached to the DOM and visible, false otherwise\n * @param elem\n * @returns {boolean}\n */\nexport function isVisible(elem) {\n var next = elem;\n\n while (polymerUnwrap(next) !== document.documentElement) { // until reached\n if (next === null) { // parent detached from DOM\n return false;\n } else if (next.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n if (next.host) { // this is Web Components Shadow DOM\n // see: http://w3c.github.io/webcomponents/spec/shadow/#encapsulation\n // according to spec, should be if (next.ownerDocument !== window.document), but that doesn't work yet\n if (next.host.impl) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features disabled\n return isVisible(next.host.impl);\n\n } else if (next.host) { // Chrome 33.0.1723.0 canary (2013-11-29) Web Platform features enabled\n return isVisible(next.host);\n\n }\n throw new Error('Lost in Web Components world');\n\n } else {\n return false; // this is a node detached from document in IE8\n }\n } else if (next.style.display === 'none') {\n return false;\n }\n next = next.parentNode;\n }\n\n return true;\n}\n\n/**\n * Returns elements top and left offset relative to the document. Function is not compatible with jQuery offset.\n *\n * @param {HTMLElement} elem\n * @return {Object} Returns object with `top` and `left` props\n */\nexport function offset(elem) {\n var offsetLeft,\n offsetTop,\n lastElem,\n docElem,\n box;\n\n docElem = document.documentElement;\n\n if (hasCaptionProblem() && elem.firstChild && elem.firstChild.nodeName === 'CAPTION') {\n // fixes problem with Firefox ignoring