: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
window.PUM_Admin = window.PUM_Admin || {};
window.PUM_Admin.models = models;
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
slider: $('<input type="range" class="pum-range-slider" />'),
plus: $('<button type="button" class="pum-range-plus">+</button>'),
minus: $('<button type="button" class="pum-range-minus">-</button>')
$('.pum-field-rangeslider:not(.pum-rangeslider-initialized)').each(function () {
var $this = $(this).addClass('pum-rangeslider-initialized'),
$input = $this.find('input.pum-range-manual'),
$slider = rangesliders.cloneables.slider.clone(),
$plus = rangesliders.cloneables.plus.clone(),
$minus = rangesliders.cloneables.minus.clone(),
force: $input.data('force-minmax'),
min: parseInt($input.attr('min'), 10) || 0,
max: parseInt($input.attr('max'), 10) || 100,
step: parseInt($input.attr('step'), 10) || 1,
value: parseInt($input.attr('value'), 10) || 0
if (settings.force && settings.value > settings.max) {
settings.value = settings.max;
$input.val(settings.value);
max: (settings.force || (settings.max && settings.max > settings.value)) ? settings.max : settings.value *
step: settings.step || settings.value * 1.5 / 100,
}).on('change input', function () {
$input.next().after($minus, $plus);
window.PUM_Admin = window.PUM_Admin || {};
window.PUM_Admin.rangesliders = rangesliders;
.on('pum_init', PUM_Admin.rangesliders.init)
* Updates the input field when the slider is used.
.on('input', '.pum-field-rangeslider.pum-rangeslider-initialized .pum-range-slider', function () {
$slider.siblings('.pum-range-manual').val($slider.val());
* Update sliders value, min, & max when manual entry is detected.
.on('change', '.pum-range-manual', function () {
max = parseInt($input.prop('max'), 0),
min = parseInt($input.prop('min'), 0),
step = parseInt($input.prop('step'), 0),
force = $input.data('force-minmax'),
value = parseInt($input.val(), 0),
if (force && value > max) {
} else if (force && value < min) {
$input.val(value).trigger('input');
'max': force || (max && max > value) ? max : value * 1.5,
'step': step || value * 1.5 / 100,
.on('click', '.pum-range-plus', function (event) {
var $input = $(this).siblings('.pum-range-manual'),
max = parseInt($input.prop('max'), 0),
step = parseInt($input.prop('step'), 0),
force = $input.data('force-minmax'),
value = parseInt($input.val(), 0),
if (force && value > max) {
$input.val(value).trigger('input');
.on('click', '.pum-range-minus', function (event) {
var $input = $(this).siblings('.pum-range-manual'),
min = parseInt($input.prop('min'), 0),
step = parseInt($input.prop('step'), 0),
force = $input.data('force-minmax'),
value = parseInt($input.val(), 0),
if (force && value < min) {
$input.val(value).trigger('input');
/*******************************************************************************
* Copyright (c) 2019, Code Atlantic LLC
******************************************************************************/
$('.pum-field-select2 select').filter(':not(.pumselect2-initialized)').each(function () {
current = $this.data('current') || $this.val(),
object_type = $this.data('objecttype'),
object_key = $this.data('objectkey'),
object_excludes = $this.data('objectexcludes') || null,
dropdownParent: $this.parent()
if ($this.attr('multiple')) {
if (object_type && object_key) {
options = $.extend(options, {
data: function (params) {
action: 'pum_object_search',
pum_admin_vars.object_search_nonce,
s: params.term, // search term
object_type: object_type,
processResults: function (data, params) {
// parse the results into the format expected by Select2
// since we are using custom formatting functions we do not need to
// alter the remote JSON data, except to indicate that infinite
params.page = params.page || 1;
more: (params.page * 10) < data.total_count
escapeMarkup: function (markup) {
}, // let our custom formatter work
closeOnSelect: !options.multiple,
templateResult: PUM_Admin.select2.formatObject,
templateSelection: PUM_Admin.select2.formatObjectSelection
.addClass('pumselect2-initialized')
if (current !== null && current !== undefined) {
if (options.multiple && 'object' !== typeof current && current !== "") {
} else if (!options.multiple && current === '') {
if (object_type && object_key && current !== null && (typeof current === 'number' || current.length)) {
action: 'pum_object_search',
pum_admin_vars.object_search_nonce,
object_type: object_type,
exclude: object_excludes,
include: current && current.length ? (typeof current === 'string' || typeof current === 'number') ? [current] : current : null
success: function (data) {
$.each(data.items, function (key, item) {
// Add any option that doesn't already exist
if (!$this.find('option[value="' + item.id + '"]').length) {
$this.prepend('<option value="' + item.id + '">' + item.text + '</option>');
$this.val(current).trigger('change');
} else if (current && ((options.multiple && current.length) || (!options.multiple && current !== ""))) {
$this.val(current).trigger('change');
} else if (current === null) {
$this.val(current).trigger('change');
formatObject: function (object) {
formatObjectSelection: function (object) {
return object.text || object.text;
window.PUM_Admin = window.PUM_Admin || {};
window.PUM_Admin.select2 = select2;
.on('pum_init', function () {
PUM_Admin.select2.init();
* Cache your selectors, without messy code.
* @author Stephen Kamenar
(function ($, undefined) {
if (typeof window.$$ === 'function') {
cacheByContext = {}, // '#context': (a cache object for the element)
tmp, tmp2; // Here for performance/minification
window.$$ = function (selector, context) {
if (tmp = context.selector) {
tmp2 = cacheByContext[context];
if (tmp2 === undefined) {
tmp2 = cacheByContext[context] = {};
return tmp2[selector] = $(selector, $$(context));
return cache[selector] = $(selector);
window.$$clear = function (selector, context) {
if (tmp = context.selector) {
if (selector && (tmp = cacheByContext[context])) {
tmp[selector] = undefined;
cacheByContext[context] = undefined;
cache[selector] = undefined;
cacheByContext[selector] = undefined;
window.$$fresh = function (selector, context) {
$$clear(selector, context);
return $$(selector, context);
* @copyright 2014, macek <paulmacek@gmail.com>
* @link https://github.com/macek/jquery-serialize-object
(function (root, factory) {
if (typeof define === "function" && define.amd) {
define(["exports", "jquery"], function (exports, $) {
return factory(exports, $);
else if (typeof exports !== "undefined") {
var $ = require("jquery");
factory(root, (root.jQuery || root.Zepto || root.ender || root.$));
}(this, function (exports, $) {
validate: /^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i,
key: /[a-z0-9_]+|(?=\[\])/gi,
function FormSerializer(helper, $form) {
function build(base, key, value) {
function makeObject(root, value) {
var keys = root.match(patterns.key), k,
field = document.querySelector('[name="' + root + '"]'),
if ("INPUT" === field.tagName) {
if ("SELECT" === field.tagName) {
} else if ("TEXTAREA" === field.tagName) {
if (['textarea', 'text'].indexOf(type) >= 0) {
value = JSON.parse(value);
while ((k = keys.pop()) !== undefined) {
if (patterns.push.test(k)) {
var idx = incrementPush(root.replace(/\[\]$/, ''));
value = build([], idx, value);
else if (patterns.fixed.test(k)) {
value = build([], k, value);
else if (patterns.named.test(k)) {
value = build({}, k, value);
function incrementPush(key) {
if (pushes[key] === undefined) {
switch ($('[name="' + pair.name + '"]', $form).attr("type")) {
return pair.value === "1" ? true : pair.value;
if (!patterns.validate.test(pair.name)) return this;
var obj = makeObject(pair.name, encode(pair));
data = helper.extend(true, data, obj);
function addPairs(pairs) {
if (!helper.isArray(pairs)) {
throw new Error("formSerializer.addPairs expects an Array");
for (var i = 0, len = pairs.length; i < len; i++) {