{"version":3,"sources":["webpack:///webpack/universalModuleDefinition?5ca6","webpack:///js/form.min.js","webpack:///webpack/bootstrap c14592c10d64a660ef67?8c09","webpack:///./src/main/util/Util.js?5bc4","webpack:///./src/main/util/Settings.js?b01f","webpack:///./src/main/util/Event.js?68bf","webpack:///./src/main/DestroyableWidget.js?8d9b","webpack:///./src/main/Tooltip.js?3890","webpack:///./src/main/Form.js?18a8","webpack:///./~/isomorphic-fetch/fetch-npm-browserify.js?7723","webpack:///./~/whatwg-fetch/fetch.js?1c20","webpack:///./src/main/modules/Form.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","global","_classCallCheck","instance","Constructor","TypeError","Object","defineProperty","value","_slicedToArray","sliceIterator","arr","i","_arr","_n","_d","_e","undefined","_s","_i","Symbol","iterator","next","done","push","length","err","Array","isArray","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","prototype","PFX","COL_LEFT_CLASS","COL_RIGHT_CLASS","COL_BOTTOM_CLASS","Util","element","type","callback","thisFunction","e","apply","thisType","toLowerCase","name","addEventListener","el","document","createElement","transitions","transition","OTransition","MozTransition","WebkitTransition","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","entries","_step$value","style","return","parent","now","parentNode","func","s4","Math","floor","random","toString","substring","doc","inner","width","height","outer","position","top","left","visibility","overflow","appendChild","body","w1","offsetWidth","w2","clientWidth","removeChild","ev","capture","event","removeEventListener","offsetHeight","str","replace","g","toUpperCase","input","JSON","parse","stringify","base","attrs","attributes","attr","s","dashToCamelCase","nodeName","val","nodeValue","hasOwnProperty","parseInt","elementToPosition","collisionContainer","centerHorizontal","positionTop","amountTop","amountLeft","parentsUntil","HTMLElement","window","getComputedStyle","isPartOfNode","offsetTop","offsetLeft","targetPosition","getBoundingClientRect","elementRect","colRect","targetTop","targetRight","right","isCollisionTop","isCollisionBottom","innerHeight","isCollisionLeft","targetLeft","isCollisionRight","classList","remove","calcTop","calcLeft","add","rightPosition","leftCentered","collisionCentered","cssText","optionalOffset","scrollIntoView","thisOffset","scrolledY","pageYOffset","scroll","default","_interopRequireDefault","obj","__esModule","_Util","_Util2","FLEXCSS_GLOBAL_SETTINGS","smallBreakpoint","touchMoveBreakpointOffCanvas","scrollbarUpdateNodes","darkenerFadeDelay","canvasToggledClass","FLEXCSS_CONST_IS_IOS","FLEXCSS_CONST_IS_TOUCH","FLEXCSS_CONST_IS_SAFARI","FLEXCSS_CONST_IS_IE","FLEXCSS_CONST_TAB_EVENT","FLEXCSS_IS_SMALL_SCREEN","init","FLEXCSS_CONST_SCROLLBAR_WIDTH","getScrollBarWidth","FLEXCSS_CONST_TRANSITION_EVENT","whichTransitionEndEvent","readyState","Settings","settings","assign","navigator","userAgent","match","test","innerWidth","get","msMaxTouchPoints","CustomEvent","params","thisParams","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","superPreventDefault","preventDefault","Event","EventHandler","defaultOptions","options","withDetail","originalEvent","o","dispatchEvent","withOptions","fire","DestroyableWidget","listeners","forEach","listener","args","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","_DestroyableWidget2","_DestroyableWidget3","_Settings","_Settings2","CLASS_NAMES_TOOLTIP","CLASS_NAMES_OPEN","ATTR_DATA_CLASSNAME","ATTR_DATA_NO_TOUCH","Tooltip","_DestroyableWidget","DelegateContainer","_this","container","getElementById","Error","tooltipContainer","containerClass","selectorAttribute","text","removeTitle","positionRelative","trim","isTouchDevice","hasAttribute","_restoreClassNames","innerHTML","flexTooltipCurrentTarget","oldTitle","removeAttribute","setupPositionNearby","classNames","maybeTargetClass","getAttribute","className","join","selfTarget","setAttribute","createTooltip","removeTooltip","EVENT_FORM_AJAX_COMPLETED","EVENT_FORM_AFTER_AJAX_SUBMIT","EVENT_FORM_SUBMIT","EVENT_FORM_READY","_Tooltip","_Tooltip2","_Event","_Event2","LOADING_CLASS","DATA_ELEMENT_INVALID","REMOTE","REMOTE_ACTION","ATTR_DISABLE_INLINE","ATTR_DISABLE_REALTIME","ATTR_VALIDATOR","ATTR_DATA_CUSTOM_MESSAGE","ATTR_DATA_CUSTOM_LABEL","ATTR_VALIDATE_VISIBILITY","ATTR_ERROR_TARGET_ID","ATTR_DEPENDS","CONST_USE_JSON","CONST_REALTIME_EVENT","FOCUS_TOOLTIP_DELAY","CLICK_TOOLTIP_DELAY","Form","form","HTMLFormElement","tooltips","currentValidationFuture","Promise","createTooltips","appendError","ajaxSubmitType","ajaxJsonContentType","inlineValidation","realtime","realtimeTimeout","formatErrorTooltip","error","inputErrorClass","containerErrorClass","fetchOptions","credentials","tooltipOptions","shouldScrollToElement","scrollToElementDiff","applyOptionsFromElement","hfWidgetInstance","_validators","globalValidators","_remoteValidationFunction","initFormValidation","destroy","thisForm","shouldUseAjax","ajaxPostUrl","location","href","useJson","dispatch","withOriginal","defaultPrevented","_formStopLoading","submit","defaultHeaders","X-Requested-With","Content-Type","headers","method","serverCall","fetch","serialize","FormData","then","r","globalRemoteValidationFunction","response","selectors","inputs","querySelectorAll","result","exists","field","focus","_this2","fields","NodeList","_handleValidation","foundAnyError","toValidateFields","scoped","_createArrayFromInvalidFieldList","isLocalInvalid","_focusElement","validation","_customValidationsForElements","validateCustomFields","thisToValidateFields","from","concat","checkedFields","foundInvalidFields","prepareErrors","firstInvalidField","activeElement","_handleTooltipHideClickAfterChange","showAndOrCreateTooltip","validity","globalErrorMessageHandler","_this3","keys","labels","getForm","invalid","labelsIndex","labelEl","_markElementInvalid","_markElementValid","filter","HTMLFieldSetElement","thisParent","errors","inputsWithErrorClasses","elementErrorIndex","inputErrorIndex","validator","validationRef","cl","future","futures","fieldsLength","iVal","_shouldNotValidateField","customError","valid","_runValidation","all","allFutures","l","fI","_removeElementErrors","removeAllErrors","handleAdditionalLabels","isInvalid","thisLabelGroup","additionalLabels","group","_this4","removeErrors","labelGroups","invalidFields","errorTarget","_findErrorTarget","flexFormsSavedValidity","_setupErrorMessages","msg","validationMessage","insertAdjacentHTML","flexFormsSavedValidationMessage","setCustomValidity","linkedFields","thisField","_isElementInvalidElement","_handleLabels","_formatErrorTooltip","fieldSelector","slice","_checkIsValidRealtimeElement","clearKeyDownTimeout","KEYDOWN_RUNNING","clearTimeout","TIMEOUT_KEYDOWN","_checkIsValidBlurFocusElement","_checkIsValidInlineCheckElement","_this5","invalidEvent","addEventOnce","handleInvalid","_formLoading","_checkIsInvalid","resolve","setTimeout","_handleSubmit","_formIsLoading","isStillTarget","_handleTooltipInline","dependentFields","_getDependentFields","flexcssKeepTooltips","_submitListener","dispatchAndFire","contains","getTabEvent","t","scrollToElement","submitListener","submitEvent","checkValidity","_getInvalidElements","firstError","_submitFunction","isVisible","list","n","foundTarget","errorFunc","selector","forms","instances","customMsg","bind","normalizeName","String","normalizeValue","iteratorFor","items","shift","support","iterable","Headers","map","append","getOwnPropertyNames","consumed","bodyUsed","reject","fileReaderReady","reader","onload","onerror","readBlobAsArrayBuffer","blob","FileReader","promise","readAsArrayBuffer","readBlobAsText","readAsText","readArrayBufferAsText","buf","view","Uint8Array","chars","fromCharCode","bufferClone","byteLength","set","buffer","Body","_initBody","_bodyInit","_bodyText","Blob","isPrototypeOf","_bodyBlob","formData","_bodyFormData","searchParams","URLSearchParams","arrayBuffer","isDataView","_bodyArrayBuffer","ArrayBuffer","isArrayBufferView","rejected","decode","json","normalizeMethod","upcased","methods","indexOf","Request","url","mode","referrer","split","bytes","decodeURIComponent","parseHeaders","rawHeaders","line","parts","Response","bodyInit","status","ok","statusText","viewClasses","DataView","isView","values","getAll","has","thisArg","clone","redirectStatuses","redirect","RangeError","request","xhr","XMLHttpRequest","getAllResponseHeaders","responseURL","responseText","ontimeout","open","withCredentials","responseType","setRequestHeader","send","polyfill","_Form","_Form2"],"mappings":"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","file":"js/form.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FlexCss\"] = factory();\n\telse\n\t\troot[\"FlexCss\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FlexCss\"] = factory();\n\telse\n\t\troot[\"FlexCss\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"../\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(18);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _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\"); } }; }();\n\t\n\tvar _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; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * The MIT License (MIT)\n\t *\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t */\n\t\n\tvar PFX = [\"webkit\", \"moz\", \"MS\", \"o\", \"\"];\n\t\n\tvar COL_LEFT_CLASS = 'is-collision-left';\n\t\n\tvar COL_RIGHT_CLASS = 'is-collision-right';\n\t\n\tvar COL_BOTTOM_CLASS = 'is-collision-bottom';\n\t\n\t/**\n\t * Provides shared DOM-Utility functions\n\t */\n\t\n\tvar Util = function () {\n\t    function Util() {\n\t        _classCallCheck(this, Util);\n\t    }\n\t\n\t    _createClass(Util, null, [{\n\t        key: \"prefixedAnimateEvent\",\n\t\n\t\n\t        /**\n\t         * Will register the right animation event based on browser\n\t         * @param element\n\t         * @param type\n\t         * @param callback\n\t         */\n\t        value: function prefixedAnimateEvent(element, type, callback) {\n\t            var thisFunction = function thisFunction(e) {\n\t                callback.apply(element, [e, thisFunction]);\n\t            };\n\t\n\t            for (var p = 0; p < PFX.length; p++) {\n\t                var thisType = type;\n\t                if (!PFX[p]) {\n\t                    thisType = type.toLowerCase();\n\t                }\n\t                var name = PFX[p] + thisType;\n\t                element.addEventListener(name, thisFunction, true);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Get correct transitionend event\n\t         * @returns {String}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: \"whichTransitionEndEvent\",\n\t        value: function whichTransitionEndEvent() {\n\t            var el = document.createElement('fake');\n\t\n\t            var transitions = {\n\t                transition: 'transitionend',\n\t                OTransition: 'oTransitionEnd',\n\t                MozTransition: 'transitionend',\n\t                WebkitTransition: 'webkitTransitionEnd'\n\t            };\n\t\n\t            var _iteratorNormalCompletion = true;\n\t            var _didIteratorError = false;\n\t            var _iteratorError = undefined;\n\t\n\t            try {\n\t                for (var _iterator = Object.entries(transitions)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n\t                    var _step$value = _slicedToArray(_step.value, 2),\n\t                        key = _step$value[0],\n\t                        value = _step$value[1];\n\t\n\t                    if (el.style[key] !== undefined) {\n\t                        return value;\n\t                    }\n\t                }\n\t            } catch (err) {\n\t                _didIteratorError = true;\n\t                _iteratorError = err;\n\t            } finally {\n\t                try {\n\t                    if (!_iteratorNormalCompletion && _iterator.return) {\n\t                        _iterator.return();\n\t                    }\n\t                } finally {\n\t                    if (_didIteratorError) {\n\t                        throw _iteratorError;\n\t                    }\n\t                }\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Check if target is part of parent node\n\t         * @param target\n\t         * @param parent\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: \"isPartOfNode\",\n\t        value: function isPartOfNode(target, parent) {\n\t            if (!target || !parent) {\n\t                return false;\n\t            }\n\t            var now = target;\n\t            while (now !== parent && now !== null) {\n\t                if (now === parent) {\n\t                    break;\n\t                }\n\t                now = now.parentNode;\n\t            }\n\t            return now !== null;\n\t        }\n\t\n\t        /**\n\t         * Finds the closest element including itself matching a callback\n\t         * @param {Node} el\n\t         * @param {Function} callback\n\t         * @returns {Node|boolean}\n\t         */\n\t\n\t    }, {\n\t        key: \"closestCallback\",\n\t        value: function closestCallback(el, callback) {\n\t            var element = el;\n\t            while (element !== null) {\n\t                if (callback(element)) {\n\t                    return element;\n\t                }\n\t                element = element.parentNode;\n\t            }\n\t            return false;\n\t        }\n\t\n\t        /**\n\t         * Walks the tree until func returns true for given argument\n\t         * @param target\n\t         * @param func\n\t         * @returns {boolean|HTMLElement}\n\t         */\n\t\n\t    }, {\n\t        key: \"parentsUntil\",\n\t        value: function parentsUntil(target, func) {\n\t            if (!target) {\n\t                return false;\n\t            }\n\t            var now = target;\n\t            while (!func(now) && now !== null) {\n\t                now = now.parentNode;\n\t            }\n\t\n\t            return now;\n\t        }\n\t\n\t        /**\n\t         * Generates a unique id\n\t         * @return {String}\n\t         */\n\t\n\t    }, {\n\t        key: \"guid\",\n\t        value: function guid() {\n\t            function s4() {\n\t                return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n\t            }\n\t\n\t            return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + (s4() + s4() + s4());\n\t        }\n\t\n\t        /**\n\t         * Detects scrollbar width\n\t         * @see http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\n\t         * @returns {number}\n\t         */\n\t\n\t    }, {\n\t        key: \"getScrollBarWidth\",\n\t        value: function getScrollBarWidth() {\n\t            var doc = global.document;\n\t            var inner = doc.createElement('p');\n\t\n\t            inner.style.width = \"100%\";\n\t            inner.style.height = \"200px\";\n\t\n\t            var outer = doc.createElement('div');\n\t            outer.style.position = \"absolute\";\n\t            outer.style.top = \"0px\";\n\t            outer.style.left = \"0px\";\n\t            outer.style.visibility = \"hidden\";\n\t            outer.style.width = \"200px\";\n\t            outer.style.height = \"150px\";\n\t            outer.style.overflow = \"hidden\";\n\t            outer.appendChild(inner);\n\t\n\t            doc.body.appendChild(outer);\n\t            var w1 = inner.offsetWidth;\n\t            outer.style.overflow = 'scroll';\n\t            var w2 = inner.offsetWidth;\n\t            if (w1 === w2) {\n\t                w2 = outer.clientWidth;\n\t            }\n\t            doc.body.removeChild(outer);\n\t\n\t            return w1 - w2;\n\t        }\n\t\n\t        /**\n\t         * Run an event once\n\t         * @param {String} ev\n\t         * @param {HTMLElement|HTMLDocument} target\n\t         * @param {Function} func\n\t         * @param {boolean} [capture]\n\t         * @return Function created listener\n\t         */\n\t\n\t    }, {\n\t        key: \"addEventOnce\",\n\t        value: function addEventOnce(ev, target, func, capture) {\n\t            var thisFunction = function thisFunction(event) {\n\t                func(event, func);\n\t                target.removeEventListener(ev, thisFunction, capture);\n\t            };\n\t            target.addEventListener(ev, thisFunction, capture);\n\t            return thisFunction;\n\t        }\n\t\n\t        /**\n\t         * Checks if an element is visible\n\t         * @param {HTMLElement} element\n\t         * @returns bool\n\t         */\n\t\n\t    }, {\n\t        key: \"isVisible\",\n\t        value: function isVisible(element) {\n\t            return element.offsetWidth > 0 && element.offsetHeight > 0;\n\t        }\n\t\n\t        /**\n\t         * Creates a camelCaseRepresentation of a dashed string\n\t         * @param {String} str\n\t         * @returns String\n\t         */\n\t\n\t    }, {\n\t        key: \"dashToCamelCase\",\n\t        value: function dashToCamelCase(str) {\n\t            return str.replace(/-([a-z])/g, function (g) {\n\t                return g[1].toUpperCase();\n\t            });\n\t        }\n\t\n\t        /**\n\t         * Creates a copy of `input`\n\t         * @param {*} input\n\t         * @return *\n\t         */\n\t\n\t    }, {\n\t        key: \"copy\",\n\t        value: function copy(input) {\n\t            return JSON.parse(JSON.stringify(input));\n\t        }\n\t\n\t        /**\n\t         * Reads options from element (data attributes) and applies to base\n\t         * @param {HTMLElement} element\n\t         * @param {Object} base\n\t         * @return {Object}\n\t         */\n\t\n\t    }, {\n\t        key: \"applyOptionsFromElement\",\n\t        value: function applyOptionsFromElement(element, base) {\n\t            if (!element) {\n\t                return base;\n\t            }\n\t            var attrs = element.attributes;\n\t            for (var i = 0; i < attrs.length; i++) {\n\t                var attr = attrs[i];\n\t                if (attr) {\n\t                    var s = Util.dashToCamelCase(attr.nodeName.replace('data-', ''));\n\t                    var val = attr.nodeValue;\n\t                    if (base.hasOwnProperty(s)) {\n\t                        // skip functions\n\t                        if (typeof base[s] === 'function') {\n\t                            continue;\n\t                        }\n\t                        if (typeof base[s] === 'boolean') {\n\t                            base[s] = parseInt(val || 1, 10) === 1;\n\t                        } else {\n\t                            base[s] = val;\n\t                        }\n\t                    }\n\t                }\n\t            }\n\t            return base;\n\t        }\n\t\n\t        /**\n\t         * Will position an element directly at given target\n\t         * Is aware of a given collision container to detect edges\n\t         * Will put elementToPosition either to left, center or right edge (prefer right)\n\t         *  and either to bottom or top (prefers bottom)\n\t         *\n\t         * You may overwrite preferred positioned with `centerHorizontal` and `positionTop`\n\t         *\n\t         * @param {HTMLElement|ClientRect} target the target container to align to\n\t         * @param {HTMLElement} elementToPosition the element to position\n\t         * @param {HTMLElement} collisionContainer the outer container to prevent collisions\n\t         * @param {boolean} [centerHorizontal] set true to center element, otherwise it's put on the right border by default\n\t         * @param {boolean} [positionTop] flip top, by default element is positioned to the bottom.\n\t         * @returns {HTMLElement}\n\t         */\n\t\n\t    }, {\n\t        key: \"setupPositionNearby\",\n\t        value: function setupPositionNearby(target, elementToPosition, collisionContainer, centerHorizontal, positionTop) {\n\t            // determine relative offsets\n\t            var amountTop = 0;\n\t            var amountLeft = 0;\n\t            Util.parentsUntil(target.parentNode, function (el) {\n\t                if (!(el instanceof HTMLElement)) {\n\t                    return false;\n\t                }\n\t                var style = window.getComputedStyle(el);\n\t                if (Util.isPartOfNode(elementToPosition, el)) {\n\t                    if (style && style.position === 'relative') {\n\t                        amountTop += el.offsetTop || 0;\n\t                        amountLeft += el.offsetLeft || 0;\n\t                    }\n\t                    return false;\n\t                }\n\t                return true;\n\t            });\n\t\n\t            var targetPosition = target instanceof HTMLElement ? target.getBoundingClientRect() : target;\n\t            var elementRect = elementToPosition.getBoundingClientRect();\n\t            var colRect = collisionContainer.getBoundingClientRect();\n\t            var targetTop = targetPosition.top - amountTop;\n\t            var targetRight = targetPosition.right;\n\t            var isCollisionTop = targetTop - elementRect.height <= 0;\n\t            var isCollisionBottom = window.innerHeight < targetTop + amountTop + targetPosition.height + elementRect.height;\n\t            var isCollisionLeft = targetRight < elementRect.width;\n\t            var targetLeft = targetPosition.left;\n\t            var isCollisionRight = targetLeft + elementRect.width > colRect.width;\n\t            var classList = elementToPosition.classList;\n\t\n\t            classList.remove(COL_RIGHT_CLASS);\n\t            classList.remove(COL_LEFT_CLASS);\n\t            classList.remove(COL_BOTTOM_CLASS);\n\t\n\t            var calcTop = void 0;\n\t            var calcLeft = void 0;\n\t            if (isCollisionLeft && !isCollisionRight) {\n\t                // put element to left if collision with left\n\t                calcLeft = targetPosition.left - colRect.left - amountLeft + \"px\";\n\t                classList.add(COL_LEFT_CLASS);\n\t            } else {\n\t                // maybe center if no collision with either side\n\t                var rightPosition = targetRight - elementRect.width - colRect.left - amountLeft + \"px\";\n\t                var leftCentered = (targetLeft + targetPosition.width / 2 - elementRect.width / 2 || 0) - colRect.left;\n\t                var collisionCentered = leftCentered + elementRect.width > colRect.width;\n\t                if (centerHorizontal && !collisionCentered) {\n\t                    calcLeft = leftCentered + \"px\";\n\t                } else {\n\t                    classList.add(COL_RIGHT_CLASS);\n\t                    calcLeft = rightPosition;\n\t                }\n\t            }\n\t\n\t            if (isCollisionBottom || positionTop && !isCollisionTop) {\n\t                // Put Element on top if collision\n\t                calcTop = targetTop - elementRect.height - colRect.top + \"px\";\n\t                classList.add(COL_BOTTOM_CLASS);\n\t            } else {\n\t                calcTop = targetTop + targetPosition.height - colRect.top + \"px\";\n\t            }\n\t\n\t            elementToPosition.style.cssText = \"top:\" + calcTop + \";left:\" + calcLeft + \";\";\n\t\n\t            return elementToPosition;\n\t        }\n\t\n\t        /**\n\t         * Brings a given element into viewport\n\t         * @param {HTMLElement} el\n\t         * @param {int|function}[optionalOffset]\n\t         */\n\t\n\t    }, {\n\t        key: \"scrollToElement\",\n\t        value: function scrollToElement(el, optionalOffset) {\n\t            el.scrollIntoView();\n\t            var thisOffset = optionalOffset;\n\t            // optionally use a additional scrollDif\n\t            if (thisOffset) {\n\t                if (typeof thisOffset === 'function') {\n\t                    thisOffset = optionalOffset();\n\t                }\n\t                var scrolledY = window.pageYOffset;\n\t                window.scroll(0, scrolledY - thisOffset);\n\t            }\n\t        }\n\t    }]);\n\t\n\t    return Util;\n\t}();\n\t\n\texports.default = Util;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _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; }; }(); /*\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * The MIT License (MIT)\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * of this software and associated documentation files (the \"Software\"), to deal\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * in the Software without restriction, including without limitation the rights\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * copies of the Software, and to permit persons to whom the Software is\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * furnished to do so, subject to the following conditions:\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * The above copyright notice and this permission notice shall be included in\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * all copies or substantial portions of the Software.\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * THE SOFTWARE.\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      */\n\t\n\t\n\tvar _Util = __webpack_require__(1);\n\t\n\tvar _Util2 = _interopRequireDefault(_Util);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t// we attach global settings to global once because settings might be shared a lot of times trough the application\n\t// Maybe find a better way to handle that scenario\n\tif (global.document && !global.FLEXCSS_GLOBAL_SETTINGS) {\n\t    global.FLEXCSS_GLOBAL_SETTINGS = {\n\t        // defined breakpoint for small devices < n\n\t        smallBreakpoint: 768,\n\t        // breakpoint when touchmove should be available\n\t        touchMoveBreakpointOffCanvas: 768,\n\t        // nodes that should be updated when no scrollbar is expected\n\t        scrollbarUpdateNodes: global.document.body !== null ? [global.document.body] : [],\n\t        // additional Delay until darkener is fully hidden\n\t        darkenerFadeDelay: 100,\n\t        // class that is added if canvas has been toggled\n\t        canvasToggledClass: 'toggled-canvas'\n\t    };\n\t\n\t    global.FLEXCSS_CONST_IS_IOS = null;\n\t\n\t    global.FLEXCSS_CONST_IS_TOUCH = null;\n\t\n\t    global.FLEXCSS_CONST_IS_SAFARI = null;\n\t\n\t    global.FLEXCSS_CONST_IS_IE = null;\n\t\n\t    global.FLEXCSS_CONST_TAB_EVENT = 'click';\n\t\n\t    global.FLEXCSS_IS_SMALL_SCREEN = false;\n\t\n\t    var init = function init() {\n\t        // Measure scrollbar width\n\t        global.FLEXCSS_CONST_SCROLLBAR_WIDTH = _Util2.default.getScrollBarWidth();\n\t        // detect right transition end event\n\t        global.FLEXCSS_CONST_TRANSITION_EVENT = _Util2.default.whichTransitionEndEvent();\n\t    };\n\t\n\t    if (global.document.readyState !== 'loading') {\n\t        init();\n\t    } else {\n\t        // it's possible that global.document.body is not available if the document is not\n\t        // loaded completely\n\t        document.addEventListener('DOMContentLoaded', function () {\n\t            init();\n\t        });\n\t    }\n\t}\n\t\n\t/**\n\t * Utility class that setups global settings\n\t */\n\t\n\tvar Settings = function () {\n\t    function Settings() {\n\t        _classCallCheck(this, Settings);\n\t    }\n\t\n\t    _createClass(Settings, null, [{\n\t        key: 'setup',\n\t\n\t\n\t        /**\n\t         * Setup global settings, overwrite default values\n\t         * @param {Object} settings\n\t         */\n\t        value: function setup(settings) {\n\t            Object.assign(global.FLEXCSS_GLOBAL_SETTINGS, settings);\n\t        }\n\t\n\t        /**\n\t         * Access to global settings\n\t         * @returns {Object}\n\t         */\n\t\n\t    }, {\n\t        key: 'get',\n\t        value: function get() {\n\t            return global.FLEXCSS_GLOBAL_SETTINGS;\n\t        }\n\t\n\t        /**\n\t         * Detects a IOS Device, caches subsequent calls\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: 'isIosDevice',\n\t        value: function isIosDevice() {\n\t            if (!global.FLEXCSS_CONST_IS_IOS) {\n\t                global.FLEXCSS_CONST_IS_IOS = global.navigator.userAgent.match(/(iPad|iPhone|iPod)/i);\n\t            }\n\t\n\t            return global.FLEXCSS_CONST_IS_IOS;\n\t        }\n\t\n\t        /**\n\t         * Detects a safari browser\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: 'isSafari',\n\t        value: function isSafari() {\n\t            if (!global.FLEXCSS_CONST_IS_SAFARI) {\n\t                global.FLEXCSS_CONST_IS_SAFARI = !!/^((?!chrome|android).)*safari/i.test(global.navigator.userAgent);\n\t            }\n\t            return global.FLEXCSS_CONST_IS_SAFARI;\n\t        }\n\t\n\t        /**\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: 'isSmallScreen',\n\t        value: function isSmallScreen() {\n\t            return window.innerWidth < Settings.get().smallBreakpoint;\n\t        }\n\t\n\t        /**\n\t         * Detects a touch device, caches subsequent calls\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: 'isTouchDevice',\n\t        value: function isTouchDevice() {\n\t            if (!global.FLEXCSS_CONST_IS_TOUCH) {\n\t                global.FLEXCSS_CONST_IS_TOUCH = 'ontouchstart' in window || !!global.navigator.msMaxTouchPoints;\n\t            }\n\t            return global.FLEXCSS_CONST_IS_TOUCH;\n\t        }\n\t\n\t        /**\n\t         * Checks if current browser is Internet Explorer\n\t         * @returns {boolean|*}\n\t         */\n\t\n\t    }, {\n\t        key: 'isIE',\n\t        value: function isIE() {\n\t            if (!global.FLEXCSS_CONST_IS_IE) {\n\t                global.FLEXCSS_CONST_IS_IE = \"ActiveXObject\" in window;\n\t            }\n\t            return global.FLEXCSS_CONST_IS_IE;\n\t        }\n\t\n\t        /**\n\t         * @returns {String}\n\t         */\n\t\n\t    }, {\n\t        key: 'getTransitionEvent',\n\t        value: function getTransitionEvent() {\n\t            return global.FLEXCSS_CONST_TRANSITION_EVENT;\n\t        }\n\t\n\t        /**\n\t         * @returns {int}\n\t         */\n\t\n\t    }, {\n\t        key: 'getScrollbarWidth',\n\t        value: function getScrollbarWidth() {\n\t            return global.FLEXCSS_CONST_SCROLLBAR_WIDTH;\n\t        }\n\t\n\t        /**\n\t         * @returns {String}\n\t         */\n\t\n\t    }, {\n\t        key: 'getTabEvent',\n\t        value: function getTabEvent() {\n\t            return global.FLEXCSS_CONST_TAB_EVENT;\n\t        }\n\t    }]);\n\t\n\t    return Settings;\n\t}();\n\t\n\texports.default = Settings;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _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; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/* global CustomEvent */\n\t\n\t/*\n\t * The MIT License (MIT)\n\t *\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t */\n\t\n\t// polyfill for custom events to make thinks work in IE\n\t// The needed polyfill is so small that I embedded it here\n\t(function poly() {\n\t    if (global.document && (!global.CustomEvent || typeof global.CustomEvent !== 'function')) {\n\t        var _CustomEvent = function CustomEvent(event, params) {\n\t            var thisParams = params || {\n\t                bubbles: false,\n\t                cancelable: false,\n\t                detail: undefined\n\t            };\n\t            var evt = document.createEvent(\"CustomEvent\");\n\t            evt.initCustomEvent(event, thisParams.bubbles, thisParams.cancelable, thisParams.detail);\n\t            evt.superPreventDefault = evt.preventDefault;\n\t            evt.preventDefault = function () {\n\t                // Due a bug in IE11, we need to set defaultPrevented manually\n\t                Object.defineProperty(evt, \"defaultPrevented\", {\n\t                    get: function get() {\n\t                        return true;\n\t                    }\n\t                });\n\t                evt.superPreventDefault();\n\t            };\n\t            return evt;\n\t        };\n\t        _CustomEvent.prototype = global.Event.prototype;\n\t        global.CustomEvent = _CustomEvent;\n\t    }\n\t})();\n\t/**\n\t * Simpler Event dispatching\n\t */\n\t\n\tvar EventHandler = function () {\n\t\n\t    /**\n\t     * @param {HTMLElement} target\n\t     * @param {String} name\n\t     */\n\t    function EventHandler(target, name) {\n\t        _classCallCheck(this, EventHandler);\n\t\n\t        this.target = target;\n\t        this.defaultOptions = {\n\t            bubbles: true,\n\t            cancelable: true\n\t        };\n\t\n\t        this.name = name;\n\t    }\n\t\n\t    /**\n\t     * Set more options\n\t     * @param {Object} options\n\t     * @returns {EventHandler}\n\t     */\n\t\n\t\n\t    _createClass(EventHandler, [{\n\t        key: \"withOptions\",\n\t        value: function withOptions(options) {\n\t            Object.assign(this.defaultOptions, options || {});\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * Call with the originalEvent\n\t         * @param {Event} e\n\t         * @returns {EventHandler}\n\t         */\n\t\n\t    }, {\n\t        key: \"withOriginal\",\n\t        value: function withOriginal(e) {\n\t            return this.withDetail({\n\t                originalEvent: e\n\t            });\n\t        }\n\t\n\t        /**\n\t         * Extends the detail part of the event\n\t         * @param {Object} o\n\t         * @returns {EventHandler}\n\t         */\n\t\n\t    }, {\n\t        key: \"withDetail\",\n\t        value: function withDetail(o) {\n\t            if (!this.defaultOptions.detail) {\n\t                this.defaultOptions.detail = {};\n\t            }\n\t            Object.assign(this.defaultOptions.detail, o);\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * @returns {CustomEvent}\n\t         */\n\t\n\t    }, {\n\t        key: \"fire\",\n\t        value: function fire() {\n\t            var e = new CustomEvent(this.name, this.defaultOptions);\n\t            if (this.target) {\n\t                this.target.dispatchEvent(e);\n\t            }\n\t            return e;\n\t        }\n\t    }]);\n\t\n\t    return EventHandler;\n\t}();\n\t\n\tvar Event = function () {\n\t    function Event() {\n\t        _classCallCheck(this, Event);\n\t    }\n\t\n\t    _createClass(Event, null, [{\n\t        key: \"dispatch\",\n\t\n\t        /**\n\t         * Prepares to dispatch a custom event (without firing)\n\t         * @param {HTMLElement} target\n\t         * @param {String} name\n\t         * @returns {EventHandler}\n\t         */\n\t        value: function dispatch(target, name) {\n\t            return new EventHandler(target, name);\n\t        }\n\t\n\t        /**\n\t         * Dispatches a custom event and fires it directly\n\t         * @param {HTMLElement} target\n\t         * @param {String} name\n\t         * @param {Object} [options]\n\t         * @returns {CustomEvent}\n\t         */\n\t\n\t    }, {\n\t        key: \"dispatchAndFire\",\n\t        value: function dispatchAndFire(target, name, options) {\n\t            return new EventHandler(target, name).withOptions(options).fire();\n\t        }\n\t    }]);\n\t\n\t    return Event;\n\t}();\n\t\n\texports.default = Event;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 4 */,\n/* 5 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _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; }; }();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * The MIT License (MIT)\n\t *\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t */\n\t\n\t/**\n\t * Provides a Basic Widget\n\t */\n\tvar DestroyableWidget = function () {\n\t    function DestroyableWidget() {\n\t        _classCallCheck(this, DestroyableWidget);\n\t\n\t        this.listeners = [];\n\t    }\n\t\n\t    /**\n\t     * Destroys a Widget\n\t     */\n\t\n\t\n\t    _createClass(DestroyableWidget, [{\n\t        key: \"destroy\",\n\t        value: function destroy() {\n\t            this.listeners.forEach(function (listener) {\n\t                listener.element.removeEventListener.apply(listener.element, listener.args);\n\t            });\n\t            this.listeners = [];\n\t        }\n\t\n\t        /**\n\t         * Adds an event and registers it later to remove bindings\n\t         * @param {HTMLElement} element\n\t         * @param {String} name\n\t         * @param {Function} listener\n\t         * @param {boolean} [capture]\n\t         * @returns {Function}\n\t         */\n\t\n\t    }, {\n\t        key: \"addEventListener\",\n\t        value: function addEventListener(element, name, listener, capture) {\n\t            this.listeners.push({\n\t                element: element,\n\t                args: [name, listener, capture]\n\t            });\n\t\n\t            element.addEventListener(name, listener, capture);\n\t            return listener;\n\t        }\n\t    }]);\n\t\n\t    return DestroyableWidget;\n\t}();\n\t\n\texports.default = DestroyableWidget;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _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; }; }();\n\t\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _Util = __webpack_require__(1);\n\t\n\tvar _Util2 = _interopRequireDefault(_Util);\n\t\n\tvar _DestroyableWidget2 = __webpack_require__(5);\n\t\n\tvar _DestroyableWidget3 = _interopRequireDefault(_DestroyableWidget2);\n\t\n\tvar _Settings = __webpack_require__(2);\n\t\n\tvar _Settings2 = _interopRequireDefault(_Settings);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * The MIT License (MIT)\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * of this software and associated documentation files (the \"Software\"), to deal\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * in the Software without restriction, including without limitation the rights\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * copies of the Software, and to permit persons to whom the Software is\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * furnished to do so, subject to the following conditions:\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * The above copyright notice and this permission notice shall be included in\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * all copies or substantial portions of the Software.\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                *\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * THE SOFTWARE.\n\t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                */\n\t\n\t/*!\n\t * FlexCss.Tooltip\n\t * Licensed under the MIT License (MIT)\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t */\n\t\n\t/**\n\t * @type {string}\n\t */\n\tvar CLASS_NAMES_TOOLTIP = 'tooltip-container';\n\t/**\n\t * @type {string}\n\t */\n\tvar CLASS_NAMES_OPEN = 'open';\n\t\n\t/**\n\t * @type {string}\n\t */\n\tvar ATTR_DATA_CLASSNAME = 'data-class';\n\t\n\t/**\n\t * @type {string}\n\t */\n\tvar ATTR_DATA_NO_TOUCH = 'data-no-touch';\n\t\n\t/**\n\t * @type {HTMLDocument}\n\t */\n\tvar doc = global.document;\n\t\n\t/**\n\t * Simple Tooltip\n\t */\n\t\n\tvar Tooltip = function (_DestroyableWidget) {\n\t    _inherits(Tooltip, _DestroyableWidget);\n\t\n\t    /**\n\t     * Creates a Tooltip\n\t     * @param {HTMLElement|String} DelegateContainer\n\t     * @param {Object} [options]\n\t     */\n\t    function Tooltip(DelegateContainer, options) {\n\t        _classCallCheck(this, Tooltip);\n\t\n\t        /**\n\t         * The Container where possible events are captured\n\t         */\n\t        var _this = _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).call(this));\n\t\n\t        _this.container = DelegateContainer instanceof HTMLElement ? DelegateContainer : doc.getElementById(DelegateContainer);\n\t\n\t        if (!_this.container) {\n\t            throw new Error('Could not create Tooltip, DelegateContainer not found');\n\t        }\n\t\n\t        /**\n\t         * The Container where tooltips are stored for this instance\n\t         * @type {HTMLElement}\n\t         */\n\t        _this.tooltipContainer = null;\n\t\n\t        /**\n\t         * Default Options\n\t         */\n\t        _this.options = {\n\t            containerClass: '',\n\t            selectorAttribute: 'data-tooltip',\n\t            collisionContainer: _this.container\n\t        };\n\t\n\t        Object.assign(_this.options, options || {});\n\t        return _this;\n\t    }\n\t\n\t    /**\n\t     * Creates and shows a tooltip\n\t     * @param {HTMLElement} target where is this tooltip positioned\n\t     * @param {String} text text content in tooltip, will be NOT escaped\n\t     * @param {Boolean} [removeTitle] removes title element if given\n\t     * @param {Node} [positionRelative]\n\t     */\n\t\n\t\n\t    _createClass(Tooltip, [{\n\t        key: 'createTooltip',\n\t        value: function createTooltip(target, text, removeTitle, positionRelative) {\n\t            // abort if text is empty\n\t            if (!text || text && text.trim() === '') {\n\t                return;\n\t            }\n\t\n\t            if (_Settings2.default.isTouchDevice() && target && target.hasAttribute(ATTR_DATA_NO_TOUCH)) {\n\t                return;\n\t            }\n\t\n\t            var tooltipContainer = this.tooltipContainer;\n\t\n\t            if (!tooltipContainer) {\n\t                tooltipContainer = doc.createElement('div');\n\t                this.container.appendChild(tooltipContainer);\n\t                this.tooltipContainer = tooltipContainer;\n\t            }\n\t            this._restoreClassNames(tooltipContainer, target);\n\t\n\t            tooltipContainer.style.left = 'auto';\n\t            tooltipContainer.style.top = 'auto';\n\t            tooltipContainer.innerHTML = text;\n\t            tooltipContainer.flexTooltipCurrentTarget = target;\n\t            if (removeTitle) {\n\t                target.oldTitle = text;\n\t                target.removeAttribute('title');\n\t            }\n\t\n\t            _Util2.default.setupPositionNearby(positionRelative || target, tooltipContainer, this.options.collisionContainer, true, true);\n\t\n\t            tooltipContainer.classList.add(CLASS_NAMES_OPEN);\n\t        }\n\t    }, {\n\t        key: '_restoreClassNames',\n\t        value: function _restoreClassNames(container, target) {\n\t            // allow additional classname per tooltip on target element\n\t            var classNames = [CLASS_NAMES_TOOLTIP, this.options.containerClass];\n\t            var maybeTargetClass = target.getAttribute(ATTR_DATA_CLASSNAME);\n\t            if (maybeTargetClass) {\n\t                classNames.push(maybeTargetClass);\n\t            }\n\t            container.className = classNames.join(\" \");\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * @returns {HTMLElement|null}\n\t         */\n\t\n\t    }, {\n\t        key: 'getCurrentTarget',\n\t        value: function getCurrentTarget() {\n\t            return this.tooltipContainer ? this.tooltipContainer.flexTooltipCurrentTarget : null;\n\t        }\n\t\n\t        /**\n\t         * Destroys this Widget\n\t         * @returns {boolean}\n\t         */\n\t\n\t    }, {\n\t        key: 'destroy',\n\t        value: function destroy() {\n\t            _get(Tooltip.prototype.__proto__ || Object.getPrototypeOf(Tooltip.prototype), 'destroy', this).call(this);\n\t\n\t            if (this.tooltipContainer) {\n\t                this.tooltipContainer.parentNode.removeChild(this.tooltipContainer);\n\t                return true;\n\t            }\n\t            return false;\n\t        }\n\t\n\t        /**\n\t         * Removes a Tooltip on given target\n\t         * @param {HTMLElement} [target], if not given will remove current open tooltip on this instance\n\t         */\n\t\n\t    }, {\n\t        key: 'removeTooltip',\n\t        value: function removeTooltip(target) {\n\t            var selfTarget = target;\n\t            if (!selfTarget && this.tooltipContainer) {\n\t                selfTarget = this.tooltipContainer.flexTooltipCurrentTarget;\n\t            }\n\t            if (this.tooltipContainer) {\n\t                if (this.tooltipContainer.flexTooltipCurrentTarget !== selfTarget) {\n\t                    return;\n\t                }\n\t                this.tooltipContainer.classList.remove(CLASS_NAMES_OPEN);\n\t                delete this.tooltipContainer.flexTooltipCurrentTarget;\n\t            }\n\t            if (selfTarget && selfTarget.oldTitle) {\n\t                selfTarget.setAttribute('title', selfTarget.oldTitle);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Initilizes mouse events on container element\n\t         */\n\t\n\t    }, {\n\t        key: 'registerEvents',\n\t        value: function registerEvents() {\n\t            var self = this;\n\t            this.addEventListener(this.container, 'mouseover', function (e) {\n\t                if (e.target.hasAttribute(self.options.selectorAttribute)) {\n\t                    self.createTooltip(e.target, e.target.getAttribute('title'), true);\n\t                }\n\t            });\n\t\n\t            this.addEventListener(this.container, 'mouseout', function (e) {\n\t                if (e.target.hasAttribute(self.options.selectorAttribute)) {\n\t                    self.removeTooltip(e.target);\n\t                }\n\t            });\n\t            return this;\n\t        }\n\t    }]);\n\t\n\t    return Tooltip;\n\t}(_DestroyableWidget3.default);\n\t\n\texports.default = Tooltip;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 7 */,\n/* 8 */,\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\texports.EVENT_FORM_AJAX_COMPLETED = exports.EVENT_FORM_AFTER_AJAX_SUBMIT = exports.EVENT_FORM_SUBMIT = exports.EVENT_FORM_READY = undefined;\n\t\n\tvar _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; }; }();\n\t\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _Tooltip = __webpack_require__(6);\n\t\n\tvar _Tooltip2 = _interopRequireDefault(_Tooltip);\n\t\n\t__webpack_require__(11);\n\t\n\tvar _Event = __webpack_require__(3);\n\t\n\tvar _Event2 = _interopRequireDefault(_Event);\n\t\n\tvar _Util = __webpack_require__(1);\n\t\n\tvar _Util2 = _interopRequireDefault(_Util);\n\t\n\tvar _Settings = __webpack_require__(2);\n\t\n\tvar _Settings2 = _interopRequireDefault(_Settings);\n\t\n\tvar _DestroyableWidget2 = __webpack_require__(5);\n\t\n\tvar _DestroyableWidget3 = _interopRequireDefault(_DestroyableWidget2);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* global HTMLFormElement, fetch, FormData, clearTimeout, NodeList */\n\t\n\t/*\n\t * The MIT License (MIT)\n\t *\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t *\n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t *\n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t *\n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t */\n\t\n\t/*!\n\t * FlexCss.Form\n\t * Licensed under the MIT License (MIT)\n\t * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n\t */\n\t\n\tvar LOADING_CLASS = 'loading';\n\tvar DATA_ELEMENT_INVALID = 'data-flexcss-invalid';\n\tvar REMOTE = 'data-remote';\n\tvar REMOTE_ACTION = 'data-remote-action';\n\tvar ATTR_DISABLE_INLINE = 'data-disable-inline-validation';\n\tvar ATTR_DISABLE_REALTIME = 'data-disable-realtime-validation';\n\tvar ATTR_VALIDATOR = 'data-validate';\n\tvar ATTR_DATA_CUSTOM_MESSAGE = 'data-validation-message';\n\tvar ATTR_DATA_CUSTOM_LABEL = 'data-custom-label';\n\tvar ATTR_VALIDATE_VISIBILITY = 'data-validate-visibility';\n\tvar ATTR_ERROR_TARGET_ID = 'data-error-target';\n\tvar ATTR_DEPENDS = 'data-depends-selector';\n\tvar CONST_USE_JSON = 'json';\n\tvar CONST_REALTIME_EVENT = 'input';\n\tvar FOCUS_TOOLTIP_DELAY = 20;\n\tvar CLICK_TOOLTIP_DELAY = 150;\n\t\n\t/**\n\t * Triggered when form is fully initialized and handlers are binded\n\t * @type {string}\n\t */\n\tvar EVENT_FORM_READY = exports.EVENT_FORM_READY = 'flexcss.form.ready';\n\t/**\n\t * Fires when a form is submitted, cancelable\n\t * @type {string}\n\t */\n\tvar EVENT_FORM_SUBMIT = exports.EVENT_FORM_SUBMIT = 'flexcss.form.submit';\n\t/**\n\t * Fired directly after the form has been submitted via ajax\n\t * @type {string}\n\t */\n\tvar EVENT_FORM_AFTER_AJAX_SUBMIT = exports.EVENT_FORM_AFTER_AJAX_SUBMIT = 'flexcss.form.afterAjaxSubmit';\n\t/**\n\t * Fired when ajax events did complete\n\t * @type {string}\n\t */\n\tvar EVENT_FORM_AJAX_COMPLETED = exports.EVENT_FORM_AJAX_COMPLETED = 'flexcss.form.ajaxCompleted';\n\t\n\t/**\n\t * A HTML5 Form Validation replacement\n\t */\n\t\n\tvar Form = function (_DestroyableWidget) {\n\t    _inherits(Form, _DestroyableWidget);\n\t\n\t    /**\n\t     * @param {HTMLElement} form\n\t     * @param [options] optional options\n\t     */\n\t    function Form(form, options) {\n\t        _classCallCheck(this, Form);\n\t\n\t        var _this = _possibleConstructorReturn(this, (Form.__proto__ || Object.getPrototypeOf(Form)).call(this));\n\t\n\t        if (!(form instanceof HTMLFormElement)) {\n\t            throw new Error('argument {0} form needs to be an form element');\n\t        }\n\t\n\t        /**\n\t         * The Form\n\t         * @type {HTMLElement}\n\t         */\n\t        _this.form = form;\n\t\n\t        /**\n\t         * @type {Tooltip}\n\t         */\n\t        _this.tooltips = null;\n\t\n\t        /**\n\t         * @type {Promise}\n\t         */\n\t        _this.currentValidationFuture = new Promise(function () {});\n\t\n\t        /**\n\t         * Default options\n\t         * @type {Object}\n\t         */\n\t        _this.options = {\n\t            // if true creates tooltips above element, uses FlexCss Tooltips\n\t            createTooltips: true,\n\t            // if true appends error message after input element\n\t            appendError: false,\n\t            // type of ajax submit\n\t            ajaxSubmitType: 'POST',\n\t            // json content type if ajax method is set to json\n\t            ajaxJsonContentType: 'application/json; charset=utf-8',\n\t            // allow inline validation\n\t            inlineValidation: true,\n\t            // validate in realtime (on `input` event)\n\t            realtime: true,\n\t            // timeout when realtime event should be captured\n\t            realtimeTimeout: 250,\n\t            // formatting method for an error\n\t            formatErrorTooltip: function formatErrorTooltip(error) {\n\t                return '<i class=\"icon-attention\"></i> ' + error;\n\t            },\n\t            // the class that will be put on the element to mark it failed validation\n\t            inputErrorClass: 'invalid',\n\t            // the container class for error messages below an element\n\t            containerErrorClass: 'form-error',\n\t            // additional options for fetch\n\t            fetchOptions: {\n\t                credentials: 'include'\n\t            },\n\t            // the container for tooltips\n\t            tooltipContainer: form,\n\t            tooltipOptions: {\n\t                containerClass: 'error-tooltip'\n\t            },\n\t            shouldScrollToElement: true,\n\t            // if you have a fixed header, either set a number or function here\n\t            scrollToElementDiff: 0\n\t        };\n\t\n\t        // overwrite default options\n\t        Object.assign(_this.options, options);\n\t\n\t        // apply settings from attributes\n\t        _Util2.default.applyOptionsFromElement(form, _this.options);\n\t\n\t        // set form class as widget\n\t        // Forms are very different to classical widgets,\n\t        // we will not use our base widget class for this but just self\n\t        form.hfWidgetInstance = _this;\n\t\n\t        /**\n\t         * A List of Validators\n\t         * @type {Object}\n\t         * @private\n\t         */\n\t        _this._validators = Form.globalValidators;\n\t\n\t        /**\n\t         * @type {Function}\n\t         * @private\n\t         */\n\t        _this._remoteValidationFunction = null;\n\t\n\t        _this.initFormValidation();\n\t        return _this;\n\t    }\n\t\n\t    _createClass(Form, [{\n\t        key: 'destroy',\n\t        value: function destroy() {\n\t            _get(Form.prototype.__proto__ || Object.getPrototypeOf(Form.prototype), 'destroy', this).call(this);\n\t            if (this.tooltips) {\n\t                this.tooltips.destroy();\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Submits this form, either via ajax or just classical (default)\n\t         * @param {HTMLFormElement} thisForm\n\t         * @param {Event} e\n\t         * @private\n\t         * @returns {Promise|boolean} returns false if submit is cancled\n\t         */\n\t\n\t    }, {\n\t        key: '_submitFunction',\n\t        value: function _submitFunction(thisForm, e) {\n\t            var self = this;\n\t            var shouldUseAjax = thisForm.getAttribute(REMOTE);\n\t            var ajaxPostUrl = thisForm.getAttribute(REMOTE_ACTION) || thisForm.getAttribute('action') || window.location.href;\n\t\n\t            var useJson = CONST_USE_JSON === shouldUseAjax;\n\t\n\t            var ev = _Event2.default.dispatch(thisForm, EVENT_FORM_SUBMIT).withOriginal(e).fire();\n\t\n\t            // abort execution is event was prevented\n\t            if (ev.defaultPrevented) {\n\t                self._formStopLoading();\n\t                return false;\n\t            }\n\t\n\t            if (shouldUseAjax === null) {\n\t                // submit\n\t                return thisForm.submit();\n\t            }\n\t            // prevent form from submit normally\n\t            e.preventDefault();\n\t\n\t            // add information that this is an XMLHttpRequest request (used by some frameworks)\n\t            var defaultHeaders = {\n\t                'X-Requested-With': 'XMLHttpRequest'\n\t            };\n\t\n\t            // setup default headers\n\t            if (useJson) {\n\t                Object.assign(defaultHeaders, {\n\t                    'Content-Type': this.options.ajaxJsonContentType\n\t                });\n\t            }\n\t            var defaultOptions = Object.assign(this.options.fetchOptions, {\n\t                headers: defaultHeaders,\n\t                method: this.options.ajaxSubmitType\n\t            });\n\t\n\t            // support either JSON request payload or normal payload submission\n\t            var serverCall = useJson ? fetch(ajaxPostUrl, Object.assign(defaultOptions, {\n\t                body: JSON.stringify(this.serialize())\n\t            })) : fetch(ajaxPostUrl, Object.assign(defaultOptions, {\n\t                body: new FormData(thisForm)\n\t            }));\n\t\n\t            _Event2.default.dispatch(thisForm, EVENT_FORM_AFTER_AJAX_SUBMIT).withOriginal(e).fire();\n\t\n\t            return serverCall.then(function (r) {\n\t                (self._remoteValidationFunction || Form.globalRemoteValidationFunction).apply(self, [r]);\n\t\n\t                _Event2.default.dispatch(thisForm, EVENT_FORM_AJAX_COMPLETED).withOriginal(e).withDetail({ response: r }).fire();\n\t                // always remove error class\n\t                self._formStopLoading();\n\t            });\n\t        }\n\t\n\t        /**\n\t         * Serializes a form to a json object\n\t         * @returns {Object}\n\t         */\n\t\n\t    }, {\n\t        key: 'serialize',\n\t        value: function serialize() {\n\t            var selectors = ['input[name]:not([type=\"radio\"]):enabled', 'input[type=\"radio\"][name]:checked', 'select[name]:enabled', 'textarea[name]:enabled'];\n\t            var inputs = this.form.querySelectorAll(selectors.join(','));\n\t            var result = {};\n\t\n\t            Array.prototype.forEach.call(inputs, function (input) {\n\t                var exists = result[input.name];\n\t                var value = input.value;\n\t                if (exists instanceof Array) {\n\t                    exists.push(value);\n\t                } else if (exists) {\n\t                    result[input.name] = [result[input.name], value];\n\t                } else {\n\t                    result[input.name] = value;\n\t                }\n\t            });\n\t\n\t            return result;\n\t        }\n\t\n\t        /**\n\t         * Handles the chain of validation on given fields\n\t         *\n\t         * @param {HTMLElement|Array|NodeList} field\n\t         * @param [focus] optional focus first error\n\t         * @returns {Promise}\n\t         */\n\t\n\t    }, {\n\t        key: 'handleValidation',\n\t        value: function handleValidation(field, focus) {\n\t            var _this2 = this;\n\t\n\t            var fields = field instanceof Array || field instanceof NodeList ? field : [field];\n\t            return this._handleValidation(fields, focus, true).then(function (r) {\n\t                if (!r.foundAnyError) {\n\t                    // remove tooltips\n\t                    if (_this2.tooltips) {\n\t                        _this2.tooltips.removeTooltip();\n\t                    }\n\t                }\n\t                return r;\n\t            });\n\t        }\n\t\n\t        /**\n\t         * Handles errors on given node list\n\t         * @param {NodeList} toValidateFields\n\t         * @param {boolean} focus\n\t         * @param {boolean} scoped if true, will only validate the fields `invalidFields`\n\t         * @returns {Promise}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_handleValidation',\n\t        value: function _handleValidation(toValidateFields, focus, scoped) {\n\t            var self = this;\n\t            var arr = Form._createArrayFromInvalidFieldList(toValidateFields);\n\t            var isLocalInvalid = arr.length > 0;\n\t\n\t            // focus must appear in the same frame for iOS devices\n\t            if (isLocalInvalid && focus) {\n\t                self._focusElement(arr[0]);\n\t            }\n\t\n\t            var validation = scoped ? this._customValidationsForElements(toValidateFields) : self.validateCustomFields();\n\t            return validation.then(function (r) {\n\t                if (isLocalInvalid) {\n\t                    // combine browser and custom validators\n\t                    r.foundAnyError = true;\n\t                }\n\t                // get a unique field list of all fields that need to be checked and rendered\n\t                // it's possible that we have duplicates in non scoped mode\n\t                var thisToValidateFields = scoped ? toValidateFields : Array.from(arr).concat(r.checkedFields);\n\t                r.checkedFields = thisToValidateFields;\n\t                var foundInvalidFields = self.prepareErrors(thisToValidateFields, false);\n\t                var firstInvalidField = foundInvalidFields[0];\n\t                if (firstInvalidField) {\n\t                    if (focus) {\n\t                        self._focusElement(firstInvalidField);\n\t                        // if element could not be focused:\n\t                        if (document.activeElement !== firstInvalidField) {\n\t                            self._handleTooltipHideClickAfterChange();\n\t                        }\n\t                    } else {\n\t                        self._handleTooltipHideClickAfterChange();\n\t                    }\n\t                    self.showAndOrCreateTooltip(firstInvalidField);\n\t                }\n\t                return r;\n\t            });\n\t        }\n\t\n\t        /**\n\t         * @param {HTMLElement} field\n\t         * @param {ValidityState} validity\n\t         * @returns {*}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_setupErrorMessages',\n\t        value: function _setupErrorMessages(field, validity) {\n\t            return Form.globalErrorMessageHandler ? Form.globalErrorMessageHandler.apply(this, [field, validity]) : false;\n\t        }\n\t\n\t        /**\n\t         * Handles class labels for elements\n\t         * @param {Object} fields\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_handleLabels',\n\t        value: function _handleLabels(fields) {\n\t            var _this3 = this;\n\t\n\t            Object.keys(fields).forEach(function (id) {\n\t                var labels = _this3.getForm().querySelectorAll('[for=\"' + id + '\"]');\n\t                var invalid = fields[id];\n\t                if (labels.length) {\n\t                    for (var labelsIndex = 0; labelsIndex < labels.length; labelsIndex++) {\n\t                        var labelEl = labels[labelsIndex];\n\t                        // we can't use toggle attribute, not supported in IE\n\t                        if (invalid) {\n\t                            _this3._markElementInvalid(labelEl);\n\t                        } else {\n\t                            _this3._markElementValid(labelEl);\n\t                        }\n\t                    }\n\t                }\n\t            });\n\t        }\n\t\n\t        /**\n\t         * @param el\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_markElementInvalid',\n\t        value: function _markElementInvalid(el) {\n\t            el.setAttribute(DATA_ELEMENT_INVALID, \"true\");\n\t            el.classList.add(this.options.inputErrorClass);\n\t        }\n\t\n\t        /**\n\t         * @param el\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_markElementValid',\n\t        value: function _markElementValid(el) {\n\t            el.removeAttribute(DATA_ELEMENT_INVALID);\n\t            el.classList.remove(this.options.inputErrorClass);\n\t        }\n\t\n\t        /**\n\t         * A List of invalid elements (:invalid)\n\t         * @returns {Array}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_getInvalidElements',\n\t        value: function _getInvalidElements() {\n\t            return Array.prototype.filter.call(this.getForm().querySelectorAll(\":invalid\"), function (r) {\n\t                return !(r instanceof HTMLFieldSetElement);\n\t            });\n\t        }\n\t\n\t        /**\n\t         * @param {HTMLElement} thisParent\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_removeElementErrors',\n\t        value: function _removeElementErrors(thisParent) {\n\t            var errors = thisParent.querySelectorAll('.' + this.options.containerErrorClass);\n\t            var inputsWithErrorClasses = thisParent.querySelectorAll('[' + DATA_ELEMENT_INVALID + ']');\n\t            for (var elementErrorIndex = 0; elementErrorIndex < errors.length; elementErrorIndex++) {\n\t                errors[elementErrorIndex].parentNode.removeChild(errors[elementErrorIndex]);\n\t            }\n\t            for (var inputErrorIndex = 0; inputErrorIndex < inputsWithErrorClasses.length; inputErrorIndex++) {\n\t                var el = inputsWithErrorClasses[inputErrorIndex];\n\t                this._markElementValid(el);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Registers a custom validator\n\t         * @param {String} name\n\t         * @param {Function} validator a validation function should always return either a Future(true) or Future(false)\n\t         * even when the field has been invalidated with `setCustomValidity`, because of different browser `bugs`\n\t         * we can't rely on that\n\t         * @returns {Form}\n\t         */\n\t\n\t    }, {\n\t        key: 'registerValidator',\n\t        value: function registerValidator(name, validator) {\n\t            this._validators[name] = validator;\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * Runs async validation\n\t         * @param {String} validationRef\n\t         * @param {HTMLElement} field\n\t         * @returns {Promise}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_runValidation',\n\t        value: function _runValidation(validationRef, field) {\n\t            if (!this._validators[validationRef]) {\n\t                throw new Error('Could not found validator: ' + validationRef);\n\t            }\n\t            var cl = field.classList;\n\t            var future = this._validators[validationRef].apply(this, [field, this.form]);\n\t            cl.add(LOADING_CLASS);\n\t            future.then(function () {\n\t                cl.remove(LOADING_CLASS);\n\t            });\n\t            return future;\n\t        }\n\t\n\t        /**\n\t         * Run custom validations for elements, validations are done async do support XHR Requests or other stuff\n\t         *\n\t         * @param {Array|NodeList} fields\n\t         * @returns {Promise} contains either true if validations passed or false if something went wrong\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_customValidationsForElements',\n\t        value: function _customValidationsForElements(fields) {\n\t            var futures = [];\n\t            var fieldsLength = fields.length;\n\t            var checkedFields = [];\n\t            for (var iVal = 0; iVal < fieldsLength; iVal++) {\n\t                var field = fields[iVal];\n\t                var validationRef = field.getAttribute(ATTR_VALIDATOR);\n\t                var validity = field.validity;\n\t                if (this._validators[validationRef]) {\n\t                    // use local validation first and then continue with custom validations\n\t                    if (Form._shouldNotValidateField(field) || validity && !validity.customError && !validity.valid) {\n\t                        continue;\n\t                    }\n\t                    checkedFields.push(field);\n\t                    futures.push(this._runValidation(validationRef, field));\n\t                } else {\n\t                    if (validationRef) {\n\t                        // console.warn('data-validate was set but no validator was found');\n\t                    }\n\t                }\n\t            }\n\t            return Promise.all(futures).then(function (allFutures) {\n\t                var l = allFutures.length;\n\t                var result = {\n\t                    checkedFields: checkedFields,\n\t                    foundAnyError: false\n\t                };\n\t                for (var fI = 0; fI < l; fI++) {\n\t                    if (!allFutures[fI]) {\n\t                        result.foundAnyError = true;\n\t                        break;\n\t                    }\n\t                }\n\t                return result;\n\t            });\n\t        }\n\t\n\t        /**\n\t         * Remove all errors for this form\n\t         * @returns {Form}\n\t         */\n\t\n\t    }, {\n\t        key: 'removeErrors',\n\t        value: function removeErrors() {\n\t            this._removeElementErrors(this.form);\n\t            if (this.tooltips) {\n\t                this.tooltips.removeTooltip();\n\t            }\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * Will handle errors for given fields\n\t         * @param {Array|NodeList} fields\n\t         * @param {Boolean} removeAllErrors\n\t         */\n\t\n\t    }, {\n\t        key: 'prepareErrors',\n\t        value: function prepareErrors(fields, removeAllErrors) {\n\t            var _this4 = this;\n\t\n\t            if (removeAllErrors) {\n\t                this.removeErrors();\n\t            }\n\t            var labelGroups = {};\n\t            var invalidFields = [];\n\t\n\t            function handleAdditionalLabels(isInvalid, thisLabelGroup, field) {\n\t                var additionalLabels = field.getAttribute(ATTR_DATA_CUSTOM_LABEL) || field.id;\n\t                var group = thisLabelGroup[additionalLabels];\n\t                if (additionalLabels) {\n\t                    // check additionally if field is currently marked as invalid\n\t                    // so the label is not marked as error if no field is marked as one\n\t                    group = group || isInvalid;\n\t                    thisLabelGroup[additionalLabels] = group;\n\t                }\n\t            }\n\t\n\t            // We save all validations in an extra property because we need to reset the validity due some\n\t            // implementation errors in other browsers then chrome\n\t            for (var i = 0; i < fields.length; i++) {\n\t                var field = fields[i];\n\t                var errorTarget = Form._findErrorTarget(field);\n\t                var parent = errorTarget.parentNode;\n\t                var validity = field.validity;\n\t                var isInvalid = validity && !validity.valid;\n\t                if (Form._shouldNotValidateField(field)) {\n\t                    continue;\n\t                }\n\t                field.flexFormsSavedValidity = JSON.parse(JSON.stringify(validity));\n\t                handleAdditionalLabels(isInvalid, labelGroups, field);\n\t                if (isInvalid) {\n\t                    if (!removeAllErrors) {\n\t                        // Remove current errors:\n\t                        this._removeElementErrors(parent);\n\t                    }\n\t                    // setup custom error messages:\n\t                    this._setupErrorMessages(field, validity);\n\t                    var msg = field.validationMessage;\n\t\n\t                    // mark fields as invalid\n\t                    this._markElementInvalid(errorTarget);\n\t                    this._markElementInvalid(field);\n\t\n\t                    if (this.options.appendError) {\n\t                        parent.insertAdjacentHTML(\"beforeend\", '<div class=\"' + this.options.containerErrorClass + '\">' + msg + '</div>');\n\t                    }\n\t                    invalidFields.push(field);\n\t                    field.flexFormsSavedValidationMessage = msg;\n\t                } else {\n\t                    // restore invalid fields\n\t                    this._markElementValid(errorTarget);\n\t                    this._markElementValid(field);\n\t\n\t                    // cleanup\n\t                    delete field.flexFormsSavedValidationMessage;\n\t\n\t                    // remove error markup\n\t                    this._removeElementErrors(parent);\n\t                }\n\t                // We have to reset the custom validity here to allow native validations work again\n\t                field.setCustomValidity('');\n\t            }\n\t            // if validates a single field we need to check the linked fields to a label:\n\t            if (fields.length === 1) {\n\t                var _field = fields[0];\n\t                var id = _field.getAttribute(ATTR_DATA_CUSTOM_LABEL) || _field.id;\n\t                if (id) {\n\t                    var linkedFields = Array.from(this.getForm().querySelectorAll('[' + ATTR_DATA_CUSTOM_LABEL + '=\"' + id + '\"], #' + id));\n\t                    linkedFields.forEach(function (thisField) {\n\t                        var validity = thisField.validity;\n\t                        var isInvalid = validity && !validity.valid && _this4._isElementInvalidElement(thisField);\n\t                        handleAdditionalLabels(isInvalid, labelGroups, thisField);\n\t                    });\n\t                }\n\t            }\n\t            this._handleLabels(labelGroups);\n\t            return invalidFields;\n\t        }\n\t\n\t        /**\n\t         * Validates all custom fields\n\t         * @returns {Promise}\n\t         */\n\t\n\t    }, {\n\t        key: 'validateCustomFields',\n\t        value: function validateCustomFields() {\n\t            return this._customValidationsForElements(this.form.querySelectorAll(\"[data-validate]\"));\n\t        }\n\t\n\t        /**\n\t         * Tests if a field should be validated\n\t         * @param {HTMLElement} field\n\t         * @returns {boolean}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: 'getForm',\n\t\n\t\n\t        /**\n\t         * This form\n\t         * @returns {HTMLElement}\n\t         */\n\t        value: function getForm() {\n\t            return this.form;\n\t        }\n\t\n\t        /**\n\t         * Registers a function that handles remote validation\n\t         * @param {Function} func\n\t         * @returns {Form}\n\t         */\n\t\n\t    }, {\n\t        key: 'registerRemoteValidation',\n\t        value: function registerRemoteValidation(func) {\n\t            this._remoteValidationFunction = func;\n\t            return this;\n\t        }\n\t\n\t        /**\n\t         * Formats the error content for the tooltip\n\t         * @param {String} error\n\t         * @returns {String}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_formatErrorTooltip',\n\t        value: function _formatErrorTooltip(error) {\n\t            return this.options.formatErrorTooltip.apply(this, [error]);\n\t        }\n\t\n\t        /**\n\t         * Tries to find a custom error target on given target\n\t         * @param target\n\t         * @returns {HTMLElement}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: 'showAndOrCreateTooltip',\n\t\n\t\n\t        /**\n\t         * Creates a tooltip at given element, will only create a new instance if not created\n\t         * @param {HTMLElement} target\n\t         * @param {Boolean} [remove]\n\t         */\n\t        value: function showAndOrCreateTooltip(target, remove) {\n\t            var self = this;\n\t            if (!this.tooltips && this.options.createTooltips) {\n\t                this.tooltips = new _Tooltip2.default(this.options.tooltipContainer, this.options.tooltipOptions);\n\t            }\n\t            if (!this.options.createTooltips) {\n\t                return false;\n\t            }\n\t\n\t            if (!target.flexFormsSavedValidity) {\n\t                return false;\n\t            }\n\t            var errorTarget = Form._findErrorTarget(target);\n\t            var result = false;\n\t            if (!target.flexFormsSavedValidity.valid && self._isElementInvalidElement(errorTarget)) {\n\t                self.tooltips.createTooltip(errorTarget, self._formatErrorTooltip(target.flexFormsSavedValidationMessage), false);\n\t                result = true;\n\t            } else {\n\t                if (remove) {\n\t                    self.tooltips.removeTooltip();\n\t                }\n\t            }\n\t            return result;\n\t        }\n\t\n\t        /**\n\t         * Checks if element is marked as invalid\n\t         * @param {HTMLElement} el\n\t         * @returns {boolean}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_isElementInvalidElement',\n\t        value: function _isElementInvalidElement(el) {\n\t            return el.hasAttribute(DATA_ELEMENT_INVALID);\n\t        }\n\t\n\t        /**\n\t         * Handles invalid event of a form\n\t         * @param {Event} e\n\t         * @returns {Promise|boolean}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_checkIsInvalid',\n\t        value: function _checkIsInvalid(e) {\n\t            e.preventDefault();\n\t            var invalidFields = this.getForm().querySelectorAll(\":invalid\");\n\t            return this._handleValidation(invalidFields, true, false);\n\t        }\n\t\n\t        /**\n\t         * Will query dependent fields (by selector) that should be validated with given field\n\t         * @param field\n\t         * @returns {NodeList|[]}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_getDependentFields',\n\t        value: function _getDependentFields(field) {\n\t            var fieldSelector = field.getAttribute(ATTR_DEPENDS);\n\t            var base = [field];\n\t            if (fieldSelector) {\n\t                base.push.apply(base, Array.prototype.slice.apply(this.getForm().querySelectorAll(fieldSelector)));\n\t            }\n\t            return base;\n\t        }\n\t\n\t        /**\n\t         * @private\n\t         * @param {HTMLElement} [target]\n\t         */\n\t\n\t    }, {\n\t        key: '_handleTooltipInline',\n\t        value: function _handleTooltipInline(target) {\n\t            if (this.tooltips) {\n\t                this.tooltips.removeTooltip(target);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Initializes validation for a given form, registers event handlers\n\t         */\n\t\n\t    }, {\n\t        key: 'initFormValidation',\n\t        value: function initFormValidation() {\n\t            var _this5 = this;\n\t\n\t            // Suppress the default bubbles\n\t            var self = this;\n\t            var form = this.getForm();\n\t            var invalidEvent = 'invalid';\n\t\n\t            /**\n\t             * Validates if is valid realtime element\n\t             * @param {HTMLElement} target\n\t             * @returns {boolean}\n\t             * @private\n\t             */\n\t            function _checkIsValidRealtimeElement(target) {\n\t                return !target.hasAttribute(ATTR_DISABLE_REALTIME) && !target.hasAttribute(ATTR_DISABLE_INLINE);\n\t            }\n\t\n\t            form.addEventListener(invalidEvent, function (e) {\n\t                e.preventDefault();\n\t            }, true);\n\t\n\t            _Util2.default.addEventOnce(invalidEvent, form, function handleInvalid(e) {\n\t                self._formLoading();\n\t                var result = self._checkIsInvalid(e);\n\t                if (result) {\n\t                    self.currentValidationFuture = new Promise(function (resolve) {\n\t                        result.then(function (r) {\n\t                            setTimeout(function () {\n\t                                _Util2.default.addEventOnce(invalidEvent, form, handleInvalid, true);\n\t                            }, 0);\n\t                            resolve(r);\n\t                            self._formStopLoading();\n\t                            if (!r.foundAnyError) {\n\t                                self._formLoading();\n\t                                self._handleSubmit(e);\n\t                            }\n\t                        });\n\t                    });\n\t                }\n\t            }, true);\n\t\n\t            this.addEventListener(form, 'reset', function () {\n\t                _this5.removeErrors();\n\t            });\n\t\n\t            // Timeout for keys:\n\t            var TIMEOUT_KEYDOWN = void 0;\n\t            var KEYDOWN_RUNNING = false;\n\t\n\t            // resets keydown events\n\t            function clearKeyDownTimeout() {\n\t                KEYDOWN_RUNNING = false;\n\t                clearTimeout(TIMEOUT_KEYDOWN);\n\t            }\n\t\n\t            // setup custom realtime event if given\n\t            if (self.options.realtime) {\n\t                this.addEventListener(form, CONST_REALTIME_EVENT, function (e) {\n\t                    if (self._formIsLoading()) {\n\t                        return;\n\t                    }\n\t                    var target = e.target;\n\t                    clearTimeout(TIMEOUT_KEYDOWN);\n\t                    if (KEYDOWN_RUNNING) {\n\t                        return;\n\t                    }\n\t                    TIMEOUT_KEYDOWN = setTimeout(function () {\n\t                        var isStillTarget = document.activeElement === e.target;\n\t                        if (!_checkIsValidRealtimeElement(target)) {\n\t                            return;\n\t                        }\n\t                        if (isStillTarget) {\n\t                            self._handleTooltipInline();\n\t                        }\n\t                        KEYDOWN_RUNNING = true;\n\t                        var dependentFields = self._getDependentFields(target);\n\t                        self._customValidationsForElements(dependentFields).then(function () {\n\t                            self.prepareErrors(dependentFields, false);\n\t                            if (isStillTarget) {\n\t                                self.showAndOrCreateTooltip(e.target);\n\t                            }\n\t                            // future must be resolved before another event can be started\n\t                            KEYDOWN_RUNNING = false;\n\t                        });\n\t                    }, self.options.realtimeTimeout);\n\t                }, true);\n\t            }\n\t\n\t            /**\n\t             * Validates if target is a valid input field to check blur and focus events\n\t             *\n\t             * @param {HTMLElement} target\n\t             * @returns {boolean}\n\t             * @private\n\t             */\n\t            function _checkIsValidBlurFocusElement(target) {\n\t                var attr = target.getAttribute(\"type\");\n\t                return attr !== \"radio\" && attr !== \"checkbox\" && attr !== \"submit\";\n\t            }\n\t\n\t            /**\n\t             * Validates if is valid inline-check element\n\t             * @param {HTMLElement} target\n\t             * @returns {boolean}\n\t             * @private\n\t             */\n\t            function _checkIsValidInlineCheckElement(target) {\n\t                return !target.hasAttribute(ATTR_DISABLE_INLINE);\n\t            }\n\t\n\t            this.addEventListener(form, 'blur', function (e) {\n\t                // do not hide tooltip after change event\n\t                if (!e.target.flexcssKeepTooltips) {\n\t                    self._handleTooltipInline(e.target);\n\t                }\n\t                delete e.target.flexcssKeepTooltips;\n\t            }, true);\n\t\n\t            // handle focus on input elements\n\t            // will show an error if field is invalid\n\t            this.addEventListener(form, \"focus\", function (e) {\n\t                if (self._formIsLoading()) {\n\t                    return;\n\t                }\n\t                // do not track errors for checkbox and radios on focus:\n\t                if (!_checkIsValidBlurFocusElement(e.target)) {\n\t                    return;\n\t                }\n\t                // we need to delay this a little, because Firefox and Safari do not show a tooltip after it\n\t                // just have been hidden (on blur). Maybe fix this with a queue later\n\t                setTimeout(function () {\n\t                    self.showAndOrCreateTooltip(e.target);\n\t                }, FOCUS_TOOLTIP_DELAY);\n\t            }, true);\n\t\n\t            if (self.options.inlineValidation) {\n\t                // Handle change for checkbox, radios and selects\n\t                this.addEventListener(form, \"change\", function (e) {\n\t                    var target = e.target;\n\t                    if (self._formIsLoading() || !_checkIsValidInlineCheckElement(target)) {\n\t                        return;\n\t                    }\n\t                    clearKeyDownTimeout();\n\t                    var name = target.getAttribute('name');\n\t                    var inputs = name ? form.querySelectorAll('[name=\"' + name + '\"]') : [target];\n\t                    // we only support dependent fields for a single widgets right now\n\t                    if (inputs.length === 1) {\n\t                        inputs = self._getDependentFields(target);\n\t                    }\n\t                    self._customValidationsForElements(inputs).then(function () {\n\t                        self.prepareErrors(inputs, false);\n\t                        target.flexcssKeepTooltips = self.showAndOrCreateTooltip(target, true);\n\t                        if (target.flexcssKeepTooltips) {\n\t                            self._handleTooltipHideClickAfterChange();\n\t                        }\n\t                    });\n\t                });\n\t            }\n\t\n\t            // prevent default if form is invalid\n\t            this.addEventListener(form, \"submit\", function listener(e) {\n\t                self._submitListener(e, listener);\n\t            });\n\t\n\t            _Event2.default.dispatchAndFire(form, EVENT_FORM_READY);\n\t        }\n\t\n\t        /* Loading states, unfortunately we can't check if a promise is pending :/*/\n\t        /* TODO: Maybe wrap promise to extend this functionality */\n\t\n\t    }, {\n\t        key: '_formLoading',\n\t        value: function _formLoading() {\n\t            this.getForm().classList.add(LOADING_CLASS);\n\t        }\n\t    }, {\n\t        key: '_formStopLoading',\n\t        value: function _formStopLoading() {\n\t            this.getForm().classList.remove(LOADING_CLASS);\n\t        }\n\t    }, {\n\t        key: '_formIsLoading',\n\t        value: function _formIsLoading() {\n\t            return this.getForm().classList.contains(LOADING_CLASS);\n\t        }\n\t\n\t        // this defines the logic after a change event when a tooltip is shown\n\t        // because we call this method inside the change event, the click would be immeditally executed with the change\n\t        // event when not using setTimeout(). There might be another solution for this...\n\t\n\t    }, {\n\t        key: '_handleTooltipHideClickAfterChange',\n\t        value: function _handleTooltipHideClickAfterChange() {\n\t            var self = this;\n\t            if (this.options.createTooltips) {\n\t                setTimeout(function () {\n\t                    _Util2.default.addEventOnce(_Settings2.default.getTabEvent(), global.document.body, function (t) {\n\t                        if (!self._isElementInvalidElement(t.target)) {\n\t                            self._handleTooltipInline();\n\t                        }\n\t                    });\n\t                }, CLICK_TOOLTIP_DELAY);\n\t            }\n\t        }\n\t    }, {\n\t        key: '_focusElement',\n\t        value: function _focusElement(el) {\n\t            el.focus();\n\t            if (this.options.shouldScrollToElement) {\n\t                _Util2.default.scrollToElement(el, this.options.scrollToElementDiff);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Listener that is executed on form submit\n\t         * @param e\n\t         * @param submitListener\n\t         * @returns {boolean}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_submitListener',\n\t        value: function _submitListener(e, submitListener) {\n\t            var form = this.getForm();\n\t            var self = this;\n\t            var submitEvent = 'submit';\n\t\n\t            if (this._formIsLoading()) {\n\t                e.preventDefault();\n\t                return false;\n\t            }\n\t            this._formLoading();\n\t            form.removeEventListener(submitEvent, submitListener);\n\t            this.removeErrors();\n\t            e.preventDefault();\n\t            // reset:\n\t            if (form.checkValidity()) {\n\t                form.addEventListener(submitEvent, submitListener);\n\t                // It's possible that the form is valid but the custom validations need to be checked again:\n\t                self.currentValidationFuture = new Promise(function (resolve) {\n\t                    var validation = self.validateCustomFields();\n\t                    validation.then(function (r) {\n\t                        // because custom validators may mark multiple fields as invalid, we get all of them in the form\n\t                        var fields = self._getInvalidElements();\n\t                        var errors = self.prepareErrors(fields, false);\n\t                        var firstError = errors[0];\n\t                        if (firstError) {\n\t                            self._focusElement(firstError);\n\t                            self.showAndOrCreateTooltip(firstError, true);\n\t                        }\n\t                        resolve(r);\n\t                    });\n\t                });\n\t                self.currentValidationFuture.then(function (r) {\n\t                    if (!r.foundAnyError) {\n\t                        // Handle submitting the form to server:\n\t                        self._handleSubmit(e);\n\t                    } else {\n\t                        self._formStopLoading();\n\t                    }\n\t                });\n\t            } else {\n\t                self._formStopLoading();\n\t                form.addEventListener(submitEvent, submitListener);\n\t            }\n\t        }\n\t\n\t        /**\n\t         * Handles submitting, optionally allows to stop submitting\n\t         * @param e\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_handleSubmit',\n\t        value: function _handleSubmit(e) {\n\t            this._submitFunction(this.form, e);\n\t        }\n\t\n\t        /**\n\t         * Registers a global event Handler\n\t         * @param errorFunc\n\t         */\n\t\n\t    }], [{\n\t        key: '_shouldNotValidateField',\n\t        value: function _shouldNotValidateField(field) {\n\t            var target = Form._findErrorTarget(field);\n\t            return target instanceof HTMLFieldSetElement || field.validity === undefined || target.hasAttribute(ATTR_VALIDATE_VISIBILITY) && !_Util2.default.isVisible(target);\n\t        }\n\t\n\t        /**\n\t         * Creates an array from a node list with invalid items\n\t         * This Method expicitly checks if field should not be validated so it can be used to foucs a field\n\t         * @param list\n\t         * @returns {Array}\n\t         * @private\n\t         */\n\t\n\t    }, {\n\t        key: '_createArrayFromInvalidFieldList',\n\t        value: function _createArrayFromInvalidFieldList(list) {\n\t            var arr = [];\n\t            for (var i = 0; i < list.length; ++i) {\n\t                var n = list[i];\n\t                if (n.validity && !n.validity.valid) {\n\t                    if (!Form._shouldNotValidateField(n)) {\n\t                        arr.push(n);\n\t                    }\n\t                }\n\t            }\n\t            return arr;\n\t        }\n\t    }, {\n\t        key: '_findErrorTarget',\n\t        value: function _findErrorTarget(target) {\n\t            var el = target.getAttribute(ATTR_ERROR_TARGET_ID) || target;\n\t            var foundTarget = el instanceof HTMLElement ? el : global.document.getElementById(el);\n\t            if (!foundTarget) {\n\t                throw new Error('Given error target did not exists: ' + target);\n\t            }\n\t            return foundTarget;\n\t        }\n\t    }, {\n\t        key: 'registerErrorMessageHandler',\n\t        value: function registerErrorMessageHandler(errorFunc) {\n\t            Form.globalErrorMessageHandler = errorFunc;\n\t        }\n\t\n\t        /**\n\t         * Initialize forms for a specific selector\n\t         * @param {String} selector\n\t         * @param {Object} [options]\n\t         * @return {array.<Form>}\n\t         */\n\t\n\t    }, {\n\t        key: 'init',\n\t        value: function init(selector, options) {\n\t            var forms = selector instanceof HTMLElement ? selector.querySelectorAll('form') : document.querySelectorAll(selector);\n\t            var instances = [];\n\t            for (var i = 0; i < forms.length; i++) {\n\t                instances.push(new Form(forms[i], options));\n\t            }\n\t            return instances;\n\t        }\n\t\n\t        /**\n\t         * Registers a global validator that is usable on all form instances\n\t         * @param {String} name\n\t         * @param {Function} validator\n\t         * @returns {Function}\n\t         */\n\t\n\t    }, {\n\t        key: 'registerValidator',\n\t        value: function registerValidator(name, validator) {\n\t            Form.globalValidators[name] = validator;\n\t            return Form;\n\t        }\n\t\n\t        /**\n\t         * Registers a global function that is called when a form should validate the response of a server\n\t         * @param {Function} func\n\t         * @returns {Form}\n\t         */\n\t\n\t    }, {\n\t        key: 'registerGlobalRemoteValidationFunction',\n\t        value: function registerGlobalRemoteValidationFunction(func) {\n\t            Form.globalRemoteValidationFunction = func;\n\t            return Form;\n\t        }\n\t    }]);\n\t\n\t    return Form;\n\t}(_DestroyableWidget3.default);\n\t\n\t/**\n\t * Global validators\n\t * @type {Array}\n\t */\n\t\n\t\n\tForm.globalValidators = [];\n\t\n\t/**\n\t * Global Remote validation function\n\t */\n\tForm.globalRemoteValidationFunction = function () {};\n\t\n\t/**\n\t * Handles custom error messages extracts custom message by default\n\t */\n\tForm.globalErrorMessageHandler = function (field, validity) {\n\t    if (!validity.customError) {\n\t        var customMsg = field.getAttribute(ATTR_DATA_CUSTOM_MESSAGE);\n\t        if (customMsg) {\n\t            field.setCustomValidity(customMsg);\n\t        }\n\t    }\n\t};\n\t\n\texports.default = Form;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 10 */,\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// the whatwg-fetch polyfill installs the fetch() function\n\t// on the global object (window or self)\n\t//\n\t// Return that as the export for use in Webpack, Browserify etc.\n\t__webpack_require__(12);\n\tmodule.exports = self.fetch.bind(self);\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t(function(self) {\n\t  'use strict';\n\t\n\t  if (self.fetch) {\n\t    return\n\t  }\n\t\n\t  var support = {\n\t    searchParams: 'URLSearchParams' in self,\n\t    iterable: 'Symbol' in self && 'iterator' in Symbol,\n\t    blob: 'FileReader' in self && 'Blob' in self && (function() {\n\t      try {\n\t        new Blob()\n\t        return true\n\t      } catch(e) {\n\t        return false\n\t      }\n\t    })(),\n\t    formData: 'FormData' in self,\n\t    arrayBuffer: 'ArrayBuffer' in self\n\t  }\n\t\n\t  if (support.arrayBuffer) {\n\t    var viewClasses = [\n\t      '[object Int8Array]',\n\t      '[object Uint8Array]',\n\t      '[object Uint8ClampedArray]',\n\t      '[object Int16Array]',\n\t      '[object Uint16Array]',\n\t      '[object Int32Array]',\n\t      '[object Uint32Array]',\n\t      '[object Float32Array]',\n\t      '[object Float64Array]'\n\t    ]\n\t\n\t    var isDataView = function(obj) {\n\t      return obj && DataView.prototype.isPrototypeOf(obj)\n\t    }\n\t\n\t    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n\t      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n\t    }\n\t  }\n\t\n\t  function normalizeName(name) {\n\t    if (typeof name !== 'string') {\n\t      name = String(name)\n\t    }\n\t    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n\t      throw new TypeError('Invalid character in header field name')\n\t    }\n\t    return name.toLowerCase()\n\t  }\n\t\n\t  function normalizeValue(value) {\n\t    if (typeof value !== 'string') {\n\t      value = String(value)\n\t    }\n\t    return value\n\t  }\n\t\n\t  // Build a destructive iterator for the value list\n\t  function iteratorFor(items) {\n\t    var iterator = {\n\t      next: function() {\n\t        var value = items.shift()\n\t        return {done: value === undefined, value: value}\n\t      }\n\t    }\n\t\n\t    if (support.iterable) {\n\t      iterator[Symbol.iterator] = function() {\n\t        return iterator\n\t      }\n\t    }\n\t\n\t    return iterator\n\t  }\n\t\n\t  function Headers(headers) {\n\t    this.map = {}\n\t\n\t    if (headers instanceof Headers) {\n\t      headers.forEach(function(value, name) {\n\t        this.append(name, value)\n\t      }, this)\n\t\n\t    } else if (headers) {\n\t      Object.getOwnPropertyNames(headers).forEach(function(name) {\n\t        this.append(name, headers[name])\n\t      }, this)\n\t    }\n\t  }\n\t\n\t  Headers.prototype.append = function(name, value) {\n\t    name = normalizeName(name)\n\t    value = normalizeValue(value)\n\t    var list = this.map[name]\n\t    if (!list) {\n\t      list = []\n\t      this.map[name] = list\n\t    }\n\t    list.push(value)\n\t  }\n\t\n\t  Headers.prototype['delete'] = function(name) {\n\t    delete this.map[normalizeName(name)]\n\t  }\n\t\n\t  Headers.prototype.get = function(name) {\n\t    var values = this.map[normalizeName(name)]\n\t    return values ? values[0] : null\n\t  }\n\t\n\t  Headers.prototype.getAll = function(name) {\n\t    return this.map[normalizeName(name)] || []\n\t  }\n\t\n\t  Headers.prototype.has = function(name) {\n\t    return this.map.hasOwnProperty(normalizeName(name))\n\t  }\n\t\n\t  Headers.prototype.set = function(name, value) {\n\t    this.map[normalizeName(name)] = [normalizeValue(value)]\n\t  }\n\t\n\t  Headers.prototype.forEach = function(callback, thisArg) {\n\t    Object.getOwnPropertyNames(this.map).forEach(function(name) {\n\t      this.map[name].forEach(function(value) {\n\t        callback.call(thisArg, value, name, this)\n\t      }, this)\n\t    }, this)\n\t  }\n\t\n\t  Headers.prototype.keys = function() {\n\t    var items = []\n\t    this.forEach(function(value, name) { items.push(name) })\n\t    return iteratorFor(items)\n\t  }\n\t\n\t  Headers.prototype.values = function() {\n\t    var items = []\n\t    this.forEach(function(value) { items.push(value) })\n\t    return iteratorFor(items)\n\t  }\n\t\n\t  Headers.prototype.entries = function() {\n\t    var items = []\n\t    this.forEach(function(value, name) { items.push([name, value]) })\n\t    return iteratorFor(items)\n\t  }\n\t\n\t  if (support.iterable) {\n\t    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n\t  }\n\t\n\t  function consumed(body) {\n\t    if (body.bodyUsed) {\n\t      return Promise.reject(new TypeError('Already read'))\n\t    }\n\t    body.bodyUsed = true\n\t  }\n\t\n\t  function fileReaderReady(reader) {\n\t    return new Promise(function(resolve, reject) {\n\t      reader.onload = function() {\n\t        resolve(reader.result)\n\t      }\n\t      reader.onerror = function() {\n\t        reject(reader.error)\n\t      }\n\t    })\n\t  }\n\t\n\t  function readBlobAsArrayBuffer(blob) {\n\t    var reader = new FileReader()\n\t    var promise = fileReaderReady(reader)\n\t    reader.readAsArrayBuffer(blob)\n\t    return promise\n\t  }\n\t\n\t  function readBlobAsText(blob) {\n\t    var reader = new FileReader()\n\t    var promise = fileReaderReady(reader)\n\t    reader.readAsText(blob)\n\t    return promise\n\t  }\n\t\n\t  function readArrayBufferAsText(buf) {\n\t    var view = new Uint8Array(buf)\n\t    var chars = new Array(view.length)\n\t\n\t    for (var i = 0; i < view.length; i++) {\n\t      chars[i] = String.fromCharCode(view[i])\n\t    }\n\t    return chars.join('')\n\t  }\n\t\n\t  function bufferClone(buf) {\n\t    if (buf.slice) {\n\t      return buf.slice(0)\n\t    } else {\n\t      var view = new Uint8Array(buf.byteLength)\n\t      view.set(new Uint8Array(buf))\n\t      return view.buffer\n\t    }\n\t  }\n\t\n\t  function Body() {\n\t    this.bodyUsed = false\n\t\n\t    this._initBody = function(body) {\n\t      this._bodyInit = body\n\t      if (!body) {\n\t        this._bodyText = ''\n\t      } else if (typeof body === 'string') {\n\t        this._bodyText = body\n\t      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n\t        this._bodyBlob = body\n\t      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n\t        this._bodyFormData = body\n\t      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n\t        this._bodyText = body.toString()\n\t      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n\t        this._bodyArrayBuffer = bufferClone(body.buffer)\n\t        // IE 10-11 can't handle a DataView body.\n\t        this._bodyInit = new Blob([this._bodyArrayBuffer])\n\t      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n\t        this._bodyArrayBuffer = bufferClone(body)\n\t      } else {\n\t        throw new Error('unsupported BodyInit type')\n\t      }\n\t\n\t      if (!this.headers.get('content-type')) {\n\t        if (typeof body === 'string') {\n\t          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n\t        } else if (this._bodyBlob && this._bodyBlob.type) {\n\t          this.headers.set('content-type', this._bodyBlob.type)\n\t        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n\t          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n\t        }\n\t      }\n\t    }\n\t\n\t    if (support.blob) {\n\t      this.blob = function() {\n\t        var rejected = consumed(this)\n\t        if (rejected) {\n\t          return rejected\n\t        }\n\t\n\t        if (this._bodyBlob) {\n\t          return Promise.resolve(this._bodyBlob)\n\t        } else if (this._bodyArrayBuffer) {\n\t          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n\t        } else if (this._bodyFormData) {\n\t          throw new Error('could not read FormData body as blob')\n\t        } else {\n\t          return Promise.resolve(new Blob([this._bodyText]))\n\t        }\n\t      }\n\t\n\t      this.arrayBuffer = function() {\n\t        if (this._bodyArrayBuffer) {\n\t          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n\t        } else {\n\t          return this.blob().then(readBlobAsArrayBuffer)\n\t        }\n\t      }\n\t    }\n\t\n\t    this.text = function() {\n\t      var rejected = consumed(this)\n\t      if (rejected) {\n\t        return rejected\n\t      }\n\t\n\t      if (this._bodyBlob) {\n\t        return readBlobAsText(this._bodyBlob)\n\t      } else if (this._bodyArrayBuffer) {\n\t        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n\t      } else if (this._bodyFormData) {\n\t        throw new Error('could not read FormData body as text')\n\t      } else {\n\t        return Promise.resolve(this._bodyText)\n\t      }\n\t    }\n\t\n\t    if (support.formData) {\n\t      this.formData = function() {\n\t        return this.text().then(decode)\n\t      }\n\t    }\n\t\n\t    this.json = function() {\n\t      return this.text().then(JSON.parse)\n\t    }\n\t\n\t    return this\n\t  }\n\t\n\t  // HTTP methods whose capitalization should be normalized\n\t  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\t\n\t  function normalizeMethod(method) {\n\t    var upcased = method.toUpperCase()\n\t    return (methods.indexOf(upcased) > -1) ? upcased : method\n\t  }\n\t\n\t  function Request(input, options) {\n\t    options = options || {}\n\t    var body = options.body\n\t\n\t    if (typeof input === 'string') {\n\t      this.url = input\n\t    } else {\n\t      if (input.bodyUsed) {\n\t        throw new TypeError('Already read')\n\t      }\n\t      this.url = input.url\n\t      this.credentials = input.credentials\n\t      if (!options.headers) {\n\t        this.headers = new Headers(input.headers)\n\t      }\n\t      this.method = input.method\n\t      this.mode = input.mode\n\t      if (!body && input._bodyInit != null) {\n\t        body = input._bodyInit\n\t        input.bodyUsed = true\n\t      }\n\t    }\n\t\n\t    this.credentials = options.credentials || this.credentials || 'omit'\n\t    if (options.headers || !this.headers) {\n\t      this.headers = new Headers(options.headers)\n\t    }\n\t    this.method = normalizeMethod(options.method || this.method || 'GET')\n\t    this.mode = options.mode || this.mode || null\n\t    this.referrer = null\n\t\n\t    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n\t      throw new TypeError('Body not allowed for GET or HEAD requests')\n\t    }\n\t    this._initBody(body)\n\t  }\n\t\n\t  Request.prototype.clone = function() {\n\t    return new Request(this, { body: this._bodyInit })\n\t  }\n\t\n\t  function decode(body) {\n\t    var form = new FormData()\n\t    body.trim().split('&').forEach(function(bytes) {\n\t      if (bytes) {\n\t        var split = bytes.split('=')\n\t        var name = split.shift().replace(/\\+/g, ' ')\n\t        var value = split.join('=').replace(/\\+/g, ' ')\n\t        form.append(decodeURIComponent(name), decodeURIComponent(value))\n\t      }\n\t    })\n\t    return form\n\t  }\n\t\n\t  function parseHeaders(rawHeaders) {\n\t    var headers = new Headers()\n\t    rawHeaders.split('\\r\\n').forEach(function(line) {\n\t      var parts = line.split(':')\n\t      var key = parts.shift().trim()\n\t      if (key) {\n\t        var value = parts.join(':').trim()\n\t        headers.append(key, value)\n\t      }\n\t    })\n\t    return headers\n\t  }\n\t\n\t  Body.call(Request.prototype)\n\t\n\t  function Response(bodyInit, options) {\n\t    if (!options) {\n\t      options = {}\n\t    }\n\t\n\t    this.type = 'default'\n\t    this.status = 'status' in options ? options.status : 200\n\t    this.ok = this.status >= 200 && this.status < 300\n\t    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n\t    this.headers = new Headers(options.headers)\n\t    this.url = options.url || ''\n\t    this._initBody(bodyInit)\n\t  }\n\t\n\t  Body.call(Response.prototype)\n\t\n\t  Response.prototype.clone = function() {\n\t    return new Response(this._bodyInit, {\n\t      status: this.status,\n\t      statusText: this.statusText,\n\t      headers: new Headers(this.headers),\n\t      url: this.url\n\t    })\n\t  }\n\t\n\t  Response.error = function() {\n\t    var response = new Response(null, {status: 0, statusText: ''})\n\t    response.type = 'error'\n\t    return response\n\t  }\n\t\n\t  var redirectStatuses = [301, 302, 303, 307, 308]\n\t\n\t  Response.redirect = function(url, status) {\n\t    if (redirectStatuses.indexOf(status) === -1) {\n\t      throw new RangeError('Invalid status code')\n\t    }\n\t\n\t    return new Response(null, {status: status, headers: {location: url}})\n\t  }\n\t\n\t  self.Headers = Headers\n\t  self.Request = Request\n\t  self.Response = Response\n\t\n\t  self.fetch = function(input, init) {\n\t    return new Promise(function(resolve, reject) {\n\t      var request = new Request(input, init)\n\t      var xhr = new XMLHttpRequest()\n\t\n\t      xhr.onload = function() {\n\t        var options = {\n\t          status: xhr.status,\n\t          statusText: xhr.statusText,\n\t          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n\t        }\n\t        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n\t        var body = 'response' in xhr ? xhr.response : xhr.responseText\n\t        resolve(new Response(body, options))\n\t      }\n\t\n\t      xhr.onerror = function() {\n\t        reject(new TypeError('Network request failed'))\n\t      }\n\t\n\t      xhr.ontimeout = function() {\n\t        reject(new TypeError('Network request failed'))\n\t      }\n\t\n\t      xhr.open(request.method, request.url, true)\n\t\n\t      if (request.credentials === 'include') {\n\t        xhr.withCredentials = true\n\t      }\n\t\n\t      if ('responseType' in xhr && support.blob) {\n\t        xhr.responseType = 'blob'\n\t      }\n\t\n\t      request.headers.forEach(function(value, name) {\n\t        xhr.setRequestHeader(name, value)\n\t      })\n\t\n\t      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n\t    })\n\t  }\n\t  self.fetch.polyfill = true\n\t})(typeof self !== 'undefined' ? self : this);\n\n\n/***/ },\n/* 13 */,\n/* 14 */,\n/* 15 */,\n/* 16 */,\n/* 17 */,\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t    value: true\n\t});\n\t\n\tvar _Form = __webpack_require__(9);\n\t\n\tvar _Form2 = _interopRequireDefault(_Form);\n\t\n\tvar _Tooltip = __webpack_require__(6);\n\t\n\tvar _Tooltip2 = _interopRequireDefault(_Tooltip);\n\t\n\tvar _Settings = __webpack_require__(2);\n\t\n\tvar _Settings2 = _interopRequireDefault(_Settings);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// default export as component object\n\texports.default = {\n\t    Form: _Form2.default,\n\t    Settings: _Settings2.default,\n\t    Tooltip: _Tooltip2.default\n\t};\n\n/***/ }\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// js/form.min.js"," \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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"../\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c14592c10d64a660ef67","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nconst PFX = [\"webkit\", \"moz\", \"MS\", \"o\", \"\"];\n\nconst COL_LEFT_CLASS = 'is-collision-left';\n\nconst COL_RIGHT_CLASS = 'is-collision-right';\n\nconst COL_BOTTOM_CLASS = 'is-collision-bottom';\n\n/**\n * Provides shared DOM-Utility functions\n */\nclass Util {\n\n    /**\n     * Will register the right animation event based on browser\n     * @param element\n     * @param type\n     * @param callback\n     */\n    static prefixedAnimateEvent(element, type, callback) {\n        const thisFunction = function thisFunction(e) {\n            callback.apply(element, [e, thisFunction]);\n        };\n\n        for (let p = 0; p < PFX.length; p++) {\n            let thisType = type;\n            if (!PFX[p]) {\n                thisType = type.toLowerCase();\n            }\n            const name = PFX[p] + thisType;\n            element.addEventListener(name, thisFunction, true);\n        }\n    }\n\n    /**\n     * Get correct transitionend event\n     * @returns {String}\n     * @private\n     */\n    static whichTransitionEndEvent() {\n        const el = document.createElement('fake');\n\n        const transitions = {\n            transition: 'transitionend',\n            OTransition: 'oTransitionEnd',\n            MozTransition: 'transitionend',\n            WebkitTransition: 'webkitTransitionEnd'\n        };\n\n        for (const [key, value] of Object.entries(transitions)) {\n            if (el.style[key] !== undefined) {\n                return value;\n            }\n        }\n    }\n\n    /**\n     * Check if target is part of parent node\n     * @param target\n     * @param parent\n     * @returns {boolean}\n     */\n    static isPartOfNode(target, parent) {\n        if (!target || !parent) {\n            return false;\n        }\n        let now = target;\n        while (now !== parent && now !== null) {\n            if (now === parent) {\n                break;\n            }\n            now = now.parentNode;\n        }\n        return now !== null;\n    }\n\n    /**\n     * Finds the closest element including itself matching a callback\n     * @param {Node} el\n     * @param {Function} callback\n     * @returns {Node|boolean}\n     */\n    static closestCallback(el, callback) {\n        let element = el;\n        while (element !== null) {\n            if (callback(element)) {\n                return element;\n            }\n            element = element.parentNode;\n        }\n        return false;\n    }\n\n    /**\n     * Walks the tree until func returns true for given argument\n     * @param target\n     * @param func\n     * @returns {boolean|HTMLElement}\n     */\n    static parentsUntil(target, func) {\n        if (!target) {\n            return false;\n        }\n        let now = target;\n        while (!func(now) && now !== null) {\n            now = now.parentNode;\n        }\n\n        return now;\n    }\n\n    /**\n     * Generates a unique id\n     * @return {String}\n     */\n    static guid() {\n        function s4() {\n            return Math.floor((1 + Math.random()) * 0x10000)\n                .toString(16)\n                .substring(1);\n        }\n\n        return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4() + s4() + s4()}`;\n    }\n\n    /**\n     * Detects scrollbar width\n     * @see http://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes\n     * @returns {number}\n     */\n    static getScrollBarWidth() {\n        const doc = global.document;\n        const inner = doc.createElement('p');\n\n        inner.style.width = \"100%\";\n        inner.style.height = \"200px\";\n\n        const outer = doc.createElement('div');\n        outer.style.position = \"absolute\";\n        outer.style.top = \"0px\";\n        outer.style.left = \"0px\";\n        outer.style.visibility = \"hidden\";\n        outer.style.width = \"200px\";\n        outer.style.height = \"150px\";\n        outer.style.overflow = \"hidden\";\n        outer.appendChild(inner);\n\n        doc.body.appendChild(outer);\n        const w1 = inner.offsetWidth;\n        outer.style.overflow = 'scroll';\n        let w2 = inner.offsetWidth;\n        if (w1 === w2) {\n            w2 = outer.clientWidth;\n        }\n        doc.body.removeChild(outer);\n\n        return (w1 - w2);\n    }\n\n\n    /**\n     * Run an event once\n     * @param {String} ev\n     * @param {HTMLElement|HTMLDocument} target\n     * @param {Function} func\n     * @param {boolean} [capture]\n     * @return Function created listener\n     */\n    static addEventOnce(ev, target, func, capture) {\n        const thisFunction = function thisFunction(event) {\n            func(event, func);\n            target.removeEventListener(ev, thisFunction, capture);\n        };\n        target.addEventListener(ev, thisFunction, capture);\n        return thisFunction;\n    }\n\n    /**\n     * Checks if an element is visible\n     * @param {HTMLElement} element\n     * @returns bool\n     */\n    static isVisible(element) {\n        return element.offsetWidth > 0 && element.offsetHeight > 0;\n    }\n\n    /**\n     * Creates a camelCaseRepresentation of a dashed string\n     * @param {String} str\n     * @returns String\n     */\n    static dashToCamelCase(str) {\n        return str.replace(/-([a-z])/g, (g) => {\n            return g[1].toUpperCase();\n        });\n    }\n\n    /**\n     * Creates a copy of `input`\n     * @param {*} input\n     * @return *\n     */\n    static copy(input) {\n        return JSON.parse(JSON.stringify(input));\n    }\n\n    /**\n     * Reads options from element (data attributes) and applies to base\n     * @param {HTMLElement} element\n     * @param {Object} base\n     * @return {Object}\n     */\n    static applyOptionsFromElement(element, base) {\n        if (!element) {\n            return base;\n        }\n        const attrs = element.attributes;\n        for (let i = 0; i < attrs.length; i++) {\n            const attr = attrs[i];\n            if (attr) {\n                const s = Util.dashToCamelCase(attr.nodeName.replace('data-', ''));\n                const val = attr.nodeValue;\n                if (base.hasOwnProperty(s)) {\n                    // skip functions\n                    if (typeof base[s] === 'function') {\n                        continue;\n                    }\n                    if (typeof base[s] === 'boolean') {\n                        base[s] = parseInt(val || 1, 10) === 1;\n                    } else {\n                        base[s] = val;\n                    }\n                }\n            }\n        }\n        return base;\n    }\n\n    /**\n     * Will position an element directly at given target\n     * Is aware of a given collision container to detect edges\n     * Will put elementToPosition either to left, center or right edge (prefer right)\n     *  and either to bottom or top (prefers bottom)\n     *\n     * You may overwrite preferred positioned with `centerHorizontal` and `positionTop`\n     *\n     * @param {HTMLElement|ClientRect} target the target container to align to\n     * @param {HTMLElement} elementToPosition the element to position\n     * @param {HTMLElement} collisionContainer the outer container to prevent collisions\n     * @param {boolean} [centerHorizontal] set true to center element, otherwise it's put on the right border by default\n     * @param {boolean} [positionTop] flip top, by default element is positioned to the bottom.\n     * @returns {HTMLElement}\n     */\n    static setupPositionNearby(target, elementToPosition, collisionContainer, centerHorizontal, positionTop) {\n        // determine relative offsets\n        let amountTop = 0;\n        let amountLeft = 0;\n        Util.parentsUntil(target.parentNode, (el) => {\n            if (!(el instanceof HTMLElement)) {\n                return false;\n            }\n            const style = window.getComputedStyle(el);\n            if (Util.isPartOfNode(elementToPosition, el)) {\n                if (style && style.position === 'relative') {\n                    amountTop += el.offsetTop || 0;\n                    amountLeft += el.offsetLeft || 0;\n                }\n                return false;\n            }\n            return true;\n        });\n\n        const targetPosition = target instanceof HTMLElement ? target.getBoundingClientRect() : target;\n        const elementRect = elementToPosition.getBoundingClientRect();\n        const colRect = collisionContainer.getBoundingClientRect();\n        const targetTop = targetPosition.top - amountTop;\n        const targetRight = targetPosition.right;\n        const isCollisionTop = (targetTop - elementRect.height) <= 0;\n        const isCollisionBottom =\n            window.innerHeight < (targetTop + amountTop + targetPosition.height + elementRect.height);\n        const isCollisionLeft = targetRight < elementRect.width;\n        const targetLeft = targetPosition.left;\n        const isCollisionRight = (targetLeft + elementRect.width) > colRect.width;\n        const classList = elementToPosition.classList;\n\n        classList.remove(COL_RIGHT_CLASS);\n        classList.remove(COL_LEFT_CLASS);\n        classList.remove(COL_BOTTOM_CLASS);\n\n        let calcTop;\n        let calcLeft;\n        if (isCollisionLeft && !isCollisionRight) {\n            // put element to left if collision with left\n            calcLeft = `${(targetPosition.left - colRect.left - amountLeft)}px`;\n            classList.add(COL_LEFT_CLASS);\n        } else {\n            // maybe center if no collision with either side\n            const rightPosition = `${(targetRight - elementRect.width - colRect.left - amountLeft)}px`;\n            const leftCentered = ((targetLeft + targetPosition.width / 2) -\n                    (elementRect.width / 2) || 0) - colRect.left;\n            const collisionCentered = (leftCentered + elementRect.width) > colRect.width;\n            if (centerHorizontal && !collisionCentered) {\n                calcLeft = `${leftCentered}px`;\n            } else {\n                classList.add(COL_RIGHT_CLASS);\n                calcLeft = rightPosition;\n            }\n        }\n\n        if (isCollisionBottom || (positionTop && !isCollisionTop)) {\n            // Put Element on top if collision\n            calcTop = `${(targetTop - elementRect.height) - colRect.top}px`;\n            classList.add(COL_BOTTOM_CLASS);\n        } else {\n            calcTop = `${(targetTop + targetPosition.height) - colRect.top}px`;\n        }\n\n        elementToPosition.style.cssText = `top:${calcTop};left:${calcLeft};`;\n\n        return elementToPosition;\n    }\n\n    /**\n     * Brings a given element into viewport\n     * @param {HTMLElement} el\n     * @param {int|function}[optionalOffset]\n     */\n    static scrollToElement(el, optionalOffset) {\n        el.scrollIntoView();\n        let thisOffset = optionalOffset;\n        // optionally use a additional scrollDif\n        if (thisOffset) {\n            if (typeof thisOffset === 'function') {\n                thisOffset = optionalOffset();\n            }\n            const scrolledY = window.pageYOffset;\n            window.scroll(0, scrolledY - thisOffset);\n        }\n    }\n}\n\nexport default Util;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/util/Util.js","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nimport Util from './Util';\n\n// we attach global settings to global once because settings might be shared a lot of times trough the application\n// Maybe find a better way to handle that scenario\nif (global.document && !global.FLEXCSS_GLOBAL_SETTINGS) {\n    global.FLEXCSS_GLOBAL_SETTINGS = {\n        // defined breakpoint for small devices < n\n        smallBreakpoint: 768,\n        // breakpoint when touchmove should be available\n        touchMoveBreakpointOffCanvas: 768,\n        // nodes that should be updated when no scrollbar is expected\n        scrollbarUpdateNodes: global.document.body !== null ? [global.document.body] : [],\n        // additional Delay until darkener is fully hidden\n        darkenerFadeDelay: 100,\n        // class that is added if canvas has been toggled\n        canvasToggledClass: 'toggled-canvas'\n    };\n\n    global.FLEXCSS_CONST_IS_IOS = null;\n\n    global.FLEXCSS_CONST_IS_TOUCH = null;\n\n    global.FLEXCSS_CONST_IS_SAFARI = null;\n\n    global.FLEXCSS_CONST_IS_IE = null;\n\n    global.FLEXCSS_CONST_TAB_EVENT = 'click';\n\n    global.FLEXCSS_IS_SMALL_SCREEN = false;\n\n    const init = () => {\n        // Measure scrollbar width\n        global.FLEXCSS_CONST_SCROLLBAR_WIDTH = Util.getScrollBarWidth();\n        // detect right transition end event\n        global.FLEXCSS_CONST_TRANSITION_EVENT = Util.whichTransitionEndEvent();\n    };\n\n    if (global.document.readyState !== 'loading') {\n        init();\n    } else {\n        // it's possible that global.document.body is not available if the document is not\n        // loaded completely\n        document.addEventListener('DOMContentLoaded', () => {\n            init();\n        });\n    }\n}\n\n/**\n * Utility class that setups global settings\n */\nclass Settings {\n\n    /**\n     * Setup global settings, overwrite default values\n     * @param {Object} settings\n     */\n    static setup(settings) {\n        Object.assign(global.FLEXCSS_GLOBAL_SETTINGS, settings);\n    }\n\n    /**\n     * Access to global settings\n     * @returns {Object}\n     */\n    static get() {\n        return global.FLEXCSS_GLOBAL_SETTINGS;\n    }\n\n    /**\n     * Detects a IOS Device, caches subsequent calls\n     * @returns {boolean}\n     */\n    static isIosDevice() {\n        if (!global.FLEXCSS_CONST_IS_IOS) {\n            global.FLEXCSS_CONST_IS_IOS = global.navigator.userAgent.match(/(iPad|iPhone|iPod)/i);\n        }\n\n        return global.FLEXCSS_CONST_IS_IOS;\n    }\n\n    /**\n     * Detects a safari browser\n     * @returns {boolean}\n     */\n    static isSafari() {\n        if (!global.FLEXCSS_CONST_IS_SAFARI) {\n            global.FLEXCSS_CONST_IS_SAFARI = !!/^((?!chrome|android).)*safari/i.test(global.navigator.userAgent);\n        }\n        return global.FLEXCSS_CONST_IS_SAFARI;\n    }\n\n    /**\n     * @returns {boolean}\n     */\n    static isSmallScreen() {\n        return window.innerWidth < Settings.get().smallBreakpoint;\n    }\n\n    /**\n     * Detects a touch device, caches subsequent calls\n     * @returns {boolean}\n     */\n    static isTouchDevice() {\n        if (!global.FLEXCSS_CONST_IS_TOUCH) {\n            global.FLEXCSS_CONST_IS_TOUCH = 'ontouchstart' in window || !!(global.navigator.msMaxTouchPoints);\n        }\n        return global.FLEXCSS_CONST_IS_TOUCH;\n    }\n\n    /**\n     * Checks if current browser is Internet Explorer\n     * @returns {boolean|*}\n     */\n    static isIE() {\n        if (!global.FLEXCSS_CONST_IS_IE) {\n            global.FLEXCSS_CONST_IS_IE = \"ActiveXObject\" in window;\n        }\n        return global.FLEXCSS_CONST_IS_IE;\n    }\n\n    /**\n     * @returns {String}\n     */\n    static getTransitionEvent() {\n        return global.FLEXCSS_CONST_TRANSITION_EVENT;\n    }\n\n    /**\n     * @returns {int}\n     */\n    static getScrollbarWidth() {\n        return global.FLEXCSS_CONST_SCROLLBAR_WIDTH;\n    }\n\n    /**\n     * @returns {String}\n     */\n    static getTabEvent() {\n        return global.FLEXCSS_CONST_TAB_EVENT;\n    }\n}\n\nexport default Settings;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/util/Settings.js","/* global CustomEvent */\n\n/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n// polyfill for custom events to make thinks work in IE\n// The needed polyfill is so small that I embedded it here\n(function poly() {\n    if (global.document && (!global.CustomEvent || typeof global.CustomEvent !== 'function')) {\n        const CustomEvent = function CustomEvent(event, params) {\n            const thisParams = params || {\n                bubbles: false,\n                cancelable: false,\n                detail: undefined\n            };\n            const evt = document.createEvent(\"CustomEvent\");\n            evt.initCustomEvent(event, thisParams.bubbles,\n                thisParams.cancelable, thisParams.detail);\n            evt.superPreventDefault = evt.preventDefault;\n            evt.preventDefault = () => {\n                // Due a bug in IE11, we need to set defaultPrevented manually\n                Object.defineProperty(evt, \"defaultPrevented\", {\n                    get: () => {\n                        return true;\n                    }\n                });\n                evt.superPreventDefault();\n            };\n            return evt;\n        };\n        CustomEvent.prototype = global.Event.prototype;\n        global.CustomEvent = CustomEvent;\n    }\n}());\n/**\n * Simpler Event dispatching\n */\nclass EventHandler {\n\n    /**\n     * @param {HTMLElement} target\n     * @param {String} name\n     */\n    constructor(target, name) {\n        this.target = target;\n        this.defaultOptions = {\n            bubbles: true,\n            cancelable: true\n        };\n\n        this.name = name;\n    }\n\n    /**\n     * Set more options\n     * @param {Object} options\n     * @returns {EventHandler}\n     */\n    withOptions(options) {\n        Object.assign(this.defaultOptions, (options || {}));\n        return this;\n    }\n\n    /**\n     * Call with the originalEvent\n     * @param {Event} e\n     * @returns {EventHandler}\n     */\n    withOriginal(e) {\n        return this.withDetail({\n            originalEvent: e\n        });\n    }\n\n    /**\n     * Extends the detail part of the event\n     * @param {Object} o\n     * @returns {EventHandler}\n     */\n    withDetail(o) {\n        if (!this.defaultOptions.detail) {\n            this.defaultOptions.detail = {};\n        }\n        Object.assign(this.defaultOptions.detail, o);\n        return this;\n    }\n\n    /**\n     * @returns {CustomEvent}\n     */\n    fire() {\n        const e = new CustomEvent(this.name, this.defaultOptions);\n        if (this.target) {\n            this.target.dispatchEvent(e);\n        }\n        return e;\n    }\n}\n\nclass Event {\n    /**\n     * Prepares to dispatch a custom event (without firing)\n     * @param {HTMLElement} target\n     * @param {String} name\n     * @returns {EventHandler}\n     */\n    static dispatch(target, name) {\n        return new EventHandler(target, name);\n    }\n\n    /**\n     * Dispatches a custom event and fires it directly\n     * @param {HTMLElement} target\n     * @param {String} name\n     * @param {Object} [options]\n     * @returns {CustomEvent}\n     */\n    static dispatchAndFire(target, name, options) {\n        return new EventHandler(target, name).withOptions(options).fire();\n    }\n}\n\nexport default Event;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/util/Event.js","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Provides a Basic Widget\n */\nclass DestroyableWidget {\n\n    constructor() {\n        this.listeners = [];\n    }\n\n    /**\n     * Destroys a Widget\n     */\n    destroy() {\n        this.listeners.forEach((listener) => {\n            listener.element.removeEventListener.apply(listener.element, listener.args);\n        });\n        this.listeners = [];\n    }\n\n    /**\n     * Adds an event and registers it later to remove bindings\n     * @param {HTMLElement} element\n     * @param {String} name\n     * @param {Function} listener\n     * @param {boolean} [capture]\n     * @returns {Function}\n     */\n    addEventListener(element, name, listener, capture) {\n        this.listeners.push({\n            element,\n            args: [name, listener, capture]\n        });\n\n        element.addEventListener(name, listener, capture);\n        return listener;\n    }\n\n}\n\nexport default DestroyableWidget;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/DestroyableWidget.js","/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*!\n * FlexCss.Tooltip\n * Licensed under the MIT License (MIT)\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n */\n\nimport Util from './util/Util';\nimport DestroyableWidget from './DestroyableWidget';\nimport Settings from './util/Settings';\n\n/**\n * @type {string}\n */\nconst CLASS_NAMES_TOOLTIP = 'tooltip-container';\n/**\n * @type {string}\n */\nconst CLASS_NAMES_OPEN = 'open';\n\n/**\n * @type {string}\n */\nconst ATTR_DATA_CLASSNAME = 'data-class';\n\n/**\n * @type {string}\n */\nconst ATTR_DATA_NO_TOUCH = 'data-no-touch';\n\n/**\n * @type {HTMLDocument}\n */\nconst doc = global.document;\n\n/**\n * Simple Tooltip\n */\nclass Tooltip extends DestroyableWidget {\n\n    /**\n     * Creates a Tooltip\n     * @param {HTMLElement|String} DelegateContainer\n     * @param {Object} [options]\n     */\n    constructor(DelegateContainer, options) {\n        super();\n        /**\n         * The Container where possible events are captured\n         */\n        this.container = DelegateContainer instanceof HTMLElement ?\n            DelegateContainer : doc.getElementById(DelegateContainer);\n\n        if (!this.container) {\n            throw new Error('Could not create Tooltip, DelegateContainer not found');\n        }\n\n        /**\n         * The Container where tooltips are stored for this instance\n         * @type {HTMLElement}\n         */\n        this.tooltipContainer = null;\n\n        /**\n         * Default Options\n         */\n        this.options = {\n            containerClass: '',\n            selectorAttribute: 'data-tooltip',\n            collisionContainer: this.container\n        };\n\n        Object.assign(this.options, options || {});\n    }\n\n    /**\n     * Creates and shows a tooltip\n     * @param {HTMLElement} target where is this tooltip positioned\n     * @param {String} text text content in tooltip, will be NOT escaped\n     * @param {Boolean} [removeTitle] removes title element if given\n     * @param {Node} [positionRelative]\n     */\n    createTooltip(target, text, removeTitle, positionRelative) {\n        // abort if text is empty\n        if (!text || text && text.trim() === '') {\n            return;\n        }\n\n        if (Settings.isTouchDevice() && target && target.hasAttribute(ATTR_DATA_NO_TOUCH)) {\n            return;\n        }\n\n        let tooltipContainer = this.tooltipContainer;\n\n        if (!tooltipContainer) {\n            tooltipContainer = doc.createElement('div');\n            this.container.appendChild(tooltipContainer);\n            this.tooltipContainer = tooltipContainer;\n        }\n        this._restoreClassNames(tooltipContainer, target);\n\n        tooltipContainer.style.left = 'auto';\n        tooltipContainer.style.top = 'auto';\n        tooltipContainer.innerHTML = text;\n        tooltipContainer.flexTooltipCurrentTarget = target;\n        if (removeTitle) {\n            target.oldTitle = text;\n            target.removeAttribute('title');\n        }\n\n        Util.setupPositionNearby(positionRelative || target, tooltipContainer,\n            this.options.collisionContainer, true, true);\n\n        tooltipContainer.classList.add(CLASS_NAMES_OPEN);\n    }\n\n    _restoreClassNames(container, target) {\n        // allow additional classname per tooltip on target element\n        const classNames = [CLASS_NAMES_TOOLTIP, this.options.containerClass];\n        const maybeTargetClass = target.getAttribute(ATTR_DATA_CLASSNAME);\n        if (maybeTargetClass) {\n            classNames.push(maybeTargetClass);\n        }\n        container.className = classNames.join(\" \");\n        return this;\n    }\n\n    /**\n     * @returns {HTMLElement|null}\n     */\n    getCurrentTarget() {\n        return this.tooltipContainer ? this.tooltipContainer.flexTooltipCurrentTarget : null;\n    }\n\n    /**\n     * Destroys this Widget\n     * @returns {boolean}\n     */\n    destroy() {\n        super.destroy();\n\n        if (this.tooltipContainer) {\n            this.tooltipContainer.parentNode.removeChild(this.tooltipContainer);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Removes a Tooltip on given target\n     * @param {HTMLElement} [target], if not given will remove current open tooltip on this instance\n     */\n    removeTooltip(target) {\n        let selfTarget = target;\n        if (!selfTarget && this.tooltipContainer) {\n            selfTarget = this.tooltipContainer.flexTooltipCurrentTarget;\n        }\n        if (this.tooltipContainer) {\n            if (this.tooltipContainer.flexTooltipCurrentTarget !== selfTarget) {\n                return;\n            }\n            this.tooltipContainer.classList.remove(CLASS_NAMES_OPEN);\n            delete this.tooltipContainer.flexTooltipCurrentTarget;\n        }\n        if (selfTarget && selfTarget.oldTitle) {\n            selfTarget.setAttribute('title', selfTarget.oldTitle);\n        }\n    }\n\n    /**\n     * Initilizes mouse events on container element\n     */\n    registerEvents() {\n        const self = this;\n        this.addEventListener(this.container, 'mouseover', (e) => {\n            if (e.target.hasAttribute(self.options.selectorAttribute)) {\n                self.createTooltip(e.target, e.target.getAttribute('title'), true);\n            }\n        });\n\n        this.addEventListener(this.container, 'mouseout', (e) => {\n            if (e.target.hasAttribute(self.options.selectorAttribute)) {\n                self.removeTooltip(e.target);\n            }\n        });\n        return this;\n    }\n}\n\nexport default Tooltip;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/Tooltip.js","/* global HTMLFormElement, fetch, FormData, clearTimeout, NodeList */\n\n/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/*!\n * FlexCss.Form\n * Licensed under the MIT License (MIT)\n * Copyright (c) 2015 David Heidrich, BowlingX <me@bowlingx.com>\n */\n\nimport Tooltip from './Tooltip';\nimport 'isomorphic-fetch';\nimport Event from './util/Event';\nimport Util from './util/Util';\nimport Settings from './util/Settings';\nimport DestroyableWidget from './DestroyableWidget';\n\nconst LOADING_CLASS = 'loading';\nconst DATA_ELEMENT_INVALID = 'data-flexcss-invalid';\nconst REMOTE = 'data-remote';\nconst REMOTE_ACTION = 'data-remote-action';\nconst ATTR_DISABLE_INLINE = 'data-disable-inline-validation';\nconst ATTR_DISABLE_REALTIME = 'data-disable-realtime-validation';\nconst ATTR_VALIDATOR = 'data-validate';\nconst ATTR_DATA_CUSTOM_MESSAGE = 'data-validation-message';\nconst ATTR_DATA_CUSTOM_LABEL = 'data-custom-label';\nconst ATTR_VALIDATE_VISIBILITY = 'data-validate-visibility';\nconst ATTR_ERROR_TARGET_ID = 'data-error-target';\nconst ATTR_DEPENDS = 'data-depends-selector';\nconst CONST_USE_JSON = 'json';\nconst CONST_REALTIME_EVENT = 'input';\nconst FOCUS_TOOLTIP_DELAY = 20;\nconst CLICK_TOOLTIP_DELAY = 150;\n\n/**\n * Triggered when form is fully initialized and handlers are binded\n * @type {string}\n */\nexport const EVENT_FORM_READY = 'flexcss.form.ready';\n/**\n * Fires when a form is submitted, cancelable\n * @type {string}\n */\nexport const EVENT_FORM_SUBMIT = 'flexcss.form.submit';\n/**\n * Fired directly after the form has been submitted via ajax\n * @type {string}\n */\nexport const EVENT_FORM_AFTER_AJAX_SUBMIT = 'flexcss.form.afterAjaxSubmit';\n/**\n * Fired when ajax events did complete\n * @type {string}\n */\nexport const EVENT_FORM_AJAX_COMPLETED = 'flexcss.form.ajaxCompleted';\n\n/**\n * A HTML5 Form Validation replacement\n */\n\nclass Form extends DestroyableWidget {\n    /**\n     * @param {HTMLElement} form\n     * @param [options] optional options\n     */\n    constructor(form, options) {\n        super();\n\n        if (!(form instanceof HTMLFormElement)) {\n            throw new Error('argument {0} form needs to be an form element');\n        }\n\n        /**\n         * The Form\n         * @type {HTMLElement}\n         */\n        this.form = form;\n\n        /**\n         * @type {Tooltip}\n         */\n        this.tooltips = null;\n\n        /**\n         * @type {Promise}\n         */\n        this.currentValidationFuture = new Promise(() => {\n        });\n\n        /**\n         * Default options\n         * @type {Object}\n         */\n        this.options = {\n            // if true creates tooltips above element, uses FlexCss Tooltips\n            createTooltips: true,\n            // if true appends error message after input element\n            appendError: false,\n            // type of ajax submit\n            ajaxSubmitType: 'POST',\n            // json content type if ajax method is set to json\n            ajaxJsonContentType: 'application/json; charset=utf-8',\n            // allow inline validation\n            inlineValidation: true,\n            // validate in realtime (on `input` event)\n            realtime: true,\n            // timeout when realtime event should be captured\n            realtimeTimeout: 250,\n            // formatting method for an error\n            formatErrorTooltip: (error) => {\n                return `<i class=\"icon-attention\"></i> ${error}`;\n            },\n            // the class that will be put on the element to mark it failed validation\n            inputErrorClass: 'invalid',\n            // the container class for error messages below an element\n            containerErrorClass: 'form-error',\n            // additional options for fetch\n            fetchOptions: {\n                credentials: 'include'\n            },\n            // the container for tooltips\n            tooltipContainer: form,\n            tooltipOptions: {\n                containerClass: 'error-tooltip'\n            },\n            shouldScrollToElement: true,\n            // if you have a fixed header, either set a number or function here\n            scrollToElementDiff: 0\n        };\n\n        // overwrite default options\n        Object.assign(this.options, options);\n\n        // apply settings from attributes\n        Util.applyOptionsFromElement(form, this.options);\n\n        // set form class as widget\n        // Forms are very different to classical widgets,\n        // we will not use our base widget class for this but just self\n        form.hfWidgetInstance = this;\n\n        /**\n         * A List of Validators\n         * @type {Object}\n         * @private\n         */\n        this._validators = Form.globalValidators;\n\n        /**\n         * @type {Function}\n         * @private\n         */\n        this._remoteValidationFunction = null;\n\n        this.initFormValidation();\n    }\n\n    destroy() {\n        super.destroy();\n        if (this.tooltips) {\n            this.tooltips.destroy();\n        }\n    }\n\n    /**\n     * Submits this form, either via ajax or just classical (default)\n     * @param {HTMLFormElement} thisForm\n     * @param {Event} e\n     * @private\n     * @returns {Promise|boolean} returns false if submit is cancled\n     */\n    _submitFunction(thisForm, e) {\n        const self = this;\n        const shouldUseAjax = thisForm.getAttribute(REMOTE);\n        const ajaxPostUrl = thisForm.getAttribute(REMOTE_ACTION) ||\n                thisForm.getAttribute('action') || window.location.href;\n\n        const useJson = CONST_USE_JSON === shouldUseAjax;\n\n        const ev = Event.dispatch(thisForm, EVENT_FORM_SUBMIT).withOriginal(e).fire();\n\n        // abort execution is event was prevented\n        if (ev.defaultPrevented) {\n            self._formStopLoading();\n            return false;\n        }\n\n        if (shouldUseAjax === null) {\n            // submit\n            return thisForm.submit();\n        }\n        // prevent form from submit normally\n        e.preventDefault();\n\n        // add information that this is an XMLHttpRequest request (used by some frameworks)\n        const defaultHeaders = {\n            'X-Requested-With': 'XMLHttpRequest'\n        };\n\n        // setup default headers\n        if (useJson) {\n            Object.assign(defaultHeaders, {\n                'Content-Type': this.options.ajaxJsonContentType\n            });\n        }\n        const defaultOptions = Object.assign(this.options.fetchOptions, {\n            headers: defaultHeaders,\n            method: this.options.ajaxSubmitType\n        });\n\n        // support either JSON request payload or normal payload submission\n        const serverCall = useJson ? fetch(ajaxPostUrl, Object.assign(defaultOptions, {\n            body: JSON.stringify(this.serialize())\n        })) : fetch(ajaxPostUrl, Object.assign(defaultOptions, {\n            body: new FormData(thisForm)\n        }));\n\n        Event.dispatch(thisForm, EVENT_FORM_AFTER_AJAX_SUBMIT).withOriginal(e).fire();\n\n        return serverCall.then((r) => {\n            (self._remoteValidationFunction || Form.globalRemoteValidationFunction).apply(self, [r]);\n\n            Event.dispatch(thisForm, EVENT_FORM_AJAX_COMPLETED).withOriginal(e).withDetail({ response: r }).fire();\n            // always remove error class\n            self._formStopLoading();\n        });\n    }\n\n    /**\n     * Serializes a form to a json object\n     * @returns {Object}\n     */\n    serialize() {\n        const selectors = [\n            'input[name]:not([type=\"radio\"]):enabled',\n            'input[type=\"radio\"][name]:checked',\n            'select[name]:enabled',\n            'textarea[name]:enabled'\n        ];\n        const inputs = this.form.querySelectorAll(selectors.join(','));\n        const result = {};\n\n        Array.prototype.forEach.call(inputs, (input) => {\n            const exists = result[input.name];\n            const value = input.value;\n            if (exists instanceof Array) {\n                exists.push(value);\n            } else if (exists) {\n                result[input.name] = [result[input.name], value];\n            } else {\n                result[input.name] = value;\n            }\n        });\n\n        return result;\n    }\n\n    /**\n     * Handles the chain of validation on given fields\n     *\n     * @param {HTMLElement|Array|NodeList} field\n     * @param [focus] optional focus first error\n     * @returns {Promise}\n     */\n    handleValidation(field, focus) {\n        const fields = (field instanceof Array || field instanceof NodeList) ? field : [field];\n        return this._handleValidation(fields, focus, true).then((r) => {\n            if (!r.foundAnyError) {\n                // remove tooltips\n                if (this.tooltips) {\n                    this.tooltips.removeTooltip();\n                }\n            }\n            return r;\n        });\n    }\n\n    /**\n     * Handles errors on given node list\n     * @param {NodeList} toValidateFields\n     * @param {boolean} focus\n     * @param {boolean} scoped if true, will only validate the fields `invalidFields`\n     * @returns {Promise}\n     * @private\n     */\n    _handleValidation(toValidateFields, focus, scoped) {\n        const self = this;\n        const arr = Form._createArrayFromInvalidFieldList(toValidateFields);\n        const isLocalInvalid = arr.length > 0;\n\n        // focus must appear in the same frame for iOS devices\n        if (isLocalInvalid && focus) {\n            self._focusElement(arr[0]);\n        }\n\n        const validation = scoped\n            ? this._customValidationsForElements(toValidateFields)\n            : self.validateCustomFields();\n        return validation.then((r) => {\n            if (isLocalInvalid) {\n                // combine browser and custom validators\n                r.foundAnyError = true;\n            }\n            // get a unique field list of all fields that need to be checked and rendered\n            // it's possible that we have duplicates in non scoped mode\n            const thisToValidateFields = scoped\n                ? toValidateFields\n                : Array.from(arr).concat(r.checkedFields);\n            r.checkedFields = thisToValidateFields;\n            const foundInvalidFields = self.prepareErrors(thisToValidateFields, false);\n            const firstInvalidField = foundInvalidFields[0];\n            if (firstInvalidField) {\n                if (focus) {\n                    self._focusElement(firstInvalidField);\n                    // if element could not be focused:\n                    if (document.activeElement !== firstInvalidField) {\n                        self._handleTooltipHideClickAfterChange();\n                    }\n                } else {\n                    self._handleTooltipHideClickAfterChange();\n                }\n                self.showAndOrCreateTooltip(firstInvalidField);\n            }\n            return r;\n        });\n    }\n\n    /**\n     * @param {HTMLElement} field\n     * @param {ValidityState} validity\n     * @returns {*}\n     * @private\n     */\n\n    _setupErrorMessages(field, validity) {\n        return Form.globalErrorMessageHandler ?\n            Form.globalErrorMessageHandler.apply(this, [field, validity]) : false;\n    }\n\n    /**\n     * Handles class labels for elements\n     * @param {Object} fields\n     * @private\n     */\n    _handleLabels(fields) {\n        Object.keys(fields).forEach((id) => {\n            const labels = this.getForm().querySelectorAll(`[for=\"${id}\"]`);\n            const invalid = fields[id];\n            if (labels.length) {\n                for (let labelsIndex = 0; labelsIndex < labels.length; labelsIndex++) {\n                    const labelEl = labels[labelsIndex];\n                    // we can't use toggle attribute, not supported in IE\n                    if (invalid) {\n                        this._markElementInvalid(labelEl);\n                    } else {\n                        this._markElementValid(labelEl);\n                    }\n                }\n            }\n        });\n    }\n\n    /**\n     * @param el\n     * @private\n     */\n    _markElementInvalid(el) {\n        el.setAttribute(DATA_ELEMENT_INVALID, \"true\");\n        el.classList.add(this.options.inputErrorClass);\n    }\n\n    /**\n     * @param el\n     * @private\n     */\n    _markElementValid(el) {\n        el.removeAttribute(DATA_ELEMENT_INVALID);\n        el.classList.remove(this.options.inputErrorClass);\n    }\n\n    /**\n     * A List of invalid elements (:invalid)\n     * @returns {Array}\n     * @private\n     */\n    _getInvalidElements() {\n        return Array.prototype.filter.call(this.getForm().querySelectorAll(\":invalid\"), (r) => {\n            return !(r instanceof HTMLFieldSetElement);\n        });\n    }\n\n    /**\n     * @param {HTMLElement} thisParent\n     * @private\n     */\n    _removeElementErrors(thisParent) {\n        const errors = thisParent.querySelectorAll(`.${this.options.containerErrorClass}`);\n        const inputsWithErrorClasses = thisParent.querySelectorAll(`[${DATA_ELEMENT_INVALID}]`);\n        for (let elementErrorIndex = 0; elementErrorIndex < errors.length; elementErrorIndex++) {\n            errors[elementErrorIndex].parentNode.removeChild(errors[elementErrorIndex]);\n        }\n        for (let inputErrorIndex = 0; inputErrorIndex < inputsWithErrorClasses.length; inputErrorIndex++) {\n            const el = inputsWithErrorClasses[inputErrorIndex];\n            this._markElementValid(el);\n        }\n    }\n\n\n    /**\n     * Registers a custom validator\n     * @param {String} name\n     * @param {Function} validator a validation function should always return either a Future(true) or Future(false)\n     * even when the field has been invalidated with `setCustomValidity`, because of different browser `bugs`\n     * we can't rely on that\n     * @returns {Form}\n     */\n    registerValidator(name, validator) {\n        this._validators[name] = validator;\n        return this;\n    }\n\n    /**\n     * Runs async validation\n     * @param {String} validationRef\n     * @param {HTMLElement} field\n     * @returns {Promise}\n     * @private\n     */\n    _runValidation(validationRef, field) {\n        if (!this._validators[validationRef]) {\n            throw new Error(`Could not found validator: ${validationRef}`);\n        }\n        const cl = field.classList;\n        const future = this._validators[validationRef].apply(this, [field, this.form]);\n        cl.add(LOADING_CLASS);\n        future.then(() => {\n            cl.remove(LOADING_CLASS);\n        });\n        return future;\n    }\n\n\n    /**\n     * Run custom validations for elements, validations are done async do support XHR Requests or other stuff\n     *\n     * @param {Array|NodeList} fields\n     * @returns {Promise} contains either true if validations passed or false if something went wrong\n     * @private\n     */\n    _customValidationsForElements(fields) {\n        const futures = [];\n        const fieldsLength = fields.length;\n        const checkedFields = [];\n        for (let iVal = 0; iVal < fieldsLength; iVal++) {\n            const field = fields[iVal];\n            const validationRef = field.getAttribute(ATTR_VALIDATOR);\n            const validity = field.validity;\n            if (this._validators[validationRef]) {\n                // use local validation first and then continue with custom validations\n                if (Form._shouldNotValidateField(field) || (validity && !validity.customError && !validity.valid)) {\n                    continue;\n                }\n                checkedFields.push(field);\n                futures.push(this._runValidation(validationRef, field));\n            } else {\n                if (validationRef) {\n                    // console.warn('data-validate was set but no validator was found');\n                }\n            }\n        }\n        return Promise.all(futures).then((allFutures) => {\n            const l = allFutures.length;\n            const result = {\n                checkedFields,\n                foundAnyError: false\n            };\n            for (let fI = 0; fI < l; fI++) {\n                if (!allFutures[fI]) {\n                    result.foundAnyError = true;\n                    break;\n                }\n            }\n            return result;\n        });\n    }\n\n    /**\n     * Remove all errors for this form\n     * @returns {Form}\n     */\n    removeErrors() {\n        this._removeElementErrors(this.form);\n        if (this.tooltips) {\n            this.tooltips.removeTooltip();\n        }\n        return this;\n    }\n\n    /**\n     * Will handle errors for given fields\n     * @param {Array|NodeList} fields\n     * @param {Boolean} removeAllErrors\n     */\n    prepareErrors(fields, removeAllErrors) {\n        if (removeAllErrors) {\n            this.removeErrors();\n        }\n        const labelGroups = {};\n        const invalidFields = [];\n\n        function handleAdditionalLabels(isInvalid, thisLabelGroup, field) {\n            const additionalLabels = field.getAttribute(ATTR_DATA_CUSTOM_LABEL) || field.id;\n            let group = thisLabelGroup[additionalLabels];\n            if (additionalLabels) {\n                // check additionally if field is currently marked as invalid\n                // so the label is not marked as error if no field is marked as one\n                group = group || isInvalid;\n                thisLabelGroup[additionalLabels] = group;\n            }\n        }\n\n        // We save all validations in an extra property because we need to reset the validity due some\n        // implementation errors in other browsers then chrome\n        for (let i = 0; i < fields.length; i++) {\n            const field = fields[i];\n            const errorTarget = Form._findErrorTarget(field);\n            const parent = errorTarget.parentNode;\n            const validity = field.validity;\n            const isInvalid = validity && !validity.valid;\n            if (Form._shouldNotValidateField(field)) {\n                continue;\n            }\n            field.flexFormsSavedValidity = JSON.parse(JSON.stringify(validity));\n            handleAdditionalLabels(isInvalid, labelGroups, field);\n            if (isInvalid) {\n                if (!removeAllErrors) {\n                    // Remove current errors:\n                    this._removeElementErrors(parent);\n                }\n                // setup custom error messages:\n                this._setupErrorMessages(field, validity);\n                const msg = field.validationMessage;\n\n                // mark fields as invalid\n                this._markElementInvalid(errorTarget);\n                this._markElementInvalid(field);\n\n                if (this.options.appendError) {\n                    parent.insertAdjacentHTML(\"beforeend\",\n                        `<div class=\"${this.options.containerErrorClass}\">${msg}</div>`);\n                }\n                invalidFields.push(field);\n                field.flexFormsSavedValidationMessage = msg;\n            } else {\n                // restore invalid fields\n                this._markElementValid(errorTarget);\n                this._markElementValid(field);\n\n                // cleanup\n                delete field.flexFormsSavedValidationMessage;\n\n                // remove error markup\n                this._removeElementErrors(parent);\n            }\n            // We have to reset the custom validity here to allow native validations work again\n            field.setCustomValidity('');\n        }\n        // if validates a single field we need to check the linked fields to a label:\n        if (fields.length === 1) {\n            const field = fields[0];\n            const id = field.getAttribute(ATTR_DATA_CUSTOM_LABEL) || field.id;\n            if (id) {\n                const linkedFields = Array.from(\n                    this.getForm().querySelectorAll(`[${ATTR_DATA_CUSTOM_LABEL}=\"${id}\"], #${id}`));\n                linkedFields.forEach((thisField) => {\n                    const validity = thisField.validity;\n                    const isInvalid = validity && !validity.valid && this._isElementInvalidElement(thisField);\n                    handleAdditionalLabels(isInvalid, labelGroups, thisField);\n                });\n            }\n        }\n        this._handleLabels(labelGroups);\n        return invalidFields;\n    }\n\n    /**\n     * Validates all custom fields\n     * @returns {Promise}\n     */\n    validateCustomFields() {\n        return this._customValidationsForElements(\n            this.form.querySelectorAll(\"[data-validate]\"));\n    }\n\n    /**\n     * Tests if a field should be validated\n     * @param {HTMLElement} field\n     * @returns {boolean}\n     * @private\n     */\n    static _shouldNotValidateField(field) {\n        const target = Form._findErrorTarget(field);\n        return target instanceof HTMLFieldSetElement || field.validity === undefined ||\n            (target.hasAttribute(ATTR_VALIDATE_VISIBILITY) && !Util.isVisible(target));\n    }\n\n    /**\n     * Creates an array from a node list with invalid items\n     * This Method expicitly checks if field should not be validated so it can be used to foucs a field\n     * @param list\n     * @returns {Array}\n     * @private\n     */\n    static _createArrayFromInvalidFieldList(list) {\n        const arr = [];\n        for (let i = 0; i < list.length; ++i) {\n            const n = list[i];\n            if (n.validity && !n.validity.valid) {\n                if (!Form._shouldNotValidateField(n)) {\n                    arr.push(n);\n                }\n            }\n        }\n        return arr;\n    }\n\n\n    /**\n     * This form\n     * @returns {HTMLElement}\n     */\n    getForm() {\n        return this.form;\n    }\n\n    /**\n     * Registers a function that handles remote validation\n     * @param {Function} func\n     * @returns {Form}\n     */\n    registerRemoteValidation(func) {\n        this._remoteValidationFunction = func;\n        return this;\n    }\n\n\n    /**\n     * Formats the error content for the tooltip\n     * @param {String} error\n     * @returns {String}\n     * @private\n     */\n    _formatErrorTooltip(error) {\n        return this.options.formatErrorTooltip.apply(this, [error]);\n    }\n\n    /**\n     * Tries to find a custom error target on given target\n     * @param target\n     * @returns {HTMLElement}\n     * @private\n     */\n    static _findErrorTarget(target) {\n        const el = target.getAttribute(ATTR_ERROR_TARGET_ID) || target;\n        const foundTarget = el instanceof HTMLElement ? el : global.document.getElementById(el);\n        if (!foundTarget) {\n            throw new Error(`Given error target did not exists: ${target}`);\n        }\n        return foundTarget;\n    }\n\n    /**\n     * Creates a tooltip at given element, will only create a new instance if not created\n     * @param {HTMLElement} target\n     * @param {Boolean} [remove]\n     */\n    showAndOrCreateTooltip(target, remove) {\n        const self = this;\n        if (!this.tooltips && this.options.createTooltips) {\n            this.tooltips = new Tooltip(this.options.tooltipContainer, this.options.tooltipOptions);\n        }\n        if (!this.options.createTooltips) {\n            return false;\n        }\n\n        if (!target.flexFormsSavedValidity) {\n            return false;\n        }\n        const errorTarget = Form._findErrorTarget(target);\n        let result = false;\n        if (!target.flexFormsSavedValidity.valid && self._isElementInvalidElement(errorTarget)) {\n            self.tooltips.createTooltip(\n                errorTarget,\n                self._formatErrorTooltip(target.flexFormsSavedValidationMessage), false\n            );\n            result = true;\n        } else {\n            if (remove) {\n                self.tooltips.removeTooltip();\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Checks if element is marked as invalid\n     * @param {HTMLElement} el\n     * @returns {boolean}\n     * @private\n     */\n    _isElementInvalidElement(el) {\n        return el.hasAttribute(DATA_ELEMENT_INVALID);\n    }\n\n    /**\n     * Handles invalid event of a form\n     * @param {Event} e\n     * @returns {Promise|boolean}\n     * @private\n     */\n    _checkIsInvalid(e) {\n        e.preventDefault();\n        const invalidFields = this.getForm().querySelectorAll(\":invalid\");\n        return this._handleValidation(invalidFields, true, false);\n    }\n\n    /**\n     * Will query dependent fields (by selector) that should be validated with given field\n     * @param field\n     * @returns {NodeList|[]}\n     * @private\n     */\n    _getDependentFields(field) {\n        const fieldSelector = field.getAttribute(ATTR_DEPENDS);\n        const base = [field];\n        if (fieldSelector) {\n            base.push.apply(base, Array.prototype.slice.apply(\n                this.getForm().querySelectorAll(fieldSelector)));\n        }\n        return base;\n    }\n\n    /**\n     * @private\n     * @param {HTMLElement} [target]\n     */\n    _handleTooltipInline(target) {\n        if (this.tooltips) {\n            this.tooltips.removeTooltip(target);\n        }\n    }\n\n    /**\n     * Initializes validation for a given form, registers event handlers\n     */\n    initFormValidation() {\n        // Suppress the default bubbles\n        const self = this;\n        const form = this.getForm();\n        const invalidEvent = 'invalid';\n\n        /**\n         * Validates if is valid realtime element\n         * @param {HTMLElement} target\n         * @returns {boolean}\n         * @private\n         */\n        function _checkIsValidRealtimeElement(target) {\n            return !target.hasAttribute(ATTR_DISABLE_REALTIME) && !target.hasAttribute(ATTR_DISABLE_INLINE);\n        }\n\n        form.addEventListener(invalidEvent, (e) => {\n            e.preventDefault();\n        }, true);\n\n        Util.addEventOnce(invalidEvent, form, function handleInvalid(e) {\n            self._formLoading();\n            const result = self._checkIsInvalid(e);\n            if (result) {\n                self.currentValidationFuture = new Promise((resolve) => {\n                    result.then((r) => {\n                        setTimeout(() => {\n                            Util.addEventOnce(invalidEvent, form, handleInvalid, true);\n                        }, 0);\n                        resolve(r);\n                        self._formStopLoading();\n                        if (!r.foundAnyError) {\n                            self._formLoading();\n                            self._handleSubmit(e);\n                        }\n                    });\n                });\n            }\n        }, true);\n\n        this.addEventListener(form, 'reset', () => {\n            this.removeErrors();\n        });\n\n        // Timeout for keys:\n        let TIMEOUT_KEYDOWN;\n        let KEYDOWN_RUNNING = false;\n\n        // resets keydown events\n        function clearKeyDownTimeout() {\n            KEYDOWN_RUNNING = false;\n            clearTimeout(TIMEOUT_KEYDOWN);\n        }\n\n        // setup custom realtime event if given\n        if (self.options.realtime) {\n            this.addEventListener(form, CONST_REALTIME_EVENT, (e) => {\n                if (self._formIsLoading()) {\n                    return;\n                }\n                const target = e.target;\n                clearTimeout(TIMEOUT_KEYDOWN);\n                if (KEYDOWN_RUNNING) {\n                    return;\n                }\n                TIMEOUT_KEYDOWN = setTimeout(() => {\n                    const isStillTarget = document.activeElement === e.target;\n                    if (!_checkIsValidRealtimeElement(target)) {\n                        return;\n                    }\n                    if (isStillTarget) {\n                        self._handleTooltipInline();\n                    }\n                    KEYDOWN_RUNNING = true;\n                    const dependentFields = self._getDependentFields(target);\n                    self._customValidationsForElements(dependentFields).then(() => {\n                        self.prepareErrors(dependentFields, false);\n                        if (isStillTarget) {\n                            self.showAndOrCreateTooltip(e.target);\n                        }\n                        // future must be resolved before another event can be started\n                        KEYDOWN_RUNNING = false;\n                    });\n                }, self.options.realtimeTimeout);\n            }, true);\n        }\n\n        /**\n         * Validates if target is a valid input field to check blur and focus events\n         *\n         * @param {HTMLElement} target\n         * @returns {boolean}\n         * @private\n         */\n        function _checkIsValidBlurFocusElement(target) {\n            const attr = target.getAttribute(\"type\");\n            return (attr !== \"radio\" && attr !== \"checkbox\" && attr !== \"submit\");\n        }\n\n        /**\n         * Validates if is valid inline-check element\n         * @param {HTMLElement} target\n         * @returns {boolean}\n         * @private\n         */\n        function _checkIsValidInlineCheckElement(target) {\n            return !target.hasAttribute(ATTR_DISABLE_INLINE);\n        }\n\n        this.addEventListener(form, 'blur', (e) => {\n            // do not hide tooltip after change event\n            if (!e.target.flexcssKeepTooltips) {\n                self._handleTooltipInline(e.target);\n            }\n            delete e.target.flexcssKeepTooltips;\n        }, true);\n\n        // handle focus on input elements\n        // will show an error if field is invalid\n        this.addEventListener(form, \"focus\", (e) => {\n            if (self._formIsLoading()) {\n                return;\n            }\n            // do not track errors for checkbox and radios on focus:\n            if (!_checkIsValidBlurFocusElement(e.target)) {\n                return;\n            }\n            // we need to delay this a little, because Firefox and Safari do not show a tooltip after it\n            // just have been hidden (on blur). Maybe fix this with a queue later\n            setTimeout(() => {\n                self.showAndOrCreateTooltip(e.target);\n            }, FOCUS_TOOLTIP_DELAY);\n        }, true);\n\n        if (self.options.inlineValidation) {\n            // Handle change for checkbox, radios and selects\n            this.addEventListener(form, \"change\", (e) => {\n                const target = e.target;\n                if (self._formIsLoading() || !_checkIsValidInlineCheckElement(target)) {\n                    return;\n                }\n                clearKeyDownTimeout();\n                const name = target.getAttribute('name');\n                let inputs = name ? form.querySelectorAll(`[name=\"${name}\"]`) : [target];\n                // we only support dependent fields for a single widgets right now\n                if (inputs.length === 1) {\n                    inputs = self._getDependentFields(target);\n                }\n                self._customValidationsForElements(inputs).then(() => {\n                    self.prepareErrors(inputs, false);\n                    target.flexcssKeepTooltips = self.showAndOrCreateTooltip(target, true);\n                    if (target.flexcssKeepTooltips) {\n                        self._handleTooltipHideClickAfterChange();\n                    }\n                });\n            });\n        }\n\n        // prevent default if form is invalid\n        this.addEventListener(form, \"submit\", function listener(e) {\n            self._submitListener(e, listener);\n        });\n\n        Event.dispatchAndFire(form, EVENT_FORM_READY);\n    }\n\n    /* Loading states, unfortunately we can't check if a promise is pending :/*/\n    /* TODO: Maybe wrap promise to extend this functionality */\n\n    _formLoading() {\n        this.getForm().classList.add(LOADING_CLASS);\n    }\n\n    _formStopLoading() {\n        this.getForm().classList.remove(LOADING_CLASS);\n    }\n\n    _formIsLoading() {\n        return this.getForm().classList.contains(LOADING_CLASS);\n    }\n\n    // this defines the logic after a change event when a tooltip is shown\n    // because we call this method inside the change event, the click would be immeditally executed with the change\n    // event when not using setTimeout(). There might be another solution for this...\n    _handleTooltipHideClickAfterChange() {\n        const self = this;\n        if (this.options.createTooltips) {\n            setTimeout(() => {\n                Util.addEventOnce(Settings.getTabEvent(), global.document.body, (t) => {\n                    if (!self._isElementInvalidElement(t.target)) {\n                        self._handleTooltipInline();\n                    }\n                });\n            }, CLICK_TOOLTIP_DELAY);\n        }\n    }\n\n    _focusElement(el) {\n        el.focus();\n        if (this.options.shouldScrollToElement) {\n            Util.scrollToElement(el, this.options.scrollToElementDiff);\n        }\n    }\n\n    /**\n     * Listener that is executed on form submit\n     * @param e\n     * @param submitListener\n     * @returns {boolean}\n     * @private\n     */\n    _submitListener(e, submitListener) {\n        const form = this.getForm();\n        const self = this;\n        const submitEvent = 'submit';\n\n        if (this._formIsLoading()) {\n            e.preventDefault();\n            return false;\n        }\n        this._formLoading();\n        form.removeEventListener(submitEvent, submitListener);\n        this.removeErrors();\n        e.preventDefault();\n        // reset:\n        if (form.checkValidity()) {\n            form.addEventListener(submitEvent, submitListener);\n            // It's possible that the form is valid but the custom validations need to be checked again:\n            self.currentValidationFuture = new Promise((resolve) => {\n                const validation = self.validateCustomFields();\n                validation.then((r) => {\n                    // because custom validators may mark multiple fields as invalid, we get all of them in the form\n                    const fields = self._getInvalidElements();\n                    const errors = self.prepareErrors(fields, false);\n                    const firstError = errors[0];\n                    if (firstError) {\n                        self._focusElement(firstError);\n                        self.showAndOrCreateTooltip(firstError, true);\n                    }\n                    resolve(r);\n                });\n            });\n            self.currentValidationFuture.then((r) => {\n                if (!r.foundAnyError) {\n                    // Handle submitting the form to server:\n                    self._handleSubmit(e);\n                } else {\n                    self._formStopLoading();\n                }\n            });\n        } else {\n            self._formStopLoading();\n            form.addEventListener(submitEvent, submitListener);\n        }\n    }\n\n\n    /**\n     * Handles submitting, optionally allows to stop submitting\n     * @param e\n     * @private\n     */\n    _handleSubmit(e) {\n        this._submitFunction(this.form, e);\n    }\n\n\n    /**\n     * Registers a global event Handler\n     * @param errorFunc\n     */\n    static registerErrorMessageHandler(errorFunc) {\n        Form.globalErrorMessageHandler = errorFunc;\n    }\n\n    /**\n     * Initialize forms for a specific selector\n     * @param {String} selector\n     * @param {Object} [options]\n     * @return {array.<Form>}\n     */\n    static init(selector, options) {\n        const forms = selector instanceof HTMLElement ? selector.querySelectorAll('form') :\n            document.querySelectorAll(selector);\n        const instances = [];\n        for (let i = 0; i < forms.length; i++) {\n            instances.push(new Form(forms[i], options));\n        }\n        return instances;\n    }\n\n\n    /**\n     * Registers a global validator that is usable on all form instances\n     * @param {String} name\n     * @param {Function} validator\n     * @returns {Function}\n     */\n    static registerValidator(name, validator) {\n        Form.globalValidators[name] = validator;\n        return Form;\n    }\n\n    /**\n     * Registers a global function that is called when a form should validate the response of a server\n     * @param {Function} func\n     * @returns {Form}\n     */\n    static registerGlobalRemoteValidationFunction(func) {\n        Form.globalRemoteValidationFunction = func;\n        return Form;\n    }\n}\n\n\n/**\n * Global validators\n * @type {Array}\n */\nForm.globalValidators = [];\n\n/**\n * Global Remote validation function\n */\nForm.globalRemoteValidationFunction = () => {\n};\n\n/**\n * Handles custom error messages extracts custom message by default\n */\nForm.globalErrorMessageHandler = (field, validity) => {\n    if (!validity.customError) {\n        const customMsg = field.getAttribute(ATTR_DATA_CUSTOM_MESSAGE);\n        if (customMsg) {\n            field.setCustomValidity(customMsg);\n        }\n    }\n};\n\nexport default Form;\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/Form.js","// the whatwg-fetch polyfill installs the fetch() function\n// on the global object (window or self)\n//\n// Return that as the export for use in Webpack, Browserify etc.\nrequire('whatwg-fetch');\nmodule.exports = self.fetch.bind(self);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/isomorphic-fetch/fetch-npm-browserify.js\n// module id = 11\n// module chunks = 0 1","(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ]\n\n    var isDataView = function(obj) {\n      return obj && DataView.prototype.isPrototypeOf(obj)\n    }\n\n    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    }\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var list = this.map[name]\n    if (!list) {\n      list = []\n      this.map[name] = list\n    }\n    list.push(value)\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    var values = this.map[normalizeName(name)]\n    return values ? values[0] : null\n  }\n\n  Headers.prototype.getAll = function(name) {\n    return this.map[normalizeName(name)] || []\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = [normalizeValue(value)]\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    Object.getOwnPropertyNames(this.map).forEach(function(name) {\n      this.map[name].forEach(function(value) {\n        callback.call(thisArg, value, name, this)\n      }, this)\n    }, this)\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsArrayBuffer(blob)\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsText(blob)\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf)\n    var chars = new Array(view.length)\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i])\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength)\n      view.set(new Uint8Array(buf))\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (!body) {\n        this._bodyText = ''\n      } else if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer)\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer])\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body)\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      }\n    }\n\n    this.text = function() {\n      var rejected = consumed(this)\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n\n    if (typeof input === 'string') {\n      this.url = input\n    } else {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, { body: this._bodyInit })\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers()\n    rawHeaders.split('\\r\\n').forEach(function(line) {\n      var parts = line.split(':')\n      var key = parts.shift().trim()\n      if (key) {\n        var value = parts.join(':').trim()\n        headers.append(key, value)\n      }\n    })\n    return headers\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = 'status' in options ? options.status : 200\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n    this.headers = new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init)\n      var xhr = new XMLHttpRequest()\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        }\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 12\n// module chunks = 0 1","import Form from '../Form';\nimport Tooltip from '../Tooltip';\nimport Settings from '../util/Settings';\n\n// default export as component object\nexport default {\n    Form,\n    Settings,\n    Tooltip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/main/modules/Form.js"],"sourceRoot":""}