1/* 2 * This script handles showing or hiding the General Data Protection Regulation (GDPR) Privacy Policy pop up. 3 * It's only shown to members who haven't previously dismissed the pop up. 4 * 5 * @requires $ (jQuery) 6 * @requires Set_Cookie, Get_Cookie (static/js/cookie.js) 7 */ 8 9/* global $, Set_Cookie, Get_Cookie */ 10 11 12$(document).ready(function() { 13 const PRIVACY_POLICY_COOKIE_NAME = 'gdpr_privacy_popup_closed'; 14 const UPDATED_PRIVACY_POLICY_COOKIE_NAME = 'gdpr_privacy_updated_popup_closed'; 15 16 const PRIVACY_POLICY_COOKIE_EXPIRATION_DAYS = 20 * 365; // 20 years 17 const UPDATED_PRIVACY_POLICY_COOKIE_EXPIRATION_DAYS = 90; // 90 days 18 19 const $body = $('body'); 20 21 var $updatedPrivacyBlock = $('#updated-privacy-policy-block'); 22 var $updatedPrivacyLink = $('#updated-privacy-policy-block .gdpr-link-privacy'); 23 var $updatedPrivacyPrompt = $('#updated-privacy-policy-block .gdpr-content'); 24 25 var $privacyBlock = $('#privacy-policy-block'); 26 var $privacyLink = $('#privacy-policy-block .gdpr-link-privacy'); 27 var $privacyPrompt = $('#privacy-policy-block .gdpr-content'); 28 29 const hasUpdatedPrivacyPolicy = $updatedPrivacyBlock.length > 0; 30 31 // we need to do this because if the page is not republished it will load the script with the old privacy policy html 32 if (!hasUpdatedPrivacyPolicy) { 33 $privacyBlock = $('.gdpr-block-privacy'); 34 $privacyLink = $('.gdpr-link-privacy'); 35 $privacyPrompt = $('.gdpr-block-privacy .gdpr-content'); 36 } 37 38 function initializeInterface() { 39 if (window.getFeatureBooleanFlag) { 40 window.getFeatureBooleanFlag('privacy-policy-banner-updates', exposePrivacyPolicyExperiment); 41 } else { 42 console.error('Growthbook is not initialized. Privacy policy experiment will not be applied.'); 43 showPrivacyPolicyPrompt(); 44 } 45 } 46 47 function registerHandlers() { 48 const privacyBannerCookiesToSet = [ 49 { 50 cookieName: PRIVACY_POLICY_COOKIE_NAME, 51 cookieExpiry: PRIVACY_POLICY_COOKIE_EXPIRATION_DAYS 52 } 53 ]; 54 55 const privacyLinkClickHandler = getPrivacyPolicyClickHandler($privacyBlock, $privacyPrompt, privacyBannerCookiesToSet); 56 57 const wasPrivacyLinkCookieAlreadySet = Get_Cookie(PRIVACY_POLICY_COOKIE_NAME); 58 const updatedPrivacyBannerCookiesToSet = [ 59 { 60 cookieName: UPDATED_PRIVACY_POLICY_COOKIE_NAME, 61 cookieExpiry: UPDATED_PRIVACY_POLICY_COOKIE_EXPIRATION_DAYS 62 }, 63 ...(wasPrivacyLinkCookieAlreadySet ? [] : privacyBannerCookiesToSet) 64 ]; 65 66 const updatedPrivacyLinkClickHandler = getPrivacyPolicyClickHandler( 67 $updatedPrivacyBlock, 68 $updatedPrivacyPrompt, 69 updatedPrivacyBannerCookiesToSet 70 ); 71 72 $privacyLink.on('click', privacyLinkClickHandler); 73 if (hasUpdatedPrivacyPolicy) { 74 $updatedPrivacyLink.on('click', updatedPrivacyLinkClickHandler); 75 } 76 } 77 78 function exposePrivacyPolicyExperiment({ flag: isPrivacyPolicyExperimentEnabled }) { 79 if (hasUpdatedPrivacyPolicy && isPrivacyPolicyExperimentEnabled) { 80 // flicker prevention against multiple gb callbacks 81 hideBanner($privacyBlock); 82 showUpdatedPrivacyPolicyPrompt(); 83 } else { 84 hideBanner($updatedPrivacyBlock); 85 showPrivacyPolicyPrompt(); 86 } 87 } 88 89 function getPrivacyPolicyClickHandler($elementToHide, $promptToStore, cookiesToSet) { 90 function handlePrivacyLinkClick(event) { 91 event.preventDefault(); 92 hideBanner($elementToHide, true); 93 var gdprPrivacyPolicyData = { 94 url: window.location.href, 95 prompt: $promptToStore.html() 96 }; 97 for (const { cookieName, cookieExpiry } of cookiesToSet) { 98 Set_Cookie(cookieName, JSON.stringify(gdprPrivacyPolicyData), cookieExpiry, '/', '.avaaz.org'); 99 } 100 } 101 return handlePrivacyLinkClick; 102 } 103 104 function showPrivacyPolicyPrompt() { 105 const wasPrivacyPolicyAccepted = Get_Cookie(PRIVACY_POLICY_COOKIE_NAME); 106 const wasUpdatedPrivacyPolicyAccepted = Get_Cookie(UPDATED_PRIVACY_POLICY_COOKIE_NAME); 107 const shouldShowPrompt = !(wasPrivacyPolicyAccepted || wasUpdatedPrivacyPolicyAccepted); 108 109 if (shouldShowPrompt) { 110 showBanner($privacyBlock); 111 } 112 } 113 114 function showUpdatedPrivacyPolicyPrompt() { 115 const wasUpdatedPrivacyPolicyAccepted = Get_Cookie(UPDATED_PRIVACY_POLICY_COOKIE_NAME); 116 const shouldShowPrompt = !wasUpdatedPrivacyPolicyAccepted; 117 118 if (shouldShowPrompt) { 119 showBanner($updatedPrivacyBlock); 120 } 121 } 122 123 function showBanner($elementToShow) { 124 $elementToShow.show(); 125 $body.addClass('body-gdpr-block'); 126 } 127 128 function hideBanner($elementToHide, shouldSlideUp = false) { 129 if (shouldSlideUp) { 130 $elementToHide.slideUp(); 131 } else { 132 $elementToHide.hide(); 133 } 134 $body.removeClass('body-gdpr-block'); 135 } 136 137 initializeInterface(); 138 registerHandlers(); 139});
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.