/**
* @file eu_cookie_compliance.js
*
- * Defines the behavior of the eu cookie compliance popup.
+ * Defines the behavior of the eu cookie compliance banner.
*/
(function ($, Drupal, drupalSettings) {
Drupal.behaviors.euCookieCompliancePopup = {
attach: function (context) {
- $('body', context).once('sliding-popup').each(function () {
- var settings = drupalSettings.eu_cookie_compliance;
- try {
- var enabled = settings.popup_enabled;
-
- if (!enabled) {
- return;
- }
-
- if (!Drupal.eu_cookie_compliance.cookiesEnabled()) {
- return;
- }
+ $('body').once('eu-cookie-compliance').each(function () {
+ // If configured, check JSON callback to determine if in EU.
+ if (drupalSettings.eu_cookie_compliance.popup_eu_only_js) {
+ if (Drupal.eu_cookie_compliance.showBanner()) {
+ var url = drupalSettings.path.baseUrl + 'eu-cookie-compliance-check';
+ var data = {};
+ $.getJSON(url, data, function (data) {
+ // If in the EU, show the compliance banner.
+ if (data.in_eu) {
+ Drupal.eu_cookie_compliance.execute();
+ }
- var status = Drupal.eu_cookie_compliance.getCurrentStatus();
- var clicking_confirms = settings.popup_clicking_confirmation;
- var agreed_enabled = settings.popup_agreed_enabled;
- var popup_hide_agreed = settings.popup_hide_agreed;
-
- if (status === 0) {
- var next_status = 1;
- if (!clicking_confirms) {
- $('a, input[type=submit]').bind('click.eu_cookie_compliance', function () {
- if (!agreed_enabled) {
- Drupal.eu_cookie_compliance.setStatus(1);
- next_status = 2;
- }
- Drupal.eu_cookie_compliance.changeStatus(next_status);
- });
- }
- $('.agree-button').click(function () {
- if (!agreed_enabled) {
- Drupal.eu_cookie_compliance.setStatus(1);
- next_status = 2;
+ // If not in EU, set an agreed cookie automatically.
+ else {
+ Drupal.eu_cookie_compliance.setStatus(2);
}
- Drupal.eu_cookie_compliance.changeStatus(next_status);
});
-
- Drupal.eu_cookie_compliance.createPopup(settings.popup_html_info);
- }
- else if (status === 1) {
- Drupal.eu_cookie_compliance.createPopup(settings.popup_html_agreed);
- if (popup_hide_agreed) {
- $('a, input[type=submit]').bind('click.eu_cookie_compliance_hideagreed', function () {
- Drupal.eu_cookie_compliance.changeStatus(2);
- });
- }
}
}
- catch (e) {
- // Nothing to show here.
+
+ // Otherwise, fallback to standard behavior which is to render the banner.
+ else {
+ Drupal.eu_cookie_compliance.execute();
}
});
- }
+ },
};
Drupal.eu_cookie_compliance = {};
+ Drupal.eu_cookie_compliance.execute = function () {
+ try {
+ if (!drupalSettings.eu_cookie_compliance.popup_enabled) {
+ return;
+ }
+
+ if (!Drupal.eu_cookie_compliance.cookiesEnabled()) {
+ return;
+ }
+
+ var status = Drupal.eu_cookie_compliance.getCurrentStatus();
+ if (status === 0 || status === null) {
+ if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
+ // Detect mobile here and use mobile_popup_html_info, if we have a mobile device.
+ if (window.matchMedia('(max-width: ' + drupalSettings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && drupalSettings.eu_cookie_compliance.use_mobile_message) {
+ Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.mobile_popup_html_info);
+ } else {
+ Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_info);
+ }
+
+ Drupal.eu_cookie_compliance.attachAgreeEvents();
+ }
+ } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
+ Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_agreed);
+ Drupal.eu_cookie_compliance.attachHideEvents();
+ }
+ }
+ catch (e) {
+ }
+ };
+
Drupal.eu_cookie_compliance.createPopup = function (html) {
- var popup = $(html)
- .attr({id: 'sliding-popup'})
- .height(drupalSettings.eu_cookie_compliance.popup_height)
- .width(drupalSettings.eu_cookie_compliance.popup_width)
- .hide();
- var height = popup.height();
+ // This fixes a problem with jQuery 1.9.
+ var popup = $('<div></div>').html(html);
+ popup.attr('id', 'sliding-popup');
+ if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) {
+ popup.height(drupalSettings.eu_cookie_compliance.popup_height)
+ .width(drupalSettings.eu_cookie_compliance.popup_width);
+ }
+
+ popup.hide();
+ var height = 0;
if (drupalSettings.eu_cookie_compliance.popup_position) {
popup.prependTo('body');
+ height = popup.outerHeight();
popup.show()
- .attr({class: 'sliding-popup-top clearfix'})
- .css({
- top: -1 * height
- })
- .animate({top: 0}, drupalSettings.eu_cookie_compliance.popup_delay);
- }
- else {
- popup.appendTo('body');
+ .addClass('sliding-popup-top clearfix')
+ .css({ top: -1 * height })
+ .animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
+ popup.trigger('eu_cookie_compliance_popup_open');
+ });
+ } else {
+ if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
+ popup.prependTo('body');
+ } else {
+ popup.appendTo('body');
+ }
+
+ height = popup.outerHeight();
popup.show()
- .attr({class: 'sliding-popup-bottom'})
- .css({
- bottom: -1 * height
- })
- .animate({bottom: 0}, drupalSettings.eu_cookie_compliance.popup_delay);
- }
- popup.css({
- background: '#' + drupalSettings.eu_cookie_compliance.popup_bg_hex
- }).find('h2, p').css('color', '#' + drupalSettings.eu_cookie_compliance.popup_text_hex);
- Drupal.eu_cookie_compliance.attachEvents();
+ .addClass('sliding-popup-bottom')
+ .css({ bottom: -1 * height })
+ .animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
+ popup.trigger('eu_cookie_compliance_popup_open');
+ });
+ }
+ };
+
+ Drupal.eu_cookie_compliance.attachAgreeEvents = function () {
+ var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
+ var scrollConfirms = drupalSettings.eu_cookie_compliance.popup_scrolling_confirmation;
+
+ $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction);
+
+ if (clickingConfirms) {
+ $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction);
+ }
+
+ if (scrollConfirms) {
+ var alreadyScrolled = false;
+ var scrollHandler = function () {
+ if (alreadyScrolled) {
+ Drupal.eu_cookie_compliance.acceptAction();
+ $(window).off('scroll', scrollHandler);
+ } else {
+ alreadyScrolled = true;
+ }
+ };
+
+ $(window).bind('scroll', scrollHandler);
+ }
+
+ $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
+ };
+
+ Drupal.eu_cookie_compliance.attachHideEvents = function () {
+ var popupHideAgreed = drupalSettings.eu_cookie_compliance.popup_hide_agreed;
+ var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
+ $('.hide-popup-button').click(function () {
+ Drupal.eu_cookie_compliance.changeStatus(2);
+ }
+ );
+ if (clickingConfirms) {
+ $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance');
+ }
+
+ if (popupHideAgreed) {
+ $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () {
+ Drupal.eu_cookie_compliance.changeStatus(2);
+ });
+ }
+
+ $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
};
- Drupal.eu_cookie_compliance.attachEvents = function () {
- var clicking_confirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
- var agreed_enabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
- $('.find-more-button').bind('click', function () {
+ Drupal.eu_cookie_compliance.acceptAction = function () {
+ var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
+ var nextStatus = 1;
+ if (!agreedEnabled) {
+ Drupal.eu_cookie_compliance.setStatus(1);
+ nextStatus = 2;
+ }
+
+ Drupal.eu_cookie_compliance.changeStatus(nextStatus);
+ };
+
+ Drupal.eu_cookie_compliance.moreInfoAction = function () {
+ if (drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup) {
+ Drupal.eu_cookie_compliance.setStatus(0);
+ $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
+ } else {
if (drupalSettings.eu_cookie_compliance.popup_link_new_window) {
window.open(drupalSettings.eu_cookie_compliance.popup_link);
- }
- else {
+ } else {
window.location.href = drupalSettings.eu_cookie_compliance.popup_link;
}
- });
- $('.agree-button').bind('click', function () {
- var next_status = 1;
- if (!agreed_enabled) {
- Drupal.eu_cookie_compliance.setStatus(1);
- next_status = 2;
- }
- if (clicking_confirms) {
- $('a, input[type=submit]').unbind('click.eu_cookie_compliance');
- }
- Drupal.eu_cookie_compliance.changeStatus(next_status);
- });
- $('.hide-popup-button').bind('click', function () {
- Drupal.eu_cookie_compliance.changeStatus(2);
- });
+ }
};
Drupal.eu_cookie_compliance.getCurrentStatus = function () {
- var name = 'cookie-agreed';
- var result = Drupal.eu_cookie_compliance.getCookie(name);
+ var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
+ var value = $.cookie(cookieName);
+ value = parseInt(value);
+ if (isNaN(value)) {
+ value = null;
+ }
- return parseInt(result);
+ return value;
};
Drupal.eu_cookie_compliance.changeStatus = function (value) {
var status = Drupal.eu_cookie_compliance.getCurrentStatus();
+ var reloadPage = drupalSettings.eu_cookie_compliance.reload_page;
if (status === value) {
return;
}
+
if (drupalSettings.eu_cookie_compliance.popup_position) {
- $('.sliding-popup-top').animate({top: $('#sliding-popup').height() * -1}, drupalSettings.eu_cookie_compliance.popup_delay, function () {
- if (status === 0) {
- $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({top: 0}, drupalSettings.eu_cookie_compliance.popup_delay);
- Drupal.eu_cookie_compliance.attachEvents();
- }
- if (status === 1) {
- $('#sliding-popup').remove();
+ $('.sliding-popup-top').animate({ top: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
+ if (status === null && !reloadPage) {
+ $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
+ Drupal.eu_cookie_compliance.attachHideEvents();
+ } else if (status === 1) {
+ $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
}
});
- }
- else {
- $('.sliding-popup-bottom').animate({bottom: $('#sliding-popup').height() * -1}, drupalSettings.eu_cookie_compliance.popup_delay, function () {
- if (status === 0) {
- $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({bottom: 0}, drupalSettings.eu_cookie_compliance.popup_delay);
- Drupal.eu_cookie_compliance.attachEvents();
- }
- if (status === 1) {
- $('#sliding-popup').remove();
+ } else {
+ $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
+ if (status === null && !reloadPage) {
+ $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
+ Drupal.eu_cookie_compliance.attachHideEvents();
+ } else if (status === 1) {
+ $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
}
});
}
+
+ if (drupalSettings.eu_cookie_compliance.reload_page) {
+ location.reload();
+ }
+
Drupal.eu_cookie_compliance.setStatus(value);
};
Drupal.eu_cookie_compliance.setStatus = function (status) {
var date = new Date();
- date.setDate(date.getDate() + 100);
- var cookie = 'cookie-agreed=' + status + ';expires=' + date.toUTCString() + ';path=' + drupalSettings.path.baseUrl;
- if (drupalSettings.eu_cookie_compliance.domain) {
- cookie += ';domain=' + drupalSettings.eu_cookie_compliance.domain;
+ var domain = drupalSettings.eu_cookie_compliance.domain ? drupalSettings.eu_cookie_compliance.domain : '';
+ var path = drupalSettings.path.baseUrl;
+ var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
+ if (path.length > 1) {
+ var pathEnd = path.length - 1;
+ if (path.lastIndexOf('/') === pathEnd) {
+ path = path.substring(0, pathEnd);
+ }
}
- document.cookie = cookie;
+
+ date.setDate(date.getDate() + parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime));
+ $.cookie(cookieName, status, { expires: date, path: path, domain: domain });
+ $(document).trigger('eu_cookie_compliance.changeStatus', [status]);
};
Drupal.eu_cookie_compliance.hasAgreed = function () {
var status = Drupal.eu_cookie_compliance.getCurrentStatus();
- if (status === 1 || status === 2) {
- return true;
- }
- return false;
+ return (status === 1 || status === 2);
};
- /**
- * Verbatim copy of Drupal.comment.getCookie().
- */
- Drupal.eu_cookie_compliance.getCookie = function (name) {
- var search = name + '=';
- var returnValue = '0';
-
- if (document.cookie.length > 0) {
- var offset = document.cookie.indexOf(search);
- if (offset !== -1) {
- offset += search.length;
- var end = document.cookie.indexOf(';', offset);
- if (end === -1) {
- end = document.cookie.length;
- }
- returnValue = decodeURIComponent(document.cookie.substring(offset, end).replace(/\+/g, '%20'));
+ Drupal.eu_cookie_compliance.showBanner = function () {
+ var showBanner = false;
+ var status = Drupal.eu_cookie_compliance.getCurrentStatus();
+ if (status === 0 || status === null) {
+ if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
+ showBanner = true;
}
+ } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
+ showBanner = true;
}
- return returnValue;
+
+ return showBanner;
};
Drupal.eu_cookie_compliance.cookiesEnabled = function () {
var cookieEnabled = (navigator.cookieEnabled);
if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) {
- document.cookie = 'testcookie';
- cookieEnabled = (document.cookie.indexOf('testcookie') !== -1);
+ $.cookie('testcookie', 'testcookie', { expires: 100 });
+ cookieEnabled = ($.cookie('testcookie').indexOf('testcookie') !== -1);
}
+
return (cookieEnabled);
};
+ Drupal.eu_cookie_compliance.reloadPage = function () {
+
+ };
+
})(jQuery, Drupal, drupalSettings);