/*!
* WPMU DEV Forminator UI
* Copyright 2019 Incsub (https://incsub.com)
* Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html)
*/
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
(function ($) {
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.formLoad = function (el) {
var form = $(el);
var message = form.find('.forminator-response-message');
if (!form.is('.forminator-ui') && !form.is('.forminator-custom-form')) {
return;
}
function reset() {
// Hide response message
message.removeClass('forminator-show');
message.removeClass('forminator-accessible');
// Make sure response message
// is not accessible by screen readers
message.attr('aria-hidden', 'true');
}
function formId() {
var attrId = form.data('id');
var dataId = form.data('id');
if (attrId.length && '' !== attrId) {
form.addClass('forminator-form-' + dataId);
}
}
function formDesign() {
var attrDesign = form.data('design');
var dataDesign = form.data('design');
if (attrDesign && '' !== attrDesign) {
form.addClass('forminator-design--' + dataDesign);
} else {
form.addClass('forminator-design--none');
}
}
function formGrid() {
var attrGrid = form.data('grid');
var dataGrid = form.data('grid');
// Reset
form.removeClass('forminator-custom');
form.removeClass('forminator-enclosed');
// Assign class
if (attrGrid && '' !== attrGrid) {
if ('open' !== attrGrid) {
form.addClass('forminator-' + dataGrid);
}
}
}
function init() {
// Reset
reset();
// Form unique id
formId();
// Form design class
formDesign();
// Form grid class
formGrid();
}
init();
return this;
};
})(jQuery);
(function ($) {
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.formSimulation = function (el) {
var submit = $(el);
var form = submit.closest('form');
var response = form.find('.forminator-response-message');
var message = '';
if (!form.is('.forminator-ui') && !form.is('.forminator-custom-form')) {
return;
}
function validateReset() {
message = '';
// Empty response
response.html(message);
// Hide response
response.removeClass('forminator-show');
response.removeClass('forminator-accessible');
// Clear out response type
response.removeClass('forminator-error');
response.removeClass('forminator-success');
// Hide response for screen readers
response.attr('aria-hidden', 'true');
response.removeAttr('tabindex');
// Remove error class from fields
form.find('.forminator-field').removeClass('forminator-has_error');
}
function validateError() {
// Show response
response.addClass('forminator-accessible');
// Show response for screen readers
response.removeAttr('aria-hidden');
response.prop('tabindex', '-1');
// Focus message
response.focus();
}
function validateSuccess() {
message = '
Form was submitted successfully.
';
// Print message
response.html(message);
// Show response
response.addClass('forminator-success');
response.addClass('forminator-show');
// Show response for screen readers
response.removeAttr('aria-hidden');
response.prop('tabindex', '-1');
// Focus message
response.focus();
}
function validateInput() {
var input = form.find('.forminator-input');
input.each(function () {
var current = $(this);
var inputField = current.closest('.forminator-field');
var inputLabel = inputField.find('.forminator-label');
if (inputField.hasClass('forminator-is_required') && '' === current.val()) {
inputField.addClass('forminator-has_error');
if (inputLabel.length) {
message += '' + inputLabel.text() + ' needs to be filled.';
} else {
message += '' + current.prop('id') + ' needs to be filled.';
}
}
});
// Print message
response.html(message);
}
function validateTextarea() {
var textarea = form.find('.forminator-textarea');
textarea.each(function () {
var current = $(this);
var textareaField = current.closest('.forminator-field');
var textareaLabel = textareaField.find('.forminator-label');
if (textareaField.hasClass('forminator-is_required') && '' === current.val()) {
textareaField.addClass('forminator-has_error');
if (textareaLabel.length) {
message += '' + textareaLabel.text() + ' needs to be filled.';
} else {
message += '' + current.prop('id') + ' needs to be filled.';
}
}
});
// Print message
response.html(message);
}
function validateRadio() {
var radioField = form.find('.forminator-field-radio');
radioField.each(function () {
var field = $(this);
var label = field.find('.forminator-label');
var radio = field.find('.forminator-radio');
var options = radio.find('input').map(function () {
return this.id;
}).get();
if (field.hasClass('forminator-is_required') && 0 === radio.find('input:checked').length) {
field.addClass('forminator-has_error');
if (label.length) {
message += '' + label.text() + ' needs at least one option selected.';
} else {
message += 'You must select at lease one of these options: ' + options.join(',') + '';
}
}
});
// Print message
response.html(message);
}
function validateMultiSelect() {
var multiselect = form.find('.forminator-multiselect');
multiselect.each(function () {
var current = $(this);
var field = current.closest('.forminator-field');
var label = field.find('.forminator-label');
var options = current.find('.forminator-option');
var optionsMap = options.find('input').map(function () {
return this.id;
}).get();
if (field.hasClass('forminator-is_required') && 0 === options.find('input:checked').length) {
field.addClass('forminator-has_error');
if (label.length) {
message += '' + label.text() + ' needs at least one option selected.';
} else {
message += 'You must select at lease one of these options: ' + optionsMap.join(',') + '';
}
}
});
// Print message
response.html(message);
}
function validation() {
var input = form.find('.forminator-input');
var inputField = input.closest('.forminator-field');
var inputRequired = input.closest('.forminator-field.forminator-is_required');
var inputFilled = inputRequired.find('.forminator-input').filter(function () {
return !!this.value;
});
var textarea = form.find('.forminator-textarea');
var textareaField = textarea.closest('.forminator-field');
var textareaRequired = textarea.closest('.forminator-field.forminator-is_required');
var textareaFilled = textareaRequired.find('.forminator-textarea').val();
var radioField = form.find('.forminator-field-radio');
var radioRequired = form.find('.forminator-field-radio.forminator-is_required');
var radioSelected = radioRequired.find('input:checked');
var multiselect = form.find('.forminator-multiselect');
var multiselectField = multiselect.closest('.forminator-field');
var multiselectRequired = multiselect.closest('.forminator-field.forminator-is_required');
var multiselectSelected = multiselectRequired.find('input:checked');
// Reset - Hide message
validateReset();
if (inputField.hasClass('forminator-is_required') && inputFilled.length !== inputRequired.length || textareaField.hasClass('forminator-is_required') && '' === textareaFilled.length || radioField.hasClass('forminator-is_required') && 0 === radioSelected.length || multiselectField.hasClass('forminator-is_required') && 0 === multiselectSelected.length) {
validateInput();
validateTextarea();
validateRadio();
validateMultiSelect();
validateError();
} else {
validateSuccess();
}
}
function init() {
submit.on('click', function (e) {
validation();
e.preventDefault();
e.stopPropagation();
return false;
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global SUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.inputStates = function (el) {
var input = $(el);
var form = input.closest('form');
if (!input.is('input') && (!form.is('.forminator-poll') || !form.is('.forminator-ui') && !form.is('.forminator-custom-form'))) {
return;
}
function hover(element) {
var getInput = $(element);
var getField = getInput.closest('.forminator-field');
getField.off('mouseenter.forminatorHoverState mouseleave.forminatorHoverState').on('mouseenter.forminatorHoverState', function (e) {
getField.addClass('forminator-is_hover');
e.stopPropagation();
}).on('mouseleave.forminatorHoverState', function (e) {
getField.removeClass('forminator-is_hover');
e.stopPropagation();
});
}
function focused(element) {
var getInput = $(element);
var getField = getInput.closest('.forminator-field');
getInput.focus(function (e) {
getField.addClass('forminator-is_active');
e.stopPropagation();
}).blur(function (e) {
getField.removeClass('forminator-is_active');
e.stopPropagation();
});
}
function filled(element) {
var getInput = $(element);
var getField = getInput.closest('.forminator-field');
// On input load
if ('' !== getInput.val().trim()) {
getField.addClass('forminator-is_filled');
}
// On input changes
getInput.on('change', function () {
if ('' !== getInput.val().trim()) {
getField.addClass('forminator-is_filled');
} else {
getField.removeClass('forminator-is_filled');
}
});
}
function init() {
input.each(function () {
hover(this);
focused(this);
filled(this);
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global SUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.inputMaterial = function (el) {
var input = $(el);
var field = input.closest('.forminator-field');
var label = field.find('.forminator-label');
var form = input.closest('form');
if (!input.is('input') && (!form.is('.forminator-poll') || !form.is('.forminator-ui') && !form.is('.forminator-custom-form'))) {
return;
}
function init() {
// Wrap Element
if (!input.parent().hasClass('forminator-input--wrap')) {
input.wrap('');
}
// Wrap Label
if (label.length) {
// Add floating class
label.addClass('forminator-floating--input');
// If input has description adjancent to label then calculate it';s height and set --forminator-floating-label-translate css variable
var description = field.find('.forminator-label + .forminator-description');
if (description.length) {
var descriptionHeight = description.outerHeight();
var labelHeight = label.outerHeight();
var translateY = descriptionHeight + labelHeight + 16; // 16px margin
label.css('--forminator-floating-label-translate', translateY + 'px');
}
// Add icon class (if applies)
if (field.find('.forminator-input-with-icon').length) {
label.addClass('forminator-has_icon');
}
// Add phone class (if applies)
if (field.find('.forminator-input-with-phone').length) {
label.addClass('forminator-has_phone');
if (field.find('.intl-tel-input').hasClass('allow-dropdown')) {
label.addClass('allow-dropdown');
}
}
}
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global SUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.textareaStates = function (el) {
var textarea = $(el);
var form = textarea.closest('form');
if (!textarea.is('textarea') && !form.is('.forminator-ui') && !form.is('.forminator-custom-form')) {
return;
}
function hover(element) {
var getTextarea = $(element);
var getField = getTextarea.closest('.forminator-field');
getField.off('mouseenter.forminatorHoverState mouseleave.forminatorHoverState').on('mouseenter.forminatorHoverState', function (e) {
getField.addClass('forminator-is_hover');
e.stopPropagation();
}).on('mouseleave.forminatorHoverState', function (e) {
getField.removeClass('forminator-is_hover');
e.stopPropagation();
});
}
function focused(element) {
var getTextarea = $(element);
var getField = getTextarea.closest('.forminator-field');
getTextarea.focus(function (e) {
getField.addClass('forminator-is_active');
e.stopPropagation();
}).blur(function (e) {
getField.removeClass('forminator-is_active');
e.stopPropagation();
});
}
function filled(element) {
var getTextarea = $(element);
var getField = getTextarea.closest('.forminator-field');
// On textarea load
getTextarea.on('load', function () {
if ('' !== getTextarea.val().trim()) {
getField.addClass('forminator-is_filled');
}
});
// On textarea changes
getTextarea.on('change', function () {
if ('' !== getTextarea.val().trim()) {
getField.addClass('forminator-is_filled');
} else {
getField.removeClass('forminator-is_filled');
}
});
}
function init() {
textarea.each(function () {
hover(this);
focused(this);
filled(this);
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global SUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.textareaMaterial = function (el) {
var textarea = $(el);
var field = textarea.closest('.forminator-field');
var label = field.find('.forminator-label');
var form = textarea.closest('form');
if (!textarea.is('textarea') && !form.is('.forminator-ui') && !form.is('.forminator-custom-form')) {
return;
}
if (textarea.hasClass('wp-editor-area')) {
return;
}
function init() {
// Wrap Element
if (!textarea.parent().hasClass('forminator-textarea--wrap')) {
textarea.wrap('');
}
// Wrap Label
if (label.length) {
// Add floating class
label.addClass('forminator-floating--textarea');
// If input has description adjancent to label then calculate it';s height and set --forminator-floating-label-translate css variable
var description = field.find('.forminator-label + .forminator-description');
if (description.length) {
var descriptionHeight = description.outerHeight();
var translateY = descriptionHeight;
label.css('--forminator-floating-label-translate', translateY + 'px');
}
// Align textarea
field.css({
'position': 'relative'
});
if (textarea.val()) {
field.addClass('forminator-is_filled');
}
}
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.radioStates = function (el) {
var label = $(el);
var input = label.find('input');
if (!label.is('label') || 'radio' !== input.prop('type')) {
return;
}
function init() {
input.each(function () {
$(this).on('click', function () {
var radioInput = $(this);
var radioLabel = radioInput.parent();
var radioField = radioLabel.closest('.forminator-field');
var radioOptions = radioField.find('.forminator-radio');
// Remove checked attribute
radioOptions.find('input').prop('checked', false);
// Remove checked class
radioOptions.removeClass('forminator-is_checked');
// Assign checked attribute
radioInput.prop('checked', 'checked');
// Assign checked class
radioLabel.addClass('forminator-is_checked');
});
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.checkboxStates = function (el) {
var label = $(el);
var input = label.find('input');
if (!label.is('label') || 'checkbox' !== input.prop('type')) {
return;
}
function init() {
input.each(function () {
$(this).on('click', function () {
var checkInput = $(this);
var checkLabel = checkInput.parent();
if (checkLabel.is('.forminator-is_checked')) {
checkLabel.removeClass('forminator-is_checked');
} else {
checkLabel.addClass('forminator-is_checked');
}
});
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode.
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.multiSelectStates = function (el) {
var container = $(el);
var option = container.find('.forminator-option');
var input = option.find('input');
if (!container.is('.forminator-multiselect') || 0 === option.length) {
return;
}
function init() {
input.each(function () {
$(this).on('click', function () {
var checkInput = $(this);
var checkLabel = checkInput.parent();
if (checkLabel.is('.forminator-is_checked')) {
checkLabel.removeClass('forminator-is_checked');
} else {
checkLabel.addClass('forminator-is_checked');
}
});
});
}
init();
return this;
};
})(jQuery);
(function ($) {
// Enable strict mode
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
FUI.select = {};
FUI.select.dropdownParentSelectors = ['.sui-dialog-content', '.pum-container', '.elementor-popup-modal', '.popup', '[role="dialog"]', '[role="alertdialog"]'];
FUI.select.getDropdownParent = function ($select) {
var $customSelectors = $select.data('dropdown-parent-selector'),
$selectors = FUI.select.dropdownParentSelectors.join(', '),
$popupSelectors = FUI.select.dropdownParentSelectors.join(', '),
$parent = $select.closest($selectors),
$formParent = $();
if ('string' === typeof $customSelectors && $customSelectors.trim().length) {
$selectors = $customSelectors;
$parent = $select.closest($selectors);
}
if ($parent.length && $parent.is($popupSelectors)) {
$formParent = $select.closest('.forminator-custom-form');
if (!$formParent.length) {
$formParent = $select.closest('form');
}
if ($formParent.length) {
$parent = $formParent;
}
}
return $parent.length ? $parent : $(document.body);
};
FUI.select.formatCheckbox = function (data, container) {
var label = data.text;
var selected = data.selected;
var id = data.id || label.toLowerCase().replace(/\s+/g, '-');
var wrapper = document.createElement('label');
wrapper.setAttribute('for', id);
wrapper.className = 'forminator-checkbox';
var input = document.createElement('input');
input.type = 'checkbox';
input.value = label;
input.id = id;
if (selected) {
input.checked = true;
}
var box = document.createElement('span');
box.className = 'forminator-checkbox-box';
box.setAttribute('aria-hidden', 'true');
var text = document.createElement('span');
text.className = 'forminator-select-label';
text.textContent = label;
wrapper.appendChild(input);
wrapper.appendChild(box);
wrapper.appendChild(text);
return wrapper;
};
FUI.select2 = function () {
$('.forminator-custom-form').each(function () {
var $element = $(this),
$formid = $element.data('form-id'),
$select = $element.find('.forminator-select2');
var $themes = ['bold', 'flat', 'default', 'basic', 'material', 'none'];
$.each($themes, function (index, $theme) {
var $dir,
$language = 'en',
$placeholder = 'Select',
$hasSearch = -1,
$hasCheckbox = false;
if ($element.hasClass('forminator-design--' + $theme) && $select.length) {
$select.each(function () {
var $select = $(this),
$parent = FUI.select.getDropdownParent($select),
$dropdownClass = 'forminator-custom-form-' + $formid + ' forminator-dropdown--' + $theme;
if (true === $select.data('rtl-support') || 'rtl' === $select.closest('html').attr('dir')) {
$dir = 'rtl';
} else {
$dir = 'ltr';
}
if ($select.data('placeholder')) {
$placeholder = $select.data('placeholder');
} else {
$placeholder = 'Select';
}
if ($select.data('language')) {
$language = $select.data('language');
} else {
$language = 'en';
}
if (true === $select.data('search')) {
$hasSearch = 0;
} else {
$hasSearch = -1;
}
if (true === $select.data('checkbox')) {
$hasCheckbox = true;
$dropdownClass += ' forminator-dropdown--checkbox';
} else {
$hasCheckbox = false;
}
if ($select.prop('multiple')) {
$dropdownClass += ' forminator-dropdown--multiple';
}
$select.FUIselect2(_objectSpread({
dir: $dir,
language: $language,
placeholder: $placeholder,
dropdownCssClass: $dropdownClass,
minimumResultsForSearch: $hasSearch,
dropdownParent: $parent
}, $hasCheckbox && {
closeOnSelect: false,
templateResult: FUI.select.formatCheckbox,
escapeMarkup: function escapeMarkup(markup) {
return markup;
}
})).on('select2:opening', function () {
if ($select.data('search-placeholder')) {
$select.data('select2').$dropdown.find(':input.select2-search__field').prop('placeholder', $select.data('search-placeholder'));
} else {
$select.data('select2').$dropdown.find(':input.select2-search__field').prop('placeholder', $select.data('placeholder') ? $select.data('placeholder') : 'Search');
}
if ($select.closest('.hustle-popup').length || $select.closest('.hustle-slidein')) {
$(document.body).addClass('forminator-hustle-dropdown-fix');
}
}).on('select2:closing', function () {
$(document.body).removeClass('forminator-hustle-dropdown-fix');
});
});
}
});
});
};
})(jQuery);
(function () {
// Enable strict mode.
'use strict';
// Define global FUI object if it doesn't exist.
if ('object' !== _typeof(window.FUI)) {
window.FUI = {};
}
/**
* @namespace aria
*/
var aria = aria || {};
// REF: Key codes.
aria.KeyCode = {
BACKSPACE: 8,
TAB: 9,
RETURN: 13,
ESC: 27,
SPACE: 32,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
LEFT: 37,
UP: 38,
RIGHT: 39,
DOWN: 40,
DELETE: 46
};
aria.Utils = aria.Utils || {};
// UTILS: Remove function.
aria.Utils.remove = function (item) {
if (item.remove && 'function' === typeof item.remove) {
return item.remove();
}
if (item.parentNode && item.parentNode.removeChild && 'function' === typeof item.parentNode.removeChild) {
return item.parentNode.removeChild(item);
}
return false;
};
// UTILS: Verify if element can be focused.
aria.Utils.isFocusable = function (element) {
if (0 < element.tabIndex || 0 === element.tabIndex && null !== element.getAttribute('tabIndex')) {
return true;
}
if (element.disabled) {
return false;
}
switch (element.nodeName) {
case 'A':
return !!element.href && 'ignore' != element.rel;
case 'INPUT':
return 'hidden' != element.type && 'file' != element.type;
case 'BUTTON':
case 'SELECT':
case 'TEXTAREA':
return true;
default:
return false;
}
};
/**
* Simulate a click event.
* @public
* @param {Element} element the element to simulate a click on
*/
aria.Utils.simulateClick = function (element) {
// Create our event (with options)
var evt = new MouseEvent('click', {
bubbles: true,
cancelable: true,
view: window
});
// If cancelled, don't dispatch our event
var canceled = !element.dispatchEvent(evt);
};
// When util functions move focus around, set this true so
// the focus listener can ignore the events.
aria.Utils.IgnoreUtilFocusChanges = false;
aria.Utils.dialogOpenClass = 'forminator-authentication-enabled';
/**
* @desc Set focus on descendant nodes until the first
* focusable element is found.
*
* @param element
* DOM node for which to find the first focusable descendant.
*
* @returns
* true if a focusable element is found and focus is set.
*/
aria.Utils.focusFirstDescendant = function (element) {
for (var i = 0; i < element.childNodes.length; i++) {
var child = element.childNodes[i];
if (aria.Utils.attemptFocus(child) || aria.Utils.focusFirstDescendant(child)) {
return true;
}
}
return false;
}; // end focusFirstDescendant.
/**
* @desc Find the last descendant node that is focusable.
*
* @param element
* DOM node for which to find the last focusable descendant.
*
* @returns
* true if a focusable element is found and focus is set.
*/
aria.Utils.focusLastDescendant = function (element) {
for (var i = element.childNodes.length - 1; 0 <= i; i--) {
var child = element.childNodes[i];
if (aria.Utils.attemptFocus(child) || aria.Utils.focusLastDescendant(child)) {
return true;
}
}
return false;
}; // end focusLastDescendant
/**
* @desc Set Attempt to set focus on the current node.
*
* @param element
* The node to attempt to focus on.
*
* @returns
* true if element is focused.
*/
aria.Utils.attemptFocus = function (element) {
if (!aria.Utils.isFocusable(element)) {
return false;
}
aria.Utils.IgnoreUtilFocusChanges = true;
try {
element.focus();
} catch (e) {}
aria.Utils.IgnoreUtilFocusChanges = false;
return document.activeElement === element;
}; // end attemptFocus
// Modals can open modals. Keep track of them with this array.
aria.OpenDialogList = aria.OpenDialogList || new Array(0);
/**
* @returns the last opened dialog (the current dialog)
*/
aria.getCurrentDialog = function () {
if (aria.OpenDialogList && aria.OpenDialogList.length) {
return aria.OpenDialogList[aria.OpenDialogList.length - 1];
}
};
aria.closeCurrentDialog = function () {
var currentDialog = aria.getCurrentDialog();
if (currentDialog) {
currentDialog.close();
return true;
}
return false;
};
aria.handleEscape = function (event) {
var key = event.which || event.keyCode;
if (key === aria.Utils.ESC && aria.closeCurrentDialog()) {
event.stopPropagation();
}
};
document.addEventListener('keyup', aria.handleEscape);
/**
* @constructor
* @desc Dialog object providing modal focus management.
*
* Assumptions: The element serving as the dialog container is present in the
* DOM and hidden. The dialog container has role='dialog'.
*
* @param dialogId
* The ID of the element serving as the dialog container.
*
* @param focusAfterClosed
* Either the DOM node or the ID of the DOM node to focus when the
* dialog closes.
*
* @param focusFirst
* Optional parameter containing either the DOM node or the ID of the
* DOM node to focus when the dialog opens. If not specified, the
* first focusable element in the dialog will receive focus.
*/
aria.Authentication = function (dialogId, focusAfterClosed, focusFirst) {
this.dialogNode = document.getElementById(dialogId);
if (null === this.dialogNode) {
throw new Error('No element found with id="' + dialogId + '".');
}
var validRoles = ['dialog', 'alertdialog'];
var isDialog = (this.dialogNode.getAttribute('role') || '').trim().split(/\s+/g).some(function (token) {
return validRoles.some(function (role) {
return token === role;
});
});
if (!isDialog) {
throw new Error('Dialog() requires a DOM element with ARIA role of dialog or alertdialog.');
}
// Wrap in an individual backdrop element if one doesn't exist
// Native