2 * @file eu_cookie_compliance.js
4 * Defines the behavior of the eu cookie compliance banner.
7 (function ($, Drupal, drupalSettings) {
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';
19 $.getJSON(url, data, function (data) {
20 // If in the EU, show the compliance banner.
22 Drupal.eu_cookie_compliance.execute();
25 // If not in EU, set an agreed cookie automatically.
27 Drupal.eu_cookie_compliance.setStatus(2);
33 // Otherwise, fallback to standard behavior which is to render the banner.
35 Drupal.eu_cookie_compliance.execute();
41 Drupal.eu_cookie_compliance = {};
43 Drupal.eu_cookie_compliance.execute = function () {
45 if (!drupalSettings.eu_cookie_compliance.popup_enabled) {
49 if (!Drupal.eu_cookie_compliance.cookiesEnabled()) {
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);
60 Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_info);
63 Drupal.eu_cookie_compliance.attachAgreeEvents();
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();
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');
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);
89 if (drupalSettings.eu_cookie_compliance.popup_position) {
90 $html.prependTo('body');
91 height = $html.outerHeight();
94 .addClass('sliding-popup-top')
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();
102 $html.animate({ top: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
103 $html.trigger('eu_cookie_compliance_popup_open');
107 if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
108 $html.prependTo('body');
110 $html.appendTo('body');
112 height = $html.outerHeight();
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();
121 $html.animate({ bottom: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
122 $html.trigger('eu_cookie_compliance_popup_open');
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);
138 $wrapper.animate({'top' : 0}, drupalSettings.eu_cookie_compliance.popup_delay);
142 if ($bannerIsShowing) {
143 $wrapper.animate({'bottom' : -1 * (height)}, drupalSettings.eu_cookie_compliance.popup_delay);
146 $wrapper.animate({'bottom' : 0}, drupalSettings.eu_cookie_compliance.popup_delay);
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);
162 if (drupalSettings.eu_cookie_compliance.popup_position) {
163 popup.prependTo('body');
164 height = popup.outerHeight();
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');
172 if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
173 popup.prependTo('body');
175 popup.appendTo('body');
178 height = popup.outerHeight();
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');
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;
192 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction);
193 $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction);
195 if (clickingConfirms) {
196 $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction);
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);
206 alreadyScrolled = true;
210 $(window).bind('scroll', scrollHandler);
213 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
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);
223 if (clickingConfirms) {
224 $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance');
227 if (popupHideAgreed) {
228 $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () {
229 Drupal.eu_cookie_compliance.changeStatus(2);
233 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
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);
241 Drupal.eu_cookie_compliance.acceptAction = function () {
242 var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
244 if (!agreedEnabled) {
245 Drupal.eu_cookie_compliance.setStatus(1);
249 if (!euCookieComplianceHasLoadedScripts) {
250 euCookieComplianceLoadScripts();
253 if (typeof euCookieComplianceBlockCookies !== 'undefined') {
254 clearInterval(euCookieComplianceBlockCookies);
257 Drupal.eu_cookie_compliance.changeStatus(nextStatus);
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');
267 popup.animate({ bottom: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close');
271 Drupal.eu_cookie_compliance.withdrawAction = function () {
272 Drupal.eu_cookie_compliance.setStatus(null);
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();
281 if (drupalSettings.eu_cookie_compliance.popup_link_new_window) {
282 window.open(drupalSettings.eu_cookie_compliance.popup_link);
284 window.location.href = drupalSettings.eu_cookie_compliance.popup_link;
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);
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) {
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();
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();
327 if (drupalSettings.eu_cookie_compliance.reload_page) {
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();
336 Drupal.eu_cookie_compliance.setStatus(value);
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);
351 var cookie_session = parseInt(drupalSettings.eu_cookie_compliance.cookie_session);
352 if (cookie_session) {
353 $.cookie(cookieName, status, { path: path, domain: domain });
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 });
359 $(document).trigger('eu_cookie_compliance.changeStatus', [status]);
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) { });
368 Drupal.eu_cookie_compliance.hasAgreed = function () {
369 var status = Drupal.eu_cookie_compliance.getCurrentStatus();
370 return (status === 1 || status === 2);
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) {
380 } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
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);
394 return (cookieEnabled);
397 // Load blocked scripts if the user has agreed to being tracked.
398 var euCookieComplianceHasLoadedScripts = false;
400 if (Drupal.eu_cookie_compliance.hasAgreed()
401 || (Drupal.eu_cookie_compliance.getCurrentStatus() === null && drupalSettings.eu_cookie_compliance.method !== 'opt_in')
403 euCookieComplianceLoadScripts();
404 euCookieComplianceHasLoadedScripts = true;
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)
412 // Split the white-listed cookies.
413 var euCookieComplianceWhitelist = drupalSettings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g);
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();
421 // Check each cookie and try to remove it if it's not white-listed.
422 for (var i in cookies) {
424 var hostname = window.location.hostname;
425 var cookieRemoved = false;
428 // Skip the PHP session cookie.
429 if (i.indexOf('SESS') === 0 || i.indexOf('SSESS') === 0) {
433 // Check if the cookie is white-listed.
434 for (var item in euCookieComplianceWhitelist) {
435 if (i === euCookieComplianceWhitelist[item]) {
440 // Remove the cookie if it's not white-listed.
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: '/' });
449 index = hostname.indexOf('.');
451 // We can be on a sub-domain, so keep checking the main domain as well.
452 hostname = (index === -1) ? '' : hostname.substring(index + 1);
459 })(jQuery, Drupal, drupalSettings);