1/** 2 * @file 3 * Cookie Compliance Javascript. 4 * 5 * Statuses: 6 * null: not yet agreed (or withdrawn), show popup 7 * 0: Disagreed 8 * 1: Agreed, show thank you banner 9 * 2: Agreed. 10 */ 11 12(function ($) { 13 14 'use strict'; 15 var euCookieComplianceBlockCookies; 16 var cookieValueDisagreed = (typeof Drupal.settings.eu_cookie_compliance.cookie_value_disagreed === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_value_disagreed === '') ? '0' : Drupal.settings.eu_cookie_compliance.cookie_value_disagreed; 17 var cookieValueAgreedShowThankYou = (typeof Drupal.settings.eu_cookie_compliance.cookie_value_agreed_show_thank_you === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_value_agreed_show_thank_you === '') ? '1' : Drupal.settings.eu_cookie_compliance.cookie_value_agreed_show_thank_you; 18 var cookieValueAgreed = (typeof Drupal.settings.eu_cookie_compliance.cookie_value_agreed === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_value_agreed === '') ? '2' : Drupal.settings.eu_cookie_compliance.cookie_value_agreed; 19 20 Drupal.behaviors.eu_cookie_compliance_popup = { 21 attach: function (context, settings) { 22 $(Drupal.settings.eu_cookie_compliance.containing_element, context).once('eu-cookie-compliance', function () { 23 24 // Initialize internal variables. 25 _euccCurrentStatus = self.getCurrentStatus(); 26 _euccSelectedCategories = self.getAcceptedCategories(); 27 28 // If configured, check JSON callback to determine if in EU. 29 if (Drupal.settings.eu_cookie_compliance.popup_eu_only_js) { 30 if (Drupal.eu_cookie_compliance.showBanner()) { 31 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance-check'; 32 var data = {}; 33 $.getJSON(url, data, function (data) { 34 // If in the EU, show the compliance banner. 35 if (data.in_eu) { 36 Drupal.eu_cookie_compliance.execute(); 37 } 38 39 // If not in EU, set an agreed cookie automatically. 40 else { 41 Drupal.eu_cookie_compliance.setStatus(cookieValueAgreed); 42 } 43 }); 44 } 45 } 46 47 // Otherwise, fallback to standard behavior which is to render the banner. 48 else { 49 Drupal.eu_cookie_compliance.execute(); 50 } 51 }).addClass('eu-cookie-compliance-status-' + Drupal.eu_cookie_compliance.getCurrentStatus()); 52 } 53 }; 54 55 // Sep up the namespace as a function to store list of arguments in a queue. 56 Drupal.eu_cookie_compliance = Drupal.eu_cookie_compliance || function () { 57 (Drupal.eu_cookie_compliance.queue = Drupal.eu_cookie_compliance.queue || []).push(arguments) 58 }; 59 // Initialize the object with some data. 60 Drupal.eu_cookie_compliance.a = +new Date; 61 // A shorter name to use when accessing the namespace. 62 var self = Drupal.eu_cookie_compliance; 63 // Save our cookie preferences locally only. 64 // Used by external scripts to modify data before it is used. 65 var _euccSelectedCategories = []; 66 var _euccCurrentStatus = null; 67 self.updateSelectedCategories = function (categories) { 68 _euccSelectedCategories = categories; 69 } 70 self.updateCurrentStatus = function (status) { 71 _euccCurrentStatus = status; 72 } 73 74 Drupal.eu_cookie_compliance.execute = function () { 75 try { 76 if (!Drupal.settings.eu_cookie_compliance.popup_enabled) { 77 return; 78 } 79 80 if (!Drupal.eu_cookie_compliance.cookiesEnabled()) { 81 return; 82 } 83 84 if (typeof Drupal.eu_cookie_compliance.getVersion() === 'undefined') { 85 // If version doesn't exist as a cookie, set it to the current one. 86 // For modules that update to this, it prevents needless retriggering 87 // For first time runs, it makes no difference as the other IF statements 88 // below will still cause the popup to trigger 89 // For incrementing the version, it also makes no difference as either it's 90 // a returning user and will have a version set, or it's a new user and 91 // the other checks will trigger it. 92 Drupal.eu_cookie_compliance.setVersion(); 93 } 94 95 Drupal.eu_cookie_compliance.updateCheck(); 96 var versionChanged = Drupal.eu_cookie_compliance.getVersion() !== Drupal.settings.eu_cookie_compliance.cookie_policy_version; 97 // Closed if status has a value and the version hasn't changed. 98 var closed = _euccCurrentStatus !== null && !versionChanged; 99 if ((_euccCurrentStatus === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || _euccCurrentStatus === null || (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) || versionChanged) { 100 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled || !Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup || _euccCurrentStatus === null || versionChanged) { 101 // Detect mobile here and use mobile_popup_html_info, if we have a mobile device. 102 if (window.matchMedia('(max-width: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 103 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info, closed); 104 } 105 else { 106 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_info, closed); 107 } 108 109 Drupal.eu_cookie_compliance.initPopup(); 110 Drupal.eu_cookie_compliance.resizeListener(); 111 } 112 } 113 if (_euccCurrentStatus === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 114 // Thank you banner. 115 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_agreed); 116 Drupal.eu_cookie_compliance.attachHideEvents(); 117 } 118 else if (_euccCurrentStatus === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 119 if (!Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 120 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 121 Drupal.eu_cookie_compliance.resizeListener(); 122 } 123 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 124 } 125 } 126 catch (e) { 127 } 128 }; 129 130 Drupal.eu_cookie_compliance.initPopup = function () { 131 Drupal.eu_cookie_compliance.attachAgreeEvents(); 132 133 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 134 Drupal.eu_cookie_compliance.setPreferenceCheckboxes(_euccSelectedCategories); 135 Drupal.eu_cookie_compliance.attachSavePreferencesEvents(); 136 } 137 138 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 139 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 140 if (_euccCurrentStatus === 1 || _euccCurrentStatus === 2) { 141 $('.eu-cookie-withdraw-button').removeClass('eu-cookie-compliance-hidden'); 142 } 143 } 144 } 145 146 Drupal.eu_cookie_compliance.positionTab = function () { 147 if (Drupal.settings.eu_cookie_compliance.popup_position) { 148 var totalHeight = $('.eu-cookie-withdraw-tab').outerHeight() + $('.eu-cookie-compliance-banner').outerHeight(); 149 $('.eu-cookie-withdraw-tab').css('margin-top', totalHeight + 'px'); 150 } 151 }; 152 153 Drupal.eu_cookie_compliance.createWithdrawBanner = function (html) { 154 var $html = $('<div></div>').html(html); 155 var $banner = $('.eu-cookie-withdraw-banner', $html); 156 $html.attr('id', 'sliding-popup'); 157 $html.addClass('eu-cookie-withdraw-wrapper'); 158 159 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 160 $banner.height(Drupal.settings.eu_cookie_compliance.popup_height) 161 .width(Drupal.settings.eu_cookie_compliance.popup_width); 162 } 163 $html.hide(); 164 var height = 0; 165 if (Drupal.settings.eu_cookie_compliance.popup_position) { 166 $html.prependTo(Drupal.settings.eu_cookie_compliance.containing_element); 167 height = $html.outerHeight(); 168 169 $html.show() 170 .addClass('sliding-popup-top') 171 .addClass('clearfix') 172 .css({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + height) : -1 * height }); 173 // For some reason, the tab outerHeight is -10 if we don't use a timeout 174 // function to reveal the tab. 175 setTimeout(function () { 176 $html.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + height) : -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 177 $html.trigger('eu_cookie_compliance_popup_open'); 178 $('body').addClass('eu-cookie-compliance-popup-open'); 179 Drupal.eu_cookie_compliance.positionTab(); 180 }); 181 }.bind($html, height), 0); 182 } 183 else { 184 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 185 $html.prependTo(Drupal.settings.eu_cookie_compliance.containing_element); 186 } 187 else { 188 $html.appendTo(Drupal.settings.eu_cookie_compliance.containing_element); 189 } 190 height = $html.outerHeight(); 191 $html.show() 192 .addClass('sliding-popup-bottom') 193 .css({ bottom: -1 * height }); 194 // For some reason, the tab outerHeight is -10 if we don't use a timeout 195 // function to reveal the tab. 196 setTimeout(function () { 197 $html.animate({ bottom: -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 198 $html.trigger('eu_cookie_compliance_popup_open'); 199 $('body').addClass('eu-cookie-compliance-popup-open'); 200 }); 201 }.bind($html, height), 0); 202 } 203 }; 204 205 Drupal.eu_cookie_compliance.toggleWithdrawBanner = function () { 206 var $wrapper = $('#sliding-popup'); 207 var height = $wrapper.outerHeight(); 208 var $bannerIsShowing = ($wrapper.find('.eu-cookie-compliance-banner, .eu-cookie-withdraw-banner').is(':visible')); 209 if ($bannerIsShowing) { 210 $bannerIsShowing = Drupal.settings.eu_cookie_compliance.popup_position ? parseInt($wrapper.css('top')) === (!Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top'))) : 0) : parseInt($wrapper.css('bottom')) === 0; 211 } 212 if (Drupal.settings.eu_cookie_compliance.popup_position) { 213 if ($bannerIsShowing) { 214 $wrapper.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + height) : -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay).trigger('eu_cookie_compliance_popup_close'); 215 $('body').removeClass('eu-cookie-compliance-popup-open'); 216 } 217 else { 218 // If "Do not show cookie policy when the user clicks the Cookie policy button." is 219 // selected, the inner banner may be hidden. 220 $wrapper.find('.eu-cookie-compliance-banner').show(); 221 $wrapper.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top'))) : 0 }, Drupal.settings.eu_cookie_compliance.popup_delay).trigger('eu_cookie_compliance_popup_open'); 222 $('body').addClass('eu-cookie-compliance-popup-open'); 223 } 224 } 225 else { 226 if ($bannerIsShowing) { 227 $wrapper.animate({ 'bottom': -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay).trigger('eu_cookie_compliance_popup_close'); 228 $('body').removeClass('eu-cookie-compliance-popup-open'); 229 } 230 else { 231 // If "Do not show cookie policy when the user clicks the Cookie policy button." is 232 // selected, the inner banner may be hidden. 233 $wrapper.find('.eu-cookie-compliance-banner').show(); 234 $wrapper.animate({ 'bottom': 0 }, Drupal.settings.eu_cookie_compliance.popup_delay).trigger('eu_cookie_compliance_popup_open'); 235 $('body').addClass('eu-cookie-compliance-popup-open'); 236 } 237 } 238 }; 239 240 Drupal.eu_cookie_compliance.resizeListener = function () { 241 var $wrapper = $('#sliding-popup'); 242 243 const debounce = function (func, wait ) { 244 var timeout; 245
246 return function executedFunction() { 247 var later = function () { 248 clearTimeout(timeout); 249 func(); 250 }; 251 252 clearTimeout(timeout); 253 timeout = setTimeout(later, wait); 254 }; 255 }; 256 257 var checkIfPopupIsClosed = debounce(function () { 258 var wrapperHeight = $wrapper.outerHeight(); 259 if (Drupal.settings.eu_cookie_compliance.popup_position) { 260 var wrapperTopProperty = parseFloat($wrapper.css('bottom')); 261 if (wrapperTopProperty !== 0) { 262 $wrapper.css('top', wrapperHeight * -1); 263 } 264 } 265 else { 266 var wrapperBottomProperty = parseFloat($wrapper.css('bottom')); 267 if (wrapperBottomProperty !== 0) { 268 $wrapper.css('bottom', wrapperHeight * -1); 269 } 270 } 271 }, 50); 272 273 setTimeout(function () { 274 checkIfPopupIsClosed(); 275 }); 276 277 window.addEventListener('resize', checkIfPopupIsClosed); 278 279 }; 280 281 Drupal.eu_cookie_compliance.createPopup = function (html, closed) { 282 // This fixes a problem with jQuery 1.9. 283 var $popup = $('<div></div>').html(html); 284 $popup.attr('id', 'sliding-popup'); 285 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 286 $popup.height(Drupal.settings.eu_cookie_compliance.popup_height) 287 .width(Drupal.settings.eu_cookie_compliance.popup_width); 288 } 289 290 $popup.hide(); 291 var height = 0; 292 if (Drupal.settings.eu_cookie_compliance.popup_position) { 293 $popup.prependTo(Drupal.settings.eu_cookie_compliance.containing_element); 294 height = $popup.outerHeight(); 295 $popup.show() 296 .attr({ 'class': 'sliding-popup-top clearfix' }) 297 .css({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + height) : -1 * height }); 298 if (closed !== true) { 299 $popup.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top'))) : 0 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 300 $popup.trigger('eu_cookie_compliance_popup_open'); 301 $('body').addClass('eu-cookie-compliance-popup-open'); 302 Drupal.eu_cookie_compliance.positionTab(); 303 }); 304 } 305 else { 306 setTimeout(function () { 307 Drupal.eu_cookie_compliance.positionTab(); 308 }, 0); 309 } 310 } 311 else { 312 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 313 $popup.prependTo(Drupal.settings.eu_cookie_compliance.containing_element); 314 } 315 else { 316 $popup.appendTo(Drupal.settings.eu_cookie_compliance.containing_element); 317 } 318 319 height = $popup.outerHeight(); 320 $popup.show() 321 .attr({ 'class': 'sliding-popup-bottom' }) 322 .css({ bottom: -1 * height }); 323 if (closed !== true) { 324 $popup.animate({bottom: 0}, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 325 $popup.trigger('eu_cookie_compliance_popup_open'); 326 $('body').addClass('eu-cookie-compliance-popup-open'); 327 }); 328 } 329 } 330 }; 331 332 Drupal.eu_cookie_compliance.attachAgreeEvents = function () { 333 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 334 var scrollConfirms = Drupal.settings.eu_cookie_compliance.popup_scrolling_confirmation; 335 336 if (Drupal.settings.eu_cookie_compliance.method === 'categories' && Drupal.settings.eu_cookie_compliance.enable_save_preferences_button) { 337 // The agree button becomes an agree to all categories button when the 'save preferences' button is present. 338 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAllAction); 339 } 340 else { 341 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction); 342 } 343 $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction); 344 345 if (clickingConfirms) { 346 $('a, input[type=submit], button[type=submit]').not('.popup-content *').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction); 347 } 348 349 if (scrollConfirms) { 350 var alreadyScrolled = false;
351 var scrollHandler = function () { 352 if (alreadyScrolled) { 353 Drupal.eu_cookie_compliance.acceptAction(); 354 $(window).off('scroll', scrollHandler); 355 } 356 else { 357 alreadyScrolled = true; 358 } 359 }; 360 361 $(window).bind('scroll', scrollHandler); 362 } 363 364 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 365 }; 366 367 Drupal.eu_cookie_compliance.attachSavePreferencesEvents = function () { 368 $('.eu-cookie-compliance-save-preferences-button').click(Drupal.eu_cookie_compliance.savePreferencesAction); 369 }; 370 371 Drupal.eu_cookie_compliance.attachHideEvents = function () { 372 var popupHideAgreed = Drupal.settings.eu_cookie_compliance.popup_hide_agreed; 373 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 374 $('.hide-popup-button').click(function () { 375 Drupal.eu_cookie_compliance.changeStatus(cookieValueAgreed); 376 } 377 ); 378 if (clickingConfirms) { 379 $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance'); 380 } 381 382 if (popupHideAgreed) { 383 $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () { 384 Drupal.eu_cookie_compliance.changeStatus(cookieValueAgreed); 385 }); 386 } 387 388 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 389 }; 390 391 Drupal.eu_cookie_compliance.attachWithdrawEvents = function () { 392 $('.eu-cookie-withdraw-button').click(Drupal.eu_cookie_compliance.withdrawAction); 393 $('.eu-cookie-withdraw-tab').click(Drupal.eu_cookie_compliance.toggleWithdrawBanner); 394 }; 395 396 Drupal.eu_cookie_compliance.acceptAction = function () { 397 var agreedEnabled = Drupal.settings.eu_cookie_compliance.popup_agreed_enabled; 398 var nextStatus = cookieValueAgreedShowThankYou; 399 if (!agreedEnabled) { 400 Drupal.eu_cookie_compliance.setStatus(cookieValueAgreedShowThankYou); 401 nextStatus = cookieValueAgreed; 402 } 403 404 if (!euCookieComplianceHasLoadedScripts && typeof euCookieComplianceLoadScripts === "function") { 405 euCookieComplianceLoadScripts(); 406 } 407 408 if (typeof euCookieComplianceBlockCookies !== 'undefined') { 409 clearInterval(euCookieComplianceBlockCookies); 410 } 411 412 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 413 // Select Checked categories. 414 var categories = $("#eu-cookie-compliance-categories input:checkbox:checked").map(function () { 415 return $(this).val(); 416 }).get(); 417 Drupal.eu_cookie_compliance.setAcceptedCategories(categories); 418 // Load scripts for all categories. If no categories selected, none 419 // will be loaded. 420 Drupal.eu_cookie_compliance.loadCategoryScripts(categories); 421 if (!categories.length) { 422 // No categories selected is the same as declining all cookies. 423 nextStatus = cookieValueDisagreed; 424 } 425 } 426 427 Drupal.eu_cookie_compliance.changeStatus(nextStatus); 428 429 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 430 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 431 if (_euccCurrentStatus === 1 || _euccCurrentStatus === 2) { 432 $('.eu-cookie-withdraw-button').removeClass('eu-cookie-compliance-hidden'); 433 } 434 } 435 }; 436 437 Drupal.eu_cookie_compliance.acceptAllAction = function () { 438 var allCategories = Drupal.settings.eu_cookie_compliance.cookie_categories; 439 Drupal.eu_cookie_compliance.setPreferenceCheckboxes(allCategories); 440 Drupal.eu_cookie_compliance.acceptAction(); 441 } 442 443 Drupal.eu_cookie_compliance.savePreferencesAction = function () { 444 var categories = $("#eu-cookie-compliance-categories input:checkbox:checked").map(function () { 445 return $(this).val(); 446 }).get(); 447 var agreedEnabled = Drupal.settings.eu_cookie_compliance.popup_agreed_enabled; 448 var nextStatus = cookieValueAgreedShowThankYou; 449 if (!agreedEnabled) {
450 Drupal.eu_cookie_compliance.setStatus(cookieValueAgreedShowThankYou); 451 nextStatus = cookieValueAgreed; 452 } 453 454 Drupal.eu_cookie_compliance.setAcceptedCategories(categories); 455 // Load scripts for all categories. If no categories selected, none 456 // will be loaded. 457 Drupal.eu_cookie_compliance.loadCategoryScripts(categories); 458 if (!categories.length) { 459 // No categories selected is the same as declining all cookies. 460 nextStatus = cookieValueDisagreed; 461 } 462 Drupal.eu_cookie_compliance.changeStatus(nextStatus); 463 }; 464 465 Drupal.eu_cookie_compliance.loadCategoryScripts = function (categories) { 466 for (var cat in categories) { 467 if (euCookieComplianceHasLoadedScriptsForCategory[cat] !== true && typeof euCookieComplianceLoadScripts === "function") { 468 euCookieComplianceLoadScripts(categories[cat]); 469 euCookieComplianceHasLoadedScriptsForCategory[cat] = true; 470 } 471 } 472 } 473 474 Drupal.eu_cookie_compliance.declineAction = function () { 475 Drupal.eu_cookie_compliance.setStatus(cookieValueDisagreed); 476 var popup = $('#sliding-popup'); 477 if (popup.hasClass('sliding-popup-top')) { 478 popup.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + popup.outerHeight()) : popup.outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 479 popup.hide(); 480 }).trigger('eu_cookie_compliance_popup_close'); 481 $('body').removeClass('eu-cookie-compliance-popup-open'); 482 } 483 else { 484 popup.animate({ bottom: popup.outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 485 popup.hide(); 486 }).trigger('eu_cookie_compliance_popup_close'); 487 $('body').removeClass('eu-cookie-compliance-popup-open'); 488 } 489 }; 490 491 Drupal.eu_cookie_compliance.withdrawAction = function () { 492 // Save "decline". 493 Drupal.eu_cookie_compliance.setStatus(0); 494 495 Drupal.eu_cookie_compliance.setAcceptedCategories([]); 496 location.reload(); 497 }; 498 499 Drupal.eu_cookie_compliance.moreInfoAction = function () { 500 if (Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup) { 501 Drupal.eu_cookie_compliance.setStatus(cookieValueDisagreed); 502 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 503 $('#sliding-popup .eu-cookie-compliance-banner').trigger('eu_cookie_compliance_popup_close').hide(); 504 $('body').removeClass('eu-cookie-compliance-popup-open'); 505 } 506 else { 507 $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); 508 $('body').removeClass('eu-cookie-compliance-popup-open'); 509 } 510 } 511 else { 512 if (Drupal.settings.eu_cookie_compliance.popup_link_new_window) { 513 window.open(Drupal.settings.eu_cookie_compliance.popup_link); 514 } 515 else { 516 window.location.href = Drupal.settings.eu_cookie_compliance.popup_link; 517 } 518 } 519 }; 520 521 Drupal.eu_cookie_compliance.getCurrentStatus = function () { 522 // Make a new observer & fire it to allow other scripts to hook in. 523 var preStatusLoadObject = new PreStatusLoad(); 524 self.handleEvent('preStatusLoad', preStatusLoadObject); 525 526 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 527 if ($.cookie(cookieName) === cookieValueDisagreed) { 528 var numericalStatus = '0'; 529 } else if ($.cookie(cookieName) === cookieValueAgreedShowThankYou) { 530 var numericalStatus = '1'; 531 } else if ($.cookie(cookieName) === cookieValueAgreed) { 532 var numericalStatus = '2'; 533 } 534 var storedStatus = numericalStatus; 535 _euccCurrentStatus = parseInt(storedStatus); 536 if (isNaN(_euccCurrentStatus)) { 537 _euccCurrentStatus = null; 538 } 539 540 // Make a new observer & fire it to allow other scripts to hook in. 541 var postStatusLoadObject = new PostStatusLoad(); 542 self.handleEvent('postStatusLoad', postStatusLoadObject); 543 544 return _euccCurrentStatus; 545 }; 546 547 Drupal.eu_cookie_compliance.setPreferenceCheckboxes = function (categories) { 548 // Unset all categories to prevent a problem where the checkboxes with a 549 // default state set would always show up as checked. 550 if ((categories.length && Drupal.eu_cookie_compliance.getCurrentStatus() !== null) || Drupal.eu_cookie_compliance.getCurrentStatus() === 0) { 551 $("#eu-cookie-compliance-categories input:checkbox").removeAttr("checked"); 552 } 553 // Check the appropriate checkboxes. 554 for (var i in categories) { 555 // Rewrite the id like we do in Drupal 7 drupal_html_class. 556 var safeCategoryId = categories[i].replace(/[ _\/\[\]]/g,'-').toLowerCase(); 557 var categoryElement = document.getElementById('cookie-category-' + safeCategoryId); 558 if (categoryElement !== null) { 559 categoryElement.checked = true; 560 } 561 } 562 } 563 564 Drupal.eu_cookie_compliance.getAcceptedCategories = function () { 565 // Make a new observer & fire it to allow other scripts to hook in. 566 var prePreferencesLoadObject = new PrePreferencesLoad(); 567 self.handleEvent('prePreferencesLoad', prePreferencesLoadObject); 568 569 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed-categories' : Drupal.settings.eu_cookie_compliance.cookie_name + '-categories'; 570 var storedCategories = $.cookie(cookieName); 571 572 if (storedCategories !== null && typeof storedCategories !== 'undefined') { 573 _euccSelectedCategories = JSON.parse(storedCategories); 574 } 575 else { 576 _euccSelectedCategories = []; 577 } 578 579 // Merge in required categories if not already present. Mimics old 580 // logic where "fix first category" changed logic in 581 // .hasAgreedWithCategory and this function. 582 for (var _categoryName in Drupal.settings.eu_cookie_compliance.cookie_categories_details) { 583 var _category = Drupal.settings.eu_cookie_compliance.cookie_categories_details[_categoryName]; 584 if (_category.checkbox_default_state === 'required' && $.inArray(_category.machine_name, _euccSelectedCategories) === -1) { 585 _euccSelectedCategories.push(_category.machine_name); 586 } 587 } 588 589 // Make a new observer & fire it to allow other scripts to hook in. 590 var postPreferencesLoadObject = new PostPreferencesLoad(); 591 self.handleEvent('postPreferencesLoad', postPreferencesLoadObject); 592 593 return _euccSelectedCategories; 594 }; 595 596 Drupal.eu_cookie_compliance.changeStatus = function (value) { 597 var reloadPage = Drupal.settings.eu_cookie_compliance.reload_page; 598 var previousState = _euccCurrentStatus; 599 if (_euccCurrentStatus === parseInt(value)) { 600 return; 601 } 602 603 if (Drupal.settings.eu_cookie_compliance.popup_position) { 604 $('.sliding-popup-top').animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top')) + $('#sliding-popup').outerHeight()) : $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () {
605 if (value === cookieValueAgreedShowThankYou && previousState === null && !reloadPage) { 606 $('.sliding-popup-top').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.popup_html_agreed).animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('padding-top')) + parseInt($(Drupal.settings.eu_cookie_compliance.containing_element).css('margin-top'))) : 0 }, Drupal.settings.eu_cookie_compliance.popup_delay); 607 Drupal.eu_cookie_compliance.attachHideEvents(); 608 } 609 else if (previousState === cookieValueAgreedShowThankYou) { 610 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 611 // Restore popup content. 612 if (window.matchMedia('(max-width: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 613 $('.sliding-popup-top').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info); 614 } 615 else { 616 $('.sliding-popup-top').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.popup_html_info); 617 } 618 Drupal.eu_cookie_compliance.initPopup(); 619 Drupal.eu_cookie_compliance.resizeListener(); 620 } 621 else { 622 $('.sliding-popup-top').not('.eu-cookie-withdraw-wrapper').trigger('eu_cookie_compliance_popup_close').remove(); 623 $('body').removeClass('eu-cookie-compliance-popup-open'); 624 } 625 } 626 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 627 Drupal.eu_cookie_compliance.showWithdrawBanner(value); 628 } 629 }); 630 } 631 else { 632 $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () { 633 if (value === cookieValueAgreedShowThankYou && previousState === null && !reloadPage) { 634 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, Drupal.settings.eu_cookie_compliance.popup_delay); 635 Drupal.eu_cookie_compliance.attachHideEvents(); 636 } 637 else if (previousState === cookieValueAgreedShowThankYou) { 638 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 639 // Restore popup content. 640 if (window.matchMedia('(max-width: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 641 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info); 642 } 643 else { 644 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.popup_html_info); 645 } 646 Drupal.eu_cookie_compliance.initPopup(); 647 Drupal.eu_cookie_compliance.resizeListener(); 648 } 649 else { 650 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').trigger('eu_cookie_compliance_popup_close').remove(); 651 $('body').removeClass('eu-cookie-compliance-popup-open'); 652 } 653 } 654 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 655 Drupal.eu_cookie_compliance.showWithdrawBanner(value); 656 } 657 }); 658 } 659 660 if (reloadPage) { 661 location.reload(); 662 } 663 664 Drupal.eu_cookie_compliance.setStatus(value); 665 }; 666 667 Drupal.eu_cookie_compliance.showWithdrawBanner = function (value) { 668 if (value === cookieValueAgreed && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 669 if (!Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 670 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 671 Drupal.eu_cookie_compliance.resizeListener(); 672 } 673 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 674 Drupal.eu_cookie_compliance.positionTab(); 675 } 676 }; 677 678 Drupal.eu_cookie_compliance.setStatus = function (status) { 679 680 // Make a new observer & fire it to allow other scripts to hook in. 681 var preStatusSaveObject = new PreStatusSave(); 682 self.handleEvent('preStatusSave', preStatusSaveObject); 683 684 var date = new Date(); 685 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 686 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 687 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 688 if (path.length > 1) { 689 var pathEnd = path.length - 1; 690 if (path.lastIndexOf('/') === pathEnd) { 691 path = path.substring(0, pathEnd); 692 } 693 } 694 695 var cookieSession = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 696 if (cookieSession) { 697 $.cookie(cookieName, status, { path: path, domain: domain }); 698 } 699 else { 700 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 701 date.setDate(date.getDate() + lifetime); 702 $.cookie(cookieName, status, { expires: date, path: path, domain: domain }); 703 } 704 _euccCurrentStatus = status; 705 $(document).trigger('eu_cookie_compliance.changeStatus', [status]); 706 // Status set means something happened, update the version. 707 Drupal.eu_cookie_compliance.setVersion(); 708 709 // Store consent if applicable. 710 if (Drupal.settings.eu_cookie_compliance.store_consent && ((status === cookieValueAgreedS
710howThankYou && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) || (status === cookieValueAgreed && !Drupal.settings.eu_cookie_compliance.popup_agreed_enabled))) { 711 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance/store_consent/banner'; 712 $.post(url, {}, function (data) { }); 713 } 714 715 // Make a new observer & fire it to allow other scripts to hook in. 716 var postStatusSaveObject = new PostStatusSave(); 717 self.handleEvent('postStatusSave', postStatusSaveObject); 718 719 if (status === cookieValueDisagreed && Drupal.settings.eu_cookie_compliance.method === 'opt_out') { 720 euCookieComplianceBlockCookies = setInterval(Drupal.eu_cookie_compliance.BlockCookies, 5000); 721 } 722 }; 723 724 Drupal.eu_cookie_compliance.setAcceptedCategories = function (categories) { 725 726 // Make a new observer & fire it to allow other scripts to hook in. 727 var prePreferencesSaveObject = new PrePreferencesSave(); 728 self.handleEvent('prePreferencesSave', prePreferencesSaveObject); 729 730 var date = new Date(); 731 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 732 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 733 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed-categories' : Drupal.settings.eu_cookie_compliance.cookie_name + '-categories'; 734 if (path.length > 1) { 735 var pathEnd = path.length - 1; 736 if (path.lastIndexOf('/') === pathEnd) { 737 path = path.substring(0, pathEnd); 738 } 739 } 740 var categoriesString = JSON.stringify(categories); 741 var cookie_session = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 742 if (cookie_session) { 743 $.cookie(cookieName, categoriesString, { path: path, domain: domain }); 744 } 745 else { 746 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 747 date.setDate(date.getDate() + lifetime); 748 $.cookie(cookieName, categoriesString, { expires: date, path: path, domain: domain }); 749 } 750 _euccSelectedCategories = categories; 751 $(document).trigger('eu_cookie_compliance.changePreferences', [categories]); 752 753 // TODO: Store categories with consent if applicable? 754 // Make a new observer & fire it to allow other scripts to hook in. 755 var postPreferencesSaveObject = new PostPreferencesSave(); 756 self.handleEvent('postPreferencesSave', postPreferencesSaveObject); 757 }; 758 759 Drupal.eu_cookie_compliance.hasAgreed = function (category) { 760 var agreed = (_euccCurrentStatus === 1 || _euccCurrentStatus === 2); 761 762 if (category !== undefined && agreed) { 763 agreed = Drupal.eu_cookie_compliance.hasAgreedWithCategory(category); 764 } 765 766 return agreed; 767 }; 768 769 Drupal.eu_cookie_compliance.hasAgreedWithCategory = function (category) { 770 return $.inArray(category, _euccSelectedCategories) !== -1; 771 }; 772 773 Drupal.eu_cookie_compliance.showBanner = function () { 774 var showBanner = false; 775 if ((_euccCurrentStatus === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || _euccCurrentStatus === null) { 776 if (!Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup || _euccCurrentStatus === null) { 777 showBanner = true; 778 } 779 } 780 else if (_euccCurrentStatus === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 781 showBanner = true; 782 } 783 else if (_euccCurrentStatus === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 784 showBanner = true; 785 } 786 787 return showBanner; 788 }; 789 790 Drupal.eu_cookie_compliance.cookiesEnabled = function () { 791 var cookieEnabled = navigator.cookieEnabled; 792 if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) { 793 document.cookie = 'testCookie'; 794 cookieEnabled = (document.cookie.indexOf('testCookie') !== -1); 795 } 796 797 return cookieEnabled; 798 }; 799 800 Drupal.eu_cookie_compliance.cookieMatches = function (cookieName, pattern) { 801 if (cookieName === pattern) { 802 return true; 803 } 804 if (pattern.indexOf('*') < 0) { 805 return false;
806 } 807 try { 808 var regexp = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.+') + '$', 'g'); 809 return regexp.test(cookieName); 810 } 811 catch (err) { 812 return false; 813 } 814 }; 815 816 Drupal.eu_cookie_compliance.isAllowed = function (cookieName) { 817 // Skip the PHP session cookie. 818 if (cookieName.indexOf('SESS') === 0 || cookieName.indexOf('SSESS') === 0) { 819 return true; 820 } 821 // Split the allowed cookies. 822 var euCookieComplianceAllowlist = Drupal.settings.eu_cookie_compliance.allowed_cookies.split(/\r\n|\n|\r/g); 823 824 // Add the EU Cookie Compliance cookie. 825 euCookieComplianceAllowlist.push((typeof Drupal.settings.eu_cookie_compliance.cookie_name === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : Drupal.settings.eu_cookie_compliance.cookie_name); 826 euCookieComplianceAllowlist.push((typeof Drupal.settings.eu_cookie_compliance.cookie_name === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed-categories' : Drupal.settings.eu_cookie_compliance.cookie_name + '-categories'); 827 euCookieComplianceAllowlist.push((typeof Drupal.settings.eu_cookie_compliance.cookie_name === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed-version' : Drupal.settings.eu_cookie_compliance.cookie_name + '-version'); 828 829 // Check if the cookie is allowed. 830 for (var item in euCookieComplianceAllowlist) { 831 // Defensively check types for comparison. 832 if (typeof euCookieComplianceAllowlist[item] === "string") { 833 if (Drupal.eu_cookie_compliance.cookieMatches(cookieName, euCookieComplianceAllowlist[item])) { 834 return true; 835 } 836 // Handle cookie names that are prefixed with a category. 837 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 838 var separatorPos = euCookieComplianceAllowlist[item].indexOf(":"); 839 if (separatorPos !== -1) { 840 var category = euCookieComplianceAllowlist[item].substr(0, separatorPos); 841 var wlCookieName = euCookieComplianceAllowlist[item].substr(separatorPos + 1); 842 843 if (Drupal.eu_cookie_compliance.cookieMatches(cookieName, wlCookieName) && Drupal.eu_cookie_compliance.hasAgreedWithCategory(category)) { 844 return true; 845 } 846 } 847 } 848 } 849 } 850 851 return false; 852 } 853 854 // This code upgrades the cookie agreed status when upgrading for an old version. 855 Drupal.eu_cookie_compliance.updateCheck = function () { 856 var legacyCookie = 'cookie-agreed-' + Drupal.settings.eu_cookie_compliance.popup_language; 857 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 858 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 859 var cookie = $.cookie(legacyCookie); 860 var date = new Date(); 861 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 862 863 // jQuery.cookie 1.0 (bundled with Drupal) returns null, 864 // jQuery.cookie 1.4.1 (bundled with some themes) returns undefined. 865 // We had a 1.4.1 related bug where the value was set to 'null' (string). 866 if (cookie !== undefined && cookie !== null && cookie !== 'null') { 867 date.setDate(date.getDate() + parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime)); 868 $.cookie(cookieName, cookie, { expires: date, path: path, domain: domain }); 869 870 // Use removeCookie if the function exists. 871 if (typeof $.removeCookie !== 'undefined') { 872 $.removeCookie(legacyCookie); 873 } 874 else { 875 $.cookie(legacyCookie, null, { path: path, domain: domain }); 876 } 877 } 878 }; 879 880 Drupal.eu_cookie_compliance.getVersion = function () { 881 var cookieName = (typeof Drupal.settings.eu_cookie_compliance.cookie_name === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed-version' : Drupal.settings.eu_cookie_compliance.cookie_name + '-version'; 882 return $.cookie(cookieName); 883 }; 884 885 Drupal.eu_cookie_compliance.setVersion = function () { 886 var date = new Date(); 887 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 888 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 889 var cookieName = (typeof Drupal.settings.eu_cookie_compliance.cookie_name === 'undefined' || Drupal.settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed-version' : Drupal.settings.eu_cookie_compliance.cookie_name + '-version'; 890 891 if (path.length > 1) { 892 var pathEnd = path.length - 1; 893 if (path.lastIndexOf('/') === pathEnd) { 894 path = path.substring(0, pathEnd); 895 } 896 } 897 var eucc_version = Drupal.settings.eu_cookie_compliance.cookie_policy_version; 898 var cookie_session = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 899 if (cookie_session) { 900 $.cookie(cookieName, eucc_version, { path: path, domain: domain }); 901 } 902 else { 903 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 904 date.setDate(date.getDate() + lifetime); 905 $.cookie(cookieName, eucc_version, { expires: date, path: path, domain: domain }); 906 } 907 }; 908 909 // Load blocked scripts if the user has agreed to being tracked. 910 var euCookieComplianceHasLoadedScripts = false;
911 var euCookieComplianceHasLoadedScriptsForCategory = []; 912 $(function () { 913 if (Drupal.eu_cookie_compliance.hasAgreed() 914 || (_euccCurrentStatus === null && Drupal.settings.eu_cookie_compliance.method !== 'opt_in' && Drupal.settings.eu_cookie_compliance.method !== 'categories') 915 ) { 916 if (typeof euCookieComplianceLoadScripts === "function") { 917 euCookieComplianceLoadScripts(); 918 } 919 euCookieComplianceHasLoadedScripts = true; 920 921 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 922 Drupal.eu_cookie_compliance.loadCategoryScripts(_euccSelectedCategories); 923 } 924 } 925 }); 926 927 // Block cookies when the user hasn't agreed. 928 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies = { 929 initialized: false, 930 attach: function (context, settings) { 931 if (!Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized && settings.eu_cookie_compliance) { 932 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized = true; 933 if (settings.eu_cookie_compliance.automatic_cookies_removal && 934 ((settings.eu_cookie_compliance.method === 'opt_in' && (_euccCurrentStatus === null || !Drupal.eu_cookie_compliance.hasAgreed())) 935 || (settings.eu_cookie_compliance.method === 'opt_out' && !Drupal.eu_cookie_compliance.hasAgreed() && _euccCurrentStatus !== null) 936 || (Drupal.settings.eu_cookie_compliance.method === 'categories')) 937 ) { 938 // Split the allowed cookies. 939 var euCookieComplianceAllowlist = settings.eu_cookie_compliance.allowed_cookies.split(/\r\n|\n|\r/g); 940 941 // Add the EU Cookie Compliance cookie. 942 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 943 euCookieComplianceAllowlist.push(cookieName); 944 945 euCookieComplianceBlockCookies = setInterval(Drupal.eu_cookie_compliance.BlockCookies, 5000); 946 } 947 } 948 } 949 } 950 951 Drupal.eu_cookie_compliance.BlockCookies = function () { 952 // Load all cookies from jQuery. 953 var cookies = $.cookie(); 954 955 // Check each cookie and try to remove it if it's not allowed. 956 for (var i in cookies) { 957 var remove = true; 958 var hostname = window.location.hostname; 959 var cookieRemoved = false; 960 var index = 0; 961 962 remove = !Drupal.eu_cookie_compliance.isAllowed(i); 963 964 // Remove the cookie if it's not allowed. 965 if (remove) { 966 while (!cookieRemoved && hostname !== '') { 967 // Attempt to remove. 968 cookieRemoved = $.removeCookie(i, { domain: '.' + hostname, path: '/' }); 969 if (!cookieRemoved) { 970 cookieRemoved = $.removeCookie(i, { domain: hostname, path: '/' }); 971 } 972 973 index = hostname.indexOf('.'); 974 975 // We can be on a sub-domain, so keep checking the main domain as well. 976 hostname = (index === -1) ? '' : hostname.substring(index + 1); 977 } 978 979 // Some jQuery Cookie versions don't remove cookies well. Try again
980 // using plain js. 981 if (!cookieRemoved) { 982 document.cookie = i + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;'; 983 } 984 } 985 } 986 } 987 988 /** 989 * Filter the event listeners by event name and return the list of handlers. 990 * 991 * @param forEventName 992 * 993 * @returns {[]} 994 */ 995 var filterQueue = function (forEventName) { 996 var handlers = []; 997 if (typeof Drupal.eu_cookie_compliance !== 'undefined' && 998 typeof Drupal.eu_cookie_compliance.queue !== 'undefined' && 999 Drupal.eu_cookie_compliance.queue.length) { 1000 // Loop over the list of arguments (objects) pushed into the queue. 1001 for (var i = 0; i < Drupal.eu_cookie_compliance.queue.length; i++) { 1002 if (Drupal.eu_cookie_compliance.queue[i].length) { 1003 var queueItem = Drupal.eu_cookie_compliance.queue[i]; 1004 var eventName = queueItem[0]; 1005 var eventHandler = queueItem[1]; 1006 // If the first element is a string and the second is a function. 1007 if (typeof eventName === 'string' && typeof eventHandler === 'function') { 1008 // And the string matches the event name. 1009 if (eventName === forEventName) { 1010 // Return the functions so they can be executed. 1011 handlers.push(eventHandler); 1012 } 1013 } 1014 } 1015 } 1016 } 1017 return handlers; 1018 } 1019 1020 /** 1021 * Handle event by finding and executing handlers pushed to the queue. 1022 */ 1023 self.handleEvent = function (eventName, observer) { 1024 var handlers = filterQueue(eventName); 1025 for (var i = 0; i < handlers.length; i++) { 1026 if (typeof handlers[i] !== 'undefined') { 1027 observer.subscribe(handlers[i]); 1028 observer.fire({ 1029 currentStatus: _euccCurrentStatus, 1030 currentCategories: _euccSelectedCategories 1031 }); 1032 observer.unsubscribe(handlers[i]); 1033 } 1034 } 1035 }; 1036 1037 /** 1038 * Observer: triggered before status gets read from cookie. 1039 */ 1040 var PreStatusLoad = (function () { 1041 // Constructor. 1042 var PreStatusLoad = function () { 1043 // Observers. 1044 this.handlers = []; 1045 }; 1046 // Convenience var for the prototype. 1047 var prototype = PreStatusLoad.prototype; 1048 prototype.subscribe = function (fn) { 1049 this.handlers.push(fn); 1050 }; 1051 prototype.unsubscribe = function (fn) { 1052 this.handlers = this.handlers.filter( 1053 function (item) { 1054 if (item !== fn) { 1055 return item; 1056 } 1057 } 1058 ); 1059 }; 1060 prototype.fire = function (o, thisObj) { 1061 var scope = thisObj || window; 1062 this.handlers.forEach(function (item) { 1063 item.call(scope, o); 1064 }); 1065 }; 1066 return PreStatusLoad; 1067 })(); 1068 1069 /** 1070 * Observer: triggered after status was read from cookie and stored in private variable. 1071 */ 1072 var PostStatusLoad = (function () { 1073 // Constructor. 1074 var PostStatusLoad = function () { 1075 // Observers. 1076 this.handlers = []; 1077 }; 1078 // Convenience var for the prototype. 1079 var prototype = PostStatusLoad.prototype; 1080 prototype.subscribe = function (fn) { 1081 this.handlers.push(fn); 1082 }; 1083 prototype.unsubscribe = function (fn) { 1084 this.handlers = this.handlers.filter( 1085 function (item) { 1086 if (item !== fn) { 1087 return item; 1088 } 1089 } 1090 ); 1091 }; 1092 prototype.fire = function (o, thisObj) { 1093 var scope = thisObj || window; 1094 this.handlers.forEach(function (item) { 1095 item.call(scope, o); 1096 }); 1097 }; 1098 return PostStatusLoad; 1099 })(); 1100 1101 /** 1102 * Observer: triggered before status gets saved into cookie. 1103 */ 1104 var PreStatusSave = (function () { 1105 // Constructor. 1106 var PreStatusSave = function () { 1107 // Observers. 1108 this.handlers = []; 1109 }; 1110 // Convenience var for the prototype. 1111 var prototype = PreStatusSave.prototype; 1112 prototype.subscribe = function (fn) { 1113 this.handlers.push(fn); 1114 }; 1115 prototype.unsubscribe = function (fn) { 1116 this.handlers = this.handlers.filter( 1117 function (item) { 1118 if (item !== fn) { 1119 return item; 1120 } 1121 } 1122 ); 1123 }; 1124 prototype.fire = function (o, thisObj) { 1125 var scope = thisObj || window;
1126 this.handlers.forEach(function (item) { 1127 item.call(scope, o); 1128 }); 1129 }; 1130 return PreStatusSave; 1131 })(); 1132 1133 /** 1134 * Observer: triggered after status was saved into cookie. 1135 */ 1136 var PostStatusSave = (function () { 1137 // Constructor. 1138 var PostStatusSave = function () { 1139 // Observers. 1140 this.handlers = []; 1141 }; 1142 // Convenience var for the prototype. 1143 var prototype = PostStatusSave.prototype; 1144 prototype.subscribe = function (fn) { 1145 this.handlers.push(fn); 1146 }; 1147 prototype.unsubscribe = function (fn) { 1148 this.handlers = this.handlers.filter( 1149 function (item) { 1150 if (item !== fn) { 1151 return item; 1152 } 1153 } 1154 ); 1155 }; 1156 prototype.fire = function (o, thisObj) { 1157 var scope = thisObj || window; 1158 this.handlers.forEach(function (item) { 1159 item.call(scope, o); 1160 }); 1161 }; 1162 return PostStatusSave; 1163 })(); 1164 1165 /** 1166 * Observer: triggered before categories are read from cookie. 1167 */ 1168 var PrePreferencesLoad = (function () { 1169 // Constructor. 1170 var prePreferencesLoad = function () { 1171 // Observers. 1172 this.handlers = []; 1173 }; 1174 // Convenience var for the prototype. 1175 var prototype = prePreferencesLoad.prototype; 1176 prototype.subscribe = function (fn) { 1177 this.handlers.push(fn); 1178 }; 1179 prototype.unsubscribe = function (fn) { 1180 this.handlers = this.handlers.filter( 1181 function (item) { 1182 if (item !== fn) { 1183 return item; 1184 } 1185 } 1186 ); 1187 }; 1188 prototype.fire = function (o, thisObj) { 1189 var scope = thisObj || window; 1190 this.handlers.forEach(function (item) { 1191 item.call(scope, o); 1192 }); 1193 }; 1194 return prePreferencesLoad; 1195 })(); 1196 1197 /** 1198 * Observer: triggered after categories were read from cookie. 1199 */ 1200 var PostPreferencesLoad = (function () { 1201 // Constructor. 1202 var postPreferencesLoad = function () { 1203 // Observers. 1204 this.handlers = []; 1205 }; 1206 // Convenience var for the prototype. 1207 var prototype = postPreferencesLoad.prototype; 1208 prototype.subscribe = function (fn) { 1209 this.handlers.push(fn); 1210 }; 1211 prototype.unsubscribe = function (fn) { 1212 this.handlers = this.handlers.filter( 1213 function (item) { 1214 if (item !== fn) { 1215 return item; 1216 } 1217 } 1218 ); 1219 }; 1220 prototype.fire = function (o, thisObj) { 1221 var scope = thisObj || window; 1222 this.handlers.forEach(function (item) { 1223 item.call(scope, o); 1224 }); 1225 }; 1226 return postPreferencesLoad; 1227 })(); 1228 1229 /** 1230 * Observer: triggered before categories are being saved to cookie. 1231 */ 1232 var PrePreferencesSave = (function () { 1233 // Constructor. 1234 var prePreferencesSave = function () { 1235 // Observers. 1236 this.handlers = []; 1237 }; 1238 // Convenience var for the prototype. 1239 var prototype = prePreferencesSave.prototype; 1240 prototype.subscribe = function (fn) { 1241 this.handlers.push(fn); 1242 }; 1243 prototype.unsubscribe = function (fn) { 1244 this.handlers = this.handlers.filter( 1245 function (item) { 1246 if (item !== fn) { 1247 return item; 1248 } 1249 } 1250 ); 1251 }; 1252 prototype.fire = function (o, thisObj) { 1253 var scope = thisObj || window; 1254 this.handlers.forEach(function (item) { 1255 item.call(scope, o); 1256 }); 1257 }; 1258 return prePreferencesSave; 1259 })(); 1260 1261 /** 1262 * Observer: triggered after categories were saved to cookie. 1263 */ 1264 var PostPreferencesSave = (function () { 1265 // Constructor. 1266 var postPreferencesSave = function () { 1267 // Observers. 1268 this.handlers = []; 1269 }; 1270 // Convenience var for the prototype. 1271 var prototype = postPreferencesSave.prototype; 1272 prototype.subscribe = function (fn) { 1273 this.handlers.push(fn); 1274 }; 1275 prototype.unsubscribe = function (fn) { 1276 this.handlers = this.handlers.filter( 1277 function (item) { 1278 if (item !== fn) { 1279 return item; 1280 } 1281 } 1282 ); 1283 }; 1284 prototype.fire = function (o, thisObj) { 1285 var scope = thisObj || window;
1286 this.handlers.forEach(function (item) { 1287 item.call(scope, o); 1288 }); 1289 }; 1290 return postPreferencesSave; 1291 })(); 1292 1293})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.