1/** 2 * @file 3 * Cookie Compliance Javascript. 4 */ 5 6(function ($) { 7 'use strict'; 8 var euCookieComplianceBlockCookies; 9 10 Drupal.behaviors.eu_cookie_compliance_popup = { 11 attach: function (context, settings) { 12 $('body', context).once('eu-cookie-compliance', function () { 13 // If configured, check JSON callback to determine if in EU. 14 if (Drupal.settings.eu_cookie_compliance.popup_eu_only_js) { 15 if (Drupal.eu_cookie_compliance.showBanner()) { 16 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance-check'; 17 var data = {}; 18 $.getJSON(url, data, function (data) { 19 // If in the EU, show the compliance banner. 20 if (data.in_eu) { 21 Drupal.eu_cookie_compliance.execute(); 22 } 23 24 // If not in EU, set an agreed cookie automatically. 25 else { 26 Drupal.eu_cookie_compliance.setStatus(2); 27 } 28 }); 29 } 30 } 31 32 // Otherwise, fallback to standard behavior which is to render the banner. 33 else { 34 Drupal.eu_cookie_compliance.execute(); 35 } 36 }); 37 } 38 }; 39 40 Drupal.eu_cookie_compliance = {}; 41 42 Drupal.eu_cookie_compliance.execute = function () { 43 try { 44 if (!Drupal.settings.eu_cookie_compliance.popup_enabled) { 45 return; 46 } 47 48 if (!Drupal.eu_cookie_compliance.cookiesEnabled()) { 49 return; 50 } 51 52 Drupal.eu_cookie_compliance.updateCheck(); 53 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 54 if ((status === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || status === null) { 55 if (!Drupal.settings.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: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 58 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info); 59 } 60 else { 61 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_info); 62 } 63 64 Drupal.eu_cookie_compliance.attachAgreeEvents(); 65 } 66 } 67 else if (status === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 68 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_agreed); 69 Drupal.eu_cookie_compliance.attachHideEvents(); 70 } 71 else if (status === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 72 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 73 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 74 } 75 } 76 catch (e) { 77 } 78 }; 79 80 Drupal.eu_cookie_compliance.createWithdrawBanner = function (html) { 81 var $html = $('<div></div>').html(html); 82 var $banner = $('.eu-cookie-withdraw-banner', $html); 83 $html.attr('id', 'sliding-popup'); 84 $html.addClass('eu-cookie-withdraw-wrapper'); 85 86 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 87 $banner.height(Drupal.settings.eu_cookie_compliance.popup_height) 88 .width(Drupal.settings.eu_cookie_compliance.popup_width); 89 } 90 $html.hide(); 91 var height = 0; 92 if (Drupal.settings.eu_cookie_compliance.popup_position) { 93 $html.prependTo('body'); 94 height = $html.outerHeight(); 95 96 $html.show() 97 .addClass('sliding-popup-top') 98 .addClass('clearfix') 99 .css({ top: -1 * height }); 100 // For some reason, the tab outerHeight is -10 if we don't use a timeout 101 // function to reveal the tab. 102 setTimeout(function () { 103 $html.animate({ top: -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 104 $html.trigger('eu_cookie_compliance_popup_open'); 105 }); 106 }.bind($html, height), 0); 107 } 108 else { 109 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 110 $html.prependTo('body'); 111 } 112 else { 113 $html.appendTo('body'); 114 } 115 height = $html.outerHeight(); 116 $html.show() 117 .addClass('sliding-popup-bottom') 118 .css({ bottom: -1 * height }); 119 // For some reason, the tab outerHeight is -10 if we don't use a timeout 120 // function to reveal the tab. 121 setTimeout(function () { 122 $html.animate({ bottom: -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 123 $html.trigger('eu_cookie_compliance_popup_open'); 124 }); 125 }.bind($html, height), 0); 126 } 127 }; 128 129 Drupal.eu_cookie_compliance.toggleWithdrawBanner = function () { 130 var $wrapper = $('#sliding-popup'); 131 var $tab = $('.eu-cookie-withdraw-tab'); 132 var $bannerIsShowing = Drupal.settings.eu_cookie_compliance.popup_position ? parseInt($wrapper.css('top')) === 0 : parseInt($wrapper.css('bottom')) === 0; 133 var topBottom = (Drupal.settings.eu_cookie_compliance.popup_position ? 'top' : 'bottom'); 134 var height = $wrapper.outerHeight(); 135 if (Drupal.settings.eu_cookie_compliance.popup_position) { 136 if ($bannerIsShowing) { 137 $wrapper.animate({'top' : -1 * height}, Drupal.settings.eu_cookie_compliance.popup_delay); 138 } 139 else { 140 $wrapper.animate({'top' : 0}, Drupal.settings.eu_cookie_compliance.popup_delay); 141 } 142 } 143 else { 144 if ($bannerIsShowing) { 145 $wrapper.animate({'bottom' : -1 * height}, Drupal.settings.eu_cookie_compliance.popup_delay); 146 } 147 else { 148 $wrapper.animate({'bottom' : 0}, Drupal.settings.eu_cookie_compliance.popup_delay); 149 } 150 } 151 }; 152 153 Drupal.eu_cookie_compliance.createPopup = function (html) { 154 // This fixes a problem with jQuery 1.9. 155 var $popup = $('<div></div>').html(html); 156 $popup.attr('id', 'sliding-popup'); 157 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 158 $popup.height(Drupal.settings.eu_cookie_compliance.popup_height) 159 .width(Drupal.settings.eu_cookie_compliance.popup_width); 160 } 161 162 $popup.hide(); 163 var height = 0; 164 if (Drupal.settings.eu_cookie_compliance.popup_position) { 165 $popup.prependTo('body'); 166 height = $popup.outerHeight(); 167 $popup.show() 168 .attr({ 'class': 'sliding-popup-top clearfix' }) 169 .css({ top: -1 * height }) 170 .animate({ top: 0 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 171 $popup.trigger('eu_cookie_compliance_popup_open'); 172 }); 173 } 174 else { 175 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 176 $popup.prependTo('body'); 177 } 178 else { 179 $popup.appendTo('body'); 180 } 181 182 height = $popup.outerHeight(); 183 $popup.show() 184 .attr({ 'class': 'sliding-popup-bottom' }) 185 .css({ bottom: -1 * height }) 186 .animate({ bottom: 0 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 187 $popup.trigger('eu_cookie_compliance_popup_open'); 188 }); 189 } 190 }; 191 192 Drupal.eu_cookie_compliance.attachAgreeEvents = function () { 193 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 194 var scrollConfirms = Drupal.settings.eu_cookie_compliance.popup_scrolling_confirmation; 195 196 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction); 197 $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction); 198 199 if (clickingConfirms) { 200 $('a, input[type=submit], button[type=submit]').not('.popup-content *').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction); 201 } 202 203 if (scrollConfirms) { 204 var alreadyScrolled = false;
205 var scrollHandler = function () { 206 if (alreadyScrolled) { 207 Drupal.eu_cookie_compliance.acceptAction(); 208 $(window).off('scroll', scrollHandler); 209 } 210 else { 211 alreadyScrolled = true; 212 } 213 }; 214 215 $(window).bind('scroll', scrollHandler); 216 } 217 218 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 219 }; 220 221 Drupal.eu_cookie_compliance.attachHideEvents = function () { 222 var popupHideAgreed = Drupal.settings.eu_cookie_compliance.popup_hide_agreed; 223 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 224 $('.hide-popup-button').click(function () { 225 Drupal.eu_cookie_compliance.changeStatus(2); 226 } 227 ); 228 if (clickingConfirms) { 229 $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance'); 230 } 231 232 if (popupHideAgreed) { 233 $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () { 234 Drupal.eu_cookie_compliance.changeStatus(2); 235 }); 236 } 237 238 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 239 }; 240 241 Drupal.eu_cookie_compliance.attachWithdrawEvents = function () { 242 $('.eu-cookie-withdraw-button').click(Drupal.eu_cookie_compliance.withdrawAction); 243 $('.eu-cookie-withdraw-tab').click(Drupal.eu_cookie_compliance.toggleWithdrawBanner); 244 }; 245 246 Drupal.eu_cookie_compliance.acceptAction = function () { 247 var agreedEnabled = Drupal.settings.eu_cookie_compliance.popup_agreed_enabled; 248 var nextStatus = 1; 249 if (!agreedEnabled) { 250 Drupal.eu_cookie_compliance.setStatus(1); 251 nextStatus = 2; 252 } 253 254 if (!euCookieComplianceHasLoadedScripts) { 255 euCookieComplianceLoadScripts(); 256 } 257 258 if (typeof euCookieComplianceBlockCookies !== 'undefined') { 259 clearInterval(euCookieComplianceBlockCookies); 260 } 261 262 Drupal.eu_cookie_compliance.changeStatus(nextStatus); 263 }; 264 265 Drupal.eu_cookie_compliance.declineAction = function () { 266 Drupal.eu_cookie_compliance.setStatus(0); 267 var popup = $('#sliding-popup'); 268 if (popup.hasClass('sliding-popup-top')) { 269 popup.animate({ top: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close'); 270 } 271 else { 272 popup.animate({ bottom: popup.outerHeight() * -1 }).trigger('eu_cookie_compliance_popup_close'); 273 } 274 }; 275 276 Drupal.eu_cookie_compliance.withdrawAction = function () { 277 Drupal.eu_cookie_compliance.setStatus(0); 278 279 location.reload(); 280 }; 281 282 Drupal.eu_cookie_compliance.moreInfoAction = function () { 283 if (Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup) { 284 Drupal.eu_cookie_compliance.setStatus(0); 285 $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); 286 } 287 else { 288 if (Drupal.settings.eu_cookie_compliance.popup_link_new_window) { 289 window.open(Drupal.settings.eu_cookie_compliance.popup_link); 290 } 291 else { 292 window.location.href = Drupal.settings.eu_cookie_compliance.popup_link; 293 } 294 } 295 }; 296 297 Drupal.eu_cookie_compliance.getCurrentStatus = function () { 298 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 299 var value = $.cookie(cookieName); 300 value = parseInt(value); 301 if (isNaN(value)) { 302 value = null; 303 } 304 305 return value; 306 }; 307 308 Drupal.eu_cookie_compliance.changeStatus = function (value) { 309 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 310 var reloadPage = Drupal.settings.eu_cookie_compliance.reload_page; 311 if (status === value) { 312 return; 313 } 314 315 if (Drupal.settings.eu_cookie_compliance.popup_position) { 316 $('.sliding-popup-top').animate({ top: $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () { 317 if (status === null && !reloadPage) { 318 $('#sliding-popup').html(Drupal.settings.eu_cookie_compliance.popup_html_agreed).animate({ top: 0 }, Drupal.settings.eu_cookie_compliance.popup_delay); 319 Drupal.eu_cookie_compliance.attachHideEvents(); 320 } 321 else if (status === 1) { 322 $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); 323 } 324 }); 325 } 326 else { 327 $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () { 328 if (status === null && !reloadPage) { 329 $('#sliding-popup').html(Drupal.settings.eu_cookie_compliance.popup_html_agreed).animate({ bottom: 0 }, Drupal.settings.eu_cookie_compliance.popup_delay); 330 Drupal.eu_cookie_compliance.attachHideEvents(); 331 } 332 else if (status === 1) { 333 $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); 334 } 335 }); 336 } 337 338 if (reloadPage) { 339 location.reload(); 340 } 341 342 if (value === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 343 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 344 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 345 } 346 347 Drupal.eu_cookie_compliance.setStatus(value); 348 }; 349 350 Drupal.eu_cookie_compliance.setStatus = function (status) { 351 var date = new Date(); 352 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 353 var path = Drupal.settings.basePath; 354 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 355 if (path.length > 1) { 356 var pathEnd = path.length - 1; 357 if (path.lastIndexOf('/') === pathEnd) { 358 path = path.substring(0, pathEnd); 359 } 360 } 361 362 var cookieSession = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 363 if (cookieSession) { 364 $.cookie(cookieName, status, { path: path, domain: domain }); 365 } 366 else { 367 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 368 date.setDate(date.getDate() + lifetime); 369 $.cookie(cookieName, status, { expires: date, path: path, domain: domain }); 370 } 371 $(document).trigger('eu_cookie_compliance.changeStatus', [status]); 372 373 // Store consent if applicable. 374 if (Drupal.settings.eu_cookie_compliance.store_consent && ((status === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) || (status === 2 && !Drupal.settings.eu_cookie_compliance.popup_agreed_enabled))) { 375 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance/store_consent/banner'; 376 $.post(url, {}, function (data) { }); 377 } 378 }; 379 380 Drupal.eu_cookie_compliance.hasAgreed = function () { 381 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 382 return (status === 1 || status === 2); 383 }; 384 385 Drupal.eu_cookie_compliance.showBanner = function () { 386 var showBanner = false;
387 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 388 if ((status === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || status === null) { 389 if (!Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) { 390 showBanner = true; 391 } 392 } 393 else if (status === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 394 showBanner = true; 395 } 396 397 return showBanner; 398 }; 399 400 Drupal.eu_cookie_compliance.cookiesEnabled = function () { 401 var cookieEnabled = navigator.cookieEnabled; 402 if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) { 403 document.cookie = 'testCookie'; 404 cookieEnabled = (document.cookie.indexOf('testCookie') !== -1); 405 } 406 407 return cookieEnabled; 408 }; 409 410 // This code upgrades the cookie agreed status when upgrading for an old version. 411 Drupal.eu_cookie_compliance.updateCheck = function () { 412 var legacyCookie = 'cookie-agreed-' + Drupal.settings.eu_cookie_compliance.popup_language; 413 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 414 var path = Drupal.settings.basePath; 415 var cookie = $.cookie(legacyCookie); 416 var date = new Date(); 417 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 418 419 // jQuery.cookie 1.0 (bundled with Drupal) returns null, 420 // jQuery.cookie 1.4.1 (bundled with some themes) returns undefined. 421 // We had a 1.4.1 related bug where the value was set to 'null' (string). 422 if (cookie !== undefined && cookie !== null && cookie !== 'null') { 423 date.setDate(date.getDate() + parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime)); 424 $.cookie(cookieName, cookie, { expires: date, path: path, domain: domain }); 425 426 // Use removeCookie if the function exists. 427 if (typeof $.removeCookie !== 'undefined') { 428 $.removeCookie(legacyCookie); 429 } 430 else { 431 $.cookie(legacyCookie, null, { path: path, domain: domain }); 432 } 433 } 434 }; 435 436 // Load blocked scripts if the user has agreed to being tracked. 437 var euCookieComplianceHasLoadedScripts = false; 438 $(function () { 439 if (Drupal.eu_cookie_compliance.hasAgreed() 440 || (Drupal.eu_cookie_compliance.getCurrentStatus() === null && Drupal.settings.eu_cookie_compliance.method !== 'opt_in') 441 ) { 442 euCookieComplianceLoadScripts(); 443 euCookieComplianceHasLoadedScripts = true; 444 } 445 }); 446 447 // Block cookies when the user hasn't agreed. 448 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies = { 449 initialized: false, 450 attach: function (context, settings) { 451 if (!Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized && settings.eu_cookie_compliance) { 452 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized = true; 453 if ((settings.eu_cookie_compliance.method === 'opt_in' && (Drupal.eu_cookie_compliance.getCurrentStatus() === null || !Drupal.eu_cookie_compliance.hasAgreed())) 454 || (settings.eu_cookie_compliance.method === 'opt_out' && !Drupal.eu_cookie_compliance.hasAgreed() && Drupal.eu_cookie_compliance.getCurrentStatus() !== null) 455 ) { 456 // Split the white-listed cookies. 457 var euCookieComplianceWhitelist = settings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g); 458 459 // Add the EU Cookie Compliance cookie. 460 euCookieComplianceWhitelist.push((typeof settings.eu_cookie_compliance.cookie_name === 'undefined' || settings.eu_cookie_compliance.cookie_name === '') ? 'cookie-agreed' : settings.eu_cookie_compliance.cookie_name); 461 euCookieComplianceBlockCookies = setInterval(function () { 462 // Load all cookies from jQuery. 463 var cookies = $.cookie(); 464 465 // Check each cookie and try to remove it if it's not white-listed. 466 for (var i in cookies) { 467 var remove = true; 468 var hostname = window.location.hostname; 469 var cookieRemoved = false;
470 var index = 0; 471 472 // Skip the PHP session cookie. 473 if (i.indexOf('SESS') === 0 || i.indexOf('SSESS') === 0) { 474 remove = false; 475 } 476 477 // Check if the cookie is white-listed. 478 for (var item in euCookieComplianceWhitelist) { 479 if (i === euCookieComplianceWhitelist[item]) { 480 remove = false; 481 } 482 } 483 484 // Remove the cookie if it's not white-listed. 485 if (remove) { 486 while (!cookieRemoved && hostname !== '') { 487 // Attempt to remove. 488 cookieRemoved = $.removeCookie(i, { domain: '.' + hostname, path: '/' }); 489 if (!cookieRemoved) { 490 cookieRemoved = $.removeCookie(i, { domain: hostname, path: '/' }); 491 } 492 493 index = hostname.indexOf('.'); 494 495 // We can be on a sub-domain, so keep checking the main domain as well. 496 hostname = (index === -1) ? '' : hostname.substring(index + 1); 497 } 498 } 499 } 500 }, 5000); 501 } 502 } 503 } 504 } 505 506})(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.