X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Feu_cookie_compliance%2Fjs%2Feu_cookie_compliance.js;h=bcb574ffbee488cadfc0554e4952afd37d64c5f3;hb=059867c3f96750652c80f39e44c442a58c2549ee;hp=8b6201f3fea4fdb873270e5e241a55b3553ab5aa;hpb=af6d1fb995500ae68849458ee10d66abbdcfb252;p=yaffs-website diff --git a/web/modules/contrib/eu_cookie_compliance/js/eu_cookie_compliance.js b/web/modules/contrib/eu_cookie_compliance/js/eu_cookie_compliance.js index 8b6201f3f..bcb574ffb 100644 --- a/web/modules/contrib/eu_cookie_compliance/js/eu_cookie_compliance.js +++ b/web/modules/contrib/eu_cookie_compliance/js/eu_cookie_compliance.js @@ -14,7 +14,7 @@ // 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 url = drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix + 'eu-cookie-compliance-check'; var data = {}; $.getJSON(url, data, function (data) { // If in the EU, show the compliance banner. @@ -51,7 +51,7 @@ } var status = Drupal.eu_cookie_compliance.getCurrentStatus(); - if (status === 0 || status === null) { + if ((status === 0 && drupalSettings.eu_cookie_compliance.method === 'default') || 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) { @@ -65,12 +65,89 @@ } 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(); + } else if (status === 2 && drupalSettings.eu_cookie_compliance.withdraw_enabled) { + Drupal.eu_cookie_compliance.createWithdrawBanner(drupalSettings.eu_cookie_compliance.withdraw_markup); + Drupal.eu_cookie_compliance.attachWithdrawEvents(); } } catch (e) { } }; + Drupal.eu_cookie_compliance.createWithdrawBanner = function (html) { + var $html = $('
').html(html); + var $banner = $('.eu-cookie-withdraw-banner', $html); + $html.attr('id', 'sliding-popup'); + $html.addClass('eu-cookie-withdraw-wrapper'); + + if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) { + $banner.height(drupalSettings.eu_cookie_compliance.popup_height) + .width(drupalSettings.eu_cookie_compliance.popup_width); + } + $html.hide(); + var height = 0; + if (drupalSettings.eu_cookie_compliance.popup_position) { + $html.prependTo('body'); + height = $html.outerHeight(); + + $html.show() + .addClass('sliding-popup-top') + .addClass('clearfix') + .css({ top: -1 * height }); + // For some reason, the tab outerHeight is -10 if we don't use a timeout + // function to reveal the tab. + setTimeout(function () { + var height = $html.outerHeight(); + + $html.animate({ top: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () { + $html.trigger('eu_cookie_compliance_popup_open'); + }); + }.bind($html), 0); + } else { + if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) { + $html.prependTo('body'); + } else { + $html.appendTo('body'); + } + height = $html.outerHeight(); + $html.show() + .addClass('sliding-popup-bottom') + .css({ bottom: -1 * height }); + // For some reason, the tab outerHeight is -10 if we don't use a timeout + // function to reveal the tab. + setTimeout(function () { + var height = $html.outerHeight(); + + $html.animate({ bottom: -1 * (height) }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () { + $html.trigger('eu_cookie_compliance_popup_open'); + }); + }.bind($html), 0); + } + }; + + Drupal.eu_cookie_compliance.toggleWithdrawBanner = function () { + var $wrapper = $('#sliding-popup'); + var $tab = $('.eu-cookie-withdraw-tab'); + var $bannerIsShowing = drupalSettings.eu_cookie_compliance.popup_position ? parseInt($wrapper.css('top')) === 0 : parseInt($wrapper.css('bottom')) === 0; + var height = $wrapper.outerHeight(); + if (drupalSettings.eu_cookie_compliance.popup_position) { + if ($bannerIsShowing) { + $wrapper.animate({'top' : -1 * (height)}, drupalSettings.eu_cookie_compliance.popup_delay); + } + else { + $wrapper.animate({'top' : 0}, drupalSettings.eu_cookie_compliance.popup_delay); + } + } + else { + if ($bannerIsShowing) { + $wrapper.animate({'bottom' : -1 * (height)}, drupalSettings.eu_cookie_compliance.popup_delay); + } + else { + $wrapper.animate({'bottom' : 0}, drupalSettings.eu_cookie_compliance.popup_delay); + } + } + }; + Drupal.eu_cookie_compliance.createPopup = function (html) { // This fixes a problem with jQuery 1.9. var popup = $('
').html(html); @@ -113,6 +190,7 @@ var scrollConfirms = drupalSettings.eu_cookie_compliance.popup_scrolling_confirmation; $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction); + $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction); if (clickingConfirms) { $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction); @@ -155,6 +233,11 @@ $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); }; + Drupal.eu_cookie_compliance.attachWithdrawEvents = function () { + $('.eu-cookie-withdraw-button').click(Drupal.eu_cookie_compliance.withdrawAction); + $('.eu-cookie-withdraw-tab').click(Drupal.eu_cookie_compliance.toggleWithdrawBanner); + }; + Drupal.eu_cookie_compliance.acceptAction = function () { var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled; var nextStatus = 1; @@ -163,13 +246,37 @@ nextStatus = 2; } + if (!euCookieComplianceHasLoadedScripts) { + euCookieComplianceLoadScripts(); + } + + if (typeof euCookieComplianceBlockCookies !== 'undefined') { + clearInterval(euCookieComplianceBlockCookies); + } + Drupal.eu_cookie_compliance.changeStatus(nextStatus); }; + Drupal.eu_cookie_compliance.declineAction = function () { + Drupal.eu_cookie_compliance.setStatus(0); + let popup = $('#sliding-popup'); + if (popup.hasClass('sliding-popup-top')) { + popup.animate({ top: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close'); + } + else { + popup.animate({ bottom: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close'); + } + }; + + Drupal.eu_cookie_compliance.withdrawAction = function () { + Drupal.eu_cookie_compliance.setStatus(null); + location.reload(); + }; + 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'); + $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); } else { if (drupalSettings.eu_cookie_compliance.popup_link_new_window) { window.open(drupalSettings.eu_cookie_compliance.popup_link); @@ -203,7 +310,7 @@ $('#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'); + $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); } }); } else { @@ -212,7 +319,7 @@ $('#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'); + $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); } }); } @@ -221,6 +328,11 @@ location.reload(); } + if (value === 2 && drupalSettings.eu_cookie_compliance.withdraw_enabled) { + Drupal.eu_cookie_compliance.createWithdrawBanner(drupalSettings.eu_cookie_compliance.withdraw_markup); + Drupal.eu_cookie_compliance.attachWithdrawEvents(); + } + Drupal.eu_cookie_compliance.setStatus(value); }; @@ -236,9 +348,21 @@ } } - date.setDate(date.getDate() + parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime)); - $.cookie(cookieName, status, { expires: date, path: path, domain: domain }); + var cookie_session = parseInt(drupalSettings.eu_cookie_compliance.cookie_session); + if (cookie_session) { + $.cookie(cookieName, status, { path: path, domain: domain }); + } else { + var lifetime = parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime); + date.setDate(date.getDate() + lifetime); + $.cookie(cookieName, status, { expires: date, path: path, domain: domain }); + } $(document).trigger('eu_cookie_compliance.changeStatus', [status]); + + // Store consent if applicable. + 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))) { + var url = drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix + 'eu-cookie-compliance/store_consent/banner'; + $.post(url, {}, function (data) { }); + } }; Drupal.eu_cookie_compliance.hasAgreed = function () { @@ -249,7 +373,7 @@ Drupal.eu_cookie_compliance.showBanner = function () { var showBanner = false; var status = Drupal.eu_cookie_compliance.getCurrentStatus(); - if (status === 0 || status === null) { + if ((status === 0 && drupalSettings.eu_cookie_compliance.method === 'default') || status === null) { if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) { showBanner = true; } @@ -270,8 +394,66 @@ return (cookieEnabled); }; - Drupal.eu_cookie_compliance.reloadPage = function () { + // Load blocked scripts if the user has agreed to being tracked. + var euCookieComplianceHasLoadedScripts = false; + $(function () { + if (Drupal.eu_cookie_compliance.hasAgreed() + || (Drupal.eu_cookie_compliance.getCurrentStatus() === null && drupalSettings.eu_cookie_compliance.method !== 'opt_in') + ) { + euCookieComplianceLoadScripts(); + euCookieComplianceHasLoadedScripts = true; + } + }); + + // Block cookies when the user hasn't agreed. + if ((drupalSettings.eu_cookie_compliance.method === 'opt_in' && (Drupal.eu_cookie_compliance.getCurrentStatus() === null || !Drupal.eu_cookie_compliance.hasAgreed())) + || (drupalSettings.eu_cookie_compliance.method === 'opt_out' && !Drupal.eu_cookie_compliance.hasAgreed() && Drupal.eu_cookie_compliance.getCurrentStatus() !== null) + ) { + // Split the white-listed cookies. + var euCookieComplianceWhitelist = drupalSettings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g); + + // Add the EU Cookie Compliance cookie. + euCookieComplianceWhitelist.push((drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name); + var euCookieComplianceBlockCookies = setInterval(function () { + // Load all cookies from jQuery. + var cookies = $.cookie(); + + // Check each cookie and try to remove it if it's not white-listed. + for (var i in cookies) { + var remove = true; + var hostname = window.location.hostname; + var cookieRemoved = false; + var index = 0; + + // Skip the PHP session cookie. + if (i.indexOf('SESS') === 0 || i.indexOf('SSESS') === 0) { + remove = false; + } - }; + // Check if the cookie is white-listed. + for (var item in euCookieComplianceWhitelist) { + if (i === euCookieComplianceWhitelist[item]) { + remove = false; + } + } + + // Remove the cookie if it's not white-listed. + if (remove) { + while (!cookieRemoved && hostname !== '') { + // Attempt to remove. + cookieRemoved = $.removeCookie(i, { domain: '.' + hostname, path: '/' }); + if (!cookieRemoved) { + cookieRemoved = $.removeCookie(i, { domain: hostname, path: '/' }); + } + + index = hostname.indexOf('.'); + + // We can be on a sub-domain, so keep checking the main domain as well. + hostname = (index === -1) ? '' : hostname.substring(index + 1); + } + } + } + }, 5000); + } })(jQuery, Drupal, drupalSettings);