diff --git a/README.md b/README.md index 4023dd5..58bd59a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -


FormHandler 1.1.0

+


FormHandler 1.1.1

diff --git a/build/js/formhandler.js b/build/js/formhandler.js index 92d614f..f4d7c41 100644 --- a/build/js/formhandler.js +++ b/build/js/formhandler.js @@ -1165,7 +1165,7 @@ sender.sendRequest(sender.makeData()); setTimeout(function () { _this.notices.form.hide(); - }, 2000); + }, delayForNotice); } } else { _this.notices.form.show(); diff --git a/build/js/formhandler.js.map b/build/js/formhandler.js.map index 8c9769f..99ab4fd 100644 --- a/build/js/formhandler.js.map +++ b/build/js/formhandler.js.map @@ -1 +1 @@ -{"version":3,"file":"formhandler.js.map","sources":["../../src/js/common/defaultConfig.js","../../src/js/common/FormHandlerError.js","../../src/js/core/Validator.js","../../src/js/common/constants.js","../../src/js/core/Form.js","../../src/js/core/Field.js","../../src/js/core/Input.js","../../src/js/core/Radio.js","../../src/js/core/Select.js","../../src/js/core/Color.js","../../src/js/core/Notice.js","../../src/js/core/Sender.js","../../src/js/FormHandler.js"],"sourcesContent":["export default {\n form: {\n block: '.formhandler',\n submit: '.formhandler__submit',\n delayForNotice: 3000,\n notice: {\n appendTo: '.formhandler__notices',\n message: 'This form seems to be invalid',\n successMessage: 'Form was successfully sent',\n errorMessage: 'Oops, something went wrong',\n classNames: {\n block: 'formhandler__notice-form',\n hidden: 'formhandler__notice-form--hidden',\n visible: 'formhandler__notice-form--visible',\n },\n },\n },\n fields: {\n min: false,\n max: false,\n send: true,\n },\n notices: {\n appendTo: false,\n nextToField: 'before',\n message: false,\n },\n classNames: {\n notices: {\n block: 'formhandler__notice',\n hidden: 'formhandler__notice--hidden',\n visible: 'formhandler__notice--visible',\n },\n form: {\n isValid: 'formhandler--is-valid',\n isNotValid: 'formhandler--is-not-valid',\n },\n fields: {\n isValid: 'formhandler__field--is-valid',\n isNotValid: 'formhandler__field--is-not-valid',\n },\n },\n sender: {\n send: false,\n type: 'xhr',\n clearFormOnSuccess: true,\n },\n callbacks: {\n onFieldChangeState() {},\n onFormChangeState() {},\n onSubmit() {},\n onSend() {},\n },\n};\n","/* eslint-disable no-useless-constructor */\nexport default class FormHandlerError extends Error {\n constructor(props) {\n super(props);\n }\n}\n","/* eslint-disable no-useless-escape */\nimport FormHandlerError from '../common/FormHandlerError';\n\nexport default class Validator {\n constructor(custom) {\n this.custom = custom;\n\n if (this.custom) {\n this.addCustomValidations();\n }\n }\n\n addCustomValidations() {\n Object.entries(this.custom).forEach(([type, obj]) => {\n Validator.validations[type] = obj;\n });\n return this;\n }\n\n static validate({\n type, node, min, max,\n }) {\n if (!type) return;\n const validation = Validator.validations[type];\n\n if (!validation) {\n throw new FormHandlerError(`No handler to validate type ${type}`);\n }\n\n // eslint-disable-next-line consistent-return\n return validation(node, min, max);\n }\n\n static validations = {\n isCheckboxChecked(node, min, max) {\n let message = 'At least one checkbox must be selected';\n let valid = true;\n let checked = 0;\n\n node.forEach((el) => {\n if (el.checked) checked += 1;\n });\n\n if (min && max) {\n if (checked < min) {\n valid = false;\n message = `Minimum ${min}, maximum ${max} checkboxes must be selected`;\n }\n if (checked > max) {\n valid = false;\n message = `Not more than ${max} ${max === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = `At least ${min} ${min === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (!min && max) {\n if (!checked) {\n message = `Minimum 1, maximum ${max} checkboxes must be selected`;\n }\n if (checked > max) {\n valid = false;\n message = `Not more than ${max} ${max === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid,\n message,\n };\n },\n isRadioChecked(node) {\n const valid = Array.from(node).some(el => el.checked === true);\n const message = 'Please select one of the buttons';\n\n return {\n valid,\n message,\n };\n },\n isSelected(node) {\n const valid = Array.from(node.options)\n .filter(el => el.value.length > 0)\n .some(el => el.selected === true);\n const message = 'Please select one of the options';\n\n return {\n valid,\n message,\n };\n },\n isName(node, min, max) {\n const pattern = /^[a-zA-Z]+$/;\n let valid = pattern.test(node.value);\n let message = 'Must contain only letters';\n const { length } = node.value.trim();\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'letter' : 'letters'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 letter but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid,\n message,\n };\n },\n isEmail(node) {\n const pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n const valid = pattern.test(node.value);\n const message = 'Must be a valid email address';\n\n return {\n valid,\n message,\n };\n },\n isPhone(node, min, max) {\n const pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n const { length } = node.value.trim();\n let valid = pattern.test(node.value);\n let message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'digit' : 'digits'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'digit' : 'digits'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'digit' : 'digits'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 digit but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'digit' : 'digits'}`;\n }\n }\n\n return {\n valid,\n message,\n };\n },\n isNonEmpty(node, min, max) {\n const { length } = node.value.trim();\n let valid = length > 0;\n let message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'character' : 'characters'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'character' : 'characters'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'character' : 'characters'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 character but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'character' : 'characters'}`;\n }\n }\n\n return {\n valid,\n message,\n };\n },\n };\n}\n","export const HTML_SELECT_ELEMENT = 'HTMLSelectElement';\nexport const INPUT = 'input';\nexport const LOAD = 'load';\nexport const UNDEFINED = 'undefined';\nexport const SUCCESS = 'success';\nexport const ERROR = 'error';\nexport const OBJECT = 'object';\nexport const FORM = 'form';\nexport const CLICK = 'click';\nexport const DIV = 'div';\nexport const READY_STATE_CHANGE = 'readystatechange';\nexport const XHR = 'xhr';\nexport const FETCH = 'fetch';\nexport const AFTER = 'after';\nexport const BEFORE = 'before';\nexport const STRING = 'string';\nexport const CHECKBOX = 'checkbox';\nexport const RADIO = 'radio';\nexport const SELECT = 'select-one';\nexport const NODE_LIST = 'NodeList';\nexport const COLOR = 'color';\n","import {\n CLICK,\n} from '../common/constants';\n\nexport default class Form {\n constructor({ ...opts }) {\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n get fieldsValidity() {\n const validness = new Set();\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n\n return !validness.has(false);\n }\n\n setState() {\n const validity = this.fieldsValidity;\n\n this.callback(this.node, this.valid, validity);\n\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n field.clear();\n });\n\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import {\n NODE_LIST,\n} from '../common/constants';\n\nexport default class Field {\n constructor({\n node, validation, min, max, send, classNames, callback,\n }) {\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n get validatorOptions() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max,\n };\n }\n\n setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n\n setFieldSubmitted(value) {\n this.submitted = value;\n }\n\n on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(el => el.addEventListener(type, listener));\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n\n off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(el => el.removeEventListener(type, listener));\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n\n remove() {\n this.node.remove();\n }\n}\n","import Field from './Field';\n\nexport default class Input extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import Field from './Field';\n\nexport default class Radio extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.forEach(el => el.classList.remove(this.classNames.isNotValid));\n this.node.forEach(el => el.classList.add(this.classNames.isValid));\n } else {\n this.node.forEach(el => el.classList.remove(this.classNames.isValid));\n this.node.forEach(el => el.classList.add(this.classNames.isNotValid));\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(el => el.classList.remove(this.classNames.isValid));\n this.node.forEach(el => el.classList.remove(this.classNames.isNotValid));\n this.node.forEach((el) => {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n}\n","import Field from './Field';\n\nexport default class Select extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach((el) => {\n el.selected = false;\n });\n }\n}\n","import Field from './Field';\n\nexport default class Color extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import {\n DIV,\n BEFORE,\n AFTER, NODE_LIST,\n} from '../common/constants';\n\nexport default class Notice {\n constructor({\n form, message, classNames, appendTo, nextToField, parent,\n }) {\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n\n show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n\n hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n\n remove() {\n this.node.remove();\n }\n}\n","import FormHandlerError from '../common/FormHandlerError';\nimport {\n HTML_SELECT_ELEMENT,\n READY_STATE_CHANGE,\n FETCH,\n XHR,\n SUCCESS,\n ERROR,\n NODE_LIST,\n} from '../common/constants';\n\nexport default class Sender {\n constructor({\n type, url, method, data, fields, form, callbacks,\n }) {\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n makeData() {\n const data = new FormData();\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.data).forEach(([name, value]) => {\n // eslint-disable-next-line no-useless-return\n if (!this.fields[name].send) return;\n data.append(name, value);\n });\n\n return data;\n }\n\n sendRequest(data) {\n if (this.type === XHR) {\n const xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, (ev) => {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n this.callbacks.setFormState(SUCCESS);\n this.callbacks.onSend(SUCCESS);\n } else {\n this.callbacks.setFormState(ERROR);\n this.callbacks.onSend(ERROR);\n throw new FormHandlerError(`Status: ${ev.target.status}, Text: ${ev.target.statusText}`);\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data,\n }).then((response) => {\n if (response.status >= 200 && response.status < 400) {\n this.callbacks.setFormState(SUCCESS);\n this.callbacks.onSend(SUCCESS);\n } else {\n this.callbacks.setFormState(ERROR);\n this.callbacks.onSend(ERROR);\n throw new FormHandlerError(`Status: ${response.status}, Text: ${response.statusText}`);\n }\n });\n }\n }\n}\n","import defaultConfig from './common/defaultConfig';\nimport Validator from './core/Validator';\nimport Form from './core/Form';\nimport Input from './core/Input';\nimport Radio from './core/Radio';\nimport Select from './core/Select';\nimport Color from './core/Color';\nimport Notice from './core/Notice';\nimport Sender from './core/Sender';\nimport {\n INPUT,\n UNDEFINED,\n ERROR,\n SUCCESS,\n OBJECT,\n LOAD,\n FORM,\n CHECKBOX,\n RADIO,\n SELECT,\n COLOR,\n STRING,\n NODE_LIST,\n HTML_SELECT_ELEMENT,\n} from './common/constants';\n\nexport default class FormHandler { // TODO: Переименовать опцию appendTo => appendTo\n constructor({ ...args }) {\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n\n this.init();\n }\n\n init() {\n this.complementOptions().makeForm();\n\n Object.entries(this.opts.fields).forEach(([name, field]) => {\n this.makeField(name, field);\n if (field.validation) {\n const validation = Validator.validate(this.fields[name].validatorOptions);\n this.makeNotice(name, field.notice);\n this.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n\n return this;\n }\n\n complementOptions() {\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames\n ? { ...defaultConfig.classNames, ...this.opts.classNames }\n : defaultConfig.classNames;\n this.opts.classNames.form = {\n ...defaultConfig.classNames.form,\n ...this.opts.classNames.form,\n };\n this.opts.classNames.fields = {\n ...defaultConfig.classNames.fields,\n ...this.opts.classNames.fields,\n };\n this.opts.classNames.notices = {\n ...defaultConfig.classNames.notices,\n ...this.opts.classNames.notices,\n };\n\n\n // Add lacks form options and merge.\n this.opts.form = this.opts.form\n ? { ...defaultConfig.form, ...this.opts.form }\n : defaultConfig.form;\n this.opts.form.notice = { ...defaultConfig.form.notice, ...this.opts.form.notice };\n this.opts.form.notice.classNames = {\n ...this.opts.classNames.notice,\n ...this.opts.form.notice.classNames,\n };\n\n\n // Add lacks notices options and merge\n this.opts.notices = { ...defaultConfig.notices, ...this.opts.notices };\n\n\n // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.opts.fields).forEach(([name, obj]) => {\n this.opts.fields[name] = { ...defaultConfig.fields, ...this.opts.fields[name] };\n this.opts.fields[name].classNames = this.opts.fields[name].classNames\n ? { ...this.opts.classNames.fields, ...this.opts.fields[name].classNames }\n : this.opts.classNames.fields;\n this.opts.fields[name].notice = { ...this.opts.notices, ...this.opts.fields[name].notice };\n this.opts.fields[name].notice.classNames = {\n ...this.opts.classNames.notices,\n ...this.opts.fields[name].notice.classNames,\n };\n });\n\n this.opts.sender = this.opts.sender\n ? { ...defaultConfig.sender, ...this.opts.sender }\n : defaultConfig.sender;\n\n this.callbacks = this.opts.callbacks\n ? { ...defaultConfig.callbacks, ...this.opts.callbacks }\n : defaultConfig.callbacks;\n\n return this;\n }\n\n makeForm() {\n const options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState,\n };\n\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n\n return this;\n }\n\n makeField(name, field) {\n let node = this.form.node.querySelector(`[name=${name}]`);\n const { type } = node;\n const options = {\n node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState,\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(`[name=${name}]`);\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n\n makeNotice(name, notice) {\n const message = this.fields[name]\n ? Validator.validate(this.fields[name].validatorOptions).message\n : false;\n const parent = notice.nextToField\n ? this.fields[name].node\n : document.querySelector(notice.appendTo);\n const options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent,\n };\n\n this.notices[name] = new Notice(options);\n\n return this;\n }\n\n setFormStateFromResponse = (result) => {\n if (result === SUCCESS) {\n this.notices.form.message = this.opts.form.notice.successMessage;\n this.form.sent = true;\n if (this.opts.sender.clearFormOnSuccess) {\n this.form.clear();\n }\n }\n if (result === ERROR) {\n this.notices.form.message = this.opts.form.notice.errorMessage;\n this.form.sent = false;\n }\n this.notices.form.show();\n };\n\n setFieldStateFromResponse(response, property, name, message) {\n // eslint-disable-next-line valid-typeof\n if (typeof response.then !== UNDEFINED) {\n response\n .then(data => data.json())\n .then((json) => {\n this.setFieldState(name, !!json[property], message);\n this.form.setState();\n });\n } else {\n response.addEventListener(LOAD, (ev) => {\n this.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n this.form.setState();\n });\n }\n }\n\n setFieldState(name, valid, message = this.notices[name].message) {\n const { submitted } = this.fields[name];\n\n // eslint-disable-next-line valid-typeof\n if (typeof valid === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n\n inputHandler = (ev) => {\n const { name } = ev.target;\n const validation = Validator.validate(this.fields[name].validatorOptions);\n\n if (this.fields[name].validation) {\n this.setFieldState(name, validation.valid, validation.message);\n\n // eslint-disable-next-line valid-typeof\n if (typeof validation.valid !== OBJECT) {\n this.form.setState();\n }\n }\n };\n\n submitHandler = (ev) => {\n ev.preventDefault();\n const fieldNodes = [];\n const { delayForNotice } = this.opts.form;\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n this.callbacks.onSubmit(this.form.node, fieldNodes);\n\n this.validateForm();\n this.notices.form.message = this.opts.form.notice.message;\n\n if (this.form.valid) {\n this.notices.form.hide();\n\n if (this.opts.sender.send) {\n const options = {\n type: this.opts.sender.type,\n url: this.form.node.action,\n method: this.form.node.method,\n data: this.getFieldsAndValues,\n fields: this.fields,\n form: this.form.node,\n callbacks: {\n setFormState: this.setFormStateFromResponse,\n onSend: this.callbacks.onSend,\n },\n };\n const sender = new Sender(options);\n\n sender.sendRequest(sender.makeData());\n\n setTimeout(() => {\n this.notices.form.hide();\n }, 2000);\n }\n } else {\n this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(() => {\n this.notices.form.hide();\n }, delayForNotice);\n }\n }\n }\n\n getFieldNameBy(field) { // return field name get by NodeList/Selector(.className)\n const type = typeof field;\n const { name } = field;\n const { node } = this.form;\n let fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n if (type === STRING) {\n const isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n\n isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n\n getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n\n isFormValid() {\n return this.form.valid;\n }\n\n isFormSubmitted() {\n return this.form.submitted;\n }\n\n isFormSent() {\n return this.form.sent;\n }\n\n clearForm() {\n this.form.clear();\n }\n\n clearField(field) { // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n\n getField(field) { // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n\n addField(field, { ...opts }) {\n const options = opts;\n options.notice = options.notice ? options.notice : {};\n const name = this.getFieldNameBy(field);\n\n const fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: { ...this.opts.classNames.fields, ...options.classNames },\n };\n\n const noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: { ...this.opts.classNames.notices, ...options.notice.classNames },\n };\n\n this.opts.fields[name] = {\n ...fieldOptions,\n notice: noticeOptions,\n };\n\n this.makeField(name, this.opts.fields[name]);\n this.makeNotice(name, this.opts.fields[name].notice);\n\n return this.fields[name].node;\n }\n\n removeField(field) {\n const name = this.getFieldNameBy(field);\n\n this.fields[name].remove();\n this.notices[name].remove();\n }\n\n validateField(field) { // also turns on toggleClassNames\n const name = this.getFieldNameBy(field);\n\n if (this.fields[name].validation) {\n const validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n this.form.setState();\n\n return this.fields[name].node;\n }\n\n validateForm() { // also turns on toggleClassNames\n Object.entries(this.fields).forEach(([name, field]) => {\n if (field.validation) {\n const validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n this.setFieldState(name, validation.valid, validation.message);\n }\n });\n\n this.form.submitted = true;\n this.form.setState();\n\n return this.form.node;\n }\n\n getFieldsAndValues = () => {\n const data = {};\n\n Object.entries(this.fields).forEach(([name, field]) => {\n const type = field.node.constructor.name;\n\n if (type === NODE_LIST) { // Radio/Checkbox\n const inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach((node) => {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach((node) => {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) { // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else { // Others\n data[name] = field.node.value;\n }\n });\n\n return data;\n }\n}\n"],"names":["form","block","submit","delayForNotice","notice","appendTo","message","successMessage","errorMessage","classNames","hidden","visible","fields","min","max","send","notices","nextToField","isValid","isNotValid","sender","type","clearFormOnSuccess","callbacks","onFieldChangeState","onFormChangeState","onSubmit","onSend","FormHandlerError","props","Error","Validator","custom","addCustomValidations","Object","entries","forEach","obj","validations","node","validation","isCheckboxChecked","valid","checked","el","isRadioChecked","Array","from","some","isSelected","options","filter","value","length","selected","isName","pattern","test","trim","isEmail","isPhone","isNonEmpty","HTML_SELECT_ELEMENT","INPUT","LOAD","UNDEFINED","SUCCESS","ERROR","OBJECT","FORM","CLICK","DIV","READY_STATE_CHANGE","XHR","FETCH","AFTER","BEFORE","STRING","CHECKBOX","RADIO","SELECT","NODE_LIST","COLOR","Form","opts","listener","submitted","sent","callback","addEventListener","validity","fieldsValidity","toggleClassNames","classList","remove","add","name","field","clear","validness","Set","has","Field","constructor","removeEventListener","Input","Radio","Select","Color","Notice","parent","mount","document","createElement","appendChild","parentElement","insertBefore","nextElementSibling","innerText","Sender","url","method","data","FormData","append","xhr","XMLHttpRequest","open","ev","target","readyState","status","setFormState","statusText","fetch","body","then","response","FormHandler","args","result","show","validate","validatorOptions","setFieldState","setState","preventDefault","fieldNodes","setFieldSubmitted","push","validateForm","hide","action","getFieldsAndValues","setFormStateFromResponse","sendRequest","makeData","setTimeout","inputType","selectedIndex","validator","customValidations","init","complementOptions","makeForm","makeField","makeNotice","defaultConfig","querySelector","submitHandler","querySelectorAll","on","inputHandler","property","json","JSON","parse","setFieldStateFromResponse","fieldName","isSelector","getFieldNameBy","fieldOptions","noticeOptions"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"formhandler.js.map","sources":["../../src/js/common/defaultConfig.js","../../src/js/common/FormHandlerError.js","../../src/js/core/Validator.js","../../src/js/common/constants.js","../../src/js/core/Form.js","../../src/js/core/Field.js","../../src/js/core/Input.js","../../src/js/core/Radio.js","../../src/js/core/Select.js","../../src/js/core/Color.js","../../src/js/core/Notice.js","../../src/js/core/Sender.js","../../src/js/FormHandler.js"],"sourcesContent":["export default {\n form: {\n block: '.formhandler',\n submit: '.formhandler__submit',\n delayForNotice: 3000,\n notice: {\n appendTo: '.formhandler__notices',\n message: 'This form seems to be invalid',\n successMessage: 'Form was successfully sent',\n errorMessage: 'Oops, something went wrong',\n classNames: {\n block: 'formhandler__notice-form',\n hidden: 'formhandler__notice-form--hidden',\n visible: 'formhandler__notice-form--visible',\n },\n },\n },\n fields: {\n min: false,\n max: false,\n send: true,\n },\n notices: {\n appendTo: false,\n nextToField: 'before',\n message: false,\n },\n classNames: {\n notices: {\n block: 'formhandler__notice',\n hidden: 'formhandler__notice--hidden',\n visible: 'formhandler__notice--visible',\n },\n form: {\n isValid: 'formhandler--is-valid',\n isNotValid: 'formhandler--is-not-valid',\n },\n fields: {\n isValid: 'formhandler__field--is-valid',\n isNotValid: 'formhandler__field--is-not-valid',\n },\n },\n sender: {\n send: false,\n type: 'xhr',\n clearFormOnSuccess: true,\n },\n callbacks: {\n onFieldChangeState() {},\n onFormChangeState() {},\n onSubmit() {},\n onSend() {},\n },\n};\n","/* eslint-disable no-useless-constructor */\nexport default class FormHandlerError extends Error {\n constructor(props) {\n super(props);\n }\n}\n","/* eslint-disable no-useless-escape */\nimport FormHandlerError from '../common/FormHandlerError';\n\nexport default class Validator {\n constructor(custom) {\n this.custom = custom;\n\n if (this.custom) {\n this.addCustomValidations();\n }\n }\n\n addCustomValidations() {\n Object.entries(this.custom).forEach(([type, obj]) => {\n Validator.validations[type] = obj;\n });\n return this;\n }\n\n static validate({\n type, node, min, max,\n }) {\n if (!type) return;\n const validation = Validator.validations[type];\n\n if (!validation) {\n throw new FormHandlerError(`No handler to validate type ${type}`);\n }\n\n // eslint-disable-next-line consistent-return\n return validation(node, min, max);\n }\n\n static validations = {\n isCheckboxChecked(node, min, max) {\n let message = 'At least one checkbox must be selected';\n let valid = true;\n let checked = 0;\n\n node.forEach((el) => {\n if (el.checked) checked += 1;\n });\n\n if (min && max) {\n if (checked < min) {\n valid = false;\n message = `Minimum ${min}, maximum ${max} checkboxes must be selected`;\n }\n if (checked > max) {\n valid = false;\n message = `Not more than ${max} ${max === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = `At least ${min} ${min === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (!min && max) {\n if (!checked) {\n message = `Minimum 1, maximum ${max} checkboxes must be selected`;\n }\n if (checked > max) {\n valid = false;\n message = `Not more than ${max} ${max === 1 ? 'checkbox' : 'checkboxes'} must be selected`;\n }\n }\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid,\n message,\n };\n },\n isRadioChecked(node) {\n const valid = Array.from(node).some(el => el.checked === true);\n const message = 'Please select one of the buttons';\n\n return {\n valid,\n message,\n };\n },\n isSelected(node) {\n const valid = Array.from(node.options)\n .filter(el => el.value.length > 0)\n .some(el => el.selected === true);\n const message = 'Please select one of the options';\n\n return {\n valid,\n message,\n };\n },\n isName(node, min, max) {\n const pattern = /^[a-zA-Z]+$/;\n let valid = pattern.test(node.value);\n let message = 'Must contain only letters';\n const { length } = node.value.trim();\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'letter' : 'letters'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 letter but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'letter' : 'letters'}`;\n }\n }\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid,\n message,\n };\n },\n isEmail(node) {\n const pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n const valid = pattern.test(node.value);\n const message = 'Must be a valid email address';\n\n return {\n valid,\n message,\n };\n },\n isPhone(node, min, max) {\n const pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n const { length } = node.value.trim();\n let valid = pattern.test(node.value);\n let message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'digit' : 'digits'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'digit' : 'digits'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'digit' : 'digits'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 digit but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'digit' : 'digits'}`;\n }\n }\n\n return {\n valid,\n message,\n };\n },\n isNonEmpty(node, min, max) {\n const { length } = node.value.trim();\n let valid = length > 0;\n let message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'character' : 'characters'} but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'character' : 'characters'}`;\n }\n }\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = `Must contain at least ${min} ${min === 1 ? 'character' : 'characters'}`;\n }\n }\n if (!min && max) {\n if (!length) {\n message = `Must contain at least 1 character but not more than ${max}`;\n }\n if (length > max) {\n valid = false;\n message = `Must contain not more than ${max} ${max === 1 ? 'character' : 'characters'}`;\n }\n }\n\n return {\n valid,\n message,\n };\n },\n };\n}\n","export const HTML_SELECT_ELEMENT = 'HTMLSelectElement';\nexport const INPUT = 'input';\nexport const LOAD = 'load';\nexport const UNDEFINED = 'undefined';\nexport const SUCCESS = 'success';\nexport const ERROR = 'error';\nexport const OBJECT = 'object';\nexport const FORM = 'form';\nexport const CLICK = 'click';\nexport const DIV = 'div';\nexport const READY_STATE_CHANGE = 'readystatechange';\nexport const XHR = 'xhr';\nexport const FETCH = 'fetch';\nexport const AFTER = 'after';\nexport const BEFORE = 'before';\nexport const STRING = 'string';\nexport const CHECKBOX = 'checkbox';\nexport const RADIO = 'radio';\nexport const SELECT = 'select-one';\nexport const NODE_LIST = 'NodeList';\nexport const COLOR = 'color';\n","import {\n CLICK,\n} from '../common/constants';\n\nexport default class Form {\n constructor({ ...opts }) {\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n get fieldsValidity() {\n const validness = new Set();\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n\n return !validness.has(false);\n }\n\n setState() {\n const validity = this.fieldsValidity;\n\n this.callback(this.node, this.valid, validity);\n\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n field.clear();\n });\n\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import {\n NODE_LIST,\n} from '../common/constants';\n\nexport default class Field {\n constructor({\n node, validation, min, max, send, classNames, callback,\n }) {\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n get validatorOptions() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max,\n };\n }\n\n setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n\n setFieldSubmitted(value) {\n this.submitted = value;\n }\n\n on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(el => el.addEventListener(type, listener));\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n\n off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(el => el.removeEventListener(type, listener));\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n\n remove() {\n this.node.remove();\n }\n}\n","import Field from './Field';\n\nexport default class Input extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import Field from './Field';\n\nexport default class Radio extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.forEach(el => el.classList.remove(this.classNames.isNotValid));\n this.node.forEach(el => el.classList.add(this.classNames.isValid));\n } else {\n this.node.forEach(el => el.classList.remove(this.classNames.isValid));\n this.node.forEach(el => el.classList.add(this.classNames.isNotValid));\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(el => el.classList.remove(this.classNames.isValid));\n this.node.forEach(el => el.classList.remove(this.classNames.isNotValid));\n this.node.forEach((el) => {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n}\n","import Field from './Field';\n\nexport default class Select extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach((el) => {\n el.selected = false;\n });\n }\n}\n","import Field from './Field';\n\nexport default class Color extends Field {\n constructor({ ...opts }) {\n super({ ...opts });\n }\n\n toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n\n clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n}\n","import {\n DIV,\n BEFORE,\n AFTER, NODE_LIST,\n} from '../common/constants';\n\nexport default class Notice {\n constructor({\n form, message, classNames, appendTo, nextToField, parent,\n }) {\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n\n show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n\n hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n\n remove() {\n this.node.remove();\n }\n}\n","import FormHandlerError from '../common/FormHandlerError';\nimport {\n HTML_SELECT_ELEMENT,\n READY_STATE_CHANGE,\n FETCH,\n XHR,\n SUCCESS,\n ERROR,\n NODE_LIST,\n} from '../common/constants';\n\nexport default class Sender {\n constructor({\n type, url, method, data, fields, form, callbacks,\n }) {\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n makeData() {\n const data = new FormData();\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.data).forEach(([name, value]) => {\n // eslint-disable-next-line no-useless-return\n if (!this.fields[name].send) return;\n data.append(name, value);\n });\n\n return data;\n }\n\n sendRequest(data) {\n if (this.type === XHR) {\n const xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, (ev) => {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n this.callbacks.setFormState(SUCCESS);\n this.callbacks.onSend(SUCCESS);\n } else {\n this.callbacks.setFormState(ERROR);\n this.callbacks.onSend(ERROR);\n throw new FormHandlerError(`Status: ${ev.target.status}, Text: ${ev.target.statusText}`);\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data,\n }).then((response) => {\n if (response.status >= 200 && response.status < 400) {\n this.callbacks.setFormState(SUCCESS);\n this.callbacks.onSend(SUCCESS);\n } else {\n this.callbacks.setFormState(ERROR);\n this.callbacks.onSend(ERROR);\n throw new FormHandlerError(`Status: ${response.status}, Text: ${response.statusText}`);\n }\n });\n }\n }\n}\n","import defaultConfig from './common/defaultConfig';\nimport Validator from './core/Validator';\nimport Form from './core/Form';\nimport Input from './core/Input';\nimport Radio from './core/Radio';\nimport Select from './core/Select';\nimport Color from './core/Color';\nimport Notice from './core/Notice';\nimport Sender from './core/Sender';\nimport {\n INPUT,\n UNDEFINED,\n ERROR,\n SUCCESS,\n OBJECT,\n LOAD,\n FORM,\n CHECKBOX,\n RADIO,\n SELECT,\n COLOR,\n STRING,\n NODE_LIST,\n HTML_SELECT_ELEMENT,\n} from './common/constants';\n\nexport default class FormHandler { // TODO: Переименовать опцию appendTo => appendTo\n constructor({ ...args }) {\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n\n this.init();\n }\n\n init() {\n this.complementOptions().makeForm();\n\n Object.entries(this.opts.fields).forEach(([name, field]) => {\n this.makeField(name, field);\n if (field.validation) {\n const validation = Validator.validate(this.fields[name].validatorOptions);\n this.makeNotice(name, field.notice);\n this.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n\n return this;\n }\n\n complementOptions() {\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames\n ? { ...defaultConfig.classNames, ...this.opts.classNames }\n : defaultConfig.classNames;\n this.opts.classNames.form = {\n ...defaultConfig.classNames.form,\n ...this.opts.classNames.form,\n };\n this.opts.classNames.fields = {\n ...defaultConfig.classNames.fields,\n ...this.opts.classNames.fields,\n };\n this.opts.classNames.notices = {\n ...defaultConfig.classNames.notices,\n ...this.opts.classNames.notices,\n };\n\n\n // Add lacks form options and merge.\n this.opts.form = this.opts.form\n ? { ...defaultConfig.form, ...this.opts.form }\n : defaultConfig.form;\n this.opts.form.notice = { ...defaultConfig.form.notice, ...this.opts.form.notice };\n this.opts.form.notice.classNames = {\n ...this.opts.classNames.notice,\n ...this.opts.form.notice.classNames,\n };\n\n\n // Add lacks notices options and merge\n this.opts.notices = { ...defaultConfig.notices, ...this.opts.notices };\n\n\n // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.opts.fields).forEach(([name, obj]) => {\n this.opts.fields[name] = { ...defaultConfig.fields, ...this.opts.fields[name] };\n this.opts.fields[name].classNames = this.opts.fields[name].classNames\n ? { ...this.opts.classNames.fields, ...this.opts.fields[name].classNames }\n : this.opts.classNames.fields;\n this.opts.fields[name].notice = { ...this.opts.notices, ...this.opts.fields[name].notice };\n this.opts.fields[name].notice.classNames = {\n ...this.opts.classNames.notices,\n ...this.opts.fields[name].notice.classNames,\n };\n });\n\n this.opts.sender = this.opts.sender\n ? { ...defaultConfig.sender, ...this.opts.sender }\n : defaultConfig.sender;\n\n this.callbacks = this.opts.callbacks\n ? { ...defaultConfig.callbacks, ...this.opts.callbacks }\n : defaultConfig.callbacks;\n\n return this;\n }\n\n makeForm() {\n const options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState,\n };\n\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n\n return this;\n }\n\n makeField(name, field) {\n let node = this.form.node.querySelector(`[name=${name}]`);\n const { type } = node;\n const options = {\n node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState,\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(`[name=${name}]`);\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n\n makeNotice(name, notice) {\n const message = this.fields[name]\n ? Validator.validate(this.fields[name].validatorOptions).message\n : false;\n const parent = notice.nextToField\n ? this.fields[name].node\n : document.querySelector(notice.appendTo);\n const options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent,\n };\n\n this.notices[name] = new Notice(options);\n\n return this;\n }\n\n setFormStateFromResponse = (result) => {\n if (result === SUCCESS) {\n this.notices.form.message = this.opts.form.notice.successMessage;\n this.form.sent = true;\n if (this.opts.sender.clearFormOnSuccess) {\n this.form.clear();\n }\n }\n if (result === ERROR) {\n this.notices.form.message = this.opts.form.notice.errorMessage;\n this.form.sent = false;\n }\n this.notices.form.show();\n };\n\n setFieldStateFromResponse(response, property, name, message) {\n // eslint-disable-next-line valid-typeof\n if (typeof response.then !== UNDEFINED) {\n response\n .then(data => data.json())\n .then((json) => {\n this.setFieldState(name, !!json[property], message);\n this.form.setState();\n });\n } else {\n response.addEventListener(LOAD, (ev) => {\n this.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n this.form.setState();\n });\n }\n }\n\n setFieldState(name, valid, message = this.notices[name].message) {\n const { submitted } = this.fields[name];\n\n // eslint-disable-next-line valid-typeof\n if (typeof valid === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n\n inputHandler = (ev) => {\n const { name } = ev.target;\n const validation = Validator.validate(this.fields[name].validatorOptions);\n\n if (this.fields[name].validation) {\n this.setFieldState(name, validation.valid, validation.message);\n\n // eslint-disable-next-line valid-typeof\n if (typeof validation.valid !== OBJECT) {\n this.form.setState();\n }\n }\n };\n\n submitHandler = (ev) => {\n ev.preventDefault();\n const fieldNodes = [];\n const { delayForNotice } = this.opts.form;\n\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(([name, field]) => {\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n this.callbacks.onSubmit(this.form.node, fieldNodes);\n\n this.validateForm();\n this.notices.form.message = this.opts.form.notice.message;\n\n if (this.form.valid) {\n this.notices.form.hide();\n\n if (this.opts.sender.send) {\n const options = {\n type: this.opts.sender.type,\n url: this.form.node.action,\n method: this.form.node.method,\n data: this.getFieldsAndValues,\n fields: this.fields,\n form: this.form.node,\n callbacks: {\n setFormState: this.setFormStateFromResponse,\n onSend: this.callbacks.onSend,\n },\n };\n const sender = new Sender(options);\n\n sender.sendRequest(sender.makeData());\n\n setTimeout(() => {\n this.notices.form.hide();\n }, delayForNotice);\n }\n } else {\n this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(() => {\n this.notices.form.hide();\n }, delayForNotice);\n }\n }\n }\n\n getFieldNameBy(field) { // return field name get by NodeList/Selector(.className)\n const type = typeof field;\n const { name } = field;\n const { node } = this.form;\n let fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n if (type === STRING) {\n const isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n\n isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n\n getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n\n isFormValid() {\n return this.form.valid;\n }\n\n isFormSubmitted() {\n return this.form.submitted;\n }\n\n isFormSent() {\n return this.form.sent;\n }\n\n clearForm() {\n this.form.clear();\n }\n\n clearField(field) { // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n\n getField(field) { // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n\n addField(field, { ...opts }) {\n const options = opts;\n options.notice = options.notice ? options.notice : {};\n const name = this.getFieldNameBy(field);\n\n const fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: { ...this.opts.classNames.fields, ...options.classNames },\n };\n\n const noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: { ...this.opts.classNames.notices, ...options.notice.classNames },\n };\n\n this.opts.fields[name] = {\n ...fieldOptions,\n notice: noticeOptions,\n };\n\n this.makeField(name, this.opts.fields[name]);\n this.makeNotice(name, this.opts.fields[name].notice);\n\n return this.fields[name].node;\n }\n\n removeField(field) {\n const name = this.getFieldNameBy(field);\n\n this.fields[name].remove();\n this.notices[name].remove();\n }\n\n validateField(field) { // also turns on toggleClassNames\n const name = this.getFieldNameBy(field);\n\n if (this.fields[name].validation) {\n const validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n this.form.setState();\n\n return this.fields[name].node;\n }\n\n validateForm() { // also turns on toggleClassNames\n Object.entries(this.fields).forEach(([name, field]) => {\n if (field.validation) {\n const validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n this.setFieldState(name, validation.valid, validation.message);\n }\n });\n\n this.form.submitted = true;\n this.form.setState();\n\n return this.form.node;\n }\n\n getFieldsAndValues = () => {\n const data = {};\n\n Object.entries(this.fields).forEach(([name, field]) => {\n const type = field.node.constructor.name;\n\n if (type === NODE_LIST) { // Radio/Checkbox\n const inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach((node) => {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach((node) => {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) { // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else { // Others\n data[name] = field.node.value;\n }\n });\n\n return data;\n }\n}\n"],"names":["form","block","submit","delayForNotice","notice","appendTo","message","successMessage","errorMessage","classNames","hidden","visible","fields","min","max","send","notices","nextToField","isValid","isNotValid","sender","type","clearFormOnSuccess","callbacks","onFieldChangeState","onFormChangeState","onSubmit","onSend","FormHandlerError","props","Error","Validator","custom","addCustomValidations","Object","entries","forEach","obj","validations","node","validation","isCheckboxChecked","valid","checked","el","isRadioChecked","Array","from","some","isSelected","options","filter","value","length","selected","isName","pattern","test","trim","isEmail","isPhone","isNonEmpty","HTML_SELECT_ELEMENT","INPUT","LOAD","UNDEFINED","SUCCESS","ERROR","OBJECT","FORM","CLICK","DIV","READY_STATE_CHANGE","XHR","FETCH","AFTER","BEFORE","STRING","CHECKBOX","RADIO","SELECT","NODE_LIST","COLOR","Form","opts","listener","submitted","sent","callback","addEventListener","validity","fieldsValidity","toggleClassNames","classList","remove","add","name","field","clear","validness","Set","has","Field","constructor","removeEventListener","Input","Radio","Select","Color","Notice","parent","mount","document","createElement","appendChild","parentElement","insertBefore","nextElementSibling","innerText","Sender","url","method","data","FormData","append","xhr","XMLHttpRequest","open","ev","target","readyState","status","setFormState","statusText","fetch","body","then","response","FormHandler","args","result","show","validate","validatorOptions","setFieldState","setState","preventDefault","fieldNodes","setFieldSubmitted","push","validateForm","hide","action","getFieldsAndValues","setFormStateFromResponse","sendRequest","makeData","setTimeout","inputType","selectedIndex","validator","customValidations","init","complementOptions","makeForm","makeField","makeNotice","defaultConfig","querySelector","submitHandler","querySelectorAll","on","inputHandler","property","json","JSON","parse","setFieldStateFromResponse","fieldName","isSelector","getFieldNameBy","fieldOptions","noticeOptions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sBAAe;EACbA,QAAM;EACJC,WAAO,cADH;EAEJC,YAAQ,sBAFJ;EAGJC,oBAAgB,IAHZ;EAIJC,YAAQ;EACNC,gBAAU,uBADJ;EAENC,eAAS,+BAFH;EAGNC,sBAAgB,4BAHV;EAINC,oBAAc,4BAJR;EAKNC,kBAAY;EACVR,eAAO,0BADG;EAEVS,gBAAQ,kCAFE;EAGVC,iBAAS;EAHC;EALN;EAJJ,GADO;EAiBbC,UAAQ;EACNC,SAAK,KADC;EAENC,SAAK,KAFC;EAGNC,UAAM;EAHA,GAjBK;EAsBbC,WAAS;EACPX,cAAU,KADH;EAEPY,iBAAa,QAFN;EAGPX,aAAS;EAHF,GAtBI;EA2BbG,cAAY;EACVO,aAAS;EACPf,aAAO,qBADA;EAEPS,cAAQ,6BAFD;EAGPC,eAAS;EAHF,KADC;EAMVX,UAAM;EACJkB,eAAS,uBADL;EAEJC,kBAAY;EAFR,KANI;EAUVP,YAAQ;EACNM,eAAS,8BADH;EAENC,kBAAY;EAFN;EAVE,GA3BC;EA0CbC,UAAQ;EACNL,UAAM,KADA;EAENM,UAAM,KAFA;EAGNC,wBAAoB;EAHd,GA1CK;EA+CbC,aAAW;EACTC,sBADS,gCACY,EADZ;EAETC,qBAFS,+BAEW,EAFX;EAGTC,YAHS,sBAGE,EAHF;EAITC,UAJS,oBAIA;EAJA;EA/CE,CAAf;;ECAA;MACqBC;;;;;EACnB,4BAAYC,KAAZ,EAAmB;EAAA;;EAAA,yFACXA,KADW;EAElB;;;qBAH2CC;;MCEzBC;;;EACnB,qBAAYC,MAAZ,EAAoB;EAAA;;EAClB,SAAKA,MAAL,GAAcA,MAAd;;EAEA,QAAI,KAAKA,MAAT,EAAiB;EACf,WAAKC,oBAAL;EACD;EACF;;;;6CAEsB;EACrBC,aAAOC,OAAP,CAAe,KAAKH,MAApB,EAA4BI,OAA5B,CAAoC,gBAAiB;EAAA;EAAA,YAAff,IAAe;EAAA,YAATgB,GAAS;;EACnDN,kBAAUO,WAAV,CAAsBjB,IAAtB,IAA8BgB,GAA9B;EACD,OAFD;EAGA,aAAO,IAAP;EACD;;;sCAIE;EAAA,UADDhB,IACC,SADDA,IACC;EAAA,UADKkB,IACL,SADKA,IACL;EAAA,UADW1B,GACX,SADWA,GACX;EAAA,UADgBC,GAChB,SADgBA,GAChB;EACD,UAAI,CAACO,IAAL,EAAW;EACX,UAAMmB,aAAaT,UAAUO,WAAV,CAAsBjB,IAAtB,CAAnB;;EAEA,UAAI,CAACmB,UAAL,EAAiB;EACf,cAAM,IAAIZ,gBAAJ,uCAAoDP,IAApD,EAAN;EACD,OANA;;;EASD,aAAOmB,WAAWD,IAAX,EAAiB1B,GAAjB,EAAsBC,GAAtB,CAAP;EACD;;;;;;kBA5BkBiB,0BA8BE;EACnBU,mBADmB,6BACDF,IADC,EACK1B,GADL,EACUC,GADV,EACe;EAChC,QAAIR,UAAU,wCAAd;EACA,QAAIoC,QAAQ,IAAZ;EACA,QAAIC,UAAU,CAAd;EAEAJ,SAAKH,OAAL,CAAa,UAACQ,EAAD,EAAQ;EACnB,UAAIA,GAAGD,OAAP,EAAgBA,WAAW,CAAX;EACjB,KAFD;;EAIA,QAAI9B,OAAOC,GAAX,EAAgB;EACd,UAAI6B,UAAU9B,GAAd,EAAmB;EACjB6B,gBAAQ,KAAR;EACApC,oCAAqBO,GAArB,uBAAqCC,GAArC;EACD;;EACD,UAAI6B,UAAU7B,GAAd,EAAmB;EACjB4B,gBAAQ,KAAR;EACApC,0CAA2BQ,GAA3B,cAAkCA,QAAQ,CAAR,GAAY,UAAZ,GAAyB,YAA3D;EACD;EACF;;EACD,QAAID,OAAO,CAACC,GAAZ,EAAiB;EACf,UAAI6B,UAAU9B,GAAd,EAAmB;EACjB6B,gBAAQ,KAAR;EACApC,qCAAsBO,GAAtB,cAA6BA,QAAQ,CAAR,GAAY,UAAZ,GAAyB,YAAtD;EACD;EACF;;EACD,QAAI,CAACA,GAAD,IAAQC,GAAZ,EAAiB;EACf,UAAI,CAAC6B,OAAL,EAAc;EACZrC,+CAAgCQ,GAAhC;EACD;;EACD,UAAI6B,UAAU7B,GAAd,EAAmB;EACjB4B,gBAAQ,KAAR;EACApC,0CAA2BQ,GAA3B,cAAkCA,QAAQ,CAAR,GAAY,UAAZ,GAAyB,YAA3D;EACD;EACF;;EACD,QAAI,CAACD,GAAD,IAAQ,CAACC,GAAT,IAAgB,CAAC6B,OAArB,EAA8B;EAC5BD,cAAQ,KAAR;EACApC,gBAAU,wCAAV;EACD;;EAED,WAAO;EACLoC,kBADK;EAELpC;EAFK,KAAP;EAID,GA5CkB;EA6CnBuC,gBA7CmB,0BA6CJN,IA7CI,EA6CE;EACnB,QAAMG,QAAQI,MAAMC,IAAN,CAAWR,IAAX,EAAiBS,IAAjB,CAAsB;EAAA,aAAMJ,GAAGD,OAAH,KAAe,IAArB;EAAA,KAAtB,CAAd;EACA,QAAMrC,UAAU,kCAAhB;EAEA,WAAO;EACLoC,kBADK;EAELpC;EAFK,KAAP;EAID,GArDkB;EAsDnB2C,YAtDmB,sBAsDRV,IAtDQ,EAsDF;EACf,QAAMG,QAAQI,MAAMC,IAAN,CAAWR,KAAKW,OAAhB,EACXC,MADW,CACJ;EAAA,aAAMP,GAAGQ,KAAH,CAASC,MAAT,GAAkB,CAAxB;EAAA,KADI,EAEXL,IAFW,CAEN;EAAA,aAAMJ,GAAGU,QAAH,KAAgB,IAAtB;EAAA,KAFM,CAAd;EAGA,QAAMhD,UAAU,kCAAhB;EAEA,WAAO;EACLoC,kBADK;EAELpC;EAFK,KAAP;EAID,GAhEkB;EAiEnBiD,QAjEmB,kBAiEZhB,IAjEY,EAiEN1B,GAjEM,EAiEDC,GAjEC,EAiEI;EACrB,QAAM0C,UAAU,aAAhB;EACA,QAAId,QAAQc,QAAQC,IAAR,CAAalB,KAAKa,KAAlB,CAAZ;EACA,QAAI9C,UAAU,2BAAd;;EAHqB,2BAIFiC,KAAKa,KAAL,CAAWM,IAAX,EAJE;EAAA,QAIbL,MAJa,oBAIbA,MAJa;;EAMrB,QAAIxC,OAAOC,GAAX,EAAgB;EACd,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,QAAZ,GAAuB,SAAjE,gCAAgGC,GAAhG;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,QAAZ,GAAuB,SAAtE;EACD;EACF;;EACD,QAAID,OAAO,CAACC,GAAZ,EAAiB;EACf,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,QAAZ,GAAuB,SAAjE;EACD;EACF;;EACD,QAAI,CAACA,GAAD,IAAQC,GAAZ,EAAiB;EACf,UAAI,CAACuC,MAAL,EAAa;EACX/C,6EAA8DQ,GAA9D;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,QAAZ,GAAuB,SAAtE;EACD;EACF;;EACD,QAAI,CAACD,GAAD,IAAQ,CAACC,GAAT,IAAgB,CAACuC,MAArB,EAA6B;EAC3BX,cAAQ,KAAR;EACApC,gBAAU,kCAAV;EACD;;EAED,WAAO;EACLoC,kBADK;EAELpC;EAFK,KAAP;EAID,GAzGkB;EA0GnBqD,SA1GmB,mBA0GXpB,IA1GW,EA0GL;EACZ,QAAMiB,UAAU,wHAAhB;EACA,QAAMd,QAAQc,QAAQC,IAAR,CAAalB,KAAKa,KAAlB,CAAd;EACA,QAAM9C,UAAU,+BAAhB;EAEA,WAAO;EACLoC,kBADK;EAELpC;EAFK,KAAP;EAID,GAnHkB;EAoHnBsD,SApHmB,mBAoHXrB,IApHW,EAoHL1B,GApHK,EAoHAC,GApHA,EAoHK;EACtB,QAAM0C,UAAU,gDAAhB;;EADsB,4BAEHjB,KAAKa,KAAL,CAAWM,IAAX,EAFG;EAAA,QAEdL,MAFc,qBAEdA,MAFc;;EAGtB,QAAIX,QAAQc,QAAQC,IAAR,CAAalB,KAAKa,KAAlB,CAAZ;EACA,QAAI9C,UAAU,8BAAd;;EAEA,QAAIO,OAAOC,GAAX,EAAgB;EACd,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,OAAZ,GAAsB,QAAhE,gCAA8FC,GAA9F;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,OAAZ,GAAsB,QAArE;EACD;EACF;;EACD,QAAID,OAAO,CAACC,GAAZ,EAAiB;EACf,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,OAAZ,GAAsB,QAAhE;EACD;EACF;;EACD,QAAI,CAACA,GAAD,IAAQC,GAAZ,EAAiB;EACf,UAAI,CAACuC,MAAL,EAAa;EACX/C,4EAA6DQ,GAA7D;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,OAAZ,GAAsB,QAArE;EACD;EACF;;EAED,WAAO;EACL4B,kBADK;EAELpC;EAFK,KAAP;EAID,GAxJkB;EAyJnBuD,YAzJmB,sBAyJRtB,IAzJQ,EAyJF1B,GAzJE,EAyJGC,GAzJH,EAyJQ;EAAA,4BACNyB,KAAKa,KAAL,CAAWM,IAAX,EADM;EAAA,QACjBL,MADiB,qBACjBA,MADiB;;EAEzB,QAAIX,QAAQW,SAAS,CAArB;EACA,QAAI/C,UAAU,qCAAd;;EAEA,QAAIO,OAAOC,GAAX,EAAgB;EACd,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,WAAZ,GAA0B,YAApE,gCAAsGC,GAAtG;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,WAAZ,GAA0B,YAAzE;EACD;EACF;;EACD,QAAID,OAAO,CAACC,GAAZ,EAAiB;EACf,UAAIuC,SAASxC,GAAb,EAAkB;EAChB6B,gBAAQ,KAAR;EACApC,kDAAmCO,GAAnC,cAA0CA,QAAQ,CAAR,GAAY,WAAZ,GAA0B,YAApE;EACD;EACF;;EACD,QAAI,CAACA,GAAD,IAAQC,GAAZ,EAAiB;EACf,UAAI,CAACuC,MAAL,EAAa;EACX/C,gFAAiEQ,GAAjE;EACD;;EACD,UAAIuC,SAASvC,GAAb,EAAkB;EAChB4B,gBAAQ,KAAR;EACApC,uDAAwCQ,GAAxC,cAA+CA,QAAQ,CAAR,GAAY,WAAZ,GAA0B,YAAzE;EACD;EACF;;EAED,WAAO;EACL4B,kBADK;EAELpC;EAFK,KAAP;EAID;EA5LkB;;ECjChB,IAAMwD,sBAAsB,mBAA5B;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,OAAO,MAAb;AACP,EAAO,IAAMC,YAAY,WAAlB;AACP,EAAO,IAAMC,UAAU,SAAhB;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,SAAS,QAAf;AACP,EAAO,IAAMC,OAAO,MAAb;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,MAAM,KAAZ;AACP,EAAO,IAAMC,qBAAqB,kBAA3B;AACP,EAAO,IAAMC,MAAM,KAAZ;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,SAAS,QAAf;AACP,EAAO,IAAMC,SAAS,QAAf;AACP,EAAO,IAAMC,WAAW,UAAjB;AACP,EAAO,IAAMC,QAAQ,OAAd;AACP,EAAO,IAAMC,SAAS,YAAf;AACP,EAAO,IAAMC,YAAY,UAAlB;AACP,EAAO,IAAMC,QAAQ,OAAd;;MChBcC;;;EACnB,sBAAyB;EAAA,QAARC,IAAQ;;EAAA;;EACvB,SAAK7C,IAAL,GAAY6C,KAAK7C,IAAjB;EACA,SAAKrC,MAAL,GAAckF,KAAKlF,MAAnB;EACA,SAAKO,UAAL,GAAkB2E,KAAK3E,UAAvB;EACA,SAAKG,MAAL,GAAcwE,KAAKxE,MAAnB;EACA,SAAKyE,QAAL,GAAgBD,KAAKC,QAArB;EACA,SAAK3C,KAAL,GAAa,IAAb;EACA,SAAK4C,SAAL,GAAiB,KAAjB;EACA,SAAKC,IAAL,GAAY,IAAZ;EACA,SAAKC,QAAL,GAAgBJ,KAAKI,QAArB;EACA,SAAKtF,MAAL,CAAYuF,gBAAZ,CAA6BnB,KAA7B,EAAoC,KAAKe,QAAzC;EACD;;;;iCAeU;EACT,UAAMK,WAAW,KAAKC,cAAtB;EAEA,WAAKH,QAAL,CAAc,KAAKjD,IAAnB,EAAyB,KAAKG,KAA9B,EAAqCgD,QAArC;EAEA,WAAKhD,KAAL,GAAagD,QAAb;;EAEA,UAAI,KAAKJ,SAAT,EAAoB;EAClB,aAAKM,gBAAL;EACD;EACF;;;yCAEkB;EACjB,UAAI,KAAKlD,KAAT,EAAgB;EACd,aAAKH,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,aAAKoB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBS,OAAxC;EACD,OAHD,MAGO;EACL,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACA,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBU,UAAxC;EACD;EACF;;;8BAEO;EACN;EACAe,aAAOC,OAAP,CAAe,KAAKvB,MAApB,EAA4BwB,OAA5B,CAAoC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EACrDA,cAAMC,KAAN;EACD,OAFD;EAIA,WAAKV,QAAL,CAAc,KAAKjD,IAAnB,EAAyB,KAAKG,KAA9B,EAAqC,KAArC;EACA,WAAKA,KAAL,GAAa,KAAb;EACA,WAAK4C,SAAL,GAAiB,KAAjB;EACA,WAAK/C,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,WAAKoB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACD;;;0BA9CoB;EACnB,UAAMiF,YAAY,IAAIC,GAAJ,EAAlB,CADmB;;EAInBlE,aAAOC,OAAP,CAAe,KAAKvB,MAApB,EAA4BwB,OAA5B,CAAoC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EACrD,YAAIA,MAAMzD,UAAV,EAAsB;EACpB2D,oBAAUJ,GAAV,CAAcE,MAAMvD,KAApB;EACD;EACF,OAJD;EAMA,aAAO,CAACyD,UAAUE,GAAV,CAAc,KAAd,CAAR;EACD;;;;;;MCzBkBC;;;EACnB,uBAEG;EAAA,QADD/D,IACC,QADDA,IACC;EAAA,QADKC,UACL,QADKA,UACL;EAAA,QADiB3B,GACjB,QADiBA,GACjB;EAAA,QADsBC,GACtB,QADsBA,GACtB;EAAA,QAD2BC,IAC3B,QAD2BA,IAC3B;EAAA,QADiCN,UACjC,QADiCA,UACjC;EAAA,QAD6C+E,QAC7C,QAD6CA,QAC7C;;EAAA;;EACD,SAAKjD,IAAL,GAAYA,IAAZ;EACA,SAAKlB,IAAL,GAAY,KAAKkB,IAAL,CAAUgE,WAAV,CAAsBP,IAAlC;EACA,SAAKA,IAAL,GAAY,KAAK3E,IAAL,KAAc4D,SAAd,GAA0B,KAAK1C,IAAL,CAAU,CAAV,EAAayD,IAAvC,GAA8C,KAAKzD,IAAL,CAAUyD,IAApE;EACA,SAAKxD,UAAL,GAAkBA,UAAlB;EACA,SAAKzB,IAAL,GAAYA,IAAZ;EACA,SAAKF,GAAL,GAAWA,GAAX;EACA,SAAKC,GAAL,GAAWA,GAAX;EACA,SAAKL,UAAL,GAAkBA,UAAlB;EACA,SAAKiC,KAAL,GAAa,IAAb;EACA,SAAK4C,SAAL,GAAiB,KAAjB;EACA,SAAKE,QAAL,GAAgBA,QAAhB;EACD;;;;+BAWQ9C,OAAO;EACd,WAAK8C,QAAL,CAAc,KAAKhD,UAAnB,EAA+B,KAAKwD,IAApC,EAA0C,KAAKzD,IAA/C,EAAqD,KAAKG,KAA1D,EAAiEA,KAAjE;EAEA,WAAKA,KAAL,GAAaA,KAAb;;EAEA,UAAI,KAAK4C,SAAT,EAAoB;EAClB,aAAKM,gBAAL;EACD;EACF;;;wCAEiBxC,OAAO;EACvB,WAAKkC,SAAL,GAAiBlC,KAAjB;EACD;;;yBAEE/B,MAAMgE,UAAU;EACjB,UAAI,KAAKhE,IAAL,KAAc4D,SAAlB,EAA6B;EAC3B,aAAK1C,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAG6C,gBAAH,CAAoBpE,IAApB,EAA0BgE,QAA1B,CAAN;EAAA,SAAlB;EACD,OAFD,MAEO;EACL,aAAK9C,IAAL,CAAUkD,gBAAV,CAA2BpE,IAA3B,EAAiCgE,QAAjC;EACD;EACF;;;0BAEGhE,MAAMgE,UAAU;EAClB,UAAI,KAAKhE,IAAL,KAAc4D,SAAlB,EAA6B;EAC3B,aAAK1C,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAG4D,mBAAH,CAAuBnF,IAAvB,EAA6BgE,QAA7B,CAAN;EAAA,SAAlB;EACD,OAFD,MAEO;EACL,aAAK9C,IAAL,CAAUiE,mBAAV,CAA8BnF,IAA9B,EAAoCgE,QAApC;EACD;EACF;;;+BAEQ;EACP,WAAK9C,IAAL,CAAUuD,MAAV;EACD;;;0BAzCsB;EACrB,aAAO;EACLzE,cAAM,KAAKmB,UADN;EAELD,cAAM,KAAKA,IAFN;EAGL1B,aAAK,KAAKA,GAHL;EAILC,aAAK,KAAKA;EAJL,OAAP;EAMD;;;;;;MC1BkB2F;;;;;EACnB,uBAAyB;EAAA,QAARrB,IAAQ;;EAAA;;EAAA,gGACZA,IADY;EAExB;;;;yCAEkB;EACjB,UAAI,KAAK1C,KAAT,EAAgB;EACd,aAAKH,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,aAAKoB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBS,OAAxC;EACD,OAHD,MAGO;EACL,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACA,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBU,UAAxC;EACD;EACF;;;8BAEO;EACN,WAAKqE,QAAL,CAAc,KAAKhD,UAAnB,EAA+B,KAAKwD,IAApC,EAA0C,KAAKzD,IAA/C,EAAqD,KAAKG,KAA1D,EAAiE,KAAjE;EACA,WAAKH,IAAL,CAAUa,KAAV,GAAkB,EAAlB;EACA,WAAKV,KAAL,GAAa,KAAb;EACA,WAAK4C,SAAL,GAAiB,KAAjB;EACA,WAAK/C,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,WAAKoB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACD;;;;IAtBgCoF;;MCAdI;;;;;EACnB,uBAAyB;EAAA,QAARtB,IAAQ;;EAAA;;EAAA,gGACZA,IADY;EAExB;;;;yCAEkB;EAAA;;EACjB,UAAI,KAAK1C,KAAT,EAAgB;EACd,aAAKH,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAGiD,SAAH,CAAaC,MAAb,CAAoB,MAAKrF,UAAL,CAAgBU,UAApC,CAAN;EAAA,SAAlB;EACA,aAAKoB,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAGiD,SAAH,CAAaE,GAAb,CAAiB,MAAKtF,UAAL,CAAgBS,OAAjC,CAAN;EAAA,SAAlB;EACD,OAHD,MAGO;EACL,aAAKqB,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAGiD,SAAH,CAAaC,MAAb,CAAoB,MAAKrF,UAAL,CAAgBS,OAApC,CAAN;EAAA,SAAlB;EACA,aAAKqB,IAAL,CAAUH,OAAV,CAAkB;EAAA,iBAAMQ,GAAGiD,SAAH,CAAaE,GAAb,CAAiB,MAAKtF,UAAL,CAAgBU,UAAjC,CAAN;EAAA,SAAlB;EACD;EACF;;;8BAEO;EAAA;;EACN,WAAKqE,QAAL,CAAc,KAAKhD,UAAnB,EAA+B,KAAKwD,IAApC,EAA0C,KAAKzD,IAA/C,EAAqD,KAAKG,KAA1D,EAAiE,KAAjE;EACA,WAAKA,KAAL,GAAa,KAAb;EACA,WAAK4C,SAAL,GAAiB,KAAjB;EACA,WAAK/C,IAAL,CAAUH,OAAV,CAAkB;EAAA,eAAMQ,GAAGiD,SAAH,CAAaC,MAAb,CAAoB,OAAKrF,UAAL,CAAgBS,OAApC,CAAN;EAAA,OAAlB;EACA,WAAKqB,IAAL,CAAUH,OAAV,CAAkB;EAAA,eAAMQ,GAAGiD,SAAH,CAAaC,MAAb,CAAoB,OAAKrF,UAAL,CAAgBU,UAApC,CAAN;EAAA,OAAlB;EACA,WAAKoB,IAAL,CAAUH,OAAV,CAAkB,UAACQ,EAAD,EAAQ;EACxB;EACAA,WAAGD,OAAH,GAAa,KAAb;EACD,OAHD;EAID;;;;IAzBgC2D;;MCAdK;;;;;EACnB,wBAAyB;EAAA,QAARvB,IAAQ;;EAAA;;EAAA,iGACZA,IADY;EAExB;;;;yCAEkB;EACjB,UAAI,KAAK1C,KAAT,EAAgB;EACd,aAAKH,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,aAAKoB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBS,OAAxC;EACD,OAHD,MAGO;EACL,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACA,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBU,UAAxC;EACD;EACF;;;8BAEO;EACN,WAAKqE,QAAL,CAAc,KAAKhD,UAAnB,EAA+B,KAAKwD,IAApC,EAA0C,KAAKzD,IAA/C,EAAqD,KAAKG,KAA1D,EAAiE,KAAjE;EACA,WAAKA,KAAL,GAAa,KAAb;EACA,WAAK4C,SAAL,GAAiB,KAAjB;EACA,WAAK/C,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACA,WAAKqB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA2B,YAAMC,IAAN,CAAW,KAAKR,IAAL,CAAUW,OAArB,EAA8Bd,OAA9B,CAAsC,UAACQ,EAAD,EAAQ;EAC5CA,WAAGU,QAAH,GAAc,KAAd;EACD,OAFD;EAGD;;;;IAxBiCgD;;MCAfM;;;;;EACnB,uBAAyB;EAAA,QAARxB,IAAQ;;EAAA;;EAAA,gGACZA,IADY;EAExB;;;;yCAEkB;EACjB,UAAI,KAAK1C,KAAT,EAAgB;EACd,aAAKH,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,aAAKoB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBS,OAAxC;EACD,OAHD,MAGO;EACL,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACA,aAAKqB,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBU,UAAxC;EACD;EACF;;;8BAEO;EACN,WAAKqE,QAAL,CAAc,KAAKhD,UAAnB,EAA+B,KAAKwD,IAApC,EAA0C,KAAKzD,IAA/C,EAAqD,KAAKG,KAA1D,EAAiE,KAAjE;EACA,WAAKH,IAAL,CAAUa,KAAV,GAAkB,SAAlB;EACA,WAAKV,KAAL,GAAa,KAAb;EACA,WAAK4C,SAAL,GAAiB,KAAjB;EACA,WAAK/C,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBU,UAA3C;EACA,WAAKoB,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBS,OAA3C;EACD;;;;IAtBgCoF;;MCIdO;;;EACnB,wBAEG;EAAA,QADD7G,IACC,QADDA,IACC;EAAA,QADKM,OACL,QADKA,OACL;EAAA,QADcG,UACd,QADcA,UACd;EAAA,QAD0BJ,QAC1B,QAD0BA,QAC1B;EAAA,QADoCY,WACpC,QADoCA,WACpC;EAAA,QADiD6F,MACjD,QADiDA,MACjD;;EAAA;;EACD,SAAK9G,IAAL,GAAYA,IAAZ;EACA,SAAKM,OAAL,GAAeA,OAAf;EACA,SAAKG,UAAL,GAAkBA,UAAlB;EACA,SAAKJ,QAAL,GAAgBA,QAAhB;EACA,SAAKY,WAAL,GAAmBA,WAAnB;EACA,SAAK6F,MAAL,GAAcA,MAAd;EACA,SAAKvE,IAAL,GAAY,IAAZ;EACA,SAAKwE,KAAL;EACD;;;;8BAEO;EACN,WAAKxE,IAAL,GAAYyE,SAASC,aAAT,CAAuB1C,GAAvB,CAAZ;EACA,WAAKhC,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBR,KAAxC;EACA,WAAKsC,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBC,MAAxC;;EAEA,UAAI,KAAKL,QAAT,EAAmB;EACjB,aAAKyG,MAAL,CAAYI,WAAZ,CAAwB,KAAK3E,IAA7B;EACD,OAFD,MAEO;EACL,YAAI,KAAKtB,WAAL,KAAqB2D,MAAzB,EAAiC;EAC/B,cAAI,KAAKkC,MAAL,CAAYP,WAAZ,CAAwBP,IAAxB,KAAiCf,SAArC,EAAgD;EAC9C,iBAAK6B,MAAL,GAAc,KAAKA,MAAL,CAAY,CAAZ,CAAd;EACD;;EACD,eAAKA,MAAL,CAAYK,aAAZ,CAA0BC,YAA1B,CAAuC,KAAK7E,IAA5C,EAAkD,KAAKuE,MAAvD;EACD;;EACD,YAAI,KAAK7F,WAAL,KAAqB0D,KAAzB,EAAgC;EAC9B,cAAI,KAAKmC,MAAL,CAAYP,WAAZ,CAAwBP,IAAxB,KAAiCf,SAArC,EAAgD;EAC9C,iBAAK6B,MAAL,GAAc,KAAKA,MAAL,CAAY,KAAKA,MAAL,CAAYzD,MAAZ,GAAqB,CAAjC,CAAd;EACD;;EACD,eAAKyD,MAAL,CAAYK,aAAZ,CAA0BC,YAA1B,CAAuC,KAAK7E,IAA5C,EAAkD,KAAKuE,MAAL,CAAYO,kBAA9D;EACD;EACF;EACF;;;6BAEM;EACL,WAAK9E,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBC,MAA3C;EACA,WAAK6B,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBE,OAAxC;EACA,WAAK4B,IAAL,CAAU+E,SAAV,GAAsB,KAAKhH,OAA3B;EACD;;;6BAEM;EACL,WAAKiC,IAAL,CAAUsD,SAAV,CAAoBC,MAApB,CAA2B,KAAKrF,UAAL,CAAgBE,OAA3C;EACA,WAAK4B,IAAL,CAAUsD,SAAV,CAAoBE,GAApB,CAAwB,KAAKtF,UAAL,CAAgBC,MAAxC;EACD;;;+BAEQ;EACP,WAAK6B,IAAL,CAAUuD,MAAV;EACD;;;;;;MC7CkByB;;;EACnB,wBAEG;EAAA,QADDlG,IACC,QADDA,IACC;EAAA,QADKmG,GACL,QADKA,GACL;EAAA,QADUC,MACV,QADUA,MACV;EAAA,QADkBC,IAClB,QADkBA,IAClB;EAAA,QADwB9G,MACxB,QADwBA,MACxB;EAAA,QADgCZ,IAChC,QADgCA,IAChC;EAAA,QADsCuB,SACtC,QADsCA,SACtC;;EAAA;;EACD,SAAKF,IAAL,GAAYA,IAAZ;EACA,SAAKmG,GAAL,GAAWA,GAAX;EACA,SAAKC,MAAL,GAAcA,MAAd;EACA,SAAKC,IAAL,GAAYA,MAAZ;EACA,SAAK9G,MAAL,GAAcA,MAAd;EACA,SAAKZ,IAAL,GAAYA,IAAZ;EACA,SAAKuB,SAAL,GAAiBA,SAAjB;EACD;;;;iCAEU;EAAA;;EACT,UAAMmG,OAAO,IAAIC,QAAJ,EAAb,CADS;;EAITzF,aAAOC,OAAP,CAAe,KAAKuF,IAApB,EAA0BtF,OAA1B,CAAkC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAX5C,KAAW;;EACnD;EACA,YAAI,CAAC,MAAKxC,MAAL,CAAYoF,IAAZ,EAAkBjF,IAAvB,EAA6B;EAC7B2G,aAAKE,MAAL,CAAY5B,IAAZ,EAAkB5C,KAAlB;EACD,OAJD;EAMA,aAAOsE,IAAP;EACD;;;kCAEWA,MAAM;EAAA;;EAChB,UAAI,KAAKrG,IAAL,KAAcoD,GAAlB,EAAuB;EACrB,YAAMoD,MAAM,IAAIC,cAAJ,EAAZ;EACAD,YAAIE,IAAJ,CAAS,KAAKN,MAAd,EAAsB,KAAKD,GAA3B,EAAgC,IAAhC;EACAK,YAAIpC,gBAAJ,CAAqBjB,kBAArB,EAAyC,UAACwD,EAAD,EAAQ;EAC/C,cAAIA,GAAGC,MAAH,CAAUC,UAAV,KAAyB,CAA7B,EAAgC;EAC9B,gBAAIF,GAAGC,MAAH,CAAUE,MAAV,IAAoB,GAApB,IAA2BH,GAAGC,MAAH,CAAUE,MAAV,GAAmB,GAAlD,EAAuD;EACrD,qBAAK5G,SAAL,CAAe6G,YAAf,CAA4BlE,OAA5B;;EACA,qBAAK3C,SAAL,CAAeI,MAAf,CAAsBuC,OAAtB;EACD,aAHD,MAGO;EACL,qBAAK3C,SAAL,CAAe6G,YAAf,CAA4BjE,KAA5B;;EACA,qBAAK5C,SAAL,CAAeI,MAAf,CAAsBwC,KAAtB;;EACA,oBAAM,IAAIvC,gBAAJ,mBAAgCoG,GAAGC,MAAH,CAAUE,MAA1C,qBAA2DH,GAAGC,MAAH,CAAUI,UAArE,EAAN;EACD;EACF;EACF,SAXD;EAYAR,YAAI9G,IAAJ,CAAS2G,IAAT;EACD;;EAED,UAAI,KAAKrG,IAAL,KAAcqD,KAAlB,EAAyB;EACvB4D,cAAM,KAAKd,GAAX,EAAgB;EACdC,kBAAQ,KAAKA,MADC;EAEdc,gBAAMb;EAFQ,SAAhB,EAGGc,IAHH,CAGQ,UAACC,QAAD,EAAc;EACpB,cAAIA,SAASN,MAAT,IAAmB,GAAnB,IAA0BM,SAASN,MAAT,GAAkB,GAAhD,EAAqD;EACnD,mBAAK5G,SAAL,CAAe6G,YAAf,CAA4BlE,OAA5B;;EACA,mBAAK3C,SAAL,CAAeI,MAAf,CAAsBuC,OAAtB;EACD,WAHD,MAGO;EACL,mBAAK3C,SAAL,CAAe6G,YAAf,CAA4BjE,KAA5B;;EACA,mBAAK5C,SAAL,CAAeI,MAAf,CAAsBwC,KAAtB;;EACA,kBAAM,IAAIvC,gBAAJ,mBAAgC6G,SAASN,MAAzC,qBAA0DM,SAASJ,UAAnE,EAAN;EACD;EACF,SAZD;EAaD;EACF;;;;;;MC7CkBK;;;EAAc;EACjC,6BAAyB;EAAA;;EAAA,QAARC,IAAQ;;EAAA;;EAAA,sDAwJE,UAACC,MAAD,EAAY;EACrC,UAAIA,WAAW1E,OAAf,EAAwB;EACtB,cAAKlD,OAAL,CAAahB,IAAb,CAAkBM,OAAlB,GAA4B,MAAK8E,IAAL,CAAUpF,IAAV,CAAeI,MAAf,CAAsBG,cAAlD;EACA,cAAKP,IAAL,CAAUuF,IAAV,GAAiB,IAAjB;;EACA,YAAI,MAAKH,IAAL,CAAUhE,MAAV,CAAiBE,kBAArB,EAAyC;EACvC,gBAAKtB,IAAL,CAAUkG,KAAV;EACD;EACF;;EACD,UAAI0C,WAAWzE,KAAf,EAAsB;EACpB,cAAKnD,OAAL,CAAahB,IAAb,CAAkBM,OAAlB,GAA4B,MAAK8E,IAAL,CAAUpF,IAAV,CAAeI,MAAf,CAAsBI,YAAlD;EACA,cAAKR,IAAL,CAAUuF,IAAV,GAAiB,KAAjB;EACD;;EACD,YAAKvE,OAAL,CAAahB,IAAb,CAAkB6I,IAAlB;EACD,KArKwB;;EAAA,0CA4MV,UAACb,EAAD,EAAQ;EAAA,UACbhC,IADa,GACJgC,GAAGC,MADC,CACbjC,IADa;EAErB,UAAMxD,aAAaT,UAAU+G,QAAV,CAAmB,MAAKlI,MAAL,CAAYoF,IAAZ,EAAkB+C,gBAArC,CAAnB;;EAEA,UAAI,MAAKnI,MAAL,CAAYoF,IAAZ,EAAkBxD,UAAtB,EAAkC;EAChC,cAAKwG,aAAL,CAAmBhD,IAAnB,EAAyBxD,WAAWE,KAApC,EAA2CF,WAAWlC,OAAtD,EADgC;;;EAIhC,YAAI,QAAOkC,WAAWE,KAAlB,MAA4B0B,MAAhC,EAAwC;EACtC,gBAAKpE,IAAL,CAAUiJ,QAAV;EACD;EACF;EACF,KAxNwB;;EAAA,2CA0NT,UAACjB,EAAD,EAAQ;EACtBA,SAAGkB,cAAH;EACA,UAAMC,aAAa,EAAnB;EAFsB,UAGdhJ,cAHc,GAGK,MAAKiF,IAAL,CAAUpF,IAHf,CAGdG,cAHc;;EAMtB+B,aAAOC,OAAP,CAAe,MAAKvB,MAApB,EAA4BwB,OAA5B,CAAoC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EACrDA,cAAMmD,iBAAN,CAAwB,IAAxB;EACAD,mBAAWE,IAAX,CAAgBpD,MAAM1D,IAAtB;EACD,OAHD;;EAKA,YAAKhB,SAAL,CAAeG,QAAf,CAAwB,MAAK1B,IAAL,CAAUuC,IAAlC,EAAwC4G,UAAxC;;EAEA,YAAKG,YAAL;;EACA,YAAKtI,OAAL,CAAahB,IAAb,CAAkBM,OAAlB,GAA4B,MAAK8E,IAAL,CAAUpF,IAAV,CAAeI,MAAf,CAAsBE,OAAlD;;EAEA,UAAI,MAAKN,IAAL,CAAU0C,KAAd,EAAqB;EACnB,cAAK1B,OAAL,CAAahB,IAAb,CAAkBuJ,IAAlB;;EAEA,YAAI,MAAKnE,IAAL,CAAUhE,MAAV,CAAiBL,IAArB,EAA2B;EACzB,cAAMmC,UAAU;EACd7B,kBAAM,MAAK+D,IAAL,CAAUhE,MAAV,CAAiBC,IADT;EAEdmG,iBAAK,MAAKxH,IAAL,CAAUuC,IAAV,CAAeiH,MAFN;EAGd/B,oBAAQ,MAAKzH,IAAL,CAAUuC,IAAV,CAAekF,MAHT;EAIdC,kBAAM,MAAK+B,kBAJG;EAKd7I,oBAAQ,MAAKA,MALC;EAMdZ,kBAAM,MAAKA,IAAL,CAAUuC,IANF;EAOdhB,uBAAW;EACT6G,4BAAc,MAAKsB,wBADV;EAET/H,sBAAQ,MAAKJ,SAAL,CAAeI;EAFd;EAPG,WAAhB;EAYA,cAAMP,SAAS,IAAImG,MAAJ,CAAWrE,OAAX,CAAf;EAEA9B,iBAAOuI,WAAP,CAAmBvI,OAAOwI,QAAP,EAAnB;EAEAC,qBAAW,YAAM;EACf,kBAAK7I,OAAL,CAAahB,IAAb,CAAkBuJ,IAAlB;EACD,WAFD,EAEGpJ,cAFH;EAGD;EACF,OAxBD,MAwBO;EACL,cAAKa,OAAL,CAAahB,IAAb,CAAkB6I,IAAlB;;EAEA,YAAI1I,cAAJ,EAAoB;EAClB0J,qBAAW,YAAM;EACf,kBAAK7I,OAAL,CAAahB,IAAb,CAAkBuJ,IAAlB;EACD,WAFD,EAEGpJ,cAFH;EAGD;EACF;EACF,KA3QwB;;EAAA,gDAsYJ,YAAM;EACzB,UAAMuH,OAAO,EAAb;EAEAxF,aAAOC,OAAP,CAAe,MAAKvB,MAApB,EAA4BwB,OAA5B,CAAoC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EACrD,YAAM5E,OAAO4E,MAAM1D,IAAN,CAAWgE,WAAX,CAAuBP,IAApC;;EAEA,YAAI3E,SAAS4D,SAAb,EAAwB;EAAE;EACxB,cAAM6E,YAAY7D,MAAM1D,IAAN,CAAW,CAAX,EAAclB,IAAhC;;EAEA,cAAIyI,cAAchF,QAAlB,EAA4B;EAC1B4C,iBAAK1B,IAAL,IAAa,EAAb;EACAlD,kBAAMC,IAAN,CAAWkD,MAAM1D,IAAjB,EAAuBH,OAAvB,CAA+B,UAACG,IAAD,EAAU;EACvC,kBAAIA,KAAKI,OAAT,EAAkB;EAChB+E,qBAAK1B,IAAL,EAAWqD,IAAX,CAAgB9G,KAAKa,KAArB;EACD;EACF,aAJD;EAKD;;EACD,cAAI0G,cAAc/E,KAAlB,EAAyB;EACvB2C,iBAAK1B,IAAL,IAAa,EAAb;EACAlD,kBAAMC,IAAN,CAAWkD,MAAM1D,IAAjB,EAAuBH,OAAvB,CAA+B,UAACG,IAAD,EAAU;EACvC,kBAAIA,KAAKI,OAAT,EAAkB;EAChB+E,qBAAK1B,IAAL,IAAazD,KAAKa,KAAlB;EACD;EACF,aAJD;EAKD;EACF,SAnBD,MAmBO,IAAI/B,SAASyC,mBAAb,EAAkC;EAAE;EACzC4D,eAAK1B,IAAL,IAAaC,MAAM1D,IAAN,CAAWW,OAAX,CAAmB+C,MAAM1D,IAAN,CAAWW,OAAX,CAAmB6G,aAAtC,EAAqD3G,KAAlE;EACD,SAFM,MAEA;EAAE;EACPsE,eAAK1B,IAAL,IAAaC,MAAM1D,IAAN,CAAWa,KAAxB;EACD;EACF,OA3BD;EA6BA,aAAOsE,IAAP;EACD,KAvawB;;EACvB,SAAKtC,IAAL,GAAYuD,IAAZ;EACA,SAAK/H,MAAL,GAAc,EAAd;EACA,SAAKI,OAAL,GAAe,EAAf;EACA,SAAKhB,IAAL,GAAY,IAAZ;EACA,SAAKgK,SAAL,GAAiB,IAAIjI,SAAJ,CAAc,KAAKqD,IAAL,CAAU6E,iBAAxB,CAAjB;EACA,SAAK1I,SAAL,GAAiB,EAAjB;EAEA,SAAK2I,IAAL;EACD;;;;6BAEM;EAAA;;EACL,WAAKC,iBAAL,GAAyBC,QAAzB;EAEAlI,aAAOC,OAAP,CAAe,KAAKiD,IAAL,CAAUxE,MAAzB,EAAiCwB,OAAjC,CAAyC,iBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EAC1D,eAAKoE,SAAL,CAAerE,IAAf,EAAqBC,KAArB;;EACA,YAAIA,MAAMzD,UAAV,EAAsB;EACpB,cAAMA,aAAaT,UAAU+G,QAAV,CAAmB,OAAKlI,MAAL,CAAYoF,IAAZ,EAAkB+C,gBAArC,CAAnB;;EACA,iBAAKuB,UAAL,CAAgBtE,IAAhB,EAAsBC,MAAM7F,MAA5B;;EACA,iBAAK4I,aAAL,CAAmBhD,IAAnB,EAAyBxD,WAAWE,KAApC,EAA2CF,WAAWlC,OAAtD;EACD;EACF,OAPD;EAQA,WAAKN,IAAL,CAAUiJ,QAAV;EAEA,aAAO,IAAP;EACD;;;0CAEmB;EAAA;;EAClB;EACA,WAAK7D,IAAL,CAAU3E,UAAV,GAAuB,KAAK2E,IAAL,CAAU3E,UAAV,qBACd8J,cAAc9J,UADA,EACe,KAAK2E,IAAL,CAAU3E,UADzB,IAEnB8J,cAAc9J,UAFlB;EAGA,WAAK2E,IAAL,CAAU3E,UAAV,CAAqBT,IAArB,qBACKuK,cAAc9J,UAAd,CAAyBT,IAD9B,EAEK,KAAKoF,IAAL,CAAU3E,UAAV,CAAqBT,IAF1B;EAIA,WAAKoF,IAAL,CAAU3E,UAAV,CAAqBG,MAArB,qBACK2J,cAAc9J,UAAd,CAAyBG,MAD9B,EAEK,KAAKwE,IAAL,CAAU3E,UAAV,CAAqBG,MAF1B;EAIA,WAAKwE,IAAL,CAAU3E,UAAV,CAAqBO,OAArB,qBACKuJ,cAAc9J,UAAd,CAAyBO,OAD9B,EAEK,KAAKoE,IAAL,CAAU3E,UAAV,CAAqBO,OAF1B,EAbkB;;EAoBlB,WAAKoE,IAAL,CAAUpF,IAAV,GAAiB,KAAKoF,IAAL,CAAUpF,IAAV,qBACRuK,cAAcvK,IADN,EACe,KAAKoF,IAAL,CAAUpF,IADzB,IAEbuK,cAAcvK,IAFlB;EAGA,WAAKoF,IAAL,CAAUpF,IAAV,CAAeI,MAAf,qBAA6BmK,cAAcvK,IAAd,CAAmBI,MAAhD,EAA2D,KAAKgF,IAAL,CAAUpF,IAAV,CAAeI,MAA1E;EACA,WAAKgF,IAAL,CAAUpF,IAAV,CAAeI,MAAf,CAAsBK,UAAtB,qBACK,KAAK2E,IAAL,CAAU3E,UAAV,CAAqBL,MAD1B,EAEK,KAAKgF,IAAL,CAAUpF,IAAV,CAAeI,MAAf,CAAsBK,UAF3B,EAxBkB;;EA+BlB,WAAK2E,IAAL,CAAUpE,OAAV,qBAAyBuJ,cAAcvJ,OAAvC,EAAmD,KAAKoE,IAAL,CAAUpE,OAA7D,EA/BkB;EAmClB;;EACAkB,aAAOC,OAAP,CAAe,KAAKiD,IAAL,CAAUxE,MAAzB,EAAiCwB,OAAjC,CAAyC,iBAAiB;EAAA;EAAA,YAAf4D,IAAe;EAAA,YAAT3D,GAAS;;EACxD,eAAK+C,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,sBAA8BuE,cAAc3J,MAA5C,EAAuD,OAAKwE,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,CAAvD;EACA,eAAKZ,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuBvF,UAAvB,GAAoC,OAAK2E,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuBvF,UAAvB,qBAC3B,OAAK2E,IAAL,CAAU3E,UAAV,CAAqBG,MADM,EACK,OAAKwE,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuBvF,UAD5B,IAEhC,OAAK2E,IAAL,CAAU3E,UAAV,CAAqBG,MAFzB;EAGA,eAAKwE,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAAvB,qBAAqC,OAAKgF,IAAL,CAAUpE,OAA/C,EAA2D,OAAKoE,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAAlF;EACA,eAAKgF,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAAvB,CAA8BK,UAA9B,qBACK,OAAK2E,IAAL,CAAU3E,UAAV,CAAqBO,OAD1B,EAEK,OAAKoE,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAAvB,CAA8BK,UAFnC;EAID,OAVD;EAYA,WAAK2E,IAAL,CAAUhE,MAAV,GAAmB,KAAKgE,IAAL,CAAUhE,MAAV,qBACVmJ,cAAcnJ,MADJ,EACe,KAAKgE,IAAL,CAAUhE,MADzB,IAEfmJ,cAAcnJ,MAFlB;EAIA,WAAKG,SAAL,GAAiB,KAAK6D,IAAL,CAAU7D,SAAV,qBACRgJ,cAAchJ,SADN,EACoB,KAAK6D,IAAL,CAAU7D,SAD9B,IAEbgJ,cAAchJ,SAFlB;EAIA,aAAO,IAAP;EACD;;;iCAEU;EACT,UAAM2B,UAAU;EACdtC,gBAAQ,KAAKA,MADC;EAEdH,oBAAY,KAAK2E,IAAL,CAAU3E,UAAV,CAAqBT,IAFnB;EAGduC,cAAMyE,SAASwD,aAAT,CAAuB,KAAKpF,IAAL,CAAUpF,IAAV,CAAeC,KAAtC,CAHQ;EAIdC,gBAAQ8G,SAASwD,aAAT,CAAuB,KAAKpF,IAAL,CAAUpF,IAAV,CAAeE,MAAtC,CAJM;EAKdmF,kBAAU,KAAKoF,aALD;EAMdjF,kBAAU,KAAKjE,SAAL,CAAeE;EANX,OAAhB;EASA,WAAKzB,IAAL,GAAY,IAAImF,IAAJ,CAASjC,OAAT,CAAZ;EACA,WAAKoH,UAAL,CAAgBjG,IAAhB,EAAsB,KAAKe,IAAL,CAAUpF,IAAV,CAAeI,MAArC;EAEA,aAAO,IAAP;EACD;;;gCAES4F,MAAMC,OAAO;EACrB,UAAI1D,OAAO,KAAKvC,IAAL,CAAUuC,IAAV,CAAeiI,aAAf,iBAAsCxE,IAAtC,OAAX;EADqB,kBAEJzD,IAFI;EAAA,UAEblB,IAFa,SAEbA,IAFa;EAGrB,UAAM6B,UAAU;EACdX,kBADc;EAEdC,oBAAYyD,MAAMzD,UAFJ;EAGd3B,aAAKoF,MAAMpF,GAHG;EAIdC,aAAKmF,MAAMnF,GAJG;EAKdC,cAAMkF,MAAMlF,IALE;EAMdN,oBAAYwF,MAAMxF,UANJ;EAOd+E,kBAAU,KAAKjE,SAAL,CAAeC;EAPX,OAAhB;;EAUA,UAAIH,SAAS0D,KAAT,IAAkB1D,SAASyD,QAA/B,EAAyC;EACvCvC,eAAO,KAAKvC,IAAL,CAAUuC,IAAV,CAAemI,gBAAf,iBAAyC1E,IAAzC,OAAP;EACA9C,gBAAQX,IAAR,GAAeA,IAAf;EACA,aAAK3B,MAAL,CAAYoF,IAAZ,IAAoB,IAAIU,KAAJ,CAAUxD,OAAV,CAApB;EACD,OAJD,MAIO,IAAI7B,SAAS2D,MAAb,EAAqB;EAC1B,aAAKpE,MAAL,CAAYoF,IAAZ,IAAoB,IAAIW,MAAJ,CAAWzD,OAAX,CAApB;EACD,OAFM,MAEA,IAAI7B,SAAS6D,KAAb,EAAoB;EACzB,aAAKtE,MAAL,CAAYoF,IAAZ,IAAoB,IAAIY,KAAJ,CAAU1D,OAAV,CAApB;EACD,OAFM,MAEA;EACL,aAAKtC,MAAL,CAAYoF,IAAZ,IAAoB,IAAIS,KAAJ,CAAUvD,OAAV,CAApB;EACD;;EAED,WAAKtC,MAAL,CAAYoF,IAAZ,EAAkB2E,EAAlB,CAAqB5G,KAArB,EAA4B,KAAK6G,YAAjC;EACA,aAAO,IAAP;EACD;;;iCAEU5E,MAAM5F,QAAQ;EACvB,UAAME,UAAU,KAAKM,MAAL,CAAYoF,IAAZ,IACZjE,UAAU+G,QAAV,CAAmB,KAAKlI,MAAL,CAAYoF,IAAZ,EAAkB+C,gBAArC,EAAuDzI,OAD3C,GAEZ,KAFJ;EAGA,UAAMwG,SAAS1G,OAAOa,WAAP,GACX,KAAKL,MAAL,CAAYoF,IAAZ,EAAkBzD,IADP,GAEXyE,SAASwD,aAAT,CAAuBpK,OAAOC,QAA9B,CAFJ;EAGA,UAAM6C,UAAU;EACdlD,cAAM,KAAKA,IAAL,CAAUuC,IADF;EAEd9B,oBAAYL,OAAOK,UAFL;EAGdJ,kBAAUD,OAAOC,QAHH;EAIdC,iBAASF,OAAOE,OAAP,IAAkBA,OAJb;EAKdW,qBAAab,OAAOa,WALN;EAMd6F;EANc,OAAhB;EASA,WAAK9F,OAAL,CAAagF,IAAb,IAAqB,IAAIa,MAAJ,CAAW3D,OAAX,CAArB;EAEA,aAAO,IAAP;EACD;;;gDAiByBuF,UAAUoC,UAAU7E,MAAM1F,SAAS;EAAA;;EAC3D;EACA,UAAI,QAAOmI,SAASD,IAAhB,MAAyBvE,SAA7B,EAAwC;EACtCwE,iBACGD,IADH,CACQ;EAAA,iBAAQd,KAAKoD,IAAL,EAAR;EAAA,SADR,EAEGtC,IAFH,CAEQ,UAACsC,IAAD,EAAU;EACd,iBAAK9B,aAAL,CAAmBhD,IAAnB,EAAyB,CAAC,CAAC8E,KAAKD,QAAL,CAA3B,EAA2CvK,OAA3C;;EACA,iBAAKN,IAAL,CAAUiJ,QAAV;EACD,SALH;EAMD,OAPD,MAOO;EACLR,iBAAShD,gBAAT,CAA0BzB,IAA1B,EAAgC,UAACgE,EAAD,EAAQ;EACtC,iBAAKgB,aAAL,CAAmBhD,IAAnB,EAAyB,CAAC,CAAC+E,KAAKC,KAAL,CAAWhD,GAAGC,MAAH,CAAUQ,QAArB,EAA+BoC,QAA/B,CAA3B,EAAqEvK,OAArE;;EACA,iBAAKN,IAAL,CAAUiJ,QAAV;EACD,SAHD;EAID;EACF;;;oCAEajD,MAAMtD,OAA6C;EAAA,UAAtCpC,OAAsC,uEAA5B,KAAKU,OAAL,CAAagF,IAAb,EAAmB1F,OAAS;EAAA,UACvDgF,SADuD,GACzC,KAAK1E,MAAL,CAAYoF,IAAZ,CADyC,CACvDV,SADuD;;EAI/D,UAAI,QAAO5C,KAAP,MAAiB0B,MAArB,EAA6B;EAC3B,aAAK6G,yBAAL,CAA+BvI,MAAM+F,QAArC,EAA+C/F,MAAMmI,QAArD,EAA+D7E,IAA/D,EAAqE1F,OAArE;EACD,OAFD,MAEO;EACL,aAAKM,MAAL,CAAYoF,IAAZ,EAAkBiD,QAAlB,CAA2BvG,KAA3B;EACD;;EAED,WAAK1B,OAAL,CAAagF,IAAb,EAAmB1F,OAAnB,GAA6B,KAAK8E,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAAvB,CAA8BE,OAA9B,IAAyCA,OAAtE;;EACA,UAAI,CAACoC,KAAD,IAAU4C,SAAd,EAAyB;EACvB,aAAKtE,OAAL,CAAagF,IAAb,EAAmB6C,IAAnB;EACD,OAFD,MAEO;EACL,aAAK7H,OAAL,CAAagF,IAAb,EAAmBuD,IAAnB;EACD;;EAED,aAAO,IAAP;EACD;;;qCAmEctD,OAAO;EAAE;EACtB,UAAM5E,eAAc4E,KAAd,CAAN;;EADoB,UAEZD,IAFY,GAEHC,KAFG,CAEZD,IAFY;EAAA,UAGZzD,IAHY,GAGH,KAAKvC,IAHF,CAGZuC,IAHY;EAIpB,UAAI2I,SAAJ;;EAEA,UAAI7J,SAAS+C,MAAb,EAAqB;EACnB8G,oBAAYlF,IAAZ;EACD;;EACD,UAAI3E,SAASwD,MAAb,EAAqB;EACnB,YAAMsG,aAAa,KAAK1H,IAAL,CAAUwC,KAAV,CAAnB;;EAEA,YAAIkF,UAAJ,EAAgB;EACdD,sBAAY3I,KAAKiI,aAAL,CAAmBvE,KAAnB,EAA0BD,IAAtC;EACD,SAFD,MAEO;EACLkF,sBAAYjF,KAAZ;EACD;EACF;;EAED,aAAOiF,SAAP;EACD;;;mCAEYjF,OAAO;EAClB,aAAO,KAAKrF,MAAL,CAAY,KAAKwK,cAAL,CAAoBnF,KAApB,CAAZ,EAAwCvD,KAA/C;EACD;;;oCAEauD,OAAO;EACnB,aAAO,KAAKrF,MAAL,CAAY,KAAKwK,cAAL,CAAoBnF,KAApB,CAAZ,EAAwC1D,IAAxC,CAA6Ca,KAApD;EACD;;;oCAEa;EACZ,aAAO,KAAKpD,IAAL,CAAU0C,KAAjB;EACD;;;wCAEiB;EAChB,aAAO,KAAK1C,IAAL,CAAUsF,SAAjB;EACD;;;mCAEY;EACX,aAAO,KAAKtF,IAAL,CAAUuF,IAAjB;EACD;;;kCAEW;EACV,WAAKvF,IAAL,CAAUkG,KAAV;EACD;;;iCAEUD,OAAO;EAAE;EAClB,WAAKrF,MAAL,CAAY,KAAKwK,cAAL,CAAoBnF,KAApB,CAAZ,EAAwCC,KAAxC;EACA,WAAKlG,IAAL,CAAUiJ,QAAV;EACD;;;+BAEQhD,OAAO;EAAE;EAChB,aAAO,KAAKrF,MAAL,CAAY,KAAKwK,cAAL,CAAoBnF,KAApB,CAAZ,EAAwC1D,IAA/C;EACD;;;+BAEQ0D,eAAoB;EAAA,UAARb,IAAQ;;EAC3B,UAAMlC,UAAUkC,IAAhB;EACAlC,cAAQ9C,MAAR,GAAiB8C,QAAQ9C,MAAR,GAAiB8C,QAAQ9C,MAAzB,GAAkC,EAAnD;EACA,UAAM4F,OAAO,KAAKoF,cAAL,CAAoBnF,KAApB,CAAb;EAEA,UAAMoF,eAAe;EACnB7I,oBAAYU,QAAQV,UADD;EAEnB3B,aAAKqC,QAAQrC,GAAR,IAAe0J,cAAc3J,MAAd,CAAqBC,GAFtB;EAGnBC,aAAKoC,QAAQpC,GAAR,IAAeyJ,cAAc3J,MAAd,CAAqBE,GAHtB;EAInBC,cAAMmC,QAAQnC,IAAR,IAAgBwJ,cAAc3J,MAAd,CAAqBG,IAJxB;EAKnBN,sCAAiB,KAAK2E,IAAL,CAAU3E,UAAV,CAAqBG,MAAtC,EAAiDsC,QAAQzC,UAAzD;EALmB,OAArB;EAQA,UAAM6K,gBAAgB;EACpBjL,kBAAU6C,QAAQ9C,MAAR,CAAeC,QAAf,IAA2BkK,cAAcvJ,OAAd,CAAsBX,QADvC;EAEpBY,qBAAaiC,QAAQ9C,MAAR,CAAea,WAAf,IAA8BsJ,cAAcvJ,OAAd,CAAsBC,WAF7C;EAGpBX,iBAAS4C,QAAQ9C,MAAR,CAAeE,OAAf,IAA0BiK,cAAcvJ,OAAd,CAAsBV,OAHrC;EAIpBG,sCAAiB,KAAK2E,IAAL,CAAU3E,UAAV,CAAqBO,OAAtC,EAAkDkC,QAAQ9C,MAAR,CAAeK,UAAjE;EAJoB,OAAtB;EAOA,WAAK2E,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,sBACKqF,YADL;EAEEjL,gBAAQkL;EAFV;EAKA,WAAKjB,SAAL,CAAerE,IAAf,EAAqB,KAAKZ,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,CAArB;EACA,WAAKsE,UAAL,CAAgBtE,IAAhB,EAAsB,KAAKZ,IAAL,CAAUxE,MAAV,CAAiBoF,IAAjB,EAAuB5F,MAA7C;EAEA,aAAO,KAAKQ,MAAL,CAAYoF,IAAZ,EAAkBzD,IAAzB;EACD;;;kCAEW0D,OAAO;EACjB,UAAMD,OAAO,KAAKoF,cAAL,CAAoBnF,KAApB,CAAb;EAEA,WAAKrF,MAAL,CAAYoF,IAAZ,EAAkBF,MAAlB;EACA,WAAK9E,OAAL,CAAagF,IAAb,EAAmBF,MAAnB;EACD;;;oCAEaG,OAAO;EAAE;EACrB,UAAMD,OAAO,KAAKoF,cAAL,CAAoBnF,KAApB,CAAb;;EAEA,UAAI,KAAKrF,MAAL,CAAYoF,IAAZ,EAAkBxD,UAAtB,EAAkC;EAChC,YAAMA,aAAaT,UAAU+G,QAAV,CAAmB,KAAKlI,MAAL,CAAYoF,IAAZ,EAAkB+C,gBAArC,CAAnB;EACA,aAAKnI,MAAL,CAAYoF,IAAZ,EAAkBV,SAAlB,GAA8B,IAA9B;EACA,aAAK0D,aAAL,CAAmBhD,IAAnB,EAAyBxD,WAAWE,KAApC;EACD;;EACD,WAAK1C,IAAL,CAAUiJ,QAAV;EAEA,aAAO,KAAKrI,MAAL,CAAYoF,IAAZ,EAAkBzD,IAAzB;EACD;;;qCAEc;EAAA;;EAAE;EACfL,aAAOC,OAAP,CAAe,KAAKvB,MAApB,EAA4BwB,OAA5B,CAAoC,kBAAmB;EAAA;EAAA,YAAjB4D,IAAiB;EAAA,YAAXC,KAAW;;EACrD,YAAIA,MAAMzD,UAAV,EAAsB;EACpB,cAAMA,aAAaT,UAAU+G,QAAV,CAAmB7C,MAAM8C,gBAAzB,CAAnB;EACA9C,gBAAMmD,iBAAN,CAAwB,IAAxB;;EACA,iBAAKJ,aAAL,CAAmBhD,IAAnB,EAAyBxD,WAAWE,KAApC,EAA2CF,WAAWlC,OAAtD;EACD;EACF,OAND;EAQA,WAAKN,IAAL,CAAUsF,SAAV,GAAsB,IAAtB;EACA,WAAKtF,IAAL,CAAUiJ,QAAV;EAEA,aAAO,KAAKjJ,IAAL,CAAUuC,IAAjB;EACD;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/js/FormHandler.esm.bundle.js b/dist/js/FormHandler.esm.bundle.js index 6e31573..526e575 100644 --- a/dist/js/FormHandler.esm.bundle.js +++ b/dist/js/FormHandler.esm.bundle.js @@ -1159,7 +1159,7 @@ function () { sender.sendRequest(sender.makeData()); setTimeout(function () { _this.notices.form.hide(); - }, 2000); + }, delayForNotice); } } else { _this.notices.form.show(); diff --git a/dist/js/FormHandler.js b/dist/js/FormHandler.js index 84b19ef..ebb298e 100644 --- a/dist/js/FormHandler.js +++ b/dist/js/FormHandler.js @@ -1165,7 +1165,7 @@ sender.sendRequest(sender.makeData()); setTimeout(function () { _this.notices.form.hide(); - }, 2000); + }, delayForNotice); } } else { _this.notices.form.show(); diff --git a/dist/js/FormHandler.min.js b/dist/js/FormHandler.min.js index ca16d55..eba2403 100644 --- a/dist/js/FormHandler.min.js +++ b/dist/js/FormHandler.min.js @@ -1,5 +1,5 @@ /** - * FormHandler 1.1.0 + * FormHandler 1.1.1 * Powerful pure Javascript form validator with a feature of adding your own validations * https://github.com/IvanGrimes/formhandler.js * @@ -9,5 +9,5 @@ * * Released on: August 26, 2018 */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.FormHandler=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function l(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var s=0;s()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(t.value),message:"Must be a valid email address"}},isPhone:function(t,e,s){var i=t.value.trim().length,n=/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g.test(t.value),a="Must be a valid phone number";return e&&s&&(i()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i.test(t.value),message:"Must be a valid email address"}},isPhone:function(t,e,s){var i=t.value.trim().length,n=/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g.test(t.value),a="Must be a valid phone number";return e&&s&&(i max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = \"At least \".concat(min, \" \").concat(min === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && max) {\n if (!checked) {\n message = \"Minimum 1, maximum \".concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isRadioChecked: function isRadioChecked(node) {\n var valid = Array.from(node).some(function (el) {\n return el.checked === true;\n });\n var message = 'Please select one of the buttons';\n return {\n valid: valid,\n message: message\n };\n },\n isSelected: function isSelected(node) {\n var valid = Array.from(node.options).filter(function (el) {\n return el.value.length > 0;\n }).some(function (el) {\n return el.selected === true;\n });\n var message = 'Please select one of the options';\n return {\n valid: valid,\n message: message\n };\n },\n isName: function isName(node, min, max) {\n var pattern = /^[a-zA-Z]+$/;\n var valid = pattern.test(node.value);\n var message = 'Must contain only letters';\n\n var _node$value$trim = node.value.trim(),\n length = _node$value$trim.length;\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 letter but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isEmail: function isEmail(node) {\n var pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n var valid = pattern.test(node.value);\n var message = 'Must be a valid email address';\n return {\n valid: valid,\n message: message\n };\n },\n isPhone: function isPhone(node, min, max) {\n var pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n\n var _node$value$trim2 = node.value.trim(),\n length = _node$value$trim2.length;\n\n var valid = pattern.test(node.value);\n var message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 digit but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isNonEmpty: function isNonEmpty(node, min, max) {\n var _node$value$trim3 = node.value.trim(),\n length = _node$value$trim3.length;\n\n var valid = length > 0;\n var message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 character but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n }\n });\n\n var HTML_SELECT_ELEMENT = 'HTMLSelectElement';\n var INPUT = 'input';\n var LOAD = 'load';\n var UNDEFINED = 'undefined';\n var SUCCESS = 'success';\n var ERROR = 'error';\n var OBJECT = 'object';\n var FORM = 'form';\n var CLICK = 'click';\n var DIV = 'div';\n var READY_STATE_CHANGE = 'readystatechange';\n var XHR = 'xhr';\n var FETCH = 'fetch';\n var AFTER = 'after';\n var BEFORE = 'before';\n var STRING = 'string';\n var CHECKBOX = 'checkbox';\n var RADIO = 'radio';\n var SELECT = 'select-one';\n var NODE_LIST = 'NodeList';\n var COLOR = 'color';\n\n var Form =\n /*#__PURE__*/\n function () {\n function Form(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Form);\n\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n _createClass(Form, [{\n key: \"setState\",\n value: function setState() {\n var validity = this.fieldsValidity;\n this.callback(this.node, this.valid, validity);\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.clear();\n });\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }, {\n key: \"fieldsValidity\",\n get: function get() {\n var validness = new Set(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n return !validness.has(false);\n }\n }]);\n\n return Form;\n }();\n\n var Field =\n /*#__PURE__*/\n function () {\n function Field(_ref) {\n var node = _ref.node,\n validation = _ref.validation,\n min = _ref.min,\n max = _ref.max,\n send = _ref.send,\n classNames = _ref.classNames,\n callback = _ref.callback;\n\n _classCallCheck(this, Field);\n\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n _createClass(Field, [{\n key: \"setState\",\n value: function setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"setFieldSubmitted\",\n value: function setFieldSubmitted(value) {\n this.submitted = value;\n }\n }, {\n key: \"on\",\n value: function on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.addEventListener(type, listener);\n });\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n }, {\n key: \"off\",\n value: function off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.removeEventListener(type, listener);\n });\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }, {\n key: \"validatorOptions\",\n get: function get() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max\n };\n }\n }]);\n\n return Field;\n }();\n\n var Input =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Input, _Field);\n\n function Input(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Input);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Input).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Input, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Input;\n }(Field);\n\n var Radio =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Radio, _Field);\n\n function Radio(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Radio);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Radio).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Radio, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n var _this = this;\n\n if (this.valid) {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isValid);\n });\n } else {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isNotValid);\n });\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n var _this2 = this;\n\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n }]);\n\n return Radio;\n }(Field);\n\n var Select =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Select, _Field);\n\n function Select(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Select);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Select).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Select, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach(function (el) {\n el.selected = false;\n });\n }\n }]);\n\n return Select;\n }(Field);\n\n var Color =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Color, _Field);\n\n function Color(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Color);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Color).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Color, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Color;\n }(Field);\n\n var Notice =\n /*#__PURE__*/\n function () {\n function Notice(_ref) {\n var form = _ref.form,\n message = _ref.message,\n classNames = _ref.classNames,\n appendTo = _ref.appendTo,\n nextToField = _ref.nextToField,\n parent = _ref.parent;\n\n _classCallCheck(this, Notice);\n\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n _createClass(Notice, [{\n key: \"mount\",\n value: function mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n }, {\n key: \"show\",\n value: function show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n }, {\n key: \"hide\",\n value: function hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }]);\n\n return Notice;\n }();\n\n var Sender =\n /*#__PURE__*/\n function () {\n function Sender(_ref) {\n var type = _ref.type,\n url = _ref.url,\n method = _ref.method,\n data = _ref.data,\n fields = _ref.fields,\n form = _ref.form,\n callbacks = _ref.callbacks;\n\n _classCallCheck(this, Sender);\n\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n _createClass(Sender, [{\n key: \"makeData\",\n value: function makeData() {\n var _this = this;\n\n var data = new FormData(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.data).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n value = _ref3[1];\n\n // eslint-disable-next-line no-useless-return\n if (!_this.fields[name].send) return;\n data.append(name, value);\n });\n return data;\n }\n }, {\n key: \"sendRequest\",\n value: function sendRequest(data) {\n var _this2 = this;\n\n if (this.type === XHR) {\n var xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, function (ev) {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(ev.target.status, \", Text: \").concat(ev.target.statusText));\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data\n }).then(function (response) {\n if (response.status >= 200 && response.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(response.status, \", Text: \").concat(response.statusText));\n }\n });\n }\n }\n }]);\n\n return Sender;\n }();\n\n var FormHandler =\n /*#__PURE__*/\n function () {\n // TODO: Переименовать опцию appendTo => appendTo\n function FormHandler(_ref) {\n var _this = this;\n\n var args = _extends({}, _ref);\n\n _classCallCheck(this, FormHandler);\n\n _defineProperty(this, \"setFormStateFromResponse\", function (result) {\n if (result === SUCCESS) {\n _this.notices.form.message = _this.opts.form.notice.successMessage;\n _this.form.sent = true;\n\n if (_this.opts.sender.clearFormOnSuccess) {\n _this.form.clear();\n }\n }\n\n if (result === ERROR) {\n _this.notices.form.message = _this.opts.form.notice.errorMessage;\n _this.form.sent = false;\n }\n\n _this.notices.form.show();\n });\n\n _defineProperty(this, \"inputHandler\", function (ev) {\n var name = ev.target.name;\n var validation = Validator.validate(_this.fields[name].validatorOptions);\n\n if (_this.fields[name].validation) {\n _this.setFieldState(name, validation.valid, validation.message); // eslint-disable-next-line valid-typeof\n\n\n if (_typeof(validation.valid) !== OBJECT) {\n _this.form.setState();\n }\n }\n });\n\n _defineProperty(this, \"submitHandler\", function (ev) {\n ev.preventDefault();\n var fieldNodes = [];\n var delayForNotice = _this.opts.form.delayForNotice; // eslint-disable-next-line no-unused-vars\n\n Object.entries(_this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n _this.callbacks.onSubmit(_this.form.node, fieldNodes);\n\n _this.validateForm();\n\n _this.notices.form.message = _this.opts.form.notice.message;\n\n if (_this.form.valid) {\n _this.notices.form.hide();\n\n if (_this.opts.sender.send) {\n var options = {\n type: _this.opts.sender.type,\n url: _this.form.node.action,\n method: _this.form.node.method,\n data: _this.getFieldsAndValues,\n fields: _this.fields,\n form: _this.form.node,\n callbacks: {\n setFormState: _this.setFormStateFromResponse,\n onSend: _this.callbacks.onSend\n }\n };\n var sender = new Sender(options);\n sender.sendRequest(sender.makeData());\n setTimeout(function () {\n _this.notices.form.hide();\n }, 2000);\n }\n } else {\n _this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(function () {\n _this.notices.form.hide();\n }, delayForNotice);\n }\n }\n });\n\n _defineProperty(this, \"getFieldsAndValues\", function () {\n var data = {};\n Object.entries(_this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n var type = field.node.constructor.name;\n\n if (type === NODE_LIST) {\n // Radio/Checkbox\n var inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) {\n // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else {\n // Others\n data[name] = field.node.value;\n }\n });\n return data;\n });\n\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n this.init();\n }\n\n _createClass(FormHandler, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n this.complementOptions().makeForm();\n Object.entries(this.opts.fields).forEach(function (_ref6) {\n var _ref7 = _slicedToArray(_ref6, 2),\n name = _ref7[0],\n field = _ref7[1];\n\n _this2.makeField(name, field);\n\n if (field.validation) {\n var validation = Validator.validate(_this2.fields[name].validatorOptions);\n\n _this2.makeNotice(name, field.notice);\n\n _this2.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n return this;\n }\n }, {\n key: \"complementOptions\",\n value: function complementOptions() {\n var _this3 = this;\n\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames ? Object.assign({}, defaultConfig.classNames, this.opts.classNames) : defaultConfig.classNames;\n this.opts.classNames.form = Object.assign({}, defaultConfig.classNames.form, this.opts.classNames.form);\n this.opts.classNames.fields = Object.assign({}, defaultConfig.classNames.fields, this.opts.classNames.fields);\n this.opts.classNames.notices = Object.assign({}, defaultConfig.classNames.notices, this.opts.classNames.notices); // Add lacks form options and merge.\n\n this.opts.form = this.opts.form ? Object.assign({}, defaultConfig.form, this.opts.form) : defaultConfig.form;\n this.opts.form.notice = Object.assign({}, defaultConfig.form.notice, this.opts.form.notice);\n this.opts.form.notice.classNames = Object.assign({}, this.opts.classNames.notice, this.opts.form.notice.classNames); // Add lacks notices options and merge\n\n this.opts.notices = Object.assign({}, defaultConfig.notices, this.opts.notices); // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.opts.fields).forEach(function (_ref8) {\n var _ref9 = _slicedToArray(_ref8, 2),\n name = _ref9[0],\n obj = _ref9[1];\n\n _this3.opts.fields[name] = Object.assign({}, defaultConfig.fields, _this3.opts.fields[name]);\n _this3.opts.fields[name].classNames = _this3.opts.fields[name].classNames ? Object.assign({}, _this3.opts.classNames.fields, _this3.opts.fields[name].classNames) : _this3.opts.classNames.fields;\n _this3.opts.fields[name].notice = Object.assign({}, _this3.opts.notices, _this3.opts.fields[name].notice);\n _this3.opts.fields[name].notice.classNames = Object.assign({}, _this3.opts.classNames.notices, _this3.opts.fields[name].notice.classNames);\n });\n this.opts.sender = this.opts.sender ? Object.assign({}, defaultConfig.sender, this.opts.sender) : defaultConfig.sender;\n this.callbacks = this.opts.callbacks ? Object.assign({}, defaultConfig.callbacks, this.opts.callbacks) : defaultConfig.callbacks;\n return this;\n }\n }, {\n key: \"makeForm\",\n value: function makeForm() {\n var options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState\n };\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n return this;\n }\n }, {\n key: \"makeField\",\n value: function makeField(name, field) {\n var node = this.form.node.querySelector(\"[name=\".concat(name, \"]\"));\n var _node = node,\n type = _node.type;\n var options = {\n node: node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(\"[name=\".concat(name, \"]\"));\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n }, {\n key: \"makeNotice\",\n value: function makeNotice(name, notice) {\n var message = this.fields[name] ? Validator.validate(this.fields[name].validatorOptions).message : false;\n var parent = notice.nextToField ? this.fields[name].node : document.querySelector(notice.appendTo);\n var options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent: parent\n };\n this.notices[name] = new Notice(options);\n return this;\n }\n }, {\n key: \"setFieldStateFromResponse\",\n value: function setFieldStateFromResponse(response, property, name, message) {\n var _this4 = this;\n\n // eslint-disable-next-line valid-typeof\n if (_typeof(response.then) !== UNDEFINED) {\n response.then(function (data) {\n return data.json();\n }).then(function (json) {\n _this4.setFieldState(name, !!json[property], message);\n\n _this4.form.setState();\n });\n } else {\n response.addEventListener(LOAD, function (ev) {\n _this4.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n\n _this4.form.setState();\n });\n }\n }\n }, {\n key: \"setFieldState\",\n value: function setFieldState(name, valid) {\n var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.notices[name].message;\n var submitted = this.fields[name].submitted; // eslint-disable-next-line valid-typeof\n\n if (_typeof(valid) === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n }, {\n key: \"getFieldNameBy\",\n value: function getFieldNameBy(field) {\n // return field name get by NodeList/Selector(.className)\n var type = _typeof(field);\n\n var name = field.name;\n var node = this.form.node;\n var fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n\n if (type === STRING) {\n var isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n }, {\n key: \"isFieldValid\",\n value: function isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n }, {\n key: \"getFieldValue\",\n value: function getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n }, {\n key: \"isFormValid\",\n value: function isFormValid() {\n return this.form.valid;\n }\n }, {\n key: \"isFormSubmitted\",\n value: function isFormSubmitted() {\n return this.form.submitted;\n }\n }, {\n key: \"isFormSent\",\n value: function isFormSent() {\n return this.form.sent;\n }\n }, {\n key: \"clearForm\",\n value: function clearForm() {\n this.form.clear();\n }\n }, {\n key: \"clearField\",\n value: function clearField(field) {\n // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n }, {\n key: \"getField\",\n value: function getField(field) {\n // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n }, {\n key: \"addField\",\n value: function addField(field, _ref10) {\n var opts = _extends({}, _ref10);\n\n var options = opts;\n options.notice = options.notice ? options.notice : {};\n var name = this.getFieldNameBy(field);\n var fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: Object.assign({}, this.opts.classNames.fields, options.classNames)\n };\n var noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames)\n };\n this.opts.fields[name] = Object.assign({}, fieldOptions, {\n notice: noticeOptions\n });\n this.makeField(name, this.opts.fields[name]);\n this.makeNotice(name, this.opts.fields[name].notice);\n return this.fields[name].node;\n }\n }, {\n key: \"removeField\",\n value: function removeField(field) {\n var name = this.getFieldNameBy(field);\n this.fields[name].remove();\n this.notices[name].remove();\n }\n }, {\n key: \"validateField\",\n value: function validateField(field) {\n // also turns on toggleClassNames\n var name = this.getFieldNameBy(field);\n\n if (this.fields[name].validation) {\n var validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n\n this.form.setState();\n return this.fields[name].node;\n }\n }, {\n key: \"validateForm\",\n value: function validateForm() {\n var _this5 = this;\n\n // also turns on toggleClassNames\n Object.entries(this.fields).forEach(function (_ref11) {\n var _ref12 = _slicedToArray(_ref11, 2),\n name = _ref12[0],\n field = _ref12[1];\n\n if (field.validation) {\n var validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n\n _this5.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.submitted = true;\n this.form.setState();\n return this.form.node;\n }\n }]);\n\n return FormHandler;\n }();\n\n return FormHandler;\n\n})));\n"]} \ No newline at end of file +{"version":3,"sources":["formhandler.js"],"names":["global","factory","exports","module","define","amd","FormHandler","this","_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","_defineProperty","value","_extends","assign","arguments","source","hasOwnProperty","call","apply","_inherits","subClass","superClass","create","_setPrototypeOf","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","p","_construct","Parent","args","Class","Reflect","construct","sham","Proxy","Date","toString","e","isNativeReflectConstruct","a","push","Function","bind","_wrapNativeSuper","_cache","Map","undefined","has","get","set","Wrapper","_possibleConstructorReturn","self","ReferenceError","_assertThisInitialized","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","next","done","err","_iterableToArrayLimit","_nonIterableRest","defaultConfig","form","block","submit","delayForNotice","notice","appendTo","message","successMessage","errorMessage","classNames","hidden","visible","fields","min","max","send","notices","nextToField","isValid","isNotValid","sender","type","clearFormOnSuccess","callbacks","onFieldChangeState","onFormChangeState","onSubmit","onSend","FormHandlerError","_Error","Error","Validator","custom","addCustomValidations","entries","forEach","_ref","_ref2","validations","_ref3","node","validation","concat","isCheckboxChecked","valid","checked","el","isRadioChecked","from","some","isSelected","options","filter","selected","isName","test","trim","isEmail","isPhone","isNonEmpty","SUCCESS","ERROR","OBJECT","CHECKBOX","RADIO","NODE_LIST","Form","opts","listener","submitted","sent","callback","addEventListener","validity","fieldsValidity","toggleClassNames","classList","remove","add","clear","validness","Set","_ref4","_ref5","field","Field","name","removeEventListener","Input","_Field","Radio","_this","_this2","Select","Color","Notice","parent","mount","document","createElement","appendChild","parentElement","insertBefore","nextElementSibling","innerText","Sender","url","method","data","FormData","append","xhr","XMLHttpRequest","open","ev","readyState","status","setFormState","statusText","fetch","body","then","response","result","show","validate","validatorOptions","setFieldState","setState","preventDefault","fieldNodes","setFieldSubmitted","validateForm","hide","action","getFieldsAndValues","setFormStateFromResponse","sendRequest","makeData","setTimeout","inputType","selectedIndex","validator","customValidations","init","complementOptions","makeForm","_ref6","_ref7","makeField","makeNotice","_this3","_ref8","_ref9","querySelector","submitHandler","querySelectorAll","on","inputHandler","property","_this4","json","JSON","parse","setFieldStateFromResponse","fieldName","getFieldNameBy","_ref10","fieldOptions","noticeOptions","_this5","_ref11","_ref12"],"mappings":";;;;;;;;;;;CAAC,SAAUA,EAAQC,GACE,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,IAC9D,mBAAXG,QAAyBA,OAAOC,IAAMD,OAAOH,GACnDD,EAAOM,YAAcL,IAHxB,CAIEM,KAAM,WAAe,aAErB,SAASC,EAAQC,GAWf,OATED,EADoB,mBAAXE,QAAoD,iBAApBA,OAAOC,SACtC,SAAUF,GAClB,cAAcA,GAGN,SAAUA,GAClB,OAAOA,GAAyB,mBAAXC,QAAyBD,EAAIG,cAAgBF,QAAUD,IAAQC,OAAOG,UAAY,gBAAkBJ,IAI9GA,GAGjB,SAASK,EAAgBC,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,qCAIxB,SAASC,EAAkBC,EAAQC,GACjC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAME,OAAQD,IAAK,CACrC,IAAIE,EAAaH,EAAMC,GACvBE,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWE,cAAe,EACtB,UAAWF,IAAYA,EAAWG,UAAW,GACjDC,OAAOC,eAAeT,EAAQI,EAAWM,IAAKN,IAIlD,SAASO,EAAad,EAAae,EAAYC,GAG7C,OAFID,GAAYb,EAAkBF,EAAYH,UAAWkB,GACrDC,GAAad,EAAkBF,EAAagB,GACzChB,EAGT,SAASiB,EAAgBxB,EAAKoB,EAAKK,GAYjC,OAXIL,KAAOpB,EACTkB,OAAOC,eAAenB,EAAKoB,EAAK,CAC9BK,MAAOA,EACPV,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZjB,EAAIoB,GAAOK,EAGNzB,EAGT,SAAS0B,IAeP,OAdAA,EAAWR,OAAOS,QAAU,SAAUjB,GACpC,IAAK,IAAIE,EAAI,EAAGA,EAAIgB,UAAUf,OAAQD,IAAK,CACzC,IAAIiB,EAASD,UAAUhB,GAEvB,IAAK,IAAIQ,KAAOS,EACVX,OAAOd,UAAU0B,eAAeC,KAAKF,EAAQT,KAC/CV,EAAOU,GAAOS,EAAOT,IAK3B,OAAOV,IAGOsB,MAAMlC,KAAM8B,WAG9B,SAASK,EAAUC,EAAUC,GAC3B,GAA0B,mBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAI3B,UAAU,sDAGtB0B,EAAS9B,UAAYc,OAAOkB,OAAOD,GAAcA,EAAW/B,UAAW,CACrED,YAAa,CACXsB,MAAOS,EACPjB,UAAU,EACVD,cAAc,KAGdmB,GAAYE,EAAgBH,EAAUC,GAG5C,SAASG,EAAgBC,GAIvB,OAHAD,EAAkBpB,OAAOsB,eAAiBtB,OAAOuB,eAAiB,SAAyBF,GACzF,OAAOA,EAAEG,WAAaxB,OAAOuB,eAAeF,KAEvBA,GAGzB,SAASF,EAAgBE,EAAGI,GAM1B,OALAN,EAAkBnB,OAAOsB,gBAAkB,SAAyBD,EAAGI,GAErE,OADAJ,EAAEG,UAAYC,EACPJ,IAGcA,EAAGI,GAgB5B,SAASC,EAAWC,EAAQC,EAAMC,GAchC,OAVEH,EAjBJ,WACE,GAAuB,oBAAZI,UAA4BA,QAAQC,UAAW,OAAO,EACjE,GAAID,QAAQC,UAAUC,KAAM,OAAO,EACnC,GAAqB,mBAAVC,MAAsB,OAAO,EAExC,IAEE,OADAC,KAAKhD,UAAUiD,SAAStB,KAAKiB,QAAQC,UAAUG,KAAM,GAAI,gBAClD,EACP,MAAOE,GACP,OAAO,GAKLC,GACWP,QAAQC,UAER,SAAoBJ,EAAQC,EAAMC,GAC7C,IAAIS,EAAI,CAAC,MACTA,EAAEC,KAAKzB,MAAMwB,EAAGV,GAChB,IACIxC,EAAW,IADGoD,SAASC,KAAK3B,MAAMa,EAAQW,IAG9C,OADIT,GAAOV,EAAgB/B,EAAUyC,EAAM3C,WACpCE,IAIO0B,MAAM,KAAMJ,WAGhC,SAASgC,EAAiBb,GACxB,IAAIc,EAAwB,mBAARC,IAAqB,IAAIA,SAAQC,EA8BrD,OA5BAH,EAAmB,SAA0Bb,GAC3C,GAAc,OAAVA,EAAgB,OAAO,KAE3B,GAAqB,mBAAVA,EACT,MAAM,IAAIvC,UAAU,sDAGtB,QAAsB,IAAXqD,EAAwB,CACjC,GAAIA,EAAOG,IAAIjB,GAAQ,OAAOc,EAAOI,IAAIlB,GAEzCc,EAAOK,IAAInB,EAAOoB,GAGpB,SAASA,IACP,OAAOvB,EAAWG,EAAOnB,UAAWU,EAAgBxC,MAAMK,aAW5D,OARAgE,EAAQ/D,UAAYc,OAAOkB,OAAOW,EAAM3C,UAAW,CACjDD,YAAa,CACXsB,MAAO0C,EACPpD,YAAY,EACZE,UAAU,EACVD,cAAc,KAGXqB,EAAgB8B,EAASpB,KAGVA,GAW1B,SAASqB,EAA2BC,EAAMtC,GACxC,OAAIA,GAAyB,iBAATA,GAAqC,mBAATA,EATlD,SAAgCsC,GAC9B,QAAa,IAATA,EACF,MAAM,IAAIC,eAAe,6DAG3B,OAAOD,EAQAE,CAAuBF,GAHrBtC,EAMX,SAASyC,EAAeC,EAAK7D,GAC3B,OAGF,SAAyB6D,GACvB,GAAIC,MAAMC,QAAQF,GAAM,OAAOA,EAJxBG,CAAgBH,IAOzB,SAA+BA,EAAK7D,GAClC,IAAIiE,EAAO,GACPC,GAAK,EACLC,GAAK,EACLC,OAAKjB,EAET,IACE,IAAK,IAAiCkB,EAA7BC,EAAKT,EAAIxE,OAAOC,cAAmB4E,GAAMG,EAAKC,EAAGC,QAAQC,QAChEP,EAAKpB,KAAKwB,EAAGxD,QAETb,GAAKiE,EAAKhE,SAAWD,GAH8CkE,GAAK,IAK9E,MAAOO,GACPN,GAAK,EACLC,EAAKK,EACL,QACA,IACOP,GAAsB,MAAhBI,EAAW,QAAWA,EAAW,SAC5C,QACA,GAAIH,EAAI,MAAMC,GAIlB,OAAOH,EA9BwBS,CAAsBb,EAAK7D,IAiC5D,WACE,MAAM,IAAIJ,UAAU,wDAlC4C+E,GAqClE,IAAIC,EAAgB,CAClBC,KAAM,CACJC,MAAO,eACPC,OAAQ,uBACRC,eAAgB,IAChBC,OAAQ,CACNC,SAAU,wBACVC,QAAS,gCACTC,eAAgB,6BAChBC,aAAc,6BACdC,WAAY,CACVR,MAAO,2BACPS,OAAQ,mCACRC,QAAS,uCAIfC,OAAQ,CACNC,KAAK,EACLC,KAAK,EACLC,MAAM,GAERC,QAAS,CACPX,UAAU,EACVY,YAAa,SACbX,SAAS,GAEXG,WAAY,CACVO,QAAS,CACPf,MAAO,sBACPS,OAAQ,8BACRC,QAAS,gCAEXX,KAAM,CACJkB,QAAS,wBACTC,WAAY,6BAEdP,OAAQ,CACNM,QAAS,+BACTC,WAAY,qCAGhBC,OAAQ,CACNL,MAAM,EACNM,KAAM,MACNC,oBAAoB,GAEtBC,UAAW,CACTC,mBAAoB,aACpBC,kBAAmB,aACnBC,SAAU,aACVC,OAAQ,eAKRC,EAEJ,SAAUC,GAGR,SAASD,EAAiB1G,GAGxB,OAFAN,EAAgBP,KAAMuH,GAEfjD,EAA2BtE,KAAMwC,EAAgB+E,GAAkBtF,KAAKjC,KAAMa,IAGvF,OARAsB,EAAUoF,EASVzD,EAAiB2D,QADVF,EATT,GAYIG,EAEJ,WACE,SAASA,EAAUC,GACjBpH,EAAgBP,KAAM0H,GAEtB1H,KAAK2H,OAASA,EAEV3H,KAAK2H,QACP3H,KAAK4H,uBAmCT,OA/BArG,EAAamG,EAAW,CAAC,CACvBpG,IAAK,uBACLK,MAAO,WAQL,OAPAP,OAAOyG,QAAQ7H,KAAK2H,QAAQG,QAAQ,SAAUC,GAC5C,IAAIC,EAAQtD,EAAeqD,EAAM,GAC7Bf,EAAOgB,EAAM,GACb9H,EAAM8H,EAAM,GAEhBN,EAAUO,YAAYjB,GAAQ9G,IAEzBF,QAEP,CAAC,CACHsB,IAAK,WACLK,MAAO,SAAkBuG,GACvB,IAAIlB,EAAOkB,EAAMlB,KACbmB,EAAOD,EAAMC,KACb3B,EAAM0B,EAAM1B,IACZC,EAAMyB,EAAMzB,IAChB,GAAKO,EAAL,CACA,IAAIoB,EAAaV,EAAUO,YAAYjB,GAEvC,IAAKoB,EACH,MAAM,IAAIb,EAAiB,+BAA+Bc,OAAOrB,IAInE,OAAOoB,EAAWD,EAAM3B,EAAKC,QAI1BiB,EA1CT,GA6CAhG,EAAgBgG,EAAW,cAAe,CACxCY,kBAAmB,SAA2BH,EAAM3B,EAAKC,GACvD,IAAIR,EAAU,yCACVsC,GAAQ,EACRC,EAAU,EAwCd,OAvCAL,EAAKL,QAAQ,SAAUW,GACjBA,EAAGD,UAASA,GAAW,KAGzBhC,GAAOC,IACL+B,EAAUhC,IACZ+B,GAAQ,EACRtC,EAAU,WAAWoC,OAAO7B,EAAK,cAAc6B,OAAO5B,EAAK,iCAG/CA,EAAV+B,IACFD,GAAQ,EACRtC,EAAU,iBAAiBoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,WAAa,aAAc,uBAI1FD,IAAQC,GACN+B,EAAUhC,IACZ+B,GAAQ,EACRtC,EAAU,YAAYoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,WAAa,aAAc,uBAIpFA,GAAOC,IACL+B,IACHvC,EAAU,sBAAsBoC,OAAO5B,EAAK,iCAGhCA,EAAV+B,IACFD,GAAQ,EACRtC,EAAU,iBAAiBoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,WAAa,aAAc,uBAIzFD,GAAQC,GAAQ+B,IACnBD,GAAQ,EACRtC,EAAU,0CAGL,CACLsC,MAAOA,EACPtC,QAASA,IAGbyC,eAAgB,SAAwBP,GAKtC,MAAO,CACLI,MALU3D,MAAM+D,KAAKR,GAAMS,KAAK,SAAUH,GAC1C,OAAsB,IAAfA,EAAGD,UAKVvC,QAHY,qCAMhB4C,WAAY,SAAoBV,GAO9B,MAAO,CACLI,MAPU3D,MAAM+D,KAAKR,EAAKW,SAASC,OAAO,SAAUN,GACpD,OAAyB,EAAlBA,EAAG9G,MAAMZ,SACf6H,KAAK,SAAUH,GAChB,OAAuB,IAAhBA,EAAGO,WAKV/C,QAHY,qCAMhBgD,OAAQ,SAAgBd,EAAM3B,EAAKC,GACjC,IACI8B,EADU,cACMW,KAAKf,EAAKxG,OAC1BsE,EAAU,4BAGVlF,EADmBoH,EAAKxG,MAAMwH,OACJpI,OAqC9B,OAnCIyF,GAAOC,IACL1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,SAAW,UAAW,uBAAuB6B,OAAO5B,IAGhHA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,SAAW,aAIvFD,IAAQC,GACN1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,SAAW,aAIjFA,GAAOC,IACL1F,IACHkF,EAAU,oDAAoDoC,OAAO5B,IAG1DA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,SAAW,aAItFD,GAAQC,GAAQ1F,IACnBwH,GAAQ,EACRtC,EAAU,oCAGL,CACLsC,MAAOA,EACPtC,QAASA,IAGbmD,QAAS,SAAiBjB,GAIxB,MAAO,CACLI,MAJY,yHACMW,KAAKf,EAAKxG,OAI5BsE,QAHY,kCAMhBoD,QAAS,SAAiBlB,EAAM3B,EAAKC,GACnC,IAGI1F,EADoBoH,EAAKxG,MAAMwH,OACJpI,OAE3BwH,EALU,iDAKMW,KAAKf,EAAKxG,OAC1BsE,EAAU,+BAgCd,OA9BIO,GAAOC,IACL1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,QAAU,SAAU,uBAAuB6B,OAAO5B,IAG9GA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,QAAU,YAItFD,IAAQC,GACN1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,QAAU,YAIhFA,GAAOC,IACL1F,IACHkF,EAAU,mDAAmDoC,OAAO5B,IAGzDA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,QAAU,YAInF,CACL8B,MAAOA,EACPtC,QAASA,IAGbqD,WAAY,SAAoBnB,EAAM3B,EAAKC,GACzC,IACI1F,EADoBoH,EAAKxG,MAAMwH,OACJpI,OAE3BwH,EAAiB,EAATxH,EACRkF,EAAU,sCAgCd,OA9BIO,GAAOC,IACL1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,YAAc,aAAc,uBAAuB6B,OAAO5B,IAGtHA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,YAAc,gBAI1FD,IAAQC,GACN1F,EAASyF,IACX+B,GAAQ,EACRtC,EAAU,yBAAyBoC,OAAO7B,EAAK,KAAK6B,OAAe,IAAR7B,EAAY,YAAc,gBAIpFA,GAAOC,IACL1F,IACHkF,EAAU,uDAAuDoC,OAAO5B,IAG7DA,EAAT1F,IACFwH,GAAQ,EACRtC,EAAU,8BAA8BoC,OAAO5B,EAAK,KAAK4B,OAAe,IAAR5B,EAAY,YAAc,gBAIvF,CACL8B,MAAOA,EACPtC,QAASA,MAKf,IAIIsD,EAAU,UACVC,EAAQ,QACRC,EAAS,SAUTC,EAAW,WACXC,EAAQ,QAERC,EAAY,WAGZC,EAEJ,WACE,SAASA,EAAK9B,GACZ,IAAI+B,EAAOlI,EAAS,GAAImG,GAExBxH,EAAgBP,KAAM6J,GAEtB7J,KAAKmI,KAAO2B,EAAK3B,KACjBnI,KAAK6F,OAASiE,EAAKjE,OACnB7F,KAAKoG,WAAa0D,EAAK1D,WACvBpG,KAAKuG,OAASuD,EAAKvD,OACnBvG,KAAK+J,SAAWD,EAAKC,SACrB/J,KAAKuI,MAAQ,KACbvI,KAAKgK,WAAY,EACjBhK,KAAKiK,KAAO,KACZjK,KAAKkK,SAAWJ,EAAKI,SACrBlK,KAAK6F,OAAOsE,iBA/BJ,QA+B4BnK,KAAK+J,UA4D3C,OAzDAxI,EAAasI,EAAM,CAAC,CAClBvI,IAAK,WACLK,MAAO,WACL,IAAIyI,EAAWpK,KAAKqK,eACpBrK,KAAKkK,SAASlK,KAAKmI,KAAMnI,KAAKuI,MAAO6B,GACrCpK,KAAKuI,MAAQ6B,EAETpK,KAAKgK,WACPhK,KAAKsK,qBAGR,CACDhJ,IAAK,mBACLK,MAAO,WACD3B,KAAKuI,OACPvI,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWS,WAExC7G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,SAC3C7G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWU,eAG3C,CACDxF,IAAK,QACLK,MAAO,WAELP,OAAOyG,QAAQ7H,KAAKuG,QAAQuB,QAAQ,SAAUE,GAC5C,IAAIE,EAAQxD,EAAesD,EAAO,GACvBE,EAAM,GACLA,EAAM,GAEZwC,UAER1K,KAAKkK,SAASlK,KAAKmI,KAAMnI,KAAKuI,OAAO,GACrCvI,KAAKuI,OAAQ,EACbvI,KAAKgK,WAAY,EACjBhK,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,WAE5C,CACDvF,IAAK,iBACL6C,IAAK,WACH,IAAIwG,EAAY,IAAIC,IAWpB,OATAxJ,OAAOyG,QAAQ7H,KAAKuG,QAAQuB,QAAQ,SAAU+C,GAC5C,IAAIC,EAAQpG,EAAemG,EAAO,GAE9BE,GADOD,EAAM,GACLA,EAAM,IAEdC,EAAM3C,YACRuC,EAAUF,IAAIM,EAAMxC,UAGhBoC,EAAUzG,KAAI,OAInB2F,EA3ET,GA8EImB,EAEJ,WACE,SAASA,EAAMjD,GACb,IAAII,EAAOJ,EAAKI,KACZC,EAAaL,EAAKK,WAClB5B,EAAMuB,EAAKvB,IACXC,EAAMsB,EAAKtB,IACXC,EAAOqB,EAAKrB,KACZN,EAAa2B,EAAK3B,WAClB8D,EAAWnC,EAAKmC,SAEpB3J,EAAgBP,KAAMgL,GAEtBhL,KAAKmI,KAAOA,EACZnI,KAAKgH,KAAOhH,KAAKmI,KAAK9H,YAAY4K,KAClCjL,KAAKiL,KAAOjL,KAAKgH,OAAS4C,EAAY5J,KAAKmI,KAAK,GAAG8C,KAAOjL,KAAKmI,KAAK8C,KACpEjL,KAAKoI,WAAaA,EAClBpI,KAAK0G,KAAOA,EACZ1G,KAAKwG,IAAMA,EACXxG,KAAKyG,IAAMA,EACXzG,KAAKoG,WAAaA,EAClBpG,KAAKuI,MAAQ,KACbvI,KAAKgK,WAAY,EACjBhK,KAAKkK,SAAWA,EAyDlB,OAtDA3I,EAAayJ,EAAO,CAAC,CACnB1J,IAAK,WACLK,MAAO,SAAkB4G,GACvBvI,KAAKkK,SAASlK,KAAKoI,WAAYpI,KAAKiL,KAAMjL,KAAKmI,KAAMnI,KAAKuI,MAAOA,GACjEvI,KAAKuI,MAAQA,EAETvI,KAAKgK,WACPhK,KAAKsK,qBAGR,CACDhJ,IAAK,oBACLK,MAAO,SAA2BA,GAChC3B,KAAKgK,UAAYrI,IAElB,CACDL,IAAK,KACLK,MAAO,SAAYqF,EAAM+C,GACnB/J,KAAKgH,OAAS4C,EAChB5J,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG0B,iBAAiBnD,EAAM+C,KAGnC/J,KAAKmI,KAAKgC,iBAAiBnD,EAAM+C,KAGpC,CACDzI,IAAK,MACLK,MAAO,SAAaqF,EAAM+C,GACpB/J,KAAKgH,OAAS4C,EAChB5J,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAGyC,oBAAoBlE,EAAM+C,KAGtC/J,KAAKmI,KAAK+C,oBAAoBlE,EAAM+C,KAGvC,CACDzI,IAAK,SACLK,MAAO,WACL3B,KAAKmI,KAAKqC,WAEX,CACDlJ,IAAK,mBACL6C,IAAK,WACH,MAAO,CACL6C,KAAMhH,KAAKoI,WACXD,KAAMnI,KAAKmI,KACX3B,IAAKxG,KAAKwG,IACVC,IAAKzG,KAAKyG,SAKTuE,EA/ET,GAkFIG,EAEJ,SAAUC,GAGR,SAASD,EAAMpD,GACb,IAAI+B,EAAOlI,EAAS,GAAImG,GAIxB,OAFAxH,EAAgBP,KAAMmL,GAEf7G,EAA2BtE,KAAMwC,EAAgB2I,GAAOlJ,KAAKjC,KAAMoB,OAAOS,OAAO,GAAIiI,KA0B9F,OAjCA3H,EAAUgJ,EAkCVH,GAxBAzJ,EAAa4J,EAAO,CAAC,CACnB7J,IAAK,mBACLK,MAAO,WACD3B,KAAKuI,OACPvI,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWS,WAExC7G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,SAC3C7G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWU,eAG3C,CACDxF,IAAK,QACLK,MAAO,WACL3B,KAAKkK,SAASlK,KAAKoI,WAAYpI,KAAKiL,KAAMjL,KAAKmI,KAAMnI,KAAKuI,OAAO,GACjEvI,KAAKmI,KAAKxG,MAAQ,GAClB3B,KAAKuI,OAAQ,EACbvI,KAAKgK,WAAY,EACjBhK,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,aAIxCsE,EAlCT,GAqCIE,EAEJ,SAAUD,GAGR,SAASC,EAAMtD,GACb,IAAI+B,EAAOlI,EAAS,GAAImG,GAIxB,OAFAxH,EAAgBP,KAAMqL,GAEf/G,EAA2BtE,KAAMwC,EAAgB6I,GAAOpJ,KAAKjC,KAAMoB,OAAOS,OAAO,GAAIiI,KA6C9F,OApDA3H,EAAUkJ,EAqDVL,GA3CAzJ,EAAa8J,EAAO,CAAC,CACnB/J,IAAK,mBACLK,MAAO,WACL,IAAI2J,EAAQtL,KAERA,KAAKuI,OACPvI,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUC,OAAOc,EAAMlF,WAAWU,cAE9C9G,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUE,IAAIa,EAAMlF,WAAWS,aAG3C7G,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUC,OAAOc,EAAMlF,WAAWS,WAE9C7G,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUE,IAAIa,EAAMlF,WAAWU,iBAI9C,CACDxF,IAAK,QACLK,MAAO,WACL,IAAI4J,EAASvL,KAEbA,KAAKkK,SAASlK,KAAKoI,WAAYpI,KAAKiL,KAAMjL,KAAKmI,KAAMnI,KAAKuI,OAAO,GACjEvI,KAAKuI,OAAQ,EACbvI,KAAKgK,WAAY,EACjBhK,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUC,OAAOe,EAAOnF,WAAWS,WAE/C7G,KAAKmI,KAAKL,QAAQ,SAAUW,GAC1B,OAAOA,EAAG8B,UAAUC,OAAOe,EAAOnF,WAAWU,cAE/C9G,KAAKmI,KAAKL,QAAQ,SAAUW,GAE1BA,EAAGD,SAAU,QAKZ6C,EArDT,GAwDIG,EAEJ,SAAUJ,GAGR,SAASI,EAAOzD,GACd,IAAI+B,EAAOlI,EAAS,GAAImG,GAIxB,OAFAxH,EAAgBP,KAAMwL,GAEflH,EAA2BtE,KAAMwC,EAAgBgJ,GAAQvJ,KAAKjC,KAAMoB,OAAOS,OAAO,GAAIiI,KA4B/F,OAnCA3H,EAAUqJ,EAoCVR,GA1BAzJ,EAAaiK,EAAQ,CAAC,CACpBlK,IAAK,mBACLK,MAAO,WACD3B,KAAKuI,OACPvI,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWS,WAExC7G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,SAC3C7G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWU,eAG3C,CACDxF,IAAK,QACLK,MAAO,WACL3B,KAAKkK,SAASlK,KAAKoI,WAAYpI,KAAKiL,KAAMjL,KAAKmI,KAAMnI,KAAKuI,OAAO,GACjEvI,KAAKuI,OAAQ,EACbvI,KAAKgK,WAAY,EACjBhK,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,SAC3C7G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3ClC,MAAM+D,KAAK3I,KAAKmI,KAAKW,SAAShB,QAAQ,SAAUW,GAC9CA,EAAGO,UAAW,QAKbwC,EApCT,GAuCIC,EAEJ,SAAUL,GAGR,SAASK,EAAM1D,GACb,IAAI+B,EAAOlI,EAAS,GAAImG,GAIxB,OAFAxH,EAAgBP,KAAMyL,GAEfnH,EAA2BtE,KAAMwC,EAAgBiJ,GAAOxJ,KAAKjC,KAAMoB,OAAOS,OAAO,GAAIiI,KA0B9F,OAjCA3H,EAAUsJ,EAkCVT,GAxBAzJ,EAAakK,EAAO,CAAC,CACnBnK,IAAK,mBACLK,MAAO,WACD3B,KAAKuI,OACPvI,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWS,WAExC7G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,SAC3C7G,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWU,eAG3C,CACDxF,IAAK,QACLK,MAAO,WACL3B,KAAKkK,SAASlK,KAAKoI,WAAYpI,KAAKiL,KAAMjL,KAAKmI,KAAMnI,KAAKuI,OAAO,GACjEvI,KAAKmI,KAAKxG,MAAQ,UAClB3B,KAAKuI,OAAQ,EACbvI,KAAKgK,WAAY,EACjBhK,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWU,YAC3C9G,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWS,aAIxC4E,EAlCT,GAqCIC,EAEJ,WACE,SAASA,EAAO3D,GACd,IAAIpC,EAAOoC,EAAKpC,KACZM,EAAU8B,EAAK9B,QACfG,EAAa2B,EAAK3B,WAClBJ,EAAW+B,EAAK/B,SAChBY,EAAcmB,EAAKnB,YACnB+E,EAAS5D,EAAK4D,OAElBpL,EAAgBP,KAAM0L,GAEtB1L,KAAK2F,KAAOA,EACZ3F,KAAKiG,QAAUA,EACfjG,KAAKoG,WAAaA,EAClBpG,KAAKgG,SAAWA,EAChBhG,KAAK4G,YAAcA,EACnB5G,KAAK2L,OAASA,EACd3L,KAAKmI,KAAO,KACZnI,KAAK4L,QAkDP,OA/CArK,EAAamK,EAAQ,CAAC,CACpBpK,IAAK,QACLK,MAAO,WACL3B,KAAKmI,KAAO0D,SAASC,cA5XjB,OA6XJ9L,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWR,OACxC5F,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWC,QAEpCrG,KAAKgG,SACPhG,KAAK2L,OAAOI,YAAY/L,KAAKmI,OA5XxB,WA8XDnI,KAAK4G,cACH5G,KAAK2L,OAAOtL,YAAY4K,OAASrB,IACnC5J,KAAK2L,OAAS3L,KAAK2L,OAAO,IAG5B3L,KAAK2L,OAAOK,cAAcC,aAAajM,KAAKmI,KAAMnI,KAAK2L,SApYrD,UAuYA3L,KAAK4G,cACH5G,KAAK2L,OAAOtL,YAAY4K,OAASrB,IACnC5J,KAAK2L,OAAS3L,KAAK2L,OAAO3L,KAAK2L,OAAO5K,OAAS,IAGjDf,KAAK2L,OAAOK,cAAcC,aAAajM,KAAKmI,KAAMnI,KAAK2L,OAAOO,wBAInE,CACD5K,IAAK,OACLK,MAAO,WACL3B,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWC,QAC3CrG,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWE,SACxCtG,KAAKmI,KAAKgE,UAAYnM,KAAKiG,UAE5B,CACD3E,IAAK,OACLK,MAAO,WACL3B,KAAKmI,KAAKoC,UAAUC,OAAOxK,KAAKoG,WAAWE,SAC3CtG,KAAKmI,KAAKoC,UAAUE,IAAIzK,KAAKoG,WAAWC,UAEzC,CACD/E,IAAK,SACLK,MAAO,WACL3B,KAAKmI,KAAKqC,aAIPkB,EApET,GAuEIU,EAEJ,WACE,SAASA,EAAOrE,GACd,IAAIf,EAAOe,EAAKf,KACZqF,EAAMtE,EAAKsE,IACXC,EAASvE,EAAKuE,OACdC,EAAOxE,EAAKwE,KACZhG,EAASwB,EAAKxB,OACdZ,EAAOoC,EAAKpC,KACZuB,EAAYa,EAAKb,UAErB3G,EAAgBP,KAAMoM,GAEtBpM,KAAKgH,KAAOA,EACZhH,KAAKqM,IAAMA,EACXrM,KAAKsM,OAASA,EACdtM,KAAKuM,KAAOA,IACZvM,KAAKuG,OAASA,EACdvG,KAAK2F,KAAOA,EACZ3F,KAAKkH,UAAYA,EAoEnB,OAjEA3F,EAAa6K,EAAQ,CAAC,CACpB9K,IAAK,WACLK,MAAO,WACL,IAAI2J,EAAQtL,KAERuM,EAAO,IAAIC,SAWf,OATApL,OAAOyG,QAAQ7H,KAAKuM,MAAMzE,QAAQ,SAAUE,GAC1C,IAAIE,EAAQxD,EAAesD,EAAO,GAC9BiD,EAAO/C,EAAM,GACbvG,EAAQuG,EAAM,GAGboD,EAAM/E,OAAO0E,GAAMvE,MACxB6F,EAAKE,OAAOxB,EAAMtJ,KAEb4K,IAER,CACDjL,IAAK,cACLK,MAAO,SAAqB4K,GAC1B,IAAIhB,EAASvL,KAEb,GAvdI,QAudAA,KAAKgH,KAAc,CACrB,IAAI0F,EAAM,IAAIC,eACdD,EAAIE,KAAK5M,KAAKsM,OAAQtM,KAAKqM,KAAK,GAChCK,EAAIvC,iBA3da,mBA2dwB,SAAU0C,GACjD,GAA6B,IAAzBA,EAAGjM,OAAOkM,WAAkB,CAC9B,KAAwB,KAApBD,EAAGjM,OAAOmM,QAAiBF,EAAGjM,OAAOmM,OAAS,KAShD,MAJAxB,EAAOrE,UAAU8F,aAAaxD,GAE9B+B,EAAOrE,UAAUI,OAAOkC,GAElB,IAAIjC,EAAiB,WAAWc,OAAOwE,EAAGjM,OAAOmM,OAAQ,YAAY1E,OAAOwE,EAAGjM,OAAOqM,aAR5F1B,EAAOrE,UAAU8F,aAAazD,GAE9BgC,EAAOrE,UAAUI,OAAOiC,MAU9BmD,EAAIhG,KAAK6F,GAxeL,UA2eFvM,KAAKgH,MACPkG,MAAMlN,KAAKqM,IAAK,CACdC,OAAQtM,KAAKsM,OACba,KAAMZ,IACLa,KAAK,SAAUC,GAChB,KAAuB,KAAnBA,EAASN,QAAiBM,EAASN,OAAS,KAS9C,MAJAxB,EAAOrE,UAAU8F,aAAaxD,GAE9B+B,EAAOrE,UAAUI,OAAOkC,GAElB,IAAIjC,EAAiB,WAAWc,OAAOgF,EAASN,OAAQ,YAAY1E,OAAOgF,EAASJ,aAR1F1B,EAAOrE,UAAU8F,aAAazD,GAE9BgC,EAAOrE,UAAUI,OAAOiC,SAa3B6C,EAtFT,GA+hBA,OApcA,WAEE,SAASrM,EAAYgI,GACnB,IAAIuD,EAAQtL,KAERgD,EAAOpB,EAAS,GAAImG,GAExBxH,EAAgBP,KAAMD,GAEtB2B,EAAgB1B,KAAM,2BAA4B,SAAUsN,GACtDA,IAAW/D,IACb+B,EAAM3E,QAAQhB,KAAKM,QAAUqF,EAAMxB,KAAKnE,KAAKI,OAAOG,eACpDoF,EAAM3F,KAAKsE,MAAO,EAEdqB,EAAMxB,KAAK/C,OAAOE,oBACpBqE,EAAM3F,KAAK+E,SAIX4C,IAAW9D,IACb8B,EAAM3E,QAAQhB,KAAKM,QAAUqF,EAAMxB,KAAKnE,KAAKI,OAAOI,aACpDmF,EAAM3F,KAAKsE,MAAO,GAGpBqB,EAAM3E,QAAQhB,KAAK4H,SAGrB7L,EAAgB1B,KAAM,eAAgB,SAAU6M,GAC9C,IAAI5B,EAAO4B,EAAGjM,OAAOqK,KACjB7C,EAAaV,EAAU8F,SAASlC,EAAM/E,OAAO0E,GAAMwC,kBAEnDnC,EAAM/E,OAAO0E,GAAM7C,aACrBkD,EAAMoC,cAAczC,EAAM7C,EAAWG,MAAOH,EAAWnC,SAGnDhG,EAAQmI,EAAWG,SAAWkB,GAChC6B,EAAM3F,KAAKgI,cAKjBjM,EAAgB1B,KAAM,gBAAiB,SAAU6M,GAC/CA,EAAGe,iBACH,IAAIC,EAAa,GACb/H,EAAiBwF,EAAMxB,KAAKnE,KAAKG,eAiBrC,GAfA1E,OAAOyG,QAAQyD,EAAM/E,QAAQuB,QAAQ,SAAUE,GAC7C,IAAIE,EAAQxD,EAAesD,EAAO,GAE9B+C,GADO7C,EAAM,GACLA,EAAM,IAElB6C,EAAM+C,mBAAkB,GACxBD,EAAWlK,KAAKoH,EAAM5C,QAGxBmD,EAAMpE,UAAUG,SAASiE,EAAM3F,KAAKwC,KAAM0F,GAE1CvC,EAAMyC,eAENzC,EAAM3E,QAAQhB,KAAKM,QAAUqF,EAAMxB,KAAKnE,KAAKI,OAAOE,QAEhDqF,EAAM3F,KAAK4C,OAGb,GAFA+C,EAAM3E,QAAQhB,KAAKqI,OAEf1C,EAAMxB,KAAK/C,OAAOL,KAAM,CAC1B,IAAIoC,EAAU,CACZ9B,KAAMsE,EAAMxB,KAAK/C,OAAOC,KACxBqF,IAAKf,EAAM3F,KAAKwC,KAAK8F,OACrB3B,OAAQhB,EAAM3F,KAAKwC,KAAKmE,OACxBC,KAAMjB,EAAM4C,mBACZ3H,OAAQ+E,EAAM/E,OACdZ,KAAM2F,EAAM3F,KAAKwC,KACjBjB,UAAW,CACT8F,aAAc1B,EAAM6C,yBACpB7G,OAAQgE,EAAMpE,UAAUI,SAGxBP,EAAS,IAAIqF,EAAOtD,GACxB/B,EAAOqH,YAAYrH,EAAOsH,YAC1BC,WAAW,WACThD,EAAM3E,QAAQhB,KAAKqI,QAClBlI,SAGLwF,EAAM3E,QAAQhB,KAAK4H,OAEfzH,GACFwI,WAAW,WACThD,EAAM3E,QAAQhB,KAAKqI,QAClBlI,KAKTpE,EAAgB1B,KAAM,qBAAsB,WAC1C,IAAIuM,EAAO,GAqCX,OApCAnL,OAAOyG,QAAQyD,EAAM/E,QAAQuB,QAAQ,SAAU+C,GAC7C,IAAIC,EAAQpG,EAAemG,EAAO,GAC9BI,EAAOH,EAAM,GACbC,EAAQD,EAAM,GAEd9D,EAAO+D,EAAM5C,KAAK9H,YAAY4K,KAElC,GAAIjE,IAAS4C,EAAW,CAEtB,IAAI2E,EAAYxD,EAAM5C,KAAK,GAAGnB,KAE1BuH,IAAc7E,IAChB6C,EAAKtB,GAAQ,GACbrG,MAAM+D,KAAKoC,EAAM5C,MAAML,QAAQ,SAAUK,GACnCA,EAAKK,SACP+D,EAAKtB,GAAMtH,KAAKwE,EAAKxG,UAKvB4M,IAAc5E,IAChB4C,EAAKtB,GAAQ,GACbrG,MAAM+D,KAAKoC,EAAM5C,MAAML,QAAQ,SAAUK,GACnCA,EAAKK,UACP+D,EAAKtB,GAAQ9C,EAAKxG,eAMxB4K,EAAKtB,GA/oBW,sBA6oBPjE,EAEI+D,EAAM5C,KAAKW,QAAQiC,EAAM5C,KAAKW,QAAQ0F,eAAe7M,MAGrDoJ,EAAM5C,KAAKxG,QAGrB4K,IAGTvM,KAAK8J,KAAO9G,EACZhD,KAAKuG,OAAS,GACdvG,KAAK2G,QAAU,GACf3G,KAAK2F,KAAO,KACZ3F,KAAKyO,UAAY,IAAI/G,EAAU1H,KAAK8J,KAAK4E,mBACzC1O,KAAKkH,UAAY,GACjBlH,KAAK2O,OAoTP,OAjTApN,EAAaxB,EAAa,CAAC,CACzBuB,IAAK,OACLK,MAAO,WACL,IAAI4J,EAASvL,KAmBb,OAjBAA,KAAK4O,oBAAoBC,WACzBzN,OAAOyG,QAAQ7H,KAAK8J,KAAKvD,QAAQuB,QAAQ,SAAUgH,GACjD,IAAIC,EAAQrK,EAAeoK,EAAO,GAC9B7D,EAAO8D,EAAM,GACbhE,EAAQgE,EAAM,GAIlB,GAFAxD,EAAOyD,UAAU/D,EAAMF,GAEnBA,EAAM3C,WAAY,CACpB,IAAIA,EAAaV,EAAU8F,SAASjC,EAAOhF,OAAO0E,GAAMwC,kBAExDlC,EAAO0D,WAAWhE,EAAMF,EAAMhF,QAE9BwF,EAAOmC,cAAczC,EAAM7C,EAAWG,MAAOH,EAAWnC,YAG5DjG,KAAK2F,KAAKgI,WACH3N,OAER,CACDsB,IAAK,oBACLK,MAAO,WACL,IAAIuN,EAASlP,KA2Bb,OAxBAA,KAAK8J,KAAK1D,WAAapG,KAAK8J,KAAK1D,WAAahF,OAAOS,OAAO,GAAI6D,EAAcU,WAAYpG,KAAK8J,KAAK1D,YAAcV,EAAcU,WAChIpG,KAAK8J,KAAK1D,WAAWT,KAAOvE,OAAOS,OAAO,GAAI6D,EAAcU,WAAWT,KAAM3F,KAAK8J,KAAK1D,WAAWT,MAClG3F,KAAK8J,KAAK1D,WAAWG,OAASnF,OAAOS,OAAO,GAAI6D,EAAcU,WAAWG,OAAQvG,KAAK8J,KAAK1D,WAAWG,QACtGvG,KAAK8J,KAAK1D,WAAWO,QAAUvF,OAAOS,OAAO,GAAI6D,EAAcU,WAAWO,QAAS3G,KAAK8J,KAAK1D,WAAWO,SAExG3G,KAAK8J,KAAKnE,KAAO3F,KAAK8J,KAAKnE,KAAOvE,OAAOS,OAAO,GAAI6D,EAAcC,KAAM3F,KAAK8J,KAAKnE,MAAQD,EAAcC,KACxG3F,KAAK8J,KAAKnE,KAAKI,OAAS3E,OAAOS,OAAO,GAAI6D,EAAcC,KAAKI,OAAQ/F,KAAK8J,KAAKnE,KAAKI,QACpF/F,KAAK8J,KAAKnE,KAAKI,OAAOK,WAAahF,OAAOS,OAAO,GAAI7B,KAAK8J,KAAK1D,WAAWL,OAAQ/F,KAAK8J,KAAKnE,KAAKI,OAAOK,YAExGpG,KAAK8J,KAAKnD,QAAUvF,OAAOS,OAAO,GAAI6D,EAAciB,QAAS3G,KAAK8J,KAAKnD,SAGvEvF,OAAOyG,QAAQ7H,KAAK8J,KAAKvD,QAAQuB,QAAQ,SAAUqH,GACjD,IAAIC,EAAQ1K,EAAeyK,EAAO,GAC9BlE,EAAOmE,EAAM,GACPA,EAAM,GAEhBF,EAAOpF,KAAKvD,OAAO0E,GAAQ7J,OAAOS,OAAO,GAAI6D,EAAca,OAAQ2I,EAAOpF,KAAKvD,OAAO0E,IACtFiE,EAAOpF,KAAKvD,OAAO0E,GAAM7E,WAAa8I,EAAOpF,KAAKvD,OAAO0E,GAAM7E,WAAahF,OAAOS,OAAO,GAAIqN,EAAOpF,KAAK1D,WAAWG,OAAQ2I,EAAOpF,KAAKvD,OAAO0E,GAAM7E,YAAc8I,EAAOpF,KAAK1D,WAAWG,OAC3L2I,EAAOpF,KAAKvD,OAAO0E,GAAMlF,OAAS3E,OAAOS,OAAO,GAAIqN,EAAOpF,KAAKnD,QAASuI,EAAOpF,KAAKvD,OAAO0E,GAAMlF,QAClGmJ,EAAOpF,KAAKvD,OAAO0E,GAAMlF,OAAOK,WAAahF,OAAOS,OAAO,GAAIqN,EAAOpF,KAAK1D,WAAWO,QAASuI,EAAOpF,KAAKvD,OAAO0E,GAAMlF,OAAOK,cAEjIpG,KAAK8J,KAAK/C,OAAS/G,KAAK8J,KAAK/C,OAAS3F,OAAOS,OAAO,GAAI6D,EAAcqB,OAAQ/G,KAAK8J,KAAK/C,QAAUrB,EAAcqB,OAChH/G,KAAKkH,UAAYlH,KAAK8J,KAAK5C,UAAY9F,OAAOS,OAAO,GAAI6D,EAAcwB,UAAWlH,KAAK8J,KAAK5C,WAAaxB,EAAcwB,UAChHlH,OAER,CACDsB,IAAK,WACLK,MAAO,WACL,IAAImH,EAAU,CACZvC,OAAQvG,KAAKuG,OACbH,WAAYpG,KAAK8J,KAAK1D,WAAWT,KACjCwC,KAAM0D,SAASwD,cAAcrP,KAAK8J,KAAKnE,KAAKC,OAC5CC,OAAQgG,SAASwD,cAAcrP,KAAK8J,KAAKnE,KAAKE,QAC9CkE,SAAU/J,KAAKsP,cACfpF,SAAUlK,KAAKkH,UAAUE,mBAI3B,OAFApH,KAAK2F,KAAO,IAAIkE,EAAKf,GACrB9I,KAAKiP,WA9tBA,OA8tBiBjP,KAAK8J,KAAKnE,KAAKI,QAC9B/F,OAER,CACDsB,IAAK,YACLK,MAAO,SAAmBsJ,EAAMF,GAC9B,IAAI5C,EAAOnI,KAAK2F,KAAKwC,KAAKkH,cAAc,SAAShH,OAAO4C,EAAM,MAE1DjE,EADQmB,EACKnB,KACb8B,EAAU,CACZX,KAAMA,EACNC,WAAY2C,EAAM3C,WAClB5B,IAAKuE,EAAMvE,IACXC,IAAKsE,EAAMtE,IACXC,KAAMqE,EAAMrE,KACZN,WAAY2E,EAAM3E,WAClB8D,SAAUlK,KAAKkH,UAAUC,oBAgB3B,OAbIH,IAAS2C,GAAS3C,IAAS0C,GAC7BvB,EAAOnI,KAAK2F,KAAKwC,KAAKoH,iBAAiB,SAASlH,OAAO4C,EAAM,MAC7DnC,EAAQX,KAAOA,EACfnI,KAAKuG,OAAO0E,GAAQ,IAAII,EAAMvC,IAE9B9I,KAAKuG,OAAO0E,GA3uBP,eA0uBIjE,EACW,IAAIwE,EAAO1C,GAzuB3B,UA0uBK9B,EACW,IAAIyE,EAAM3C,GAEV,IAAIqC,EAAMrC,GAGhC9I,KAAKuG,OAAO0E,GAAMuE,GAnwBZ,QAmwBsBxP,KAAKyP,cAC1BzP,OAER,CACDsB,IAAK,aACLK,MAAO,SAAoBsJ,EAAMlF,GAC/B,IAAIE,IAAUjG,KAAKuG,OAAO0E,IAAQvD,EAAU8F,SAASxN,KAAKuG,OAAO0E,GAAMwC,kBAAkBxH,QACrF0F,EAAS5F,EAAOa,YAAc5G,KAAKuG,OAAO0E,GAAM9C,KAAO0D,SAASwD,cAActJ,EAAOC,UACrF8C,EAAU,CACZnD,KAAM3F,KAAK2F,KAAKwC,KAChB/B,WAAYL,EAAOK,WACnBJ,SAAUD,EAAOC,SACjBC,QAASF,EAAOE,SAAWA,EAC3BW,YAAab,EAAOa,YACpB+E,OAAQA,GAGV,OADA3L,KAAK2G,QAAQsE,GAAQ,IAAIS,EAAO5C,GACzB9I,OAER,CACDsB,IAAK,4BACLK,MAAO,SAAmC0L,EAAUqC,EAAUzE,EAAMhF,GAClE,IAAI0J,EAAS3P,KAvxBH,cA0xBNC,EAAQoN,EAASD,MACnBC,EAASD,KAAK,SAAUb,GACtB,OAAOA,EAAKqD,SACXxC,KAAK,SAAUwC,GAChBD,EAAOjC,cAAczC,IAAQ2E,EAAKF,GAAWzJ,GAE7C0J,EAAOhK,KAAKgI,aAGdN,EAASlD,iBApyBN,OAoyB6B,SAAU0C,GACxC8C,EAAOjC,cAAczC,IAAQ4E,KAAKC,MAAMjD,EAAGjM,OAAOyM,UAAUqC,GAAWzJ,GAEvE0J,EAAOhK,KAAKgI,eAIjB,CACDrM,IAAK,gBACLK,MAAO,SAAuBsJ,EAAM1C,GAClC,IAAItC,EAA6B,EAAnBnE,UAAUf,aAA+BkD,IAAjBnC,UAAU,GAAmBA,UAAU,GAAK9B,KAAK2G,QAAQsE,GAAMhF,QACjG+D,EAAYhK,KAAKuG,OAAO0E,GAAMjB,UAgBlC,OAdI/J,EAAQsI,KAAWkB,EACrBzJ,KAAK+P,0BAA0BxH,EAAM8E,SAAU9E,EAAMmH,SAAUzE,EAAMhF,GAErEjG,KAAKuG,OAAO0E,GAAM0C,SAASpF,GAG7BvI,KAAK2G,QAAQsE,GAAMhF,QAAUjG,KAAK8J,KAAKvD,OAAO0E,GAAMlF,OAAOE,SAAWA,GAEjEsC,GAASyB,EACZhK,KAAK2G,QAAQsE,GAAMsC,OAEnBvN,KAAK2G,QAAQsE,GAAM+C,OAGdhO,OAER,CACDsB,IAAK,iBACLK,MAAO,SAAwBoJ,GAE7B,IAIIiF,EAJAhJ,EAAO/G,EAAQ8K,GAEfE,EAAOF,EAAME,KACb9C,EAAOnI,KAAK2F,KAAKwC,MAGjBnB,IAASyC,IACXuG,EAAY/E,GA/zBP,WAk0BHjE,KAIAgJ,EAHe,KAAK9G,KAAK6B,GAGb5C,EAAKkH,cAActE,GAAOE,KAE1BF,GAIhB,OAAOiF,IAER,CACD1O,IAAK,eACLK,MAAO,SAAsBoJ,GAC3B,OAAO/K,KAAKuG,OAAOvG,KAAKiQ,eAAelF,IAAQxC,QAEhD,CACDjH,IAAK,gBACLK,MAAO,SAAuBoJ,GAC5B,OAAO/K,KAAKuG,OAAOvG,KAAKiQ,eAAelF,IAAQ5C,KAAKxG,QAErD,CACDL,IAAK,cACLK,MAAO,WACL,OAAO3B,KAAK2F,KAAK4C,QAElB,CACDjH,IAAK,kBACLK,MAAO,WACL,OAAO3B,KAAK2F,KAAKqE,YAElB,CACD1I,IAAK,aACLK,MAAO,WACL,OAAO3B,KAAK2F,KAAKsE,OAElB,CACD3I,IAAK,YACLK,MAAO,WACL3B,KAAK2F,KAAK+E,UAEX,CACDpJ,IAAK,aACLK,MAAO,SAAoBoJ,GAEzB/K,KAAKuG,OAAOvG,KAAKiQ,eAAelF,IAAQL,QACxC1K,KAAK2F,KAAKgI,aAEX,CACDrM,IAAK,WACLK,MAAO,SAAkBoJ,GAEvB,OAAO/K,KAAKuG,OAAOvG,KAAKiQ,eAAelF,IAAQ5C,OAEhD,CACD7G,IAAK,WACLK,MAAO,SAAkBoJ,EAAOmF,GAC9B,IAEIpH,EAFOlH,EAAS,GAAIsO,GAGxBpH,EAAQ/C,OAAS+C,EAAQ/C,OAAS+C,EAAQ/C,OAAS,GACnD,IAAIkF,EAAOjL,KAAKiQ,eAAelF,GAC3BoF,EAAe,CACjB/H,WAAYU,EAAQV,WACpB5B,IAAKsC,EAAQtC,KAAOd,EAAca,OAAOC,IACzCC,IAAKqC,EAAQrC,KAAOf,EAAca,OAAOE,IACzCC,KAAMoC,EAAQpC,MAAQhB,EAAca,OAAOG,KAC3CN,WAAYhF,OAAOS,OAAO,GAAI7B,KAAK8J,KAAK1D,WAAWG,OAAQuC,EAAQ1C,aAEjEgK,EAAgB,CAClBpK,SAAU8C,EAAQ/C,OAAOC,UAAYN,EAAciB,QAAQX,SAC3DY,YAAakC,EAAQ/C,OAAOa,aAAelB,EAAciB,QAAQC,YACjEX,QAAS6C,EAAQ/C,OAAOE,SAAWP,EAAciB,QAAQV,QACzDG,WAAYhF,OAAOS,OAAO,GAAI7B,KAAK8J,KAAK1D,WAAWO,QAASmC,EAAQ/C,OAAOK,aAO7E,OALApG,KAAK8J,KAAKvD,OAAO0E,GAAQ7J,OAAOS,OAAO,GAAIsO,EAAc,CACvDpK,OAAQqK,IAEVpQ,KAAKgP,UAAU/D,EAAMjL,KAAK8J,KAAKvD,OAAO0E,IACtCjL,KAAKiP,WAAWhE,EAAMjL,KAAK8J,KAAKvD,OAAO0E,GAAMlF,QACtC/F,KAAKuG,OAAO0E,GAAM9C,OAE1B,CACD7G,IAAK,cACLK,MAAO,SAAqBoJ,GAC1B,IAAIE,EAAOjL,KAAKiQ,eAAelF,GAC/B/K,KAAKuG,OAAO0E,GAAMT,SAClBxK,KAAK2G,QAAQsE,GAAMT,WAEpB,CACDlJ,IAAK,gBACLK,MAAO,SAAuBoJ,GAE5B,IAAIE,EAAOjL,KAAKiQ,eAAelF,GAE/B,GAAI/K,KAAKuG,OAAO0E,GAAM7C,WAAY,CAChC,IAAIA,EAAaV,EAAU8F,SAASxN,KAAKuG,OAAO0E,GAAMwC,kBACtDzN,KAAKuG,OAAO0E,GAAMjB,WAAY,EAC9BhK,KAAK0N,cAAczC,EAAM7C,EAAWG,OAItC,OADAvI,KAAK2F,KAAKgI,WACH3N,KAAKuG,OAAO0E,GAAM9C,OAE1B,CACD7G,IAAK,eACLK,MAAO,WACL,IAAI0O,EAASrQ,KAiBb,OAdAoB,OAAOyG,QAAQ7H,KAAKuG,QAAQuB,QAAQ,SAAUwI,GAC5C,IAAIC,EAAS7L,EAAe4L,EAAQ,GAChCrF,EAAOsF,EAAO,GACdxF,EAAQwF,EAAO,GAEnB,GAAIxF,EAAM3C,WAAY,CACpB,IAAIA,EAAaV,EAAU8F,SAASzC,EAAM0C,kBAC1C1C,EAAM+C,mBAAkB,GAExBuC,EAAO3C,cAAczC,EAAM7C,EAAWG,MAAOH,EAAWnC,YAG5DjG,KAAK2F,KAAKqE,WAAY,EACtBhK,KAAK2F,KAAKgI,WACH3N,KAAK2F,KAAKwC,SAIdpI,EAjcT","file":"formhandler.min.js","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.FormHandler = factory());\n}(this, (function () { 'use strict';\n\n function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null) return null;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return _setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n }\n\n var defaultConfig = {\n form: {\n block: '.formhandler',\n submit: '.formhandler__submit',\n delayForNotice: 3000,\n notice: {\n appendTo: '.formhandler__notices',\n message: 'This form seems to be invalid',\n successMessage: 'Form was successfully sent',\n errorMessage: 'Oops, something went wrong',\n classNames: {\n block: 'formhandler__notice-form',\n hidden: 'formhandler__notice-form--hidden',\n visible: 'formhandler__notice-form--visible'\n }\n }\n },\n fields: {\n min: false,\n max: false,\n send: true\n },\n notices: {\n appendTo: false,\n nextToField: 'before',\n message: false\n },\n classNames: {\n notices: {\n block: 'formhandler__notice',\n hidden: 'formhandler__notice--hidden',\n visible: 'formhandler__notice--visible'\n },\n form: {\n isValid: 'formhandler--is-valid',\n isNotValid: 'formhandler--is-not-valid'\n },\n fields: {\n isValid: 'formhandler__field--is-valid',\n isNotValid: 'formhandler__field--is-not-valid'\n }\n },\n sender: {\n send: false,\n type: 'xhr',\n clearFormOnSuccess: true\n },\n callbacks: {\n onFieldChangeState: function onFieldChangeState() {},\n onFormChangeState: function onFormChangeState() {},\n onSubmit: function onSubmit() {},\n onSend: function onSend() {}\n }\n };\n\n /* eslint-disable no-useless-constructor */\n var FormHandlerError =\n /*#__PURE__*/\n function (_Error) {\n _inherits(FormHandlerError, _Error);\n\n function FormHandlerError(props) {\n _classCallCheck(this, FormHandlerError);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(FormHandlerError).call(this, props));\n }\n\n return FormHandlerError;\n }(_wrapNativeSuper(Error));\n\n var Validator =\n /*#__PURE__*/\n function () {\n function Validator(custom) {\n _classCallCheck(this, Validator);\n\n this.custom = custom;\n\n if (this.custom) {\n this.addCustomValidations();\n }\n }\n\n _createClass(Validator, [{\n key: \"addCustomValidations\",\n value: function addCustomValidations() {\n Object.entries(this.custom).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n type = _ref2[0],\n obj = _ref2[1];\n\n Validator.validations[type] = obj;\n });\n return this;\n }\n }], [{\n key: \"validate\",\n value: function validate(_ref3) {\n var type = _ref3.type,\n node = _ref3.node,\n min = _ref3.min,\n max = _ref3.max;\n if (!type) return;\n var validation = Validator.validations[type];\n\n if (!validation) {\n throw new FormHandlerError(\"No handler to validate type \".concat(type));\n } // eslint-disable-next-line consistent-return\n\n\n return validation(node, min, max);\n }\n }]);\n\n return Validator;\n }();\n\n _defineProperty(Validator, \"validations\", {\n isCheckboxChecked: function isCheckboxChecked(node, min, max) {\n var message = 'At least one checkbox must be selected';\n var valid = true;\n var checked = 0;\n node.forEach(function (el) {\n if (el.checked) checked += 1;\n });\n\n if (min && max) {\n if (checked < min) {\n valid = false;\n message = \"Minimum \".concat(min, \", maximum \").concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (min && !max) {\n if (checked < min) {\n valid = false;\n message = \"At least \".concat(min, \" \").concat(min === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && max) {\n if (!checked) {\n message = \"Minimum 1, maximum \".concat(max, \" checkboxes must be selected\");\n }\n\n if (checked > max) {\n valid = false;\n message = \"Not more than \".concat(max, \" \").concat(max === 1 ? 'checkbox' : 'checkboxes', \" must be selected\");\n }\n }\n\n if (!min && !max && !checked) {\n valid = false;\n message = 'At least one checkbox must be selected';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isRadioChecked: function isRadioChecked(node) {\n var valid = Array.from(node).some(function (el) {\n return el.checked === true;\n });\n var message = 'Please select one of the buttons';\n return {\n valid: valid,\n message: message\n };\n },\n isSelected: function isSelected(node) {\n var valid = Array.from(node.options).filter(function (el) {\n return el.value.length > 0;\n }).some(function (el) {\n return el.selected === true;\n });\n var message = 'Please select one of the options';\n return {\n valid: valid,\n message: message\n };\n },\n isName: function isName(node, min, max) {\n var pattern = /^[a-zA-Z]+$/;\n var valid = pattern.test(node.value);\n var message = 'Must contain only letters';\n\n var _node$value$trim = node.value.trim(),\n length = _node$value$trim.length;\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 letter but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'letter' : 'letters');\n }\n }\n\n if (!min && !max && !length) {\n valid = false;\n message = 'Must contain at least one letter';\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isEmail: function isEmail(node) {\n var pattern = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i;\n var valid = pattern.test(node.value);\n var message = 'Must be a valid email address';\n return {\n valid: valid,\n message: message\n };\n },\n isPhone: function isPhone(node, min, max) {\n var pattern = /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g;\n\n var _node$value$trim2 = node.value.trim(),\n length = _node$value$trim2.length;\n\n var valid = pattern.test(node.value);\n var message = 'Must be a valid phone number';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'digit' : 'digits');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 digit but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'digit' : 'digits');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n },\n isNonEmpty: function isNonEmpty(node, min, max) {\n var _node$value$trim3 = node.value.trim(),\n length = _node$value$trim3.length;\n\n var valid = length > 0;\n var message = 'Must contain at least one character';\n\n if (min && max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters', \" but not more than \").concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n if (min && !max) {\n if (length < min) {\n valid = false;\n message = \"Must contain at least \".concat(min, \" \").concat(min === 1 ? 'character' : 'characters');\n }\n }\n\n if (!min && max) {\n if (!length) {\n message = \"Must contain at least 1 character but not more than \".concat(max);\n }\n\n if (length > max) {\n valid = false;\n message = \"Must contain not more than \".concat(max, \" \").concat(max === 1 ? 'character' : 'characters');\n }\n }\n\n return {\n valid: valid,\n message: message\n };\n }\n });\n\n var HTML_SELECT_ELEMENT = 'HTMLSelectElement';\n var INPUT = 'input';\n var LOAD = 'load';\n var UNDEFINED = 'undefined';\n var SUCCESS = 'success';\n var ERROR = 'error';\n var OBJECT = 'object';\n var FORM = 'form';\n var CLICK = 'click';\n var DIV = 'div';\n var READY_STATE_CHANGE = 'readystatechange';\n var XHR = 'xhr';\n var FETCH = 'fetch';\n var AFTER = 'after';\n var BEFORE = 'before';\n var STRING = 'string';\n var CHECKBOX = 'checkbox';\n var RADIO = 'radio';\n var SELECT = 'select-one';\n var NODE_LIST = 'NodeList';\n var COLOR = 'color';\n\n var Form =\n /*#__PURE__*/\n function () {\n function Form(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Form);\n\n this.node = opts.node;\n this.submit = opts.submit;\n this.classNames = opts.classNames;\n this.fields = opts.fields;\n this.listener = opts.listener;\n this.valid = null;\n this.submitted = false;\n this.sent = null;\n this.callback = opts.callback;\n this.submit.addEventListener(CLICK, this.listener);\n }\n\n _createClass(Form, [{\n key: \"setState\",\n value: function setState() {\n var validity = this.fieldsValidity;\n this.callback(this.node, this.valid, validity);\n this.valid = validity;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n // eslint-disable-next-line no-unused-vars\n Object.entries(this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.clear();\n });\n this.callback(this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }, {\n key: \"fieldsValidity\",\n get: function get() {\n var validness = new Set(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n if (field.validation) {\n validness.add(field.valid);\n }\n });\n return !validness.has(false);\n }\n }]);\n\n return Form;\n }();\n\n var Field =\n /*#__PURE__*/\n function () {\n function Field(_ref) {\n var node = _ref.node,\n validation = _ref.validation,\n min = _ref.min,\n max = _ref.max,\n send = _ref.send,\n classNames = _ref.classNames,\n callback = _ref.callback;\n\n _classCallCheck(this, Field);\n\n this.node = node;\n this.type = this.node.constructor.name;\n this.name = this.type === NODE_LIST ? this.node[0].name : this.node.name;\n this.validation = validation;\n this.send = send;\n this.min = min;\n this.max = max;\n this.classNames = classNames;\n this.valid = null;\n this.submitted = false;\n this.callback = callback;\n }\n\n _createClass(Field, [{\n key: \"setState\",\n value: function setState(valid) {\n this.callback(this.validation, this.name, this.node, this.valid, valid);\n this.valid = valid;\n\n if (this.submitted) {\n this.toggleClassNames();\n }\n }\n }, {\n key: \"setFieldSubmitted\",\n value: function setFieldSubmitted(value) {\n this.submitted = value;\n }\n }, {\n key: \"on\",\n value: function on(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.addEventListener(type, listener);\n });\n } else {\n this.node.addEventListener(type, listener);\n }\n }\n }, {\n key: \"off\",\n value: function off(type, listener) {\n if (this.type === NODE_LIST) {\n this.node.forEach(function (el) {\n return el.removeEventListener(type, listener);\n });\n } else {\n this.node.removeEventListener(type, listener);\n }\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }, {\n key: \"validatorOptions\",\n get: function get() {\n return {\n type: this.validation,\n node: this.node,\n min: this.min,\n max: this.max\n };\n }\n }]);\n\n return Field;\n }();\n\n var Input =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Input, _Field);\n\n function Input(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Input);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Input).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Input, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Input;\n }(Field);\n\n var Radio =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Radio, _Field);\n\n function Radio(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Radio);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Radio).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Radio, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n var _this = this;\n\n if (this.valid) {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isValid);\n });\n } else {\n this.node.forEach(function (el) {\n return el.classList.remove(_this.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.add(_this.classNames.isNotValid);\n });\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n var _this2 = this;\n\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isValid);\n });\n this.node.forEach(function (el) {\n return el.classList.remove(_this2.classNames.isNotValid);\n });\n this.node.forEach(function (el) {\n // eslint-disable-next-line no-param-reassign\n el.checked = false;\n });\n }\n }]);\n\n return Radio;\n }(Field);\n\n var Select =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Select, _Field);\n\n function Select(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Select);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Select).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Select, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.remove(this.classNames.isNotValid);\n Array.from(this.node.options).forEach(function (el) {\n el.selected = false;\n });\n }\n }]);\n\n return Select;\n }(Field);\n\n var Color =\n /*#__PURE__*/\n function (_Field) {\n _inherits(Color, _Field);\n\n function Color(_ref) {\n var opts = _extends({}, _ref);\n\n _classCallCheck(this, Color);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(Color).call(this, Object.assign({}, opts)));\n }\n\n _createClass(Color, [{\n key: \"toggleClassNames\",\n value: function toggleClassNames() {\n if (this.valid) {\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.add(this.classNames.isValid);\n } else {\n this.node.classList.remove(this.classNames.isValid);\n this.node.classList.add(this.classNames.isNotValid);\n }\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.callback(this.validation, this.name, this.node, this.valid, false);\n this.node.value = '#000000';\n this.valid = false;\n this.submitted = false;\n this.node.classList.remove(this.classNames.isNotValid);\n this.node.classList.remove(this.classNames.isValid);\n }\n }]);\n\n return Color;\n }(Field);\n\n var Notice =\n /*#__PURE__*/\n function () {\n function Notice(_ref) {\n var form = _ref.form,\n message = _ref.message,\n classNames = _ref.classNames,\n appendTo = _ref.appendTo,\n nextToField = _ref.nextToField,\n parent = _ref.parent;\n\n _classCallCheck(this, Notice);\n\n this.form = form;\n this.message = message;\n this.classNames = classNames;\n this.appendTo = appendTo;\n this.nextToField = nextToField;\n this.parent = parent;\n this.node = null;\n this.mount();\n }\n\n _createClass(Notice, [{\n key: \"mount\",\n value: function mount() {\n this.node = document.createElement(DIV);\n this.node.classList.add(this.classNames.block);\n this.node.classList.add(this.classNames.hidden);\n\n if (this.appendTo) {\n this.parent.appendChild(this.node);\n } else {\n if (this.nextToField === BEFORE) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[0];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent);\n }\n\n if (this.nextToField === AFTER) {\n if (this.parent.constructor.name === NODE_LIST) {\n this.parent = this.parent[this.parent.length - 1];\n }\n\n this.parent.parentElement.insertBefore(this.node, this.parent.nextElementSibling);\n }\n }\n }\n }, {\n key: \"show\",\n value: function show() {\n this.node.classList.remove(this.classNames.hidden);\n this.node.classList.add(this.classNames.visible);\n this.node.innerText = this.message;\n }\n }, {\n key: \"hide\",\n value: function hide() {\n this.node.classList.remove(this.classNames.visible);\n this.node.classList.add(this.classNames.hidden);\n }\n }, {\n key: \"remove\",\n value: function remove() {\n this.node.remove();\n }\n }]);\n\n return Notice;\n }();\n\n var Sender =\n /*#__PURE__*/\n function () {\n function Sender(_ref) {\n var type = _ref.type,\n url = _ref.url,\n method = _ref.method,\n data = _ref.data,\n fields = _ref.fields,\n form = _ref.form,\n callbacks = _ref.callbacks;\n\n _classCallCheck(this, Sender);\n\n this.type = type;\n this.url = url;\n this.method = method;\n this.data = data();\n this.fields = fields;\n this.form = form;\n this.callbacks = callbacks;\n }\n\n _createClass(Sender, [{\n key: \"makeData\",\n value: function makeData() {\n var _this = this;\n\n var data = new FormData(); // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.data).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n value = _ref3[1];\n\n // eslint-disable-next-line no-useless-return\n if (!_this.fields[name].send) return;\n data.append(name, value);\n });\n return data;\n }\n }, {\n key: \"sendRequest\",\n value: function sendRequest(data) {\n var _this2 = this;\n\n if (this.type === XHR) {\n var xhr = new XMLHttpRequest();\n xhr.open(this.method, this.url, true);\n xhr.addEventListener(READY_STATE_CHANGE, function (ev) {\n if (ev.target.readyState === 4) {\n if (ev.target.status >= 200 && ev.target.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(ev.target.status, \", Text: \").concat(ev.target.statusText));\n }\n }\n });\n xhr.send(data);\n }\n\n if (this.type === FETCH) {\n fetch(this.url, {\n method: this.method,\n body: data\n }).then(function (response) {\n if (response.status >= 200 && response.status < 400) {\n _this2.callbacks.setFormState(SUCCESS);\n\n _this2.callbacks.onSend(SUCCESS);\n } else {\n _this2.callbacks.setFormState(ERROR);\n\n _this2.callbacks.onSend(ERROR);\n\n throw new FormHandlerError(\"Status: \".concat(response.status, \", Text: \").concat(response.statusText));\n }\n });\n }\n }\n }]);\n\n return Sender;\n }();\n\n var FormHandler =\n /*#__PURE__*/\n function () {\n // TODO: Переименовать опцию appendTo => appendTo\n function FormHandler(_ref) {\n var _this = this;\n\n var args = _extends({}, _ref);\n\n _classCallCheck(this, FormHandler);\n\n _defineProperty(this, \"setFormStateFromResponse\", function (result) {\n if (result === SUCCESS) {\n _this.notices.form.message = _this.opts.form.notice.successMessage;\n _this.form.sent = true;\n\n if (_this.opts.sender.clearFormOnSuccess) {\n _this.form.clear();\n }\n }\n\n if (result === ERROR) {\n _this.notices.form.message = _this.opts.form.notice.errorMessage;\n _this.form.sent = false;\n }\n\n _this.notices.form.show();\n });\n\n _defineProperty(this, \"inputHandler\", function (ev) {\n var name = ev.target.name;\n var validation = Validator.validate(_this.fields[name].validatorOptions);\n\n if (_this.fields[name].validation) {\n _this.setFieldState(name, validation.valid, validation.message); // eslint-disable-next-line valid-typeof\n\n\n if (_typeof(validation.valid) !== OBJECT) {\n _this.form.setState();\n }\n }\n });\n\n _defineProperty(this, \"submitHandler\", function (ev) {\n ev.preventDefault();\n var fieldNodes = [];\n var delayForNotice = _this.opts.form.delayForNotice; // eslint-disable-next-line no-unused-vars\n\n Object.entries(_this.fields).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n name = _ref3[0],\n field = _ref3[1];\n\n field.setFieldSubmitted(true);\n fieldNodes.push(field.node);\n });\n\n _this.callbacks.onSubmit(_this.form.node, fieldNodes);\n\n _this.validateForm();\n\n _this.notices.form.message = _this.opts.form.notice.message;\n\n if (_this.form.valid) {\n _this.notices.form.hide();\n\n if (_this.opts.sender.send) {\n var options = {\n type: _this.opts.sender.type,\n url: _this.form.node.action,\n method: _this.form.node.method,\n data: _this.getFieldsAndValues,\n fields: _this.fields,\n form: _this.form.node,\n callbacks: {\n setFormState: _this.setFormStateFromResponse,\n onSend: _this.callbacks.onSend\n }\n };\n var sender = new Sender(options);\n sender.sendRequest(sender.makeData());\n setTimeout(function () {\n _this.notices.form.hide();\n }, delayForNotice);\n }\n } else {\n _this.notices.form.show();\n\n if (delayForNotice) {\n setTimeout(function () {\n _this.notices.form.hide();\n }, delayForNotice);\n }\n }\n });\n\n _defineProperty(this, \"getFieldsAndValues\", function () {\n var data = {};\n Object.entries(_this.fields).forEach(function (_ref4) {\n var _ref5 = _slicedToArray(_ref4, 2),\n name = _ref5[0],\n field = _ref5[1];\n\n var type = field.node.constructor.name;\n\n if (type === NODE_LIST) {\n // Radio/Checkbox\n var inputType = field.node[0].type;\n\n if (inputType === CHECKBOX) {\n data[name] = [];\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name].push(node.value);\n }\n });\n }\n\n if (inputType === RADIO) {\n data[name] = '';\n Array.from(field.node).forEach(function (node) {\n if (node.checked) {\n data[name] = node.value;\n }\n });\n }\n } else if (type === HTML_SELECT_ELEMENT) {\n // Select\n data[name] = field.node.options[field.node.options.selectedIndex].value;\n } else {\n // Others\n data[name] = field.node.value;\n }\n });\n return data;\n });\n\n this.opts = args;\n this.fields = {};\n this.notices = {};\n this.form = null;\n this.validator = new Validator(this.opts.customValidations);\n this.callbacks = {};\n this.init();\n }\n\n _createClass(FormHandler, [{\n key: \"init\",\n value: function init() {\n var _this2 = this;\n\n this.complementOptions().makeForm();\n Object.entries(this.opts.fields).forEach(function (_ref6) {\n var _ref7 = _slicedToArray(_ref6, 2),\n name = _ref7[0],\n field = _ref7[1];\n\n _this2.makeField(name, field);\n\n if (field.validation) {\n var validation = Validator.validate(_this2.fields[name].validatorOptions);\n\n _this2.makeNotice(name, field.notice);\n\n _this2.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.setState();\n return this;\n }\n }, {\n key: \"complementOptions\",\n value: function complementOptions() {\n var _this3 = this;\n\n // Add lacks classNames and merge.\n this.opts.classNames = this.opts.classNames ? Object.assign({}, defaultConfig.classNames, this.opts.classNames) : defaultConfig.classNames;\n this.opts.classNames.form = Object.assign({}, defaultConfig.classNames.form, this.opts.classNames.form);\n this.opts.classNames.fields = Object.assign({}, defaultConfig.classNames.fields, this.opts.classNames.fields);\n this.opts.classNames.notices = Object.assign({}, defaultConfig.classNames.notices, this.opts.classNames.notices); // Add lacks form options and merge.\n\n this.opts.form = this.opts.form ? Object.assign({}, defaultConfig.form, this.opts.form) : defaultConfig.form;\n this.opts.form.notice = Object.assign({}, defaultConfig.form.notice, this.opts.form.notice);\n this.opts.form.notice.classNames = Object.assign({}, this.opts.classNames.notice, this.opts.form.notice.classNames); // Add lacks notices options and merge\n\n this.opts.notices = Object.assign({}, defaultConfig.notices, this.opts.notices); // Add lacks fields options and merge\n // eslint-disable-next-line no-unused-vars\n\n Object.entries(this.opts.fields).forEach(function (_ref8) {\n var _ref9 = _slicedToArray(_ref8, 2),\n name = _ref9[0],\n obj = _ref9[1];\n\n _this3.opts.fields[name] = Object.assign({}, defaultConfig.fields, _this3.opts.fields[name]);\n _this3.opts.fields[name].classNames = _this3.opts.fields[name].classNames ? Object.assign({}, _this3.opts.classNames.fields, _this3.opts.fields[name].classNames) : _this3.opts.classNames.fields;\n _this3.opts.fields[name].notice = Object.assign({}, _this3.opts.notices, _this3.opts.fields[name].notice);\n _this3.opts.fields[name].notice.classNames = Object.assign({}, _this3.opts.classNames.notices, _this3.opts.fields[name].notice.classNames);\n });\n this.opts.sender = this.opts.sender ? Object.assign({}, defaultConfig.sender, this.opts.sender) : defaultConfig.sender;\n this.callbacks = this.opts.callbacks ? Object.assign({}, defaultConfig.callbacks, this.opts.callbacks) : defaultConfig.callbacks;\n return this;\n }\n }, {\n key: \"makeForm\",\n value: function makeForm() {\n var options = {\n fields: this.fields,\n classNames: this.opts.classNames.form,\n node: document.querySelector(this.opts.form.block),\n submit: document.querySelector(this.opts.form.submit),\n listener: this.submitHandler,\n callback: this.callbacks.onFormChangeState\n };\n this.form = new Form(options);\n this.makeNotice(FORM, this.opts.form.notice);\n return this;\n }\n }, {\n key: \"makeField\",\n value: function makeField(name, field) {\n var node = this.form.node.querySelector(\"[name=\".concat(name, \"]\"));\n var _node = node,\n type = _node.type;\n var options = {\n node: node,\n validation: field.validation,\n min: field.min,\n max: field.max,\n send: field.send,\n classNames: field.classNames,\n callback: this.callbacks.onFieldChangeState\n };\n\n if (type === RADIO || type === CHECKBOX) {\n node = this.form.node.querySelectorAll(\"[name=\".concat(name, \"]\"));\n options.node = node;\n this.fields[name] = new Radio(options);\n } else if (type === SELECT) {\n this.fields[name] = new Select(options);\n } else if (type === COLOR) {\n this.fields[name] = new Color(options);\n } else {\n this.fields[name] = new Input(options);\n }\n\n this.fields[name].on(INPUT, this.inputHandler);\n return this;\n }\n }, {\n key: \"makeNotice\",\n value: function makeNotice(name, notice) {\n var message = this.fields[name] ? Validator.validate(this.fields[name].validatorOptions).message : false;\n var parent = notice.nextToField ? this.fields[name].node : document.querySelector(notice.appendTo);\n var options = {\n form: this.form.node,\n classNames: notice.classNames,\n appendTo: notice.appendTo,\n message: notice.message || message,\n nextToField: notice.nextToField,\n parent: parent\n };\n this.notices[name] = new Notice(options);\n return this;\n }\n }, {\n key: \"setFieldStateFromResponse\",\n value: function setFieldStateFromResponse(response, property, name, message) {\n var _this4 = this;\n\n // eslint-disable-next-line valid-typeof\n if (_typeof(response.then) !== UNDEFINED) {\n response.then(function (data) {\n return data.json();\n }).then(function (json) {\n _this4.setFieldState(name, !!json[property], message);\n\n _this4.form.setState();\n });\n } else {\n response.addEventListener(LOAD, function (ev) {\n _this4.setFieldState(name, !!JSON.parse(ev.target.response)[property], message);\n\n _this4.form.setState();\n });\n }\n }\n }, {\n key: \"setFieldState\",\n value: function setFieldState(name, valid) {\n var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.notices[name].message;\n var submitted = this.fields[name].submitted; // eslint-disable-next-line valid-typeof\n\n if (_typeof(valid) === OBJECT) {\n this.setFieldStateFromResponse(valid.response, valid.property, name, message);\n } else {\n this.fields[name].setState(valid);\n }\n\n this.notices[name].message = this.opts.fields[name].notice.message || message;\n\n if (!valid && submitted) {\n this.notices[name].show();\n } else {\n this.notices[name].hide();\n }\n\n return this;\n }\n }, {\n key: \"getFieldNameBy\",\n value: function getFieldNameBy(field) {\n // return field name get by NodeList/Selector(.className)\n var type = _typeof(field);\n\n var name = field.name;\n var node = this.form.node;\n var fieldName;\n\n if (type === OBJECT) {\n fieldName = name;\n }\n\n if (type === STRING) {\n var isSelector = /\\./.test(field);\n\n if (isSelector) {\n fieldName = node.querySelector(field).name;\n } else {\n fieldName = field;\n }\n }\n\n return fieldName;\n }\n }, {\n key: \"isFieldValid\",\n value: function isFieldValid(field) {\n return this.fields[this.getFieldNameBy(field)].valid;\n }\n }, {\n key: \"getFieldValue\",\n value: function getFieldValue(field) {\n return this.fields[this.getFieldNameBy(field)].node.value;\n }\n }, {\n key: \"isFormValid\",\n value: function isFormValid() {\n return this.form.valid;\n }\n }, {\n key: \"isFormSubmitted\",\n value: function isFormSubmitted() {\n return this.form.submitted;\n }\n }, {\n key: \"isFormSent\",\n value: function isFormSent() {\n return this.form.sent;\n }\n }, {\n key: \"clearForm\",\n value: function clearForm() {\n this.form.clear();\n }\n }, {\n key: \"clearField\",\n value: function clearField(field) {\n // Also clears classNames and field of instance like valid, submitted\n this.fields[this.getFieldNameBy(field)].clear();\n this.form.setState();\n }\n }, {\n key: \"getField\",\n value: function getField(field) {\n // Returns a field node\n return this.fields[this.getFieldNameBy(field)].node;\n }\n }, {\n key: \"addField\",\n value: function addField(field, _ref10) {\n var opts = _extends({}, _ref10);\n\n var options = opts;\n options.notice = options.notice ? options.notice : {};\n var name = this.getFieldNameBy(field);\n var fieldOptions = {\n validation: options.validation,\n min: options.min || defaultConfig.fields.min,\n max: options.max || defaultConfig.fields.max,\n send: options.send || defaultConfig.fields.send,\n classNames: Object.assign({}, this.opts.classNames.fields, options.classNames)\n };\n var noticeOptions = {\n appendTo: options.notice.appendTo || defaultConfig.notices.appendTo,\n nextToField: options.notice.nextToField || defaultConfig.notices.nextToField,\n message: options.notice.message || defaultConfig.notices.message,\n classNames: Object.assign({}, this.opts.classNames.notices, options.notice.classNames)\n };\n this.opts.fields[name] = Object.assign({}, fieldOptions, {\n notice: noticeOptions\n });\n this.makeField(name, this.opts.fields[name]);\n this.makeNotice(name, this.opts.fields[name].notice);\n return this.fields[name].node;\n }\n }, {\n key: \"removeField\",\n value: function removeField(field) {\n var name = this.getFieldNameBy(field);\n this.fields[name].remove();\n this.notices[name].remove();\n }\n }, {\n key: \"validateField\",\n value: function validateField(field) {\n // also turns on toggleClassNames\n var name = this.getFieldNameBy(field);\n\n if (this.fields[name].validation) {\n var validation = Validator.validate(this.fields[name].validatorOptions);\n this.fields[name].submitted = true;\n this.setFieldState(name, validation.valid);\n }\n\n this.form.setState();\n return this.fields[name].node;\n }\n }, {\n key: \"validateForm\",\n value: function validateForm() {\n var _this5 = this;\n\n // also turns on toggleClassNames\n Object.entries(this.fields).forEach(function (_ref11) {\n var _ref12 = _slicedToArray(_ref11, 2),\n name = _ref12[0],\n field = _ref12[1];\n\n if (field.validation) {\n var validation = Validator.validate(field.validatorOptions);\n field.setFieldSubmitted(true);\n\n _this5.setFieldState(name, validation.valid, validation.message);\n }\n });\n this.form.submitted = true;\n this.form.setState();\n return this.form.node;\n }\n }]);\n\n return FormHandler;\n }();\n\n return FormHandler;\n\n})));\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5d31255..fd37c45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "formhandler.js", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a6b24ef..2691550 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "formhandler.js", - "version": "1.1.0", + "version": "1.1.1", "description": "Powerful pure Javascript form validator with a feature of adding your own validations", "author": "Ivan Grimes", "license": "MIT", diff --git a/src/js/FormHandler.js b/src/js/FormHandler.js index 14bb7ba..5edb79c 100644 --- a/src/js/FormHandler.js +++ b/src/js/FormHandler.js @@ -281,7 +281,7 @@ export default class FormHandler { // TODO: Переименовать опци setTimeout(() => { this.notices.form.hide(); - }, 2000); + }, delayForNotice); } } else { this.notices.form.show();