Updated all the contrib modules to their latest versions.
[yaffs-website] / web / modules / contrib / eu_cookie_compliance / js / eu_cookie_compliance.js
index 8b6201f3fea4fdb873270e5e241a55b3553ab5aa..bcb574ffbee488cadfc0554e4952afd37d64c5f3 100644 (file)
@@ -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) {
       } 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 = $('<div></div>').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 = $('<div></div>').html(html);
     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);
     $('.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;
       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);
           $('#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 {
           $('#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();
         }
       });
     }
       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);
   };
 
       }
     }
 
-    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 () {
   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;
       }
     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);