X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Feu_cookie_compliance%2Fjs%2Feu_cookie_compliance.js;fp=web%2Fmodules%2Fcontrib%2Feu_cookie_compliance%2Fjs%2Feu_cookie_compliance.js;h=8b6201f3fea4fdb873270e5e241a55b3553ab5aa;hp=60c71a4c9607975a22cb9626d53b485a80a79aea;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 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 60c71a4c9..8b6201f3f 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 @@ -1,7 +1,7 @@ /** * @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) { @@ -10,204 +10,268 @@ 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 = $('
').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);