: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/*******************************************************************************
* Copyright (c) 2020, Code Atlantic LLC
******************************************************************************/
window.PUM_Admin = window.PUM_Admin || {};
window.pum_popup_settings_editor = window.pum_popup_settings_editor || {
.on( 'keydown', '#popup-title', function( event ) {
var keyCode = event.keyCode || event.which;
.on( 'keydown', '#title, #popup-title', function( event ) {
var keyCode = event.keyCode || event.which,
if ( ! event.shiftKey && 9 === keyCode ) {
$( this ).attr( 'id' ) === 'title'
: '#insert-media-button';
.on( 'keydown', '#popup-title, #insert-media-button', function(
var keyCode = event.keyCode || event.which,
if ( event.shiftKey && 9 === keyCode ) {
$( this ).attr( 'id' ) === 'popup-title'
$( this ).trigger( 'pum_init' );
$( '#title' ).prop( 'required', true );
var $container = $( '#pum-popup-settings-container' ),
args = pum_popup_settings_editor.form_args || {},
values = pum_popup_settings_editor.current_values || {};
if ( $container.length ) {
$container.find( '.pum-no-js' ).hide();
PUM_Admin.forms.render( args, values, $container );
$( 'a.page-title-action' )
.attr( 'target', '_blank' )
'?popup_preview=' + pum_popup_settings_editor.preview_nonce + '&popup=' +
.text( pum_admin_vars.I10n.preview_popup )
.insertAfter( 'a.page-title-action' );
// TODO Can't figure out why this is needed, but it looks stupid otherwise when the first condition field defaults to something other than the placeholder.
$( '#pum-first-condition, #pum-first-trigger, #pum-first-cookie' )
// Add event handler to detect when opening sound is change and play the sound to allow admin to preview it.
.querySelector( '#pum-popup-settings-container' )
.addEventListener( 'change', function( e ) {
if ( 'open_sound' === e.target.id ) {
// Only play if the sound selected is not None or Custom.
var notThese = [ 'none', 'custom' ];
if ( notThese.indexOf( e.target.value ) === -1 ) {
pum_admin_vars.pm_dir_url +
this.play().catch( function( reason ) {
'Sound was not able to play when selected. Reason: ' +
audio.addEventListener( 'error', function() {
'Error occurred when trying to load popup opening sound.'
// Dynamically switches example click trigger from popup-{popup-id} to using real ID.
$( document ).on( 'pum_init', function() {
'#pum-default-click-trigger-class:not(.pum-click-trigger-initialized)'
.addClass( 'pum-click-trigger-initialized' )
.text( $( '#popup-id' ).data( 'popup-id' ) );
.querySelector( '#pum-popup-settings-container' )
.addEventListener( 'click', function( e ) {
Array.from( e.target.classList ).includes(
Array.from( e.target.parentElement.classList ).includes(
'#pum-popup-settings-container'
if ( 1 === $container.length ) {
// Our initial presets. As we add more, consider creating JSON import system and moving to there.
responsive_min_width: '0%',
responsive_max_width: '100%',
position_from_trigger: false,
disable_reposition: false,
responsive_min_width: '0%',
responsive_max_width: '100%',
animation_origin: 'left bottom',
position_from_trigger: false,
disable_reposition: false,
custom_height_auto: true,
animation_type: 'fadeAndSlide',
position_from_trigger: false,
disable_reposition: false,
'right-bottom-slidein': {
custom_height_auto: true,
animation_origin: 'bottom',
location: 'right bottom',
position_from_trigger: false,
disable_reposition: false,
e.target.dataset.popupType ||
e.target.parentElement.dataset.popupType ||
// Gather our values needed for creating new settings object.
var presetValues = popupTypes.hasOwnProperty(
? popupTypes[ popupType ]
pum_popup_settings_editor.form_args || {};
pum_popup_settings_editor.current_values || {};
var currentValues = $container.pumSerializeObject();
// pumSerializeObject returns the trigger/cookie settings as strings instead of objects.
// Cycle through each trigger and cookie and convert to objects.
if ( currentValues.popup_settings.triggers ) {
currentValues.popup_settings.triggers
currentValues.popup_settings.triggers[
currentValues.popup_settings.triggers[
if ( currentValues.popup_settings.cookies ) {
currentValues.popup_settings.cookies.length;
currentValues.popup_settings.cookies[
currentValues.popup_settings.cookies[
var newValues = Object.assign(
currentValues.popup_settings,
// Re-render form using updated settings.
// Click to 'Display' so they don't jump to 'Targeting' tab upon render.
'a[href="#pum-popup-settings_display"]'
// Adds a notice into 'Display Presets' tab telling admin the settings have been applied.
var notice = document.createElement( 'div' );
notice.classList.add( 'notice', 'updated' );
document.createElement( 'p' ),
notice.firstChild.innerText =
'Display settings have been updated with the ' +
var parent = document.querySelector(
'#pum-popup-settings-display-subtabs_preset'
parent.insertBefore( notice, parent.firstChild );
( function( $, document, undefined ) {
$( document ).on( 'click', '#popup_reset_open_count', function() {
$this.is( ':checked' ) &&
! confirm( pum_admin_vars.I10n.confirm_count_reset )
$this.prop( 'checked', false );
get_conditions: function() {
return window.pum_popup_settings_editor.conditions_selectlist;
not_operand_checkbox: function( $element ) {
$element = $element || $( '.pum-not-operand' );
return $element.each( function() {
$input = $this.find( 'input' );
$input.prop( 'checked', ! $input.is( ':checked' ) );
conditions.toggle_not_operand( $this );
toggle_not_operand: function( $element ) {
$element = $element || $( '.pum-not-operand' );
return $element.each( function() {
$input = $this.find( 'input' ),
// $is = $this.find('.is'),
// $not = $this.find('.not'),
$container = $this.parents( '.facet-target' );
if ( $input.is( ':checked' ) ) {
$container.addClass( 'not-operand-checked' );
$container.removeClass( 'not-operand-checked' );
editor: function( args ) {
data.groups = PUM_Admin.utils.object_to_array( data.groups );
return PUM_Admin.templates.render(
group: function( args ) {
data.facets = PUM_Admin.utils.object_to_array( data.facets );
for ( i = 0; data.facets.length > i; i++ ) {
data.facets[ i ].index = i;
data.facets[ i ].group = data.index;
return PUM_Admin.templates.render(
facet: function( args ) {
return PUM_Admin.templates.render(
settings: function( args, values ) {
pum_popup_settings_editor.conditions[ args.target ] !==
pum_popup_settings_editor.conditions[
if ( undefined === values ) {
// Replace the array with rendered fields.
_.each( data.fields, function( field, fieldID ) {
field = PUM_Admin.models.field( field );
if ( typeof field.meta !== 'object' ) {
if ( undefined !== values[ fieldID ] ) {
field.value = values[ fieldID ];
'popup_settings[conditions][' +
'popup_settings_conditions_' +
fields.push( PUM_Admin.templates.field( field ) );
return PUM_Admin.templates.section( {
selectbox: function( args ) {
options: conditions.get_conditions(),
if ( data.id === null ) {