: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
container_classes = ['pum-dynamic-form'];
if (Object.keys(data.tabs).length && Object.keys(data.sections).length) {
container_classes.push('tabbed-content');
_.each(data.fields, function (subTabs, tabID) {
// If not a valid tab or no subsections skip it.
if (typeof subTabs !== 'object' || !Object.keys(subTabs).length) {
if (undefined === maintabs.tabs[tabID]) {
// Define the sub tabs model.
subtabs = $.extend(subtabs, {
id: data.id + '-' + tabID + '-subtabs',
_.each(subTabs, function (subTabFields, subTabID) {
// If not a valid subtab or no fields skip it.
if (typeof subTabFields !== 'object' || !Object.keys(subTabFields).length) {
// Move single fields into the main subtab.
if (forms.is_field(subTabFields)) {
var newSubTabFields = {};
newSubTabFields[subTabID] = subTabFields;
subTabFields = newSubTabFields;
// Define this subtab model.
if (undefined === subtabs.tabs[subTabID]) {
subtabs.tabs[subTabID] = {
label: data.sections[tabID][subTabID],
subTabFields = forms.parseFields(subTabFields, values);
// Loop Tab Section Fields
_.each(subTabFields, function (field) {
// Store the field by id for easy lookup later.
form_fields[field.id] = field;
// Push rendered fields into the subtab content.
subtabs.tabs[subTabID].content += PUM_Admin.templates.field(field);
// Remove any empty tabs.
if ("" === subtabs.tabs[subTabID].content) {
delete subtabs.tabs[subTabID];
// If there are subtabs, then render them into the main tabs content, otherwise remove this main tab.
if (Object.keys(subtabs.tabs).length) {
maintabs.tabs[tabID].content = PUM_Admin.templates.tabs(subtabs);
delete maintabs.tabs[tabID];
if (Object.keys(maintabs.tabs).length) {
form = PUM_Admin.templates.tabs(maintabs);
} else if (Object.keys(data.tabs).length) {
container_classes.push('tabbed-content');
_.each(data.fields, function (tabFields, tabID) {
// If not a valid tab or no subsections skip it.
if (typeof tabFields !== 'object' || !Object.keys(tabFields).length) {
if (undefined === maintabs.tabs[tabID]) {
tabFields = forms.parseFields(tabFields, values);
_.each(tabFields, function (field) {
// Store the field by id for easy lookup later.
form_fields[field.id] = field;
// Push rendered fields into the subtab content.
section.push(PUM_Admin.templates.field(field));
// Push rendered tab into the tab.
// Push rendered sub tabs into the main tabs if not empty.
maintabs.tabs[tabID].content = PUM_Admin.templates.section({
delete (maintabs.tabs[tabID]);
if (Object.keys(maintabs.tabs).length) {
form = PUM_Admin.templates.tabs(maintabs);
} else if (Object.keys(data.sections).length) {
_.each(data.fields, function (sectionFields, sectionID) {
section.push(PUM_Admin.templates.field({
desc: data.sections[sectionID] || ''
sectionFields = forms.parseFields(sectionFields, values);
// Loop Tab Section Fields
_.each(sectionFields, function (field) {
// Store the field by id for easy lookup later.
form_fields[field.id] = field;
// Push rendered fields into the section.
section.push(PUM_Admin.templates.field(field));
// Push rendered sections into the form.
form += PUM_Admin.templates.section({
data.fields = forms.parseFields(data.fields, values);
// Replace the array with rendered fields.
_.each(data.fields, function (field) {
// Store the field by id for easy lookup later.
form_fields[field.id] = field;
// Push rendered fields into the section.
section.push(PUM_Admin.templates.field(field));
form = PUM_Admin.templates.section({
if ($container !== undefined && $container.length) {
.addClass(container_classes.join(' '))
.data('form_fields', form_fields)
parseValues: function (values, fields) {
fields = fields || false;
for (var key in fields) {
if (!fields.hasOwnProperty(key)) {
// Measure field value corrections.
if (values.hasOwnProperty(key + "_unit")) {
values[key] += values[key + "_unit"];
delete values[key + "_unit"];
// If the value key is empty and a checkbox set it to false. Then return.
if (typeof values[key] === 'undefined') {
if (fields[key].type === 'checkbox') {
if (fields[key].allow_html && !PUM_Admin.utils.htmlencoder.hasEncoded(values[key])) {
values[key] = PUM_Admin.utils.htmlencoder.htmlEncode(values[key]);
window.PUM_Admin = window.PUM_Admin || {};
window.PUM_Admin.forms = forms;
.on('pum_init pum_form_check', function () {
.on('pumFieldChanged', '.pum-field', function () {
dependent_field_ids = $wrapper.data('pum-field-dependents') || [],
$fields_with_dependencies = $(),
if (!dependent_field_ids || dependent_field_ids.length <= 0) {
for (i = 0; i < dependent_field_ids.length; i++) {
$fields_with_dependencies = $fields_with_dependencies.add('.pum-field[data-id="' + dependent_field_ids[i] + '"]');
PUM_Admin.forms.checkDependencies($fields_with_dependencies);
.on('pumFieldChanged', '.pum-field-dynamic-desc', function () {
$input = $this.find(':input'),
$container = $this.parents('.pum-dynamic-form:first'),
form_fields = $container.data('form_fields') || {},
field = form_fields[$this.data('id')] || {},
$desc = $this.find('.pum-desc'),
desc = $this.data('pum-dynamic-desc');
val = $this.find(':input:checked').val();
if (desc && desc.length) {
$desc.html(PUM_Admin.templates.renderInline(desc, field));
.on('change', '.pum-field-select select', function () {
$(this).parents('.pum-field').trigger('pumFieldChanged');
.on('click', '.pum-field-checkbox input', function () {
$(this).parents('.pum-field').trigger('pumFieldChanged');
.on('click', '.pum-field-multicheck input', function () {
$(this).parents('.pum-field').trigger('pumFieldChanged');
.on('click', '.pum-field-radio input', function (event) {
$selected = $this.parents('li'),
$wrapper = $this.parents('.pum-field');
$wrapper.trigger('pumFieldChanged');
$wrapper.find('li.pum-selected').removeClass('pum-selected');
$selected.addClass('pum-selected');
function pumSelected(val1, val2, print) {
if (typeof val1 === 'object' && typeof val2 === 'string' && jQuery.inArray(val2, val1) !== -1) {
} else if (typeof val2 === 'object' && typeof val1 === 'string' && jQuery.inArray(val1, val2) !== -1) {
} else if (val1 === val2) {
if (print !== undefined && print) {
return selected ? ' selected="selected"' : '';
function pumChecked(val1, val2, print) {
if (typeof val1 === 'object' && typeof val2 === 'string' && jQuery.inArray(val2, val1) !== -1) {
} else if (typeof val2 === 'object' && typeof val1 === 'string' && jQuery.inArray(val1, val2) !== -1) {
} else if (val1 === val2) {
if (print !== undefined && print) {
return checked ? ' checked="checked"' : '';
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
focusableElementsString = "a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]",
// Accessibility: Checks focus events to ensure they stay inside the modal.
forceFocus: function (event) {
if (PUM_Admin.modals._current && !PUM_Admin.modals._current.contains(event.target)) {
PUM_Admin.modals._current.focus();
trapEscapeKey: function (e) {
PUM_Admin.modals.closeAll();
trapTabKey: function (e) {
// if tab or shift-tab pressed
// get list of focusable items
var focusableItems = PUM_Admin.modals._current.find('*').filter(focusableElementsString).filter(':visible'),
// get currently focused item
focusedItem = $(':focus'),
// get the number of focusable items
numberOfFocusableItems = focusableItems.length,
// get the index of the currently focused item
focusedItemIndex = focusableItems.index(focusedItem);
// if focused on first item and user preses back-tab, go to the last focusable item
if (focusedItemIndex === 0) {
focusableItems.get(numberOfFocusableItems - 1).focus();
// if focused on the last item and user preses tab, go to the first focusable item
if (focusedItemIndex === numberOfFocusableItems - 1) {
focusableItems.get(0).focus();
setFocusToFirstItem: function () {
// set focus to first focusable item
PUM_Admin.modals._current.find('.pum-modal-content *').filter(focusableElementsString).filter(':visible').first().focus();
closeAll: function (callback) {
$('.pum-modal-background')
.off('keydown.pum_modal')
$('html').css({overflow: 'visible', width: 'auto'});
// Accessibility: Focus back on the previously focused element.
if (previouslyFocused.length) {
previouslyFocused.focus();
// Accessibility: Clears the PUM_Admin.modals._current var.
PUM_Admin.modals._current = null;
// Accessibility: Removes the force focus check.
$document.off('focus.pum_modal');
if (undefined !== callback) {
.attr('aria-modal', 'false');
show: function (modal, callback) {
$('.pum-modal-background')
.off('keydown.pum_modal')
.attr('aria-modal', 'true');
.data('origwidth', $html.innerWidth())
.css({overflow: 'hidden', 'width': $html.innerWidth()});
// Accessibility: Sets the previous focus element.
var $focused = $(':focus');
if (!$focused.parents('.pum-modal-wrap').length) {
previouslyFocused = $focused;
// Accessibility: Sets the current modal for focus checks.
PUM_Admin.modals._current = $(modal);
// Accessibility: Close on esc press.
PUM_Admin.modals._current
.on('keydown.pum_modal', function (e) {
PUM_Admin.modals.trapEscapeKey(e);
PUM_Admin.modals.trapTabKey(e);
PUM_Admin.modals._current
// Accessibility: Add focus check that prevents tabbing outside of modal.
.on('focus.pum_modal', PUM_Admin.modals.forceFocus);
// Accessibility: Focus on the modal.
PUM_Admin.modals.setFocusToFirstItem();
if (undefined !== callback) {
remove: function (modal) {
replace: function (modal, replacement) {
PUM_Admin.modals.remove($.trim(modal));
$('body').append($.trim(replacement));
reload: function (modal, replacement, callback) {
PUM_Admin.modals.replace(modal, replacement);
PUM_Admin.modals.show(modal, callback);
$(modal).trigger('pum_init');
window.PUM_Admin = window.PUM_Admin || {};
window.PUM_Admin.modals = modals;
$(document).on('click', '.pum-modal-background, .pum-modal-wrap .cancel, .pum-modal-wrap .pum-modal-close', function (e) {
var $target = $(e.target);
if (/*$target.hasClass('pum-modal-background') || */$target.hasClass('cancel') || $target.hasClass('pum-modal-close') || $target.hasClass('submitdelete')) {
PUM_Admin.modals.closeAll();
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
return $.extend(true, {}, {