HEX
Server: Apache/2.4.65 (Debian)
System: Linux 88f31f35b0b8 6.1.0-38-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.147-1 (2025-08-02) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/advanced-ads-pro/src/js/front/cache-busting/group-refresh.js
/* eslint-disable */
/*
 * Group refresh
 */
import jQuery from 'jquery';
import { PassivePlacement } from './passive-placement';

export const GroupRefresh = {
	/**
	 * Wrapper ids of groups with refresh enabled.
	 */
	element_ids: {},

	/**
	 * Equivalent passive cb data for groups using ajax refresh
	 */
	passiveRefresh: {},

	/**
	 * Collect placement group and ad data on the very first impression of an ajax refresh group
	 *
	 * @param {Object} data all the data needed for a passive placement creation.
	 */
	collectPassiveRefreshData: (data) => {
		GroupRefresh.passiveRefresh[data.cb_id] = data;
	},

	/**
	 * Empty a CB wrapper then create a passive placement using the same wrapper
	 *
	 * @param {string} cbid id of the CB wrapper.
	 */
	switchToPassive: (cbid) => {
		const data = GroupRefresh.passiveRefresh[cbid];
		setTimeout(
			() => {
				jQuery(`.${data.cb_id}`).empty();
				GroupRefresh.launchRefresh(data);
			},
			parseInt(data.default_interval, 10)
		);
	},

	/**
	 * Create and output a passive placement with a refreshed group
	 *
	 * @param {Object} data data needed for a passive placement creation.
	 */
	launchRefresh: (data) => {
		new PassivePlacement(
			{
				id: data.placement_info.id,
				type: data.type,
				ads: data.ads,
				placement_info: data.placement_info,
				group_info: data.group_info,
				group_wrap: data.group_wrap,
			},
			data.cb_id
		).output();
	},

	/**
	 * Requests group with AJAX. Uses single request, if possible.
	 *
	 * @param {obj} query
	 * @param {int} interval
	 */
	add_query: (function advanced_ads_group_refresh_add_query(query, interval) {
		var queries = [];
		return function (query, interval) {
			var elementid = query.elementid;
			var call_at = new Date().getTime() + interval;
			queries[call_at] = queries[call_at] || [];
			queries[call_at].push(query);

			setTimeout(function () {
				var now = new Date().getTime();
				var requests = [];

				for (const call_time in queries) {
					if (!queries.hasOwnProperty(call_time)) {
						continue;
					}

					if (now > call_time - 1000) {
						// Gather multiple requests into one request.
						var queries_for_time = queries[call_time];
						var queries_length = queries_for_time.length;

						for (var i = 0; i < queries_length; i++) {
							requests.push(queries_for_time[i]);
						}

						delete queries[call_time];
					}
				}

				advanced_ads_pro.process_ajax_ads(requests);
			}, interval);
		};
	})(),

	/**
	 * Find a first floated div.
	 *
	 * @param {jQuery} $el Element id.
	 * @return string/false
	 */
	find_float: function ($el) {
		var r = false;
		$el.find('div').each(function (i, el) {
			if (this.style.float === 'left' || this.style.float === 'right') {
				r = this.style.float;
				return false;
			}
		});
		return r;
	},

	/**
	 * Prepare the wrapper for inserting new ad.
	 *
	 * @param {jQuery} $el Wrapper id.
	 * @param {string|bool} float The float setting of the ad.
	 * @param {bool} is_first_time True for the first ad injection.
	 */
	prepare_wrapper: function ($el, float, is_first_time) {
		if (!is_first_time) {
			this.maybe_increase_sizes($el);
			$el.empty();
		}
		this.set_float($el, float);
	},

	/**
	 * Increase the width and height of the wrapper to fit an ad.
	 * The width and height can only be increased, not decreased to minimize content jumping.
	 *
	 * @param {jQuery} $el Element id.
	 */
	maybe_increase_sizes: function ($el) {
		var float = $el.css('float');
		if (['left', 'right'].indexOf(float) === -1) {
			float = false;
		}
		var sizes = {};

		if (float) {
			// Check if we need to increase the width.
			var prev_w = parseInt($el.css('min-width'), 10) || 0;
			// Get measured width.
			var now_w = $el.prop('scrollWidth') || 0;
			if (now_w > prev_w) {
				sizes['min-width'] = now_w;
			}
		}

		// Check if we need to increase the height.
		var prev_h = parseInt($el.css('min-height'), 10) || 0;
		// Get measured height.
		var now_h = $el.prop('scrollHeight') || 0;

		if (now_h > prev_h) {
			sizes['min-height'] = now_h;
		}

		if (sizes['min-height'] || sizes['min-width']) {
			$el.css(sizes);
		}
	},

	/**
	 * Get the 'float' attribute from the ad or the placement (nested floated divs) and assign it to '$el'.
	 *
	 * @param {jQuery} $el Wrapper id.
	 * @param {string|bool} float The float setting of the ad.
	 */
	set_float: function ($el, float) {
		if (['left', 'right'].indexOf(float) === -1) {
			float = false;
		}

		var prev_float = $el.data('prev_float') || false;

		if (float !== prev_float) {
			$el.data('prev_float', float);

			if (float) {
				// Allow to measure the size of the '$el' that contains floated divs using 'scrollWidth/Height'
				// Allow texts to be floated around the '$el' that has 'min-height' set.
				$el.css({ 'min-width': '', 'min-height': '', float: float });
			} else {
				$el.css({ 'min-width': '', 'min-height': '', float: '' });
			}
		}
	},
};

export const GroupRefreshCompat = () => {
	window.advanced_ads_group_refresh = GroupRefresh;
};