8b6201f3fea4fdb873270e5e241a55b3553ab5aa
[yaffs-website] / web / modules / contrib / eu_cookie_compliance / js / eu_cookie_compliance.js
1 /**
2  * @file eu_cookie_compliance.js
3  *
4  * Defines the behavior of the eu cookie compliance banner.
5  */
6
7 (function ($, Drupal, drupalSettings) {
8
9   'use strict';
10
11   Drupal.behaviors.euCookieCompliancePopup = {
12     attach: function (context) {
13       $('body').once('eu-cookie-compliance').each(function () {
14         // If configured, check JSON callback to determine if in EU.
15         if (drupalSettings.eu_cookie_compliance.popup_eu_only_js) {
16           if (Drupal.eu_cookie_compliance.showBanner()) {
17             var url = drupalSettings.path.baseUrl + 'eu-cookie-compliance-check';
18             var data = {};
19             $.getJSON(url, data, function (data) {
20               // If in the EU, show the compliance banner.
21               if (data.in_eu) {
22                 Drupal.eu_cookie_compliance.execute();
23               }
24
25               // If not in EU, set an agreed cookie automatically.
26               else {
27                 Drupal.eu_cookie_compliance.setStatus(2);
28               }
29             });
30           }
31         }
32
33         // Otherwise, fallback to standard behavior which is to render the banner.
34         else {
35           Drupal.eu_cookie_compliance.execute();
36         }
37       });
38     },
39   };
40
41   Drupal.eu_cookie_compliance = {};
42
43   Drupal.eu_cookie_compliance.execute = function () {
44     try {
45       if (!drupalSettings.eu_cookie_compliance.popup_enabled) {
46         return;
47       }
48
49       if (!Drupal.eu_cookie_compliance.cookiesEnabled()) {
50         return;
51       }
52
53       var status = Drupal.eu_cookie_compliance.getCurrentStatus();
54       if (status === 0 || status === null) {
55         if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
56           // Detect mobile here and use mobile_popup_html_info, if we have a mobile device.
57           if (window.matchMedia('(max-width: ' + drupalSettings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && drupalSettings.eu_cookie_compliance.use_mobile_message) {
58             Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.mobile_popup_html_info);
59           } else {
60             Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_info);
61           }
62
63           Drupal.eu_cookie_compliance.attachAgreeEvents();
64         }
65       } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
66         Drupal.eu_cookie_compliance.createPopup(drupalSettings.eu_cookie_compliance.popup_html_agreed);
67         Drupal.eu_cookie_compliance.attachHideEvents();
68       }
69     }
70     catch (e) {
71     }
72   };
73
74   Drupal.eu_cookie_compliance.createPopup = function (html) {
75     // This fixes a problem with jQuery 1.9.
76     var popup = $('<div></div>').html(html);
77     popup.attr('id', 'sliding-popup');
78     if (!drupalSettings.eu_cookie_compliance.popup_use_bare_css) {
79       popup.height(drupalSettings.eu_cookie_compliance.popup_height)
80           .width(drupalSettings.eu_cookie_compliance.popup_width);
81     }
82
83     popup.hide();
84     var height = 0;
85     if (drupalSettings.eu_cookie_compliance.popup_position) {
86       popup.prependTo('body');
87       height = popup.outerHeight();
88       popup.show()
89         .addClass('sliding-popup-top clearfix')
90         .css({ top: -1 * height })
91         .animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
92           popup.trigger('eu_cookie_compliance_popup_open');
93         });
94     } else {
95       if (drupalSettings.eu_cookie_compliance.better_support_for_screen_readers) {
96         popup.prependTo('body');
97       } else {
98         popup.appendTo('body');
99       }
100
101       height = popup.outerHeight();
102       popup.show()
103         .addClass('sliding-popup-bottom')
104         .css({ bottom: -1 * height })
105         .animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay, null, function () {
106           popup.trigger('eu_cookie_compliance_popup_open');
107         });
108     }
109   };
110
111   Drupal.eu_cookie_compliance.attachAgreeEvents = function () {
112     var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
113     var scrollConfirms = drupalSettings.eu_cookie_compliance.popup_scrolling_confirmation;
114
115     $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction);
116
117     if (clickingConfirms) {
118       $('a, input[type=submit], button[type=submit]').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction);
119     }
120
121     if (scrollConfirms) {
122       var alreadyScrolled = false;
123       var scrollHandler = function () {
124         if (alreadyScrolled) {
125           Drupal.eu_cookie_compliance.acceptAction();
126           $(window).off('scroll', scrollHandler);
127         } else {
128           alreadyScrolled = true;
129         }
130       };
131
132       $(window).bind('scroll', scrollHandler);
133     }
134
135     $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
136   };
137
138   Drupal.eu_cookie_compliance.attachHideEvents = function () {
139     var popupHideAgreed = drupalSettings.eu_cookie_compliance.popup_hide_agreed;
140     var clickingConfirms = drupalSettings.eu_cookie_compliance.popup_clicking_confirmation;
141     $('.hide-popup-button').click(function () {
142           Drupal.eu_cookie_compliance.changeStatus(2);
143         }
144     );
145     if (clickingConfirms) {
146       $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance');
147     }
148
149     if (popupHideAgreed) {
150       $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () {
151         Drupal.eu_cookie_compliance.changeStatus(2);
152       });
153     }
154
155     $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction);
156   };
157
158   Drupal.eu_cookie_compliance.acceptAction = function () {
159     var agreedEnabled = drupalSettings.eu_cookie_compliance.popup_agreed_enabled;
160     var nextStatus = 1;
161     if (!agreedEnabled) {
162       Drupal.eu_cookie_compliance.setStatus(1);
163       nextStatus = 2;
164     }
165
166     Drupal.eu_cookie_compliance.changeStatus(nextStatus);
167   };
168
169   Drupal.eu_cookie_compliance.moreInfoAction = function () {
170     if (drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup) {
171       Drupal.eu_cookie_compliance.setStatus(0);
172       $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
173     } else {
174       if (drupalSettings.eu_cookie_compliance.popup_link_new_window) {
175         window.open(drupalSettings.eu_cookie_compliance.popup_link);
176       } else {
177         window.location.href = drupalSettings.eu_cookie_compliance.popup_link;
178       }
179     }
180   };
181
182   Drupal.eu_cookie_compliance.getCurrentStatus = function () {
183     var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
184     var value = $.cookie(cookieName);
185     value = parseInt(value);
186     if (isNaN(value)) {
187       value = null;
188     }
189
190     return value;
191   };
192
193   Drupal.eu_cookie_compliance.changeStatus = function (value) {
194     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
195     var reloadPage = drupalSettings.eu_cookie_compliance.reload_page;
196     if (status === value) {
197       return;
198     }
199
200     if (drupalSettings.eu_cookie_compliance.popup_position) {
201       $('.sliding-popup-top').animate({ top: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
202         if (status === null && !reloadPage) {
203           $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ top: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
204           Drupal.eu_cookie_compliance.attachHideEvents();
205         } else if (status === 1) {
206           $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
207         }
208       });
209     } else {
210       $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, drupalSettings.eu_cookie_compliance.popup_delay, function () {
211         if (status === null && !reloadPage) {
212           $('#sliding-popup').html(drupalSettings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, drupalSettings.eu_cookie_compliance.popup_delay);
213           Drupal.eu_cookie_compliance.attachHideEvents();
214         } else if (status === 1) {
215           $('#sliding-popup').remove().trigger('eu_cookie_compliance_popup_close');
216         }
217       });
218     }
219
220     if (drupalSettings.eu_cookie_compliance.reload_page) {
221       location.reload();
222     }
223
224     Drupal.eu_cookie_compliance.setStatus(value);
225   };
226
227   Drupal.eu_cookie_compliance.setStatus = function (status) {
228     var date = new Date();
229     var domain = drupalSettings.eu_cookie_compliance.domain ? drupalSettings.eu_cookie_compliance.domain : '';
230     var path = drupalSettings.path.baseUrl;
231     var cookieName = (drupalSettings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : drupalSettings.eu_cookie_compliance.cookie_name;
232     if (path.length > 1) {
233       var pathEnd = path.length - 1;
234       if (path.lastIndexOf('/') === pathEnd) {
235         path = path.substring(0, pathEnd);
236       }
237     }
238
239     date.setDate(date.getDate() + parseInt(drupalSettings.eu_cookie_compliance.cookie_lifetime));
240     $.cookie(cookieName, status, { expires: date, path: path, domain: domain });
241     $(document).trigger('eu_cookie_compliance.changeStatus', [status]);
242   };
243
244   Drupal.eu_cookie_compliance.hasAgreed = function () {
245     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
246     return (status === 1 || status === 2);
247   };
248
249   Drupal.eu_cookie_compliance.showBanner = function () {
250     var showBanner = false;
251     var status = Drupal.eu_cookie_compliance.getCurrentStatus();
252     if (status === 0 || status === null) {
253       if (!drupalSettings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) {
254         showBanner = true;
255       }
256     } else if (status === 1 && drupalSettings.eu_cookie_compliance.popup_agreed_enabled) {
257       showBanner = true;
258     }
259
260     return showBanner;
261   };
262
263   Drupal.eu_cookie_compliance.cookiesEnabled = function () {
264     var cookieEnabled = (navigator.cookieEnabled);
265     if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) {
266       $.cookie('testcookie', 'testcookie', { expires: 100 });
267       cookieEnabled = ($.cookie('testcookie').indexOf('testcookie') !== -1);
268     }
269
270     return (cookieEnabled);
271   };
272
273   Drupal.eu_cookie_compliance.reloadPage = function () {
274
275   };
276
277 })(jQuery, Drupal, drupalSettings);