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/assets/src/front/cache-busting/passive-group.js
/* eslint-disable */
import jQuery from 'jquery';

export class PassiveGroup {
	/**
	 * Constructor
	 *
	 * @param {object} item object which contains info about the group.
	 * @param {string} elementid cache busting wrapper id.
	 */
	constructor(item, elementid) {
		if (
			!advads_pro_utils.isset(item.group_info.id) ||
			!advads_pro_utils.isset(item.group_info.type) ||
			!advads_pro_utils.isset(item.group_info.weights) ||
			!advads_pro_utils.isset(item.group_info.ordered_ad_ids) ||
			!advads_pro_utils.isset(item.group_info.ad_count) ||
			!advads_pro_utils.isset(item.ads)
		) {
			throw new SyntaxError('Can not create Advads_passive_cb_Group obj');
		}

		this.id = item.group_info.id;
		this.name = item.group_info.name ? item.group_info.name : this.id;
		this.type = item.group_info.type;
		this.weights = item.group_info.weights;
		this.ordered_ad_ids = item.group_info.ordered_ad_ids;
		this.ad_count = item.group_info.ad_count;
		this.elementid = elementid ? elementid : null;
		this.slider_options = advads_pro_utils.isset(
			item.group_info.slider_options
		)
			? item.group_info.slider_options
			: false;
		this.refresh_enabled = advads_pro_utils.isset(
			item.group_info.refresh_enabled
		);

		if (advads_pro_utils.isset(item.group_info.refresh_interval_for_ads)) {
			this.refresh_interval = item.group_info.refresh_interval_for_ads;
		} else if (advads_pro_utils.isset(item.group_info.refresh_interval)) {
			// Deprecated.
			this.refresh_interval = item.group_info.refresh_interval;
		} else {
			this.refresh_interval = 2000;
		}

		this.placement =
			item instanceof Advads_passive_cb_Placement ? item : false;
		this.random = item.group_info.random;

		this.ads = item.ads;
		this.group_wrap = item.group_wrap;
		this.is_empty = true;
	}

	/**
	 * Inject group output inside the cache busting wrapper
	 */
	output() {
		var ad_for_adblocker =
			this.placement && this.placement.get_ad_for_adblocker();

		advanced_ads_pro.hasAd(this.id, 'group', this.name, 'passive');

		if (!ad_for_adblocker && this.refresh_enabled) {
			this.output_refresh();
			return;
		}

		var ordered_ad_ids,
			ads_displayed = 0,
			output_buffer = [];

		const group_for_ab =
			this.placement && this.placement.get_group_for_adblocker();
		if (group_for_ab) {
			this.ads = group_for_ab.ads;
		}

		switch (this.type) {
			case 'ordered':
			case 'slider':
				ordered_ad_ids = this.shuffle_ordered_ads(
					this.ordered_ad_ids,
					this.weights
				);
				break;
			case 'grid':
				ordered_ad_ids = this.random
					? this.shuffle_ads()
					: this.shuffle_ordered_ads(
							this.ordered_ad_ids,
							this.weights
						);
				break;
			default:
				ordered_ad_ids = this.shuffle_ads();
		}

		if (!Array.isArray(ordered_ad_ids) || !jQuery.isPlainObject(this.ads)) {
			return;
		}

		for (var i = 0; i < ordered_ad_ids.length; i++) {
			if (!this.ads.hasOwnProperty(ordered_ad_ids[i])) {
				continue;
			}
			var ad_info = this.ads[ordered_ad_ids[i]];

			if (typeof ad_info === 'object') {
				var ad = new Advads_passive_cb_Ad(ad_info, this.elementid);
				if (ad.can_display()) {
					if (ad_for_adblocker) {
						ad = ad_for_adblocker;
					}

					const canTrack =
						!advads.privacy ||
						'unknown' !== advads.privacy.get_state();

					if (
						(this.type === 'slider' && this.slider_options) ||
						this.group_wrap
					) {
						output_buffer.push(
							ad.output({
								track: canTrack,
								inject: false,
								do_has_ad: true,
							})
						);
					} else {
						ad.output({
							track: canTrack,
							inject: true,
							do_has_ad: true,
						});
					}
					ads_displayed++;
					this.is_empty = false;
				}
			}
			// break the loop when maximum ads are reached
			if (ads_displayed === this.ad_count) {
				break;
			}
			// show only first ad when an ad blocker is found.
			if (!this.is_empty && ad_for_adblocker) {
				break;
			}
		}

		if (output_buffer.length) {
			if (this.type === 'slider' && this.slider_options) {
				output_buffer = this.output_slider(output_buffer);
			}

			advanced_ads_pro.inject(
				this.elementid,
				this.add_group_wrap(output_buffer, ads_displayed)
			);
		}
	}

