PageSourceSearch

https://avaaz.org/campaign/static/js/gdpr/privacy-popup.js?1747848700

js avaaz.org collected 2026-10-01 09:17:27 UTC 5,224 bytes, 139 lines download raw bytes

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.