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 'use strict'; 14 var euCookieComplianceBlockCookies; 15 16 Drupal.behaviors.eu_cookie_compliance_popup = { 17 attach: function (context, settings) { 18 $('body', context).once('eu-cookie-compliance', function () { 19 // If configured, check JSON callback to determine if in EU. 20 if (Drupal.settings.eu_cookie_compliance.popup_eu_only_js) { 21 if (Drupal.eu_cookie_compliance.showBanner()) { 22 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance-check'; 23 var data = {}; 24 $.getJSON(url, data, function (data) { 25 // If in the EU, show the compliance banner. 26 if (data.in_eu) { 27 Drupal.eu_cookie_compliance.execute(); 28 } 29 30 // If not in EU, set an agreed cookie automatically. 31 else { 32 Drupal.eu_cookie_compliance.setStatus(2); 33 } 34 }); 35 } 36 } 37 38 // Otherwise, fallback to standard behavior which is to render the banner. 39 else { 40 Drupal.eu_cookie_compliance.execute(); 41 } 42 }); 43 } 44 }; 45 46 Drupal.eu_cookie_compliance = {}; 47 48 Drupal.eu_cookie_compliance.execute = function () { 49 try { 50 if (!Drupal.settings.eu_cookie_compliance.popup_enabled) { 51 return; 52 } 53 54 if (!Drupal.eu_cookie_compliance.cookiesEnabled()) { 55 return; 56 } 57 58 Drupal.eu_cookie_compliance.updateCheck(); 59 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 60 if ((status === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || status === null || (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup)) { 61 if (!Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) { 62 // Detect mobile here and use mobile_popup_html_info, if we have a mobile device. 63 if (window.matchMedia('(max-width: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 64 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info, (status !== null)); 65 } 66 else { 67 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_info, (status !== null)); 68 } 69 70 Drupal.eu_cookie_compliance.initPopup(); 71 } 72 } 73 if (status === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 74 // Thank you banner. 75 Drupal.eu_cookie_compliance.createPopup(Drupal.settings.eu_cookie_compliance.popup_html_agreed); 76 Drupal.eu_cookie_compliance.attachHideEvents(); 77 } 78 else if (status === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 79 if (!Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 80 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 81 } 82 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 83 } 84 } 85 catch (e) { 86 } 87 }; 88 89 Drupal.eu_cookie_compliance.initPopup = function() { 90 Drupal.eu_cookie_compliance.attachAgreeEvents(); 91 92 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 93 var categories_checked = []; 94 95 if (Drupal.eu_cookie_compliance.getCurrentStatus() === null) { 96 if (Drupal.settings.eu_cookie_compliance.select_all_categories_by_default) { 97 categories_checked = Drupal.settings.eu_cookie_compliance.cookie_categories; 98 } 99 } 100 else { 101 categories_checked = Drupal.eu_cookie_compliance.getAcceptedCategories(); 102 } 103 Drupal.eu_cookie_compliance.setPreferenceCheckboxes(categories_checked); 104 Drupal.eu_cookie_compliance.attachSavePreferencesEvents(); 105 } 106 107 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 108 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 109 var currentStatus = Drupal.eu_cookie_compliance.getCurrentStatus(); 110 if (currentStatus === 1 || currentStatus === 2) { 111 $('.eu-cookie-withdraw-button').show(); 112 } 113 } 114 } 115 116 Drupal.eu_cookie_compliance.createWithdrawBanner = function (html) { 117 var $html = $('<div></div>').html(html); 118 var $banner = $('.eu-cookie-withdraw-banner', $html); 119 $html.attr('id', 'sliding-popup'); 120 $html.addClass('eu-cookie-withdraw-wrapper'); 121 122 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 123 $banner.height(Drupal.settings.eu_cookie_compliance.popup_height) 124 .width(Drupal.settings.eu_cookie_compliance.popup_width); 125 } 126 $html.hide(); 127 var height = 0; 128 if (Drupal.settings.eu_cookie_compliance.popup_position) { 129 $html.prependTo('body'); 130 height = $html.outerHeight(); 131 132 $html.show() 133 .addClass('sliding-popup-top') 134 .addClass('clearfix') 135 .css({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + height) : -1 * height }); 136 // For some reason, the tab outerHeight is -10 if we don't use a timeout 137 // function to reveal the tab. 138 setTimeout(function () { 139 $html.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + height) : -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 140 $html.trigger('eu_cookie_compliance_popup_open'); 141 }); 142 }.bind($html, height), 0); 143 } 144 else { 145 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 146 $html.prependTo('body'); 147 } 148 else { 149 $html.appendTo('body'); 150 } 151 height = $html.outerHeight(); 152 $html.show() 153 .addClass('sliding-popup-bottom') 154 .css({ bottom: -1 * height }); 155 // For some reason, the tab outerHeight is -10 if we don't use a timeout 156 // function to reveal the tab. 157 setTimeout(function () { 158 $html.animate({ bottom: -1 * height }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 159 $html.trigger('eu_cookie_compliance_popup_open'); 160 }); 161 }.bind($html, height), 0); 162 } 163 }; 164 165 Drupal.eu_cookie_compliance.toggleWithdrawBanner = function () { 166 var $wrapper = $('#sliding-popup'); 167 var $tab = $('.eu-cookie-withdraw-tab'); 168 var topBottom = (Drupal.settings.eu_cookie_compliance.popup_position ? 'top' : 'bottom'); 169 var height = $wrapper.outerHeight(); 170 var $bannerIsShowing = Drupal.settings.eu_cookie_compliance.popup_position ? parseInt($wrapper.css('top')) === (!Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top'))) : 0) : parseInt($wrapper.css('bottom')) === 0; 171 if (Drupal.settings.eu_cookie_compliance.popup_position) { 172 if ($bannerIsShowing) { 173 $wrapper.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + height) : -1 * height}, Drupal.settings.eu_cookie_compliance.popup_delay); 174 } 175 else { 176 $wrapper.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top'))) : 0}, Drupal.settings.eu_cookie_compliance.popup_delay); 177 } 178 } 179 else { 180 if ($bannerIsShowing) { 181 $wrapper.animate({'bottom' : -1 * height}, Drupal.settings.eu_cookie_compliance.popup_delay); 182 } 183 else { 184 $wrapper.animate({'bottom' : 0}, Drupal.settings.eu_cookie_compliance.popup_delay); 185 } 186 } 187 }; 188 189 Drupal.eu_cookie_compliance.createPopup = function (html, closed) { 190 // This fixes a problem with jQuery 1.9. 191 var $popup = $('<div></div>').html(html); 192 $popup.attr('id', 'sliding-popup'); 193 if (!Drupal.settings.eu_cookie_compliance.popup_use_bare_css) { 194 $popup.height(Drupal.settings.eu_cookie_compliance.popup_height) 195 .width(Drupal.settings.eu_cookie_compliance.popup_width); 196 } 197 198 $popup.hide(); 199 var height = 0; 200 if (Drupal.settings.eu_cookie_compliance.popup_position) { 201 $popup.prependTo('body'); 202 height = $popup.outerHeight(); 203 $popup.show() 204 .attr({ 'class': 'sliding-popup-top clearfix' }) 205 .css({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + height) : -1 * height }); 206 if (closed !== true) { 207 $popup.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top'))) : 0 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 208 $popup.trigger('eu_cookie_compliance_popup_open'); 209 }); 210 } 211 } 212 else { 213 if (Drupal.settings.eu_cookie_compliance.better_support_for_screen_readers) { 214 $popup.prependTo('body'); 215 } 216 else { 217 $popup.appendTo('body'); 218 } 219 220 height = $popup.outerHeight(); 221 $popup.show() 222 .attr({ 'class': 'sliding-popup-bottom' }) 223 .css({ bottom: -1 * height }); 224 if (closed !== true) { 225 $popup.animate({bottom: 0}, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 226 $popup.trigger('eu_cookie_compliance_popup_open'); 227 }); 228 } 229 } 230 }; 231 232 Drupal.eu_cookie_compliance.attachAgreeEvents = function () { 233 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 234 var scrollConfirms = Drupal.settings.eu_cookie_compliance.popup_scrolling_confirmation; 235 236 if (Drupal.settings.eu_cookie_compliance.method === 'categories' && Drupal.settings.eu_cookie_compliance.enable_save_preferences_button) { 237 // The agree button becomes an agree to all categories button when the 'save preferences' button is present. 238 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAllAction); 239 } 240 else { 241 $('.agree-button').click(Drupal.eu_cookie_compliance.acceptAction); 242 } 243 $('.decline-button').click(Drupal.eu_cookie_compliance.declineAction); 244 245 if (clickingConfirms) { 246 $('a, input[type=submit], button[type=submit]').not('.popup-content *').bind('click.euCookieCompliance', Drupal.eu_cookie_compliance.acceptAction); 247 } 248 249 if (scrollConfirms) { 250 var alreadyScrolled = false;
251 var scrollHandler = function () { 252 if (alreadyScrolled) { 253 Drupal.eu_cookie_compliance.acceptAction(); 254 $(window).off('scroll', scrollHandler); 255 } 256 else { 257 alreadyScrolled = true; 258 } 259 }; 260 261 $(window).bind('scroll', scrollHandler); 262 } 263 264 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 265 }; 266 267 Drupal.eu_cookie_compliance.attachSavePreferencesEvents = function () { 268 $('.eu-cookie-compliance-save-preferences-button').click(Drupal.eu_cookie_compliance.savePreferencesAction); 269 }; 270 271 Drupal.eu_cookie_compliance.attachHideEvents = function () { 272 var popupHideAgreed = Drupal.settings.eu_cookie_compliance.popup_hide_agreed; 273 var clickingConfirms = Drupal.settings.eu_cookie_compliance.popup_clicking_confirmation; 274 $('.hide-popup-button').click(function () { 275 Drupal.eu_cookie_compliance.changeStatus(2); 276 } 277 ); 278 if (clickingConfirms) { 279 $('a, input[type=submit], button[type=submit]').unbind('click.euCookieCompliance'); 280 } 281 282 if (popupHideAgreed) { 283 $('a, input[type=submit], button[type=submit]').bind('click.euCookieComplianceHideAgreed', function () { 284 Drupal.eu_cookie_compliance.changeStatus(2); 285 }); 286 } 287 288 $('.find-more-button').not('.find-more-button-processed').addClass('find-more-button-processed').click(Drupal.eu_cookie_compliance.moreInfoAction); 289 }; 290 291 Drupal.eu_cookie_compliance.attachWithdrawEvents = function () { 292 $('.eu-cookie-withdraw-button').click(Drupal.eu_cookie_compliance.withdrawAction); 293 $('.eu-cookie-withdraw-tab').click(Drupal.eu_cookie_compliance.toggleWithdrawBanner); 294 }; 295 296 Drupal.eu_cookie_compliance.acceptAction = function () { 297 var agreedEnabled = Drupal.settings.eu_cookie_compliance.popup_agreed_enabled; 298 var nextStatus = 1; 299 if (!agreedEnabled) { 300 Drupal.eu_cookie_compliance.setStatus(1); 301 nextStatus = 2; 302 } 303 304 if (!euCookieComplianceHasLoadedScripts && typeof euCookieComplianceLoadScripts === "function") { 305 euCookieComplianceLoadScripts(); 306 } 307 308 if (typeof euCookieComplianceBlockCookies !== 'undefined') { 309 clearInterval(euCookieComplianceBlockCookies); 310 } 311 312 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 313 // Select Checked categories. 314 var categories = $("#eu-cookie-compliance-categories input:checkbox:checked").map(function(){ 315 return $(this).val(); 316 }).get(); 317 Drupal.eu_cookie_compliance.setAcceptedCategories(categories); 318 // Load scripts for all categories. 319 Drupal.eu_cookie_compliance.loadCategoryScripts(categories); 320 } 321 322 Drupal.eu_cookie_compliance.changeStatus(nextStatus); 323 }; 324 325 Drupal.eu_cookie_compliance.acceptAllAction = function () { 326 var allCategories = Drupal.settings.eu_cookie_compliance.cookie_categories; 327 Drupal.eu_cookie_compliance.setPreferenceCheckboxes(allCategories); 328 Drupal.eu_cookie_compliance.acceptAction(); 329 } 330 331 Drupal.eu_cookie_compliance.savePreferencesAction = function () { 332 var categories = $("#eu-cookie-compliance-categories input:checkbox:checked").map(function(){ 333 return $(this).val(); 334 }).get(); 335 var agreedEnabled = Drupal.settings.eu_cookie_compliance.popup_agreed_enabled; 336 var nextStatus = 1; 337 if (!agreedEnabled) { 338 Drupal.eu_cookie_compliance.setStatus(1); 339 nextStatus = 2; 340 } 341 342 Drupal.eu_cookie_compliance.setAcceptedCategories(categories); 343 if (!euCookieComplianceHasLoadedScripts && typeof euCookieComplianceLoadScripts === "function") { 344 euCookieComplianceLoadScripts(); 345 } 346 Drupal.eu_cookie_compliance.loadCategoryScripts(categories); 347 Drupal.eu_cookie_compliance.changeStatus(nextStatus); 348 }; 349 350 Drupal.eu_cookie_compliance.loadCategoryScripts = function(categories) { 351 for (var cat in categories) { 352 if (euCookieComplianceHasLoadedScriptsForCategory[cat] !== true && typeof euCookieComplianceLoadScripts === "function") { 353 euCookieComplianceLoadScripts(categories[cat]); 354 euCookieComplianceHasLoadedScriptsForCategory[cat] = true; 355 } 356 } 357 } 358 359 Drupal.eu_cookie_compliance.declineAction = function () { 360 Drupal.eu_cookie_compliance.setStatus(0); 361 var popup = $('#sliding-popup'); 362 if (popup.hasClass('sliding-popup-top')) { 363 popup.animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + popup.outerHeight()) : popup.outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 364 popup.hide(); 365 }).trigger('eu_cookie_compliance_popup_close'); 366 } 367 else { 368 popup.animate({ bottom: popup.outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, null, function () { 369 popup.hide(); 370 }).trigger('eu_cookie_compliance_popup_close'); 371 } 372 }; 373 374 Drupal.eu_cookie_compliance.withdrawAction = function () { 375 Drupal.eu_cookie_compliance.setStatus(0); 376 Drupal.eu_cookie_compliance.setAcceptedCategories([]); 377 location.reload(); 378 }; 379 380 Drupal.eu_cookie_compliance.moreInfoAction = function () { 381 if (Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup) { 382 Drupal.eu_cookie_compliance.setStatus(0); 383 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 384 $('#sliding-popup .eu-cookie-compliance-banner').trigger('eu_cookie_compliance_popup_close').hide(); 385 } 386 else { 387 $('#sliding-popup').trigger('eu_cookie_compliance_popup_close').remove(); 388 } 389 } 390 else { 391 if (Drupal.settings.eu_cookie_compliance.popup_link_new_window) { 392 window.open(Drupal.settings.eu_cookie_compliance.popup_link); 393 } 394 else { 395 window.location.href = Drupal.settings.eu_cookie_compliance.popup_link; 396 } 397 } 398 }; 399 400 Drupal.eu_cookie_compliance.getCurrentStatus = function () { 401 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 402 var value = $.cookie(cookieName); 403 value = parseInt(value); 404 if (isNaN(value)) { 405 value = null; 406 } 407 408 return value; 409 }; 410 411 Drupal.eu_cookie_compliance.setPreferenceCheckboxes = function (categories) { 412 for (var i in categories) { 413 $("#eu-cookie-compliance-categories input:checkbox[value='" + categories[i] + "']").prop("checked", true); 414 } 415 } 416 417 Drupal.eu_cookie_compliance.getAcceptedCategories = function () { 418 var allCategories = Drupal.settings.eu_cookie_compliance.cookie_categories; 419 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'; 420 var value = $.cookie(cookieName); 421 var selectedCategories = []; 422 423 if (value !== null && typeof value !== 'undefined') { 424 value = JSON.parse(value); 425 selectedCategories = value; 426 } 427 428 if (Drupal.eu_cookie_compliance.fix_first_cookie_category && !$.inArray(allCategories[0], selectedCategories)) { 429 selectedCategories.push(allCategories[0]); 430 } 431 432 return selectedCategories; 433 }; 434 435 Drupal.eu_cookie_compliance.changeStatus = function (value) { 436 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 437 var reloadPage = Drupal.settings.eu_cookie_compliance.reload_page; 438 if (status === value) { 439 return; 440 } 441 442 if (Drupal.settings.eu_cookie_compliance.popup_position) { 443 $('.sliding-popup-top').animate({ top: !Drupal.settings.eu_cookie_compliance.fixed_top_position ? -(parseInt($('body').css('padding-top')) + parseInt($('body').css('margin-top')) + $('#sliding-popup').outerHeight()) : $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () { 444 if (value === 1 && status === null && !reloadPage) { 445 $('.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($('body').css('padding-top')) + parseInt($('body').css('margin-top'))) : 0 }, Drupal.settings.eu_cookie_compliance.popup_delay); 446 Drupal.eu_cookie_compliance.attachHideEvents(); 447 } else if (status === 1 && !(Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup)) { 448 $('.sliding-popup-top').not('.eu-cookie-withdraw-wrapper').trigger('eu_cookie_compliance_popup_close').remove(); 449 } 450 Drupal.eu_cookie_compliance.showWithdrawBanner(value); 451 }); 452 } 453 else { 454 $('.sliding-popup-bottom').animate({ bottom: $('#sliding-popup').outerHeight() * -1 }, Drupal.settings.eu_cookie_compliance.popup_delay, function () { 455 if (value === 1 && status === null && !reloadPage) { 456 $('.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); 457 Drupal.eu_cookie_compliance.attachHideEvents(); 458 } 459 else if (status === 1) { 460 if (Drupal.settings.eu_cookie_compliance.withdraw_enabled && Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 461 // Restore popup content. 462 if (window.matchMedia('(max-width: ' + Drupal.settings.eu_cookie_compliance.mobile_breakpoint + 'px)').matches && Drupal.settings.eu_cookie_compliance.use_mobile_message) { 463 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.mobile_popup_html_info); 464 } else { 465 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').html(Drupal.settings.eu_cookie_compliance.popup_html_info); 466 } 467 Drupal.eu_cookie_compliance.initPopup(); 468 } 469 else { 470 $('.sliding-popup-bottom').not('.eu-cookie-withdraw-wrapper').trigger('eu_cookie_compliance_popup_close').remove(); 471 } 472 } 473 Drupal.eu_cookie_compliance.showWithdrawBanner(value); 474 }); 475 } 476 477 if (reloadPage) { 478 location.reload(); 479 } 480 481 Drupal.eu_cookie_compliance.setStatus(value); 482 }; 483 484 Drupal.eu_cookie_compliance.showWithdrawBanner = function (value) { 485 if (value === 2 && Drupal.settings.eu_cookie_compliance.withdraw_enabled) { 486 if (!Drupal.settings.eu_cookie_compliance.withdraw_button_on_info_popup) { 487 Drupal.eu_cookie_compliance.createWithdrawBanner(Drupal.settings.eu_cookie_compliance.withdraw_markup); 488 } 489 Drupal.eu_cookie_compliance.attachWithdrawEvents(); 490 } 491 }; 492 493 Drupal.eu_cookie_compliance.setStatus = function (status) { 494 var date = new Date(); 495 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 496 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 497 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 498 if (path.length > 1) { 499 var pathEnd = path.length - 1; 500 if (path.lastIndexOf('/') === pathEnd) { 501 path = path.substring(0, pathEnd); 502 } 503 } 504 505 var cookieSession = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 506 if (cookieSession) { 507 $.cookie(cookieName, status, { path: path, domain: domain }); 508 } 509 else { 510 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 511 date.setDate(date.getDate() + lifetime); 512 $.cookie(cookieName, status, { expires: date, path: path, domain: domain }); 513 } 514 $(document).trigger('eu_cookie_compliance.changeStatus', [status]); 515 516 // Store consent if applicable. 517 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))) { 518 var url = Drupal.settings.basePath + Drupal.settings.pathPrefix + 'eu-cookie-compliance/store_consent/banner'; 519 $.post(url, {}, function (data) { }); 520 } 521 }; 522 523 Drupal.eu_cookie_compliance.setAcceptedCategories = function (categories) { 524 var date = new Date(); 525 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 526 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 527 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'; 528 if (path.length > 1) { 529 var pathEnd = path.length - 1; 530 if (path.lastIndexOf('/') === pathEnd) { 531 path = path.substring(0, pathEnd); 532 } 533 } 534 var categoriesString = JSON.stringify(categories); 535 var cookie_session = parseInt(Drupal.settings.eu_cookie_compliance.cookie_session); 536 if (cookie_session) { 537 $.cookie(cookieName, categoriesString, { path: path, domain: domain }); 538 } else { 539 var lifetime = parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime); 540 date.setDate(date.getDate() + lifetime); 541 $.cookie(cookieName, categoriesString, { expires: date, path: path, domain: domain }); 542 } 543 $(document).trigger('eu_cookie_compliance.changePreferences', [categories]); 544 545 // TODO: Store categories with consent if applicable? 546 }; 547 548 Drupal.eu_cookie_compliance.hasAgreed = function (category) { 549 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 550 var agreed = (status === 1 || status === 2); 551 552 if(category !== undefined && agreed) { 553 agreed = Drupal.eu_cookie_compliance.hasAgreedWithCategory(category); 554 } 555 556 return agreed; 557 }; 558 559 Drupal.eu_cookie_compliance.hasAgreedWithCategory = function(category) { 560 var allCategories = Drupal.settings.eu_cookie_compliance.cookie_categories; 561 var agreedCategories = Drupal.eu_cookie_compliance.getAcceptedCategories(); 562 563 if (Drupal.settings.eu_cookie_compliance.fix_first_cookie_category && category === allCategories[0]) { 564 return true; 565 } 566 567 return $.inArray(category, agreedCategories) !== -1; 568 }; 569 570 Drupal.eu_cookie_compliance.showBanner = function () { 571 var showBanner = false;
572 var status = Drupal.eu_cookie_compliance.getCurrentStatus(); 573 if ((status === 0 && Drupal.settings.eu_cookie_compliance.method === 'default') || status === null) { 574 if (!Drupal.settings.eu_cookie_compliance.disagree_do_not_show_popup || status === null) { 575 showBanner = true; 576 } 577 } 578 else if (status === 1 && Drupal.settings.eu_cookie_compliance.popup_agreed_enabled) { 579 showBanner = true; 580 } 581 582 return showBanner; 583 }; 584 585 Drupal.eu_cookie_compliance.cookiesEnabled = function () { 586 var cookieEnabled = navigator.cookieEnabled; 587 if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnabled) { 588 document.cookie = 'testCookie'; 589 cookieEnabled = (document.cookie.indexOf('testCookie') !== -1); 590 } 591 592 return cookieEnabled; 593 }; 594 595 Drupal.eu_cookie_compliance.isWhitelisted = function (cookieName) { 596 // Skip the PHP session cookie. 597 if (cookieName.indexOf('SESS') === 0 || cookieName.indexOf('SSESS') === 0) { 598 return true; 599 } 600 // Split the white-listed cookies. 601 var euCookieComplianceWhitelist = Drupal.settings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g); 602 603 // Add the EU Cookie Compliance cookie. 604 euCookieComplianceWhitelist.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); 605 euCookieComplianceWhitelist.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'); 606 607 // Check if the cookie is white-listed. 608 for (var item in euCookieComplianceWhitelist) { 609 if (cookieName === euCookieComplianceWhitelist[item]) { 610 return true; 611 } 612 // Handle cookie names that are prefixed with a category. 613 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 614 var separatorPos = euCookieComplianceWhitelist[item].indexOf(":"); 615 if (separatorPos !== -1) { 616 var category = euCookieComplianceWhitelist[item].substr(0, separatorPos); 617 var wlCookieName = euCookieComplianceWhitelist[item].substr(separatorPos + 1); 618 619 if (wlCookieName === cookieName && Drupal.eu_cookie_compliance.hasAgreedWithCategory(category)) { 620 return true; 621 } 622 } 623 } 624 } 625 626 return false; 627 } 628 629 // This code upgrades the cookie agreed status when upgrading for an old version. 630 Drupal.eu_cookie_compliance.updateCheck = function () { 631 var legacyCookie = 'cookie-agreed-' + Drupal.settings.eu_cookie_compliance.popup_language; 632 var domain = Drupal.settings.eu_cookie_compliance.domain ? Drupal.settings.eu_cookie_compliance.domain : ''; 633 var path = Drupal.settings.eu_cookie_compliance.domain_all_sites ? '/' : Drupal.settings.basePath; 634 var cookie = $.cookie(legacyCookie); 635 var date = new Date(); 636 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 637 638 // jQuery.cookie 1.0 (bundled with Drupal) returns null, 639 // jQuery.cookie 1.4.1 (bundled with some themes) returns undefined. 640 // We had a 1.4.1 related bug where the value was set to 'null' (string). 641 if (cookie !== undefined && cookie !== null && cookie !== 'null') { 642 date.setDate(date.getDate() + parseInt(Drupal.settings.eu_cookie_compliance.cookie_lifetime)); 643 $.cookie(cookieName, cookie, { expires: date, path: path, domain: domain }); 644 645 // Use removeCookie if the function exists. 646 if (typeof $.removeCookie !== 'undefined') { 647 $.removeCookie(legacyCookie); 648 } 649 else { 650 $.cookie(legacyCookie, null, { path: path, domain: domain }); 651 } 652 } 653 }; 654 655 // Load blocked scripts if the user has agreed to being tracked. 656 var euCookieComplianceHasLoadedScripts = false; 657 var euCookieComplianceHasLoadedScriptsForCategory = []; 658 $(function () { 659 if (Drupal.eu_cookie_compliance.hasAgreed() 660 || (Drupal.eu_cookie_compliance.getCurrentStatus() === null && Drupal.settings.eu_cookie_compliance.method !== 'opt_in' && Drupal.settings.eu_cookie_compliance.method !== 'categories') 661 ) { 662 if (typeof euCookieComplianceLoadScripts === "function") { 663 euCookieComplianceLoadScripts(); 664 } 665 euCookieComplianceHasLoadedScripts = true; 666 667 if (Drupal.settings.eu_cookie_compliance.method === 'categories') { 668 var acceptedCategories = Drupal.eu_cookie_compliance.getAcceptedCategories(); 669 Drupal.eu_cookie_compliance.loadCategoryScripts(acceptedCategories); 670 } 671 } 672 }); 673 674 // Block cookies when the user hasn't agreed. 675 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies = { 676 initialized: false, 677 attach: function (context, settings) { 678 if (!Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized && settings.eu_cookie_compliance) { 679 Drupal.behaviors.eu_cookie_compliance_popup_block_cookies.initialized = true; 680 if ((settings.eu_cookie_compliance.method === 'opt_in' && (Drupal.eu_cookie_compliance.getCurrentStatus() === null || !Drupal.eu_cookie_compliance.hasAgreed()))
681 || (settings.eu_cookie_compliance.method === 'opt_out' && !Drupal.eu_cookie_compliance.hasAgreed() && Drupal.eu_cookie_compliance.getCurrentStatus() !== null) 682 || (Drupal.settings.eu_cookie_compliance.method === 'categories') 683 ) { 684 // Split the white-listed cookies. 685 var euCookieComplianceWhitelist = settings.eu_cookie_compliance.whitelisted_cookies.split(/\r\n|\n|\r/g); 686 687 // Add the EU Cookie Compliance cookie. 688 var cookieName = (typeof eu_cookie_compliance_cookie_name === 'undefined' || eu_cookie_compliance_cookie_name === '') ? 'cookie-agreed' : eu_cookie_compliance_cookie_name; 689 euCookieComplianceWhitelist.push(cookieName); 690 691 euCookieComplianceBlockCookies = setInterval(function () { 692 // Load all cookies from jQuery. 693 var cookies = $.cookie(); 694 695 // Check each cookie and try to remove it if it's not white-listed. 696 for (var i in cookies) { 697 var remove = true; 698 var hostname = window.location.hostname; 699 var cookieRemoved = false; 700 var index = 0; 701 702 remove = !Drupal.eu_cookie_compliance.isWhitelisted(i); 703 704 // Remove the cookie if it's not white-listed. 705 if (remove) { 706 while (!cookieRemoved && hostname !== '') { 707 // Attempt to remove. 708 cookieRemoved = $.removeCookie(i, { domain: '.' + hostname, path: '/' }); 709 if (!cookieRemoved) { 710 cookieRemoved = $.removeCookie(i, { domain: hostname, path: '/' }); 711 } 712 713 index = hostname.indexOf('.'); 714 715 // We can be on a sub-domain, so keep checking the main domain as well. 716 hostname = (index === -1) ? '' : hostname.substring(index + 1); 717 } 718 719 // Some jQuery Cookie versions don't remove cookies well. Try again
720 // using plain js. 721 if (!cookieRemoved) { 722 document.cookie = i + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;'; 723 } 724 } 725 } 726 }, 5000); 727 } 728 } 729 } 730 } 731 732})(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.