PageSourceSearch

https://www.prdaily.com/wp-content/plugins/ragan-ticker-ad/assets/js/ragan-ticker-ad.js?ver=1.0.7

js prdaily.com collected 2026-09-24 07:13:29 UTC 3,834 bytes, 135 lines download raw bytes

1(function ($) {
2	$(function () {
3		var data = window.RaganTickerAdData || {};
4		var ads = data.ads || [];
5		var defaultCtaBg = '#F26B35';
6		var defaultCtaText = '#FFFFFF';
7		var defaultLogoWidth = '350px';
8
9		function darkenHex(hex, percent) {
10			var normalized = (hex || '').replace('#', '');
11			if (!/^[0-9a-fA-F]{6}$/.test(normalized)) {
12				return '';
13			}
14
15			var r = parseInt(normalized.substring(0, 2), 16);
16			var g = parseInt(normalized.substring(2, 4), 16);
17			var b = parseInt(normalized.substring(4, 6), 16);
18			var factor = (100 - percent) / 100;
19
20			r = Math.max(0, Math.min(255, Math.round(r * factor)));
21			g = Math.max(0, Math.min(255, Math.round(g * factor)));
22			b = Math.max(0, Math.min(255, Math.round(b * factor)));
23
24			return '#' + [r, g, b].map(function (v) {
25				var part = v.toString(16);
26				return part.length === 1 ? '0' + part : part;
27			}).join('');
28		}
29
30		if (!ads.length) {
31			return;
32		}
33
34		var selectedAd = ads[Math.floor(Math.random() * ads.length)];
35
36		// Basic validation
37		if (!selectedAd.image || !selectedAd.text || !selectedAd.link) {
38			return;
39		}
40
41		// Session suppression
42		try {
43			if (window.sessionStorage && sessionStorage.getItem('raganTickerAdDismissed')) {
44				return;
45			}
46		} catch (e) {
47			// Ignore sessionStorage issues.
48		}
49
50		var $target = $('.toplinks').first();
51		if (!$target.length) {
52			return;
53		}
54
55		// Build ad
56		var $ad = $('<div>', { class: 'ragan-ticker-ad' });
57		var $inner = $('<div>', { class: 'ragan-ticker-ad__inner' });
58		var $logo = $('<div>', { class: 'ragan-ticker-ad__logo' }).append(
59			$('<img>', { src: selectedAd.image, alt: '' })
60		);
61		var $content = $('<div>', { class: 'ragan-ticker-ad__content' }).html(selectedAd.text);
62		var $cta = $('<a>', {
63			class: 'ragan-ticker-ad__cta',
64			href: selectedAd.link,
65			text: selectedAd.button_text || 'START NOW',
66			target: '_blank',
67			rel: 'noopener'
68		});
69		var $close = $('<button>', {
70			type: 'button',
71			class: 'ragan-ticker-ad__close',
72			'aria-label': 'Close ticker ad',
73			text: '×'
74		});
75
76		var ctaBg = selectedAd.cta_bg || defaultCtaBg;
77		var ctaText = selectedAd.cta_text || defaultCtaText;
78		var ctaHover = darkenHex(ctaBg, 12) || '#D95D2E';
79		var logoWidth = selectedAd.logo_width || defaultLogoWidth;
80
81		$logo.css('max-width', logoWidth);
82		$content.css('color', selectedAd.text_color || '#193BA5');
83		$cta.css({
84			'background-color': ctaBg,
85			color: ctaText
86		});
87		$cta.on('mouseenter focus', function () {
88			$(this).css('background-color', ctaHover);
89		});
90		$cta.on('mouseleave blur', function () {
91			$(this).css('background-color', ctaBg);
92		});
93
94		// Mobile-only margin adjustment (for fixed header setups)
95		var headerSelector = '#header'; // set to your fixed header
96		var contentSelector = '#main';        //set to the element you push down
97		var isMobile = window.innerWidth < 768;
98
99		function adjustMargin(withAd) {
100			if (!isMobile) {
101				$(contentSelector).css('margin-top', ''); // clear for desktop
102				return;
103			}
104			var headerH = $(headerSelector).first().outerHeight(true) || 0;
105			var adH = withAd && $ad.length ? $ad.outerHeight(true) : 0;
106			$(contentSelector).css('margin-top', headerH);
107		}
108
109		$close.on('click', function (e) {
110			e.preventDefault();
111			try {
112				if (window.sessionStorage) {
113					sessionStorage.setItem('raganTickerAdDismissed', '1');
114				}
115			} catch (err) {
116				// Ignore sessionStorage issues.
117			}
118			$ad.remove();
119			//adjustMargin(false);
120		});
121
122		$inner.append($logo, $content, $cta, $close);
123		$ad.append($inner);
124		$ad.css('background-color', selectedAd.bg_color || '#E0E5FC');
125		$target.after($ad);
126
127		//adjustMargin(true);
128
129		// Re-run on load/resize for responsive changes
130		/*$(window).on('load resize', function () {
131			isMobile = window.innerWidth < 768;
132			adjustMargin($ad && $ad.parent().length);
133		});*/
134	});
135})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.