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 + '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 || 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();
74 Drupal.eu_cookie_compliance.createPopup = function (html) {
75 // This fixes a problem with jQuery 1.9.
76 var popup = $('<div></div>').html(html);
77 popup.attr('id', 'sliding-popup');
78 if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) {
79 popup.height(drupalSettings.eu_cookie_compliance.popup_height)
80 .width(drupalSettings.eu_cookie_compliance.popup_width);
85 if (drupalSettings.eu_cookie_compliance.popup_position) {
86 popup.prependTo('body');
87 height = popup.outerHeight();
89 .addClass('sliding-popup-top clearfix')
90 .css({ top: -1 * height })
91 .animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
92 popup.trigger('eu_cookie_compliance_popup_open');
95 if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
96 popup.prependTo('body');
98 popup.appendTo('body');
101 height = popup.outerHeight();
103 .addClass('sliding-popup-bottom')
104 .css({ bottom: -1 * height })
105 .animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
106 popup.trigger('eu_cookie_compliance_popup_open');
111 Drupal.eu_cookie_compliance.attachAgreeEvents = function () {
112 var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
113 var scrollConfirms = drupalSettings.eu_cookie_compliance.popup_scrolling_confirmation;
115 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction);
117 if (clickingConfirms) {
118 $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction);
121 if (scrollConfirms) {
122 var alreadyScrolled = false;
123 var scrollHandler = function () {
124 if (alreadyScrolled) {
125 Drupal.eu_cookie_compliance.acceptAction();
126 $(window).off('scroll', scrollHandler);
128 alreadyScrolled = true;
132 $(window).bind('scroll', scrollHandler);
135 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
138 Drupal.eu_cookie_compliance.attachHideEvents = function () {
139 var popupHideAgreed = drupalSettings.eu_cookie_compliance.popup_hide_agreed;
140 var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
141 $('.hide-popup-button').click(function () {
142 Drupal.eu_cookie_compliance.changeStatus(2);
145 if (clickingConfirms) {
146 $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance');
149 if (popupHideAgreed) {
150 $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () {
151 Drupal.eu_cookie_compliance.changeStatus(2);
155 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
158 Drupal.eu_cookie_compliance.acceptAction = function () {
159 var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
161 if (!agreedEnabled) {
162 Drupal.eu_cookie_compliance.setStatus(1);
166 Drupal.eu_cookie_compliance.changeStatus(nextStatus);
169 Drupal.eu_cookie_compliance.moreInfoAction = function () {
170 if (drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup) {
171 Drupal.eu_cookie_compliance.setStatus(0);
172 $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
174 if (drupalSettings.eu_cookie_compliance.popup_link_new_window) {
175 window.open(drupalSettings.eu_cookie_compliance.popup_link);
177 window.location.href = drupalSettings.eu_cookie_compliance.popup_link;
182 Drupal.eu_cookie_compliance.getCurrentStatus = function () {
183 var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
184 var value = $.cookie(cookieName);
185 value = parseInt(value);
193 Drupal.eu_cookie_compliance.changeStatus = function (value) {
194 var status = Drupal.eu_cookie_compliance.getCurrentStatus();
195 var reloadPage = drupalSettings.eu_cookie_compliance.reload_page;
196 if (status === value) {
200 if (drupalSettings.eu_cookie_compliance.popup_position) {
201 $('.sliding-popup-top').animate({ top: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
202 if (status === null && !reloadPage) {
203 $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
204 Drupal.eu_cookie_compliance.attachHideEvents();
205 } else if (status === 1) {
206 $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
210 $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
211 if (status === null && !reloadPage) {
212 $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
213 Drupal.eu_cookie_compliance.attachHideEvents();
214 } else if (status === 1) {
215 $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
220 if (drupalSettings.eu_cookie_compliance.reload_page) {
224 Drupal.eu_cookie_compliance.setStatus(value);
227 Drupal.eu_cookie_compliance.setStatus = function (status) {
228 var date = new Date();
229 var domain = drupalSettings.eu_cookie_compliance.domain ? drupalSettings.eu_cookie_compliance.domain : '';
230 var path = drupalSettings.path.baseUrl;
231 var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
232 if (path.length > 1) {
233 var pathEnd = path.length - 1;
234 if (path.lastIndexOf('/') === pathEnd) {
235 path = path.substring(0, pathEnd);
239 date.setDate(date.getDate() + parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime));
240 $.cookie(cookieName, status, { expires: date, path: path, domain: domain });
241 $(document).trigger('eu_cookie_compliance.changeStatus', [status]);
244 Drupal.eu_cookie_compliance.hasAgreed = function () {
245 var status = Drupal.eu_cookie_compliance.getCurrentStatus();
246 return (status === 1 || status === 2);
249 Drupal.eu_cookie_compliance.showBanner = function () {
250 var showBanner = false;
251 var status = Drupal.eu_cookie_compliance.getCurrentStatus();
252 if (status === 0 || status === null) {
253 if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
256 } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
263 Drupal.eu_cookie_compliance.cookiesEnabled = function () {
264 var cookieEnabled = (navigator.cookieEnabled);
265 if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) {
266 $.cookie('testcookie', 'testcookie', { expires: 100 });
267 cookieEnabled = ($.cookie('testcookie').indexOf('testcookie') !== -1);
270 return (cookieEnabled);
273 Drupal.eu_cookie_compliance.reloadPage = function () {
277 })(jQuery, Drupal, drupalSettings);