Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / modules / contrib / eu_cookie_compliance / js / eu_cookie_compliance.js
index 60c71a4c9607975a22cb9626d53b485a80a79aea..8b6201f3fea4fdb873270e5e241a55b3553ab5aa 100644 (file)
@@ -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) {
 
   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);