	/**
	 * Output for group that has a refresh set up
	 */
	output_refresh() {
		var ordered_ad_ids = this.ordered_ad_ids,
			output_buffer = [],
			self = this,
			index = 0,
			ad_id,
			prev_ad_id = false,
			tracked_ads = [],
			ads_displayed = 0,
			interval = this.refresh_interval;

		var $el = jQuery('.' + self.elementid);
		$el = advanced_ads_pro._inject_before(this.elementid, $el);

		if (!Array.isArray(ordered_ad_ids) || !jQuery.isPlainObject(this.ads)) {
			return;
		}

		/**
		 * Track the ad.
		 *
		 * @param {Object} ad Advads_passive_cb_Ad
		 */
		function track_ad(ad) {
			if (jQuery.inArray(ad.id, tracked_ads) < 0 && ad.tracking_enabled) {
				var data = {};
				data[ad.blog_id] = [ad.id];
				advanced_ads_pro.observers.fire({
					event: 'inject_passive_ads',
					ad_ids: data,
				});
			}
		}

		function pick_ids() {
			switch (self.type) {
				case 'ordered':
					var prev_index = ordered_ad_ids.indexOf(prev_ad_id);
					if (prev_index !== -1) {
						var new_ids = ordered_ad_ids
							.slice(prev_index + 1)
							.concat(ordered_ad_ids.slice(0, prev_index));
					} else {
						var new_ids = ordered_ad_ids;
					}
					break;
				default:
					var new_ids = self.shuffle_ads();
					var prev_index = new_ids.indexOf(prev_ad_id);
					if (prev_index !== -1) {
						new_ids.splice(prev_index, 1);
					}
			}
			return new_ids;
		}

		function get_ad_interval(ad_id) {
			if (typeof self.refresh_interval !== 'object') {
				return parseInt(self.refresh_interval, 10) || 2000;
			}

			return parseInt(self.refresh_interval[ad_id], 10) || 2000;
		}

		/**
		 * Get the 'float' property from the ad or the placement.
		 *
		 * @param {Object} ad Advads_passive_cb_Ad
		 * @return string
		 */
		function get_position(ad) {
			var position = '';
			if (
				advads_pro_utils.isset_nested(
					self.placement,
					'placement_info',
					'options',
					'placement_position'
				)
			) {
				position =
					self.placement.placement_info.options.placement_position;
			}
			if (['left', 'right'].indexOf(position) === -1) {
				position = ad.position;
			}

			return position;
		}

		(function tick() {
			var new_ids = pick_ids();
			var idsLen = new_ids.length;
			for (var i = 0; i < idsLen; i++) {
				var ad_id = new_ids[i];
				var ad_info = self.ads[ad_id];
				if (typeof ad_info === 'object') {
					var ad = new Advads_passive_cb_Ad(ad_info, self.elementid);
					if (ad.can_display()) {
						// The first ad will be tracked like all other passive ads.
						if (ads_displayed === 0) {
							output_buffer = [
								ad.output({
									track: true,
									inject: false,
									do_has_ad: true,
								}),
							];
							advanced_ads_group_refresh.prepare_wrapper(
								$el,
								get_position(ad),
								true
							);
						} else {
							var do_has_ad =
								jQuery.inArray(ad_id, tracked_ads) < 0;
							output_buffer = [
								ad.output({
									track: false,
									inject: false,
									do_has_ad: do_has_ad,
								}),
							];
							track_ad(ad);
							advanced_ads_group_refresh.prepare_wrapper(
								$el,
								get_position(ad),
								false
							);
						}
						tracked_ads.push(ad.id);

						advanced_ads_pro.inject(
							self.elementid,
							self.add_group_wrap(output_buffer, 1)
						);
						self.is_empty = false;
						ads_displayed++;
						setTimeout(function () {
							if (
								!self.placement ||
								self.placement.can_display()
							) {
								tick();
							}
						}, get_ad_interval(ad_id));
						prev_ad_id = ad.id;
						break;
					}
				}
			}
		})();
	}

	/**
	 * Get markup to inject around each ad and around entire set of ads (if needed)
	 *
	 * @param {Array}  output_buffer output buffer.
	 * @param {number} ads_displayed amount of ad to show for the group.
	 * @returns {string} output with wrapper (if any)
	 */
	add_group_wrap(output_buffer, ads_displayed) {
		if (!output_buffer.length) {
			return '';
		}

		var before = '',
			after = '';

		if (this.group_wrap) {
			for (var i = 0; i < this.group_wrap.length; i++) {
				var wrap = this.group_wrap[i];
				wrap.min_ads = wrap.min_ads || 1;

				if (typeof wrap !== 'object' || wrap.min_ads > ads_displayed) {
					continue;
				}
				if (wrap.before) {
					before = wrap.before + before;
				}
				if (wrap.after) {
					after = after + wrap.after;
				}
				if (typeof wrap.each === 'string') {
					for (var j = 0; j < output_buffer.length; j++) {
						output_buffer[j] = wrap.each.replace(
							'%s',
							output_buffer[j]
						);
					}
				} else if (typeof wrap.each === 'object') {
					var each_obj = wrap.each;

					for (var j = 0; j < output_buffer.length; j++) {
						for (var format_index in each_obj) {
							var ad_wrapped = false;

							if (
								each_obj.hasOwnProperty(format_index) &&
								format_index !== 'all' &&
								(1 + j) % parseInt(format_index, 10) === 0
							) {
								output_buffer[j] = each_obj[
									format_index
								].replace('%s', output_buffer[j]);
								ad_wrapped = true;
								break;
							}
						}

						if (!ad_wrapped && each_obj.all) {
							// applied here since JavaScript does not guarantee object key order
							output_buffer[j] = each_obj.all.replace(
								'%s',
								output_buffer[j]
							);
						}
					}
				}
			}
		}

		return before + output_buffer.join('') + after;
	}

	/**
	 * Output slider markup around slides
	 *
	 * @param   output_buffer output buffer
	 * @deprecated since AAS_VERSION > 1.3.1
	 * @returns {*[]}
	 */
	output_slider(output_buffer) {
		var output_html, ads_output;

		if (
			output_buffer.length > 1 &&
			typeof jQuery.fn.unslider === 'function'
		) {
			ads_output = output_buffer.join('</li><li>');
			output_buffer = [];

			output_buffer.push(
				'<div id="' +
					this.slider_options.slider_id +
					'" class="' +
					this.slider_options.init_class +
					' ' +
					this.slider_options.prefix +
					'slider"><ul><li>'
			);
			output_buffer.push(ads_output);
			output_buffer.push('</li></ul></div>');
			/* custom css file was added with version 1.1 of Advads Slider. Deactivate the following lines if there are issues with your layout
			 output_buffer.push( "<style>.advads-slider { position: relative; width: 100% !important; overflow: hidden; } " );
			 output_buffer.push( ".advads-slider ul, .advads-slider li { list-style: none; margin: 0 !important; padding: 0 !important; } " );
			 output_buffer.push( ".advads-slider ul li { width: 100%; float: left; }</style>" );
			 */
			output_buffer.push(
				'<scr' +
					"ipt>jQuery(function() { jQuery('." +
					this.slider_options.init_class +
					"').unslider({ " +
					this.slider_options.settings +
					' }); });</scr' +
					'ipt>'
			);
		}

		return output_buffer;
	}

	/**
	 * Shuffle ads that have the same weights.
	 *
	 * @param {Array} ordered_ad_ids Ad ids.
	 * @param {Object} weights ad_id: weight pairs.
	 * @return {Array} ordered_ad_ids Ad ids.
	 */
	shuffle_ordered_ads(ordered_ad_ids, weights) {
		// Get weights of ordered ad ids.
		const weight_array = [];
		for (var i = 0; i < ordered_ad_ids.length; i++) {
			var weight = weights[ordered_ad_ids[i]];
			if (!weight) {
				return ordered_ad_ids;
			}

			weight_array.push(weight);
		}

		var count = weight_array.length;
		var pos = 0;
		for (var i = 1; i <= count; i++) {
			if (i == count || weight_array[i] !== weight_array[i - 1]) {
				var slice_len = i - pos;
				if (slice_len !== 1) {
					var shuffled = advads_pro_utils.shuffle_array(
						ordered_ad_ids.slice(pos, pos + slice_len)
					);
					// Replace the unshuffled chunk of array with the shuffled one.
					var arg = [pos, slice_len].concat(shuffled);
					Array.prototype.splice.apply(ordered_ad_ids, arg);
				}
				pos = i;
			}
		}
		return ordered_ad_ids;
	}

	/**
	 * shuffle ads based on ad weight
	 *
	 * @return {Array} shuffled array with ad ids
	 */
	shuffle_ads() {
		const shuffled_ads = [],
			ad_weights = jQuery.extend({}, this.weights);

		let random_ad_id = advads_pro_utils.get_random_el_by_weight(ad_weights);

		// while non-zero weights are set select random next
		while (null !== random_ad_id) {
			// remove chosen ad from weights array
			delete ad_weights[random_ad_id];
			// put random ad into shuffled array
			shuffled_ads.push(parseInt(random_ad_id, 10));
			random_ad_id = advads_pro_utils.get_random_el_by_weight(ad_weights);
		}
		return shuffled_ads;
	}
}

export const PassiveGroupCompat = () => {
	window.Advads_passive_cb_Group = PassiveGroup;
};