: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
jQuery( document ).ready( function ( $ ) {
function advads_load_ad_type_parameter_metabox ( ad_type ) {
jQuery( '#advanced-ad-type input' ).prop( 'disabled', true )
$( '#advanced-ads-tinymce-wrapper' ).hide()
$( '#advanced-ads-ad-parameters' ).html( '<span class="spinner advads-ad-parameters-spinner advads-spinner"></span>' )
'action': 'load_ad_parameters_metabox',
'ad_id': $( '#post_ID' ).val(),
'nonce': advadsglobal.ajax_nonce
success: function ( data, textStatus, XMLHttpRequest ) {
// toggle main content field.
$( '#advanced-ads-ad-parameters' ).html( data ).trigger( 'paramloaded' )
advads_maybe_textarea_to_tinymce( ad_type )
error: function ( MLHttpRequest, textStatus, errorThrown ) {
$( '#advanced-ads-ad-parameters' ).html( errorThrown )
} ).always( function ( MLHttpRequest, textStatus, errorThrown ) {
jQuery( '#advanced-ad-type input[name^="advanced_ad"]' ).prop( 'disabled', false );
$( document ).on( 'click', '#switch-to-adsense-type', function ( ev ) {
AdvancedAdsAdmin.AdImporter.adsenseCode = Advanced_Ads_Admin.get_ad_source_editor_text()
$( '#advanced-ad-type-adsense' ).trigger( 'click' )
$( this ).closest( 'li' ).addClass( 'hidden' )
$( document ).on( 'change', '#advanced-ad-type input', function () {
var ad_type = $( this ).val()
advads_load_ad_type_parameter_metabox( ad_type )
// trigger for ad injection after ad creation
$( '#advads-ad-injection-box .advads-ad-injection-button' ).on( 'click', function () {
var placement_type = this.dataset.placementType, // create new placement
placement_slug = this.dataset.placementSlug, // use existing placement
if ( ! placement_type && ! placement_slug ) { return }
if ( 'post_content' === placement_type ) {
var paragraph = prompt( advadstxt.after_paragraph_promt, 1 )
if ( paragraph !== null ) {
options.index = parseInt( paragraph, 10 )
$( '#advads-ad-injection-box .advads-loader' ).show()
$( '#advads-ad-injection-box-placements' ).hide()
$( 'body' ).animate( { scrollTop: $( '#advads-ad-injection-box' ).offset().top - 40 }, 1, 'linear' )
action: 'advads-ad-injection-content',
placement_type: placement_type,
placement_slug: placement_slug,
ad_id: $( '#post_ID' ).val(),
nonce: advadsglobal.ajax_nonce
success: function ( r, textStatus, XMLHttpRequest ) {
$( '#advads-ad-injection-box' ).html( 'an error occured' )
$( '#advads-ad-injection-box *' ).hide()
// append anchor to placement message
$( '#advads-ad-injection-message-placement-created .advads-placement-link' ).attr( 'href', $( '#advads-ad-injection-message-placement-created a' ).attr( 'href' ) + r )
$( '#advads-ad-injection-message-placement-created, #advads-ad-injection-message-placement-created *' ).show()
error: function ( MLHttpRequest, textStatus, errorThrown ) {
$( '#advads-ad-injection-box' ).html( errorThrown )
} ).always( function ( MLHttpRequest, textStatus, errorThrown ) {
// jQuery( '#advanced-ad-type input').prop( 'disabled', false );
// activate general buttons
$( '.advads-buttonset' ).advads_buttonset()
$( '.advads-accordion' ).accordion( {
$( '.advads-ad-list-tooltip' ).advads_tooltip( {
return jQuery( this ).find( '.advads-ad-list-tooltip-content' ).html()
// show edit icon in the last head column
$( '.post-type-advanced_ads .wp-list-table thead th:last-of-type' ).append( $( '<span class="dashicons dashicons-edit"></span>' ).on( 'click', function () {
$( '#show-settings-link' ).trigger( 'click' );
* Logic for placement list
const placementRows = jQuery( '.advads-placements-table tbody tr' );
const showHidePlacementRow = callback => {
placementRows.each( ( index, element ) => {
const $row = jQuery( element );
const rowData = $row.data( 'order' );
typeof rowData === 'undefined'
|| typeof rowData['type'] === 'undefined'
|| typeof rowData['name'] === 'undefined'
( selectedValue === '0' || rowData['type'] === selectedValue )
&& ( searchTerm === '' || rowData['name'].toLowerCase().indexOf( searchTerm.toLowerCase() ) !== - 1 )
// filter placement by type
jQuery( '.advads_filter_placement_type' ).on( 'change', function () {
selectedValue = jQuery( this ).val();
// search placement by name
jQuery( '.advads_search_placement_name' ).on( 'keyup', function () {
* Filter ad/ad group selection in new placement form.
const placementTypeRadios = document.querySelectorAll( '[name="advads[placement][type]"]' );
placementTypeRadios.forEach( radio => {
radio.addEventListener( 'input', event => {
jQuery( '[name="advads[placement][item]"]' ).attr( 'disabled', true );
wp.ajax.post( window.advadstxt.placements_allowed_ads.action, {
'_ajax_nonce': window.advadstxt.placements_allowed_ads.nonce,
'placement_type': event.target.value
jQuery( '[name="advads[placement][item]"]' )
.replaceWith( wp.template( 'advads-placement-ad-select' )( {items: Object.values( response.items )} ) );
jQuery( '.advads-delete-tag' ).each( function () {
jQuery( this ).on( 'click', function () {
var r = confirm( window.advadstxt.delete_placement_confirmation );
var row = jQuery( this ).parents( '.advanced-ads-placement-row' );
row.find( '.advads-placements-item-delete' ).prop( 'checked', true );
row.data( 'touched', true );
jQuery( '#advanced-ads-placements-form' ).submit();
// sort placement by type order or name
jQuery( '.advads-sort' ).on( 'click', function ( e ) {
var sort = jQuery( this );
var orderBy = sort.data( 'orderby' );
var table = jQuery( '.advads-placements-table' );
var rows = jQuery( '> tbody > tr', table );
var links = jQuery( '> thead th > a', table );
links.each( function () {
jQuery( this ).removeClass( 'advads-placement-sorted' );
sort.addClass( 'advads-placement-sorted' );
rows.sort( function ( a, b ) {
let orderA = jQuery( a ).data( 'order' );
let orderB = jQuery( b ).data( 'order' );
if ( orderBy === 'type' ) {
if ( orderA['words-between-repeats'] !== orderB['words-between-repeats'] ) {
return orderA['words-between-repeats'] ? 1 : -1;
if ( orderA['order'] === orderB['order'] ) {
if ( orderA['post-content-index'] && orderB['post-content-index'] && orderA['post-content-index'] !== orderB['post-content-index'] ) {
return (orderA['post-content-index'] < orderB['post-content-index'] ) ? -1 : 1;
return orderA['name'].localeCompare( orderB['name'], undefined, { numeric: true } );
return orderA['order'] - orderB['order'];
return orderA['name'].localeCompare( orderB['name'], undefined, { numeric: true } );
jQuery.each( rows, function ( index, row ) {
var url = window.location.pathname + window.location.search;
if ( url.indexOf( 'orderby=' ) !== - 1 ) {
url = url.replace( /\borderby=[0-9a-zA-Z_@.#+-]{1,50}\b/, 'orderby=' + orderBy );
url += '&orderby=' + orderBy;
window.history.replaceState( {orderby: orderBy}, document.title, url );
// show warning if Container ID option contains invalid characters
$( '#advads-output-wrapper-id' ).on( 'keyup', function () {
var id_value = $( this ).val()
if ( /^[a-z-0-9]*$/.test( id_value ) ) {
$( '.advads-output-wrapper-id-error' ).addClass( 'hidden' )
$( '.advads-output-wrapper-id-error' ).removeClass( 'hidden' )
// group page: add ad to group
$('.advads-group-add-ad button').on('click', function () {
var $settings_row = $( this ).closest('.advads-ad-group-form'),
$ad = $settings_row.find(
'.advads-group-add-ad-list-ads option:selected'
$weight_selector = $settings_row
.find('.advads-group-add-ad-list-weights')
$ad_table = $settings_row.find('.advads-group-ads tbody');
const adVal = $ad.val().match(/\d+/g);
adUrl = advancedAds.endpoints.editAd + adVal.pop();
// add new row if does not already exist
$weight_selector.length &&
!$ad_table.find('[name="' + $ad.val() + '"]').length
`<a target="_blank" href="${adUrl}">${$ad.text()}</a>`
.val($weight_selector.val())
'<td><button type="button" class="advads-remove-ad-from-group button">x</button></td>'
// group page: remove ad from group
$( '#advads-ad-group-list' ).on( 'click', '.advads-remove-ad-from-group', function () {
var $ad_row = $( this ).closest( 'tr' )
if ( $ad_row.data( 'ad-id' ) ) {
// save the ad id, it is needed when this ad is not included in any other group
$( '#advads-ad-group-list form' ).append(
'<input type="hidden" name="advads-groups-removed-ads[]" value="' + $ad_row.data( 'ad-id' ) + '">'
+ '<input type="hidden" name="advads-groups-removed-ads-gid[]" value="' + $ad_row.data( 'group-id' ) + '">'
// group page: handle switching of group types based on a class derrived from that type
$( '.advads-ad-group-type input' ).on( 'click', function () {
advads_show_group_options( $( this ) )
function advads_show_group_options ( el ) {
// first, hide all options except title and type
// iterate through all elements
var _this = jQuery( this )
_this.parents( '.advads-ad-group-form' ).find( '.advads-option:not(.static)' ).hide()
var current_type = _this.val()
// now, show only the ones corresponding with the group type
_this.parents( '.advads-ad-group-form' ).find( '.advads-group-type-' + current_type ).show()
// set default group options for earch group
advads_show_group_options( $( '.advads-ad-group-type input:checked' ) )
// show more than 3 ads when clicked on a link
$( '.advads-group-ads-list-show-more' ).on( 'click', function () {
$( this ).hide().parent().siblings( '.advads-ad-group-list-ads' ).children( 'div' ).show()
// automatically copy the first entered license key into all other empty fields
$( '.advads-settings-tab-main-form .advads-license-key' ).on( 'blur', function () {
// get number of license fields
var license_key = $( this ).val()
if ( '' === license_key ) {
var license_fields = $( '.advads-settings-tab-main-form .advads-license-key' )
var license_fields_without_value = []
// count license fields without value
license_fields.each( function ( i, el ) {
if ( '' === $( el ).val() ) {
license_fields_without_value.push( el )
// if there is only one field filled then take its content (probably a license key) and add it into the other fields
if ( license_fields.length === (license_fields_without_value.length + 1) ) {
$.each( license_fields_without_value, function ( i, el ) {
$( el ).val( license_key )
$( '.advads-license-activate' ).on( 'click', function () {
if ( ! this.dataset.addon ) {
advads_disable_license_buttons( true )
action: 'advads-activate-license',
addon: this.dataset.addon,
pluginname: this.dataset.pluginname,
optionslug: this.dataset.optionslug,
license: $( this ).parents( 'td' ).find( '.advads-license-key' ).val(),
security: $( '#advads-licenses-ajax-referrer' ).val()
$( '<span class="spinner advads-spinner"></span>' ).insertAfter( button )
// send and close message
$.post( ajaxurl, query, function ( r ) {
$( 'span.spinner' ).remove()
var parent = button.parents( 'td' )
const key = 'advanced-ads-licenses[' + query.addon + ']';
advadsTermination.setInitialValue( key, document.querySelector( '[name="' + key + '"]' ) );
parent.find( '.advads-license-activate-error' ).remove()
parent.find( '.advads-license-deactivate' ).show()
parent.find( '.advads-license-activate-active' ).fadeIn()
parent.find( 'input' ).prop( 'readonly', 'readonly' )
advads_disable_license_buttons( false )
} else if ( r === 'ex' ) {
var input = parent.find( 'input.advads-license-key' )
var link = parent.find( 'a.advads-renewal-link' )
var license_key = input.val()
var href = link.prop( 'href' )
link.prop( 'href', href.replace( '%LICENSE_KEY%', license_key ) )
parent.find( '.advads-license-activate-error' ).remove()
parent.find( '.advads-license-expired-error' ).show()
advads_disable_license_buttons( false )
parent.find( '.advads-license-activate-error' ).show().html( r )
advads_disable_license_buttons( false )
$( '.advads-license-deactivate' ).on( 'click', function () {
if ( ! this.dataset.addon ) { return }
advads_disable_license_buttons( true )
action: 'advads-deactivate-license',
addon: this.dataset.addon,
pluginname: this.dataset.pluginname,
optionslug: this.dataset.optionslug,
security: $( '#advads-licenses-ajax-referrer' ).val()
$( '<span class="spinner advads-spinner"></span>' ).insertAfter( button )
// send and close message
$.post( ajaxurl, query, function ( r ) {
$( 'span.spinner' ).remove()
button.siblings( '.advads-license-activate-error' ).hide()
button.siblings( '.advads-license-activate-active' ).hide()
button.siblings( '.advads-license-activate' ).show()
button.siblings( 'input' ).prop( 'readonly', false )
advads_disable_license_buttons( false )
} else if ( r === 'ex' ) {
button.siblings( '.advads-license-activate-error' ).hide()
button.siblings( '.advads-license-activate-active' ).hide()
button.siblings( '.advads-license-expired-error' ).show()
button.siblings( 'input' ).prop( 'readonly', false )
advads_disable_license_buttons( false )
button.siblings( '.advads-license-activate-error' ).show().html( r )
button.siblings( '.advads-license-activate-active' ).hide()
advads_disable_license_buttons( false )
// toggle license buttons – disable or not
function advads_disable_license_buttons ( disable = true ) {
var buttons = $( 'button.advads-license-activate, button.advads-license-deactivate' ) // all activation buttons
// disable all buttons to prevent issues when users try to enable multiple licenses at the same time
buttons.attr( 'disabled', 'disabled' )
buttons.removeAttr( 'disabled' )
* There are two formats of URL supported:
* admin.php?page=advanced-ads-settings#top#tab_id go to the `tab_id`
* admin.php?page=advanced-ads-settings#tab_id__anchor go to the `tab_id`, scroll to the `anchor`
* Extract the active tab and anchor from the URL hash.
* @var {string} hash The URL hash.
* @return {{tab: string, anchor: string}}
function advads_extract_tab( hash ) {
var hash_parts = hash.replace( /^#top(#|%23)/, '' ).replace( /(#|%23)/, '' ).split( '__' );
'tab': hash_parts[0] || jQuery( '.advads-tab' ).attr( 'id' ),