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.