PageSourceSearch

https://www.universalmusica.com/wp-content/themes/umg-grand-royal-…/global-assets/js/umggr-main.js?ver=3.5.8

js universalmusica.com collected 2026-10-02 07:17:35 UTC 9,718 bytes, 303 lines download raw bytes

1//Show ECRM functions
2
3/**
4 * Get last time the newsletter popup was shown
5 * @return string|null - timestamp or null
6 */
7function getNewsletterLastShown() {
8    var lastShown = null;
9    if (typeof(Storage) !== 'undefined') {
10        lastShown = localStorage.getItem('umggr-newsletter-last-shown');
11    }
12    return lastShown;
13}
14
15/**
16 * Record that the newsletter popup was shown
17 * @param boolean recordVisit - whether to record this showing (false for 'every_time' mode)
18 */
19function setNewsletterLastShown(recordVisit) {
20    if (recordVisit && typeof(Storage) !== 'undefined') {
21        localStorage.setItem('umggr-newsletter-last-shown', new Date().getTime());
22    }
23}
24
25/**
26 * Get number of newsletter popup visits
27 * @return int
28 */
29function getNewsletterVisits() {
30    var visits = 0;
31    if (typeof(Storage) !== 'undefined') {
32        visits = parseInt(localStorage.getItem('umggr-newsletter-visits')) || 0;
33    }
34    return visits;
35}
36
37/**
38 * Increment newsletter popup visit counter
39 */
40function incrementNewsletterVisits() {
41    if (typeof(Storage) !== 'undefined') {
42        var visits = getNewsletterVisits();
43        localStorage.setItem('umggr-newsletter-visits', visits + 1);
44    }
45}
46
47/**
48 * Check if newsletter popup can be shown based on repeat frequency setting
49 * @return boolean
50 */
51function canShowNewsletterPopup() {
52    var repeatFrequency = gr_global_vars.showEcrmFirstLoadRepeat || 'first_time_session';
53    
54    switch(repeatFrequency) {
55        case 'every_time':
56            return true;
57        
58        case 'first_time_session':
59            // Check session storage
60            var sessionShown = false;
61            if (typeof(sessionStorage) !== 'undefined') {
62                sessionShown = sessionStorage.getItem('umggr-newsletter-first-load');
63            }
64            return !sessionShown;
65        
66        case 'first_time_ever':
67            // Check local storage
68            var lastShown = getNewsletterLastShown();
69            return !lastShown;
70        
71        case 'nth_time':
72            var nthVisit = parseInt(gr_global_vars.showEcrmFirstLoadNthVisit) || 2;
73            var visitCount = getNewsletterVisits();
74            // Show on first visit, then every Nth visit after that
75            // E.g., if nthVisit=2: show on visits 1, 3, 5, 7...
76            // E.g., if nthVisit=3: show on visits 1, 4, 7, 10...
77            return (visitCount === 1 || (visitCount > 1 && (visitCount - 1) % nthVisit === 0));
78        
79        default:
80            // Default to first_time_session behavior
81            var defaultSessionShown = false;
82            if (typeof(sessionStorage) !== 'undefined') {
83                defaultSessionShown = sessionStorage.getItem('umggr-newsletter-first-load');
84            }
85            return !defaultSessionShown;
86    }
87}
88
89/**
90 * Record that newsletter was shown (called after successful display)
91 */
92function recordNewsletterShown() {
93    var repeatFrequency = gr_global_vars.showEcrmFirstLoadRepeat || 'first_time_session';
94    
95    switch(repeatFrequency) {
96        case 'every_time':
97            // Don't record anything - show every time
98            break;
99        
100        case 'first_time_session':
101            // Set session storage
102            if (typeof(sessionStorage) !== 'undefined') {
103                sessionStorage.setItem('umggr-newsletter-first-load', true);
104            }
105            break;
106        
107        case 'first_time_ever':
108        case 'nth_time':
109            // Set local storage with timestamp
110            setNewsletterLastShown(true);
111            break;
112    }
113}
114
115/**
116 * Legacy function - maintained for backwards compatibility
117 * Now delegates to canShowNewsletterPopup() for repeat frequency logic
118 */
119function grShowEcrm() {
120    // For backwards compatibility, check session storage
121    var show = false;
122    if (typeof (sessionStorage) !== 'undefined') {
123        show = sessionStorage.getItem('umggr-newsletter-first-load');
124    }
125    return show;
126}
127
128/**
129 * Newsletter v3 completion flag (GR-owned).
130 * Once set, automatic popups should never show again.
131 */
132function isNewsletterCompleted() {
133    try {
134        if (typeof(Storage) !== 'undefined') {
135            return localStorage.getItem('umggr-newsletter-completed') === 'true';
136        }
137    } catch (e) {}
138    return false;
139}
140
141function setNewsletterCompleted() {
142    try {
143        if (typeof(Storage) !== 'undefined') {
144            localStorage.setItem('umggr-newsletter-completed', 'true');
145        }
146    } catch (e) {}
147}
148
149function checkEcrmComplete(){
150    var mailingListComplete = false;
151
152    // Prefer the GR-owned completion flag (Newsletter V3).
153    if (isNewsletterCompleted()) {
154        return true;
155    }
156
157    // Legacy AE completion check (guarded so v3 sites don't error if AEJSWP is absent).
158    try {
159        var checkForMailingList = null;
160        if (typeof(AEJSWP) !== 'undefined' && typeof(AEJSWP.getLocalStorageItem) === 'function') {
161            checkForMailingList = AEJSWP.getLocalStorageItem('aeswp_cform_mailing_lists_completed', true);
162        }
163        if (Array.isArray(checkForMailingList) && checkForMailingList.length > 0){
164            mailingListComplete = true;
165        }
166    } catch (e) {}
167
168    return mailingListComplete;
169}
170
171/**
172 * Open the newsletter v3 modal (if present).
173 *
174 * Slick layouts render `#gr-newsletter-form` via a footer hook.
175 * @return boolean - true if opened, false otherwise
176 */
177function openNewsletterV3Modal() {
178    var form = document.querySelector('#gr-newsletter-form');
179    var modalState = window.__umggrNewsletterModalState || (window.__umggrNewsletterModalState = {
180        opening: false,
181    });
182
183    if (form && typeof form.openForm === 'function') {
184        if (form.isOpen || modalState.opening) {
185            return true;
186        }
187
188        modalState.opening = true;
189        form.openForm();
190
191        window.setTimeout(function() {
192            modalState.opening = false;
193        }, 500);
194
195        return true;
196    }
197
198    return false;
199}
200
201function openModalEcrm(){
202    if (
203      gr_global_vars.mailListEnabled === 'on'
204      && gr_global_vars.showEcrmFirstLoad === 'true'
205      && canShowNewsletterPopup()
206      && !checkEcrmComplete()
207    ) {
208        (function ($) {
209            $(document).ready(function(){
210                setTimeout(function(){
211                    // Prefer opening the v3 newsletter modal when available.
212                    if (openNewsletterV3Modal()) {
213                        recordNewsletterShown();
214                        return;
215                    }
216
217                    // Try AEJSWP.triggerCustomFormModal first (more reliable)
218                    if (typeof(AEJSWP) !== 'undefined' && typeof(AEJSWP.triggerCustomFormModal) === 'function') {
219                        var $aeContainer = $('.ae-cform-container');
220                        var hash = $aeContainer.find('[data-hash-selector]').data('hash-selector');
221                        if (hash) {
222                            try {
223                                AEJSWP.triggerCustomFormModal(1, hash);
224                            } catch(e) {
225                                // Fallback to click triggers
226                                $('#ae-cform-modal-display-cta-1').trigger('click');
227                                $('.umggr-open-newsletter').trigger('click');
228                            }
229                        } else {
230                            // No hash found, use click triggers
231                            $('#ae-cform-modal-display-cta-1').trigger('click');
232                            $('.umggr-open-newsletter').trigger('click');
233                        }
234                    } else {
235                        // AEJSWP not available, use click triggers
236                        $('#ae-cform-modal-display-cta-1').trigger('click');
237                        $('.umggr-open-newsletter').trigger('click');
238                    }
239                    
240                    // Record that newsletter was shown (respecting repeat frequency)
241                    recordNewsletterShown();
242                }, parseInt(gr_global_vars.showEcrmFirstLoadTimer * 1000));
243            });
244        })(jQuery);
245    }
246}
247
248/**
249 * Mark newsletter as completed when the multi-step form closes successfully.
250 *
251 * Note: `pu-form-closed` is emitted by `pu-multistep-form` in modal mode when the
252 * user closes the form. We only persist completion for successful flows.
253 */
254(function() {
255    if (window.__umggrNewsletterCompletionListenerAdded) {
256        return;
257    }
258    window.__umggrNewsletterCompletionListenerAdded = true;
259
260    document.addEventListener('pu-form-closed', function(e) {
261        if (window.__umggrNewsletterModalState) {
262            window.__umggrNewsletterModalState.opening = false;
263        }
264
265        try {
266            if (e && e.detail && e.detail.reason === 'success') {
267                setNewsletterCompleted();
268            }
269        } catch (err) {}
270    });
271})();
272
273function gr_ae_wpaejsready(){
274    openModalEcrm();
275}
276
277// Ensure auto-popup runs even when AEJSWP is not present (slick layouts).
278(function($) {
279    $(document).ready(function() {
280        if (gr_global_vars && gr_global_vars.showEcrmFirstLoad === 'true') {
281            openModalEcrm();
282        }
283    });
284})(jQuery);
285
286// Initialize visit counter for nth_time mode (increment once per page load)
287(function() {
288    var repeatFrequency = gr_global_vars.showEcrmFirstLoadRepeat || 'first_time_session';
289    if (repeatFrequency === 'nth_time') {
290        incrementNewsletterVisits();
291    }
292})();
293
294if (typeof(AEJSWP) !== 'undefined') {
295    AEJSWP.add_aejsready_handler("gr_ae_wpaejsready");
296}
297//End Show ECRM
298
299(function ($) {
300    $(document).ready(function(){
301        jQuery('noscript').prependTo(document.body);
302    });
303})(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.