Updated all the contrib modules to their latest versions.
[yaffs-website] / web / modules / contrib / eu_cookie_compliance / js / eu_cookie_compliance.js
1 /**
2  * @file eu_cookie_compliance.js
3  *
4  * Defines the behavior of the eu cookie compliance banner.
5  */
6
7 (function ($, Drupal, drupalSettings) {
8
9   'use strict';
10
11   Drupal.behaviors.euCookieCompliancePopup = {
12     attach: function (context) {
13       $('body').once('eu-cookie-compliance').each(function () {
14         // If configured, check JSON callback to determine if in EU.
15         if (drupalSettings.eu_cookie_compliance.popup_eu_only_js) {
16           if (Drupal.eu_cookie_compliance.showBanner()) {
17             var url = drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix + 'eu-cookie-compliance-check';
18             var data = {};
19             $.getJSON(url, data, function (data) {
20               // If in the EU, show the compliance banner.
21               if (data.in_eu) {
22                 Drupal.eu_cookie_compliance.execute();
23               }
24
25               // If not in EU, set an agreed cookie automatically.
26               else {
27                 Drupal.eu_cookie_compliance.setStatus(2);
28               }
29             });
30           }
31         }
32
33         // Otherwise, fallback to standard behavior which is to render the banner.
34         else {
35           Drupal.eu_cookie_compliance.execute();
36         }
37       });
38     },
39   };
40
41   Drupal.eu_cookie_compliance = {};
42
43   Drupal.eu_cookie_compliance.execute = function () {
44     try {
45       if (!drupalSettings.eu_cookie_compliance.popup_enabled) {
46         return;
47       }
48
49       if (!Drupal.eu_cookie_compliance.cookiesEnabled()) {
50         return;
51       }
52
53       var status = Drupal.eu_cookie_compliance.getCurrentStatus();
54       if ((status === 0 && drupalSettings.eu_cookie_compliance.method === 'default') || status === null) {
55         if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
56           // Detect mobile here and use mobile_popup_html_info, if we have a mobile device.
57           if (window.matchMedia('(max-width: ' + drupalSettings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && drupalSettings.eu_cookie_compliance.use_mobile_message) {
58             Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.mobile_popup_html_info);
59           } else {
60             Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_info);
61           }
62
63           Drupal.eu_cookie_compliance.attachAgreeEvents();
64         }
65       } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
66         Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_agreed);
67         Drupal.eu_cookie_compliance.attachHideEvents();
68       } else if (status === 2 && drupalSettings.eu_cookie_compliance.withdraw_enabled) {
69         Drupal.eu_cookie_compliance.createWithdrawBanner(drupalSettings.eu_cookie_compliance.withdraw_markup);
70         Drupal.eu_cookie_compliance.attachWithdrawEvents();
71       }
72     }
73     catch (e) {
74     }
75   };
76
77   Drupal.eu_cookie_compliance.createWithdrawBanner = function (html) {
78     var $html = $('<div></div>').html(html);
79     var $banner = $('.eu-cookie-withdraw-banner', $html);
80     $html.attr('id', 'sliding-popup');
81     $html.addClass('eu-cookie-withdraw-wrapper');
82
83     if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) {
84       $banner.height(drupalSettings.eu_cookie_compliance.popup_height)
85           .width(drupalSettings.eu_cookie_compliance.popup_width);
86     }
87     $html.hide();
88     var height = 0;
89     if (drupalSettings.eu_cookie_compliance.popup_position) {
90       $html.prependTo('body');
91       height = $html.outerHeight();
92
93       $html.show()
94           .addClass('sliding-popup-top')
95           .addClass('clearfix')
96           .css({ top: -1 * height });
97       // For some reason, the tab outerHeight is -10 if we don't use a timeout
98       // function to reveal the tab.
99       setTimeout(function () {
100         var height = $html.outerHeight();
101
102         $html.animate({ top: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
103           $html.trigger('eu_cookie_compliance_popup_open');
104         });
105       }.bind($html), 0);
106     } else {
107       if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
108         $html.prependTo('body');
109       } else {
110         $html.appendTo('body');
111       }
112       height = $html.outerHeight();
113       $html.show()
114           .addClass('sliding-popup-bottom')
115           .css({ bottom: -1 * height });
116       // For some reason, the tab outerHeight is -10 if we don't use a timeout
117       // function to reveal the tab.
118       setTimeout(function () {
119         var height = $html.outerHeight();
120
121         $html.animate({ bottom: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
122           $html.trigger('eu_cookie_compliance_popup_open');
123         });
124       }.bind($html), 0);
125     }
126   };
127
128   Drupal.eu_cookie_compliance.toggleWithdrawBanner = function () {
129     var $wrapper = $('#sliding-popup');
130     var $tab = $('.eu-cookie-withdraw-tab');
131     var $bannerIsShowing = drupalSettings.eu_cookie_compliance.popup_position ? parseInt($wrapper.css('top')) === 0 : parseInt($wrapper.css('bottom')) === 0;
132     var height = $wrapper.outerHeight();
133     if (drupalSettings.eu_cookie_compliance.popup_position) {
134       if ($bannerIsShowing) {
135         $wrapper.animate({'top' : -1 * (height)}, drupalSettings.eu_cookie_compliance.popup_delay);
136       }
137       else {
138         $wrapper.animate({'top' : 0}, drupalSettings.eu_cookie_compliance.popup_delay);
139       }
140     }
141     else {
142       if ($bannerIsShowing) {
143         $wrapper.animate({'bottom' : -1 * (height)}, drupalSettings.eu_cookie_compliance.popup_delay);
144       }
145       else {
146         $wrapper.animate({'bottom' : 0}, drupalSettings.eu_cookie_compliance.popup_delay);
147       }
148     }
149   };
150
151   Drupal.eu_cookie_compliance.createPopup = function (html) {
152     // This fixes a problem with jQuery 1.9.
153     var popup = $('<div></div>').html(html);
154     popup.attr('id', 'sliding-popup');
155     if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) {
156       popup.height(drupalSettings.eu_cookie_compliance.popup_height)
157           .width(drupalSettings.eu_cookie_compliance.popup_width);
158     }
159
160     popup.hide();
161     var height = 0;
162     if (drupalSettings.eu_cookie_compliance.popup_position) {
163       popup.prependTo('body');
164       height = popup.outerHeight();
165       popup.show()
166         .addClass('sliding-popup-top clearfix')
167         .css({ top: -1 * height })
168         .animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
169           popup.trigger('eu_cookie_compliance_popup_open');
170         });
171     } else {
172       if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
173         popup.prependTo('body');
174       } else {
175         popup.appendTo('body');
176       }
177
178       height = popup.outerHeight();
179       popup.show()
180         .addClass('sliding-popup-bottom')
181         .css({ bottom: -1 * height })
182         .animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
183           popup.trigger('eu_cookie_compliance_popup_open');
184         });
185     }
186   };
187
188   Drupal.eu_cookie_compliance.attachAgreeEvents = function () {
189     var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
190     var scrollConfirms = drupalSettings.eu_cookie_compliance.popup_scrolling_confirmation;
191
192     $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction);
193     $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction);
194
195     if (clickingConfirms) {
196       $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction);
197     }
198
199     if (scrollConfirms) {
200       var alreadyScrolled = false;
201       var scrollHandler = function () {
202         if (alreadyScrolled) {
203           Drupal.eu_cookie_compliance.acceptAction();
204           $(window).off('scroll', scrollHandler);
205         } else {
206           alreadyScrolled = true;
207         }
208       };
209
210       $(window).bind('scroll', scrollHandler);
211     }
212
213     $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
214   };
215
216   Drupal.eu_cookie_compliance.attachHideEvents = function () {
217     var popupHideAgreed = drupalSettings.eu_cookie_compliance.popup_hide_agreed;
218     var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
219     $('.hide-popup-button').click(function () {
220           Drupal.eu_cookie_compliance.changeStatus(2);
221         }
222     );
223     if (clickingConfirms) {
224       $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance');
225     }
226
227     if (popupHideAgreed) {
228       $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () {
229         Drupal.eu_cookie_compliance.changeStatus(2);
230       });
231     }
232
233     $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
234   };
235
236   Drupal.eu_cookie_compliance.attachWithdrawEvents = function () {
237     $('.eu-cookie-withdraw-button').click(Drupal.eu_cookie_compliance.withdrawAction);
238     $('.eu-cookie-withdraw-tab').click(Drupal.eu_cookie_compliance.toggleWithdrawBanner);
239   };
240
241   Drupal.eu_cookie_compliance.acceptAction = function () {
242     var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
243     var nextStatus = 1;
244     if (!agreedEnabled) {
245       Drupal.eu_cookie_compliance.setStatus(1);
246       nextStatus = 2;
247     }
248
249     if (!euCookieComplianceHasLoadedScripts) {
250       euCookieComplianceLoadScripts();
251     }
252
253     if (typeof euCookieComplianceBlockCookies !== 'undefined') {
254       clearInterval(euCookieComplianceBlockCookies);
255     }
256
257     Drupal.eu_cookie_compliance.changeStatus(nextStatus);
258   };
259
260   Drupal.eu_cookie_compliance.declineAction = function () {
261     Drupal.eu_cookie_compliance.setStatus(0);
262     let popup = $('#sliding-popup');
263     if (popup.hasClass('sliding-popup-top')) {
264       popup.animate({ top: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close');
265     }
266     else {
267       popup.animate({ bottom: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close');
268     }
269   };
270
271   Drupal.eu_cookie_compliance.withdrawAction = function () {
272     Drupal.eu_cookie_compliance.setStatus(null);
273     location.reload();
274   };
275
276   Drupal.eu_cookie_compliance.moreInfoAction = function () {
277     if (drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup) {
278       Drupal.eu_cookie_compliance.setStatus(0);
279       $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove();
280     } else {
281       if (drupalSettings.eu_cookie_compliance.popup_link_new_window) {
282         window.open(drupalSettings.eu_cookie_compliance.popup_link);
283       } else {
284         window.location.href = drupalSettings.eu_cookie_compliance.popup_link;
285       }
286     }
287   };
288
289   Drupal.eu_cookie_compliance.getCurrentStatus = function () {
290     var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
291     var value = $.cookie(cookieName);
292     value = parseInt(value);
293     if (isNaN(value)) {
294       value = null;
295     }
296
297     return value;
298   };
299
300   Drupal.eu_cookie_compliance.changeStatus = function (value) {
301     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
302     var reloadPage = drupalSettings.eu_cookie_compliance.reload_page;
303     if (status === value) {
304       return;
305     }
306
307     if (drupalSettings.eu_cookie_compliance.popup_position) {
308       $('.sliding-popup-top').animate({ top: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
309         if (status === null && !reloadPage) {
310           $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
311           Drupal.eu_cookie_compliance.attachHideEvents();
312         } else if (status === 1) {
313           $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove();
314         }
315       });
316     } else {
317       $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
318         if (status === null && !reloadPage) {
319           $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
320           Drupal.eu_cookie_compliance.attachHideEvents();
321         } else if (status === 1) {
322           $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove();
323         }
324       });
325     }
326
327     if (drupalSettings.eu_cookie_compliance.reload_page) {
328       location.reload();
329     }
330
331     if (value === 2 && drupalSettings.eu_cookie_compliance.withdraw_enabled) {
332       Drupal.eu_cookie_compliance.createWithdrawBanner(drupalSettings.eu_cookie_compliance.withdraw_markup);
333       Drupal.eu_cookie_compliance.attachWithdrawEvents();
334     }
335
336     Drupal.eu_cookie_compliance.setStatus(value);
337   };
338
339   Drupal.eu_cookie_compliance.setStatus = function (status) {
340     var date = new Date();
341     var domain = drupalSettings.eu_cookie_compliance.domain ? drupalSettings.eu_cookie_compliance.domain : '';
342     var path = drupalSettings.path.baseUrl;
343     var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
344     if (path.length > 1) {
345       var pathEnd = path.length - 1;
346       if (path.lastIndexOf('/') === pathEnd) {
347         path = path.substring(0, pathEnd);
348       }
349     }
350
351     var cookie_session = parseInt(drupalSettings.eu_cookie_compliance.cookie_session);
352     if (cookie_session) {
353       $.cookie(cookieName, status, { path: path, domain: domain });
354     } else {
355       var lifetime = parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime);
356       date.setDate(date.getDate() + lifetime);
357       $.cookie(cookieName, status, { expires: date, path: path, domain: domain });
358     }
359     $(document).trigger('eu_cookie_compliance.changeStatus', [status]);
360
361     // Store consent if applicable.
362     if (drupalSettings.eu_cookie_compliance.store_consent && ((status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) || (status === 2  && !drupalSettings.eu_cookie_compliance.popup_agreed_enabled))) {
363       var url = drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix + 'eu-cookie-compliance/store_consent/banner';
364       $.post(url, {}, function (data) { });
365     }
366   };
367
368   Drupal.eu_cookie_compliance.hasAgreed = function () {
369     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
370     return (status === 1 || status === 2);
371   };
372
373   Drupal.eu_cookie_compliance.showBanner = function () {
374     var showBanner = false;
375     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
376     if ((status === 0 && drupalSettings.eu_cookie_compliance.method === 'default') || status === null) {
377       if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
378         showBanner = true;
379       }
380     } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
381       showBanner = true;
382     }
383
384     return showBanner;
385   };
386
387   Drupal.eu_cookie_compliance.cookiesEnabled = function () {
388     var cookieEnabled = (navigator.cookieEnabled);
389     if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) {
390       $.cookie('testcookie', 'testcookie', { expires: 100 });
391       cookieEnabled = ($.cookie('testcookie').indexOf('testcookie') !== -1);
392     }
393
394     return (cookieEnabled);
395   };
396
397   // Load blocked scripts if the user has agreed to being tracked.
398   var euCookieComplianceHasLoadedScripts = false;
399   $(function () {
400     if (Drupal.eu_cookie_compliance.hasAgreed()
401         || (Drupal.eu_cookie_compliance.getCurrentStatus() === null && drupalSettings.eu_cookie_compliance.method !== 'opt_in')
402     ) {
403       euCookieComplianceLoadScripts();
404       euCookieComplianceHasLoadedScripts = true;
405     }
406   });
407
408   // Block cookies when the user hasn't agreed.
409   if ((drupalSettings.eu_cookie_compliance.method === 'opt_in' && (Drupal.eu_cookie_compliance.getCurrentStatus() === null  || !Drupal.eu_cookie_compliance.hasAgreed()))
410       || (drupalSettings.eu_cookie_compliance.method === 'opt_out' && !Drupal.eu_cookie_compliance.hasAgreed() && Drupal.eu_cookie_compliance.getCurrentStatus() !== null)
411   ) {
412     // Split the white-listed cookies.
413     var euCookieComplianceWhitelist = drupalSettings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g);
414
415     // Add the EU Cookie Compliance cookie.
416     euCookieComplianceWhitelist.push((drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name);
417     var euCookieComplianceBlockCookies = setInterval(function () {
418       // Load all cookies from jQuery.
419       var cookies = $.cookie();
420
421       // Check each cookie and try to remove it if it's not white-listed.
422       for (var i in cookies) {
423         var remove = true;
424         var hostname = window.location.hostname;
425         var cookieRemoved = false;
426         var index = 0;
427
428         // Skip the PHP session cookie.
429         if (i.indexOf('SESS') === 0 || i.indexOf('SSESS') === 0) {
430           remove = false;
431         }
432
433         // Check if the cookie is white-listed.
434         for (var item in euCookieComplianceWhitelist) {
435           if (i === euCookieComplianceWhitelist[item]) {
436             remove = false;
437           }
438         }
439
440         // Remove the cookie if it's not white-listed.
441         if (remove) {
442           while (!cookieRemoved && hostname !== '') {
443             // Attempt to remove.
444             cookieRemoved = $.removeCookie(i, { domain: '.' + hostname, path: '/' });
445             if (!cookieRemoved) {
446               cookieRemoved = $.removeCookie(i, { domain: hostname, path: '/' });
447             }
448
449             index = hostname.indexOf('.');
450
451             // We can be on a sub-domain, so keep checking the main domain as well.
452             hostname = (index === -1) ? '' : hostname.substring(index + 1);
453           }
454         }
455       }
456     }, 5000);
457   }
458
459 })(jQuery, Drupal, drupalSettings);