1/*! 2 * gdpr-cookie - A jQuery plugin to manage cookie settings in compliance with EU law 3 * 4 * Copyright (c) 2018 Martijn Saly 5 * 6 * Licensed under the MIT license: 7 * http://www.opensource.org/licenses/mit-license.php 8 * 9 * Version: 0.2.3 - Anpassung NW 10 * Ãnderung in 0.2.1: Neue Variablen requireUserInput und showAdvancedOnDefault, CSS berücksichtigt 2 und 3 Kategorien 11 * Ãnderung in 0.2.2: Möglichkeit, einen dritten Button für notwendige Cookies per showEssentialBtn zu erlauben. Ãnderung Label des Akzeptieren-Buttons im erweiterten Modus 12 * Ãnderung in 0.2.3: Anpassung jQuery CSS Klassendefinitionen, auf neuere Syntax 13 * 14 * Original: 15 * https://www.jqueryscript.net/other/GDPR-Cookie-Compliance-Plugin.html 16 * https://libraries.io/npm/gdpr-cookie/0.3.0 17 */ 18;(function(root, factory) { 19 if (typeof define === "function" && define.amd) { 20 // AMD 21 define([ "jquery" ], factory); 22 } 23 else if (typeof module === "object" && module.exports) { 24 // CommonJS 25 module.exports = function( root, jQuery ) { 26 if (jQuery === undefined) { 27 if (typeof window !== "undefined") { 28 jQuery = require("jquery"); 29 } 30 else { 31 jQuery = require("jquery")(root); 32 } 33 } 34 factory(jQuery); 35 return jQuery; 36 }; 37 } 38 else { 39 // Plain 40 factory(root.jQuery); 41 } 42}(this, function($) { 43 "use strict"; 44 45 var settings, showing = false, display, isAdvanced = false, seenAdvanced = false; 46 47 var setCookie = function(name, value, expires) { 48 var d = new Date(); 49 d.setTime(d.getTime() + expires * 24 * 60 * 60 * 1000); 50 document.cookie = name + "=" + value + ";expires=" + d.toUTCString() + ";path=/"; 51 return getCookie(name); 52 }; 53 54 var getCookie = function(name) { 55 var ca = decodeURIComponent(document.cookie).split(";"); 56 name += "="; 57 for (var i = 0; i < ca.length; i++) { 58 var c = ca[i]; 59 while (c.charAt(0) == " ") { 60 c = c.substring(1); 61 } 62 if (c.indexOf(name) === 0) { 63 return c.substring(name.length, c.length); 64 } 65 } 66 }; 67 68 var validateCookieName = function(name) { 69 // Cookie name may consist of \u0021-\u007e, excluding whitespace and characters , ; =
70 return name.replace(/[^\u0021-\u007e]|[,;=\s]/g, ""); 71 }; 72 73 var getPreferences = function() { 74 var preferences = getCookie(settings.cookieName); 75 try { 76 preferences = JSON.parse(preferences); 77 } 78 catch(ex) { 79 return; 80 } 81 82 if (!Array.isArray(preferences) || !preferences.length) { 83 return; 84 } 85 86 var knownTypes = settings.cookieTypes.map(function(type) { 87 return type.value; 88 }); 89 preferences = preferences.filter(function(pref) { 90 return knownTypes.indexOf(pref) >= 0; 91 }); 92 93 return preferences; 94 }; 95 96 $.gdprcookie = { }; 97 98 $.gdprcookie.init = function(options) { 99 100 // Define defaults 101 var defaultSettings = { 102 cookieTypes: [ 103 { 104 type: "Essential", 105 value: "essential", 106 description: "These are cookies that are essential for the website to work correctly.", 107 checked: true, 108 }, 109 { 110 type: "Site Preferences", 111 value: "preferences", 112 description: "These are cookies that are related to your site preferences, e.g. remembering your username, site colours, etc.", 113 checked: true, 114 }, 115 { 116 type: "Analytics", 117 value: "analytics", 118 description: "Cookies related to site visits, browser types, etc.", 119 checked: true, 120 }, 121 { 122 type: "Marketing", 123 value: "marketing", 124 description: "Cookies related to marketing, e.g. newsletters, social media, etc", 125 checked: true, 126 } 127 ], 128 title: "Cookies & privacy", 129 subtitle: "Select cookies to accept", 130 message: "Cookies enable you to use shopping carts and to personalize your experience on our sites, tell us which parts of our websites people have visited, help us measure the effectiveness of ads and web searches, and give us insights into user behaviour so we can improve our communications and products.", 131 submessage: "", 132 delay: 2000, 133 expires: 30, 134 cookieName: "cookieControlPrefs", 135 acceptReload: false, 136 acceptBeforeAdvanced: [ "essential" ], 137 acceptAfterAdvanced: [ "essential" ], 138 requireUserInput: false, 139 showAdvancedOnDefault: false, 140 showEssentialBtn: false, 141 allowUnadvanced: false, 142 switchAdvanced: false, 143 acceptBtnLabel: "Accept cookies", 144 essentialBtnLabel: "Accept essential cookies", 145 advancedBtnLabel: "Customize cookies", 146 confirmBtnLabel: "Confirm selection", 147 unadvancedBtnLabel: "Back", 148 customShowMessage: undefined, 149 customHideMessage: undefined, 150 customShowChecks: undefined, 151 customHideChecks: undefined 152 }; 153 154 // Set defaults 155 settings = $.extend(defaultSettings, window.GdprCookieSettings, options); 156 157 // Coerce into a string because this is poured into innerHTML 158 settings.message = String(settings.message); 159 160 // Coerce into a positive number because it is passed to setTimeout 161 settings.delay = Math.max(0, +settings.delay) || 0; 162 163 // Coerce into a positive whole number between 0 and 730 (2-ish years), to ensure a well-formed cookie value 164 settings.expires = Math.round(Math.min(Math.max(0, +settings.expires), 730)) || 0; 165 166 // Coerce cookieTypes into an array containing plain objects 167 if (Array.isArray(settings.cookieTypes)) { 168 settings.cookieTypes = settings.cookieTypes.filter(function(cookieType) { 169 return $.isPlainObject(cookieType); 170 }); 171 if (!settings.cookieTypes.length) { 172 settings.cookieTypes = defaultSettings.cookieTypes; 173 } 174 } 175 else { 176 settings.cookieTypes = defaultSettings.cookieTypes; 177 } 178 179 // Coerce into a string and valid cookie name 180 settings.cookieName = validateCookieName(String(settings.cookieName || "")) || "cookieControlPrefs"; 181 182 // Coerce acceptBeforeAdvanced and acceptAfterAdvanced into arrays of str
182ings, that exist in settings.cookieTypes[].value 183 var coerce = (function() { 184 var values = settings.cookieTypes.map(function(cookieType) { return cookieType.value; }), 185 exists = function(item) { return values.indexOf(item) >= 0; }; 186 187 return function(setting) { 188 // Convert a single string into an array of 1 189 setting = typeof setting === "string" ? [ setting ] : setting; 190 191 // If it's an array, make sure it only contains known cookie types 192 return Array.isArray(setting) ? setting.map(String).filter(exists) : undefined; 193 }; 194 }()); 195 settings.acceptBeforeAdvanced = coerce(settings.acceptBeforeAdvanced); 196 settings.acceptAfterAdvanced = coerce(settings.acceptAfterAdvanced); 197 198 $(function() { display(); }); 199 }; 200 201 display = function(alwaysShow) { 202 if (showing) { 203 return; 204 } 205 206 var body = $("body"), 207 myCookiePrefs = getPreferences(); 208 209 if(!alwaysShow && myCookiePrefs) { 210 console.log("gdpr:accepted"); 211 body.trigger("gdpr:accept"); 212 return; 213 } 214 215 var elements = { 216 container: undefined, 217 introContainer: undefined, 218 types: undefined, 219 typesContainer: undefined, 220 buttons: { 221 accept: undefined, 222 advanced: undefined 223 }, 224 allChecks: [ ], 225 nonessentialChecks: [ ] 226 }; 227 228 var hide = function(canreload) { 229 if (elements.container) { 230 if ($.isFunction(settings.customHideMessage)) { 231 settings.customHideMessage.call(elements.container, elements.container); 232 showing = false; 233 } 234 else { 235 elements.container.fadeOut("fast", function() { 236 $(this).remove(); 237 showing = false; 238 }); 239 if(settings.requireUserInput) { 240 $(".gdprcookie-mask").fadeOut("fast"); 241 } 242 } 243 } 244 if (canreload && settings.acceptReload) { 245 document.location.reload(); 246 } 247 }; 248 249 if (!Array.isArray(myCookiePrefs) || !myCookiePrefs.length) { 250 myCookiePrefs = undefined; 251 } 252 253 if (alwaysShow || !myCookiePrefs) { 254 elements.types = $("<ul/>").append( 255 $.map(settings.cookieTypes, function(field, index) { 256 if (!field.type || !field.value) { 257 return; 258 } 259 var isEssential = field.value === "essential", 260 isChecked; 261 262 if (Array.isArray(myCookiePrefs)) { 263 isChecked = myCookiePrefs.indexOf(field.value) >= 0; 264 } 265 else { 266 isChecked = field.checked === true; 267 } 268 269 var input = $("<input/>", { 270 type: "checkbox", 271 id: "gdpr-cookietype-" + index, 272 name: "gdpr[]", 273 value: field.value, 274 275 // The essential cookies checkbox is checked and cannot be unchecked 276 checked: isEssential || isChecked, 277 disabled: isEssential 278 }); 279 280 elements.allChecks.push(input.get(0)); 281 if (!isEssential) { 282 elements.nonessentialChecks.push(input.get(0)); 283 } 284 285 var label = $("<label/>", { 286 "for": "gdpr-cookietype-" + index, 287 text: field.type, 288 title: field.description 289 }); 290 291 return $("<li/>").append([ 292 input.get(0), 293 label.get(0), 294 "<br>", 295 field.description 296 ]).get(0); 297 }) 298 ); 299 elements.allChecks = $(elements.allChecks); 300 elements.nonessentialChecks = $(elements.nonessentialChecks); 301 302 // When accept button is clicked drop cookie 303 var acceptClick = function() { 304 var prefsFromCheckboxes = function() { 305 return elements.allChecks 306 .filter(function() { return this.checked || this.disabled; }) 307 .map(function() { return this.value; }) 308 .get(); 309 }; 310 var prefsOutsideAdvanced = function(where) { 311 var setting = "accept" + where + "Advanced"; 312 return Array.isArray(settings[setting]) ? settings[setting] : prefsFromCheckboxes(); 313 }; 314 315 // Hide the cookie message 316 hide(true); 317 318 // Save user cookie preferences (in a cookie!) 319 var prefs = isAdvanced ? prefsFromCheckboxes() : prefsOutsideAdvanced(seenAdvanced ? "After" : "Before");
320 setCookie(settings.cookieName, JSON.stringify(prefs), settings.expires); 321 322 // Trigger cookie accept event 323 body.trigger("gdpr:accept"); 324 }; 325 326 // Toggle advanced cookie options 327 var advancedClick = function() { 328 var showAdvanced = function() { 329 if (!settings.allowUnadvanced) { 330 elements.buttons.advanced.prop("disabled", true); 331 } 332 333 if ($.isFunction(settings.customShowChecks)) { 334 settings.customShowChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 335 } 336 else { 337 if (settings.switchAdvanced) { 338 elements.introContainer.slideUp("fast"); 339 } 340 elements.typesContainer.slideDown("fast"); 341 } 342 343 isAdvanced = seenAdvanced = true; 344 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 345 elements.buttons.advanced.text(settings.unadvancedBtnLabel); 346 elements.buttons.accept.text(settings.confirmBtnLabel); 347 elements.buttons.essential ? elements.buttons.essential.hide() : undefined; 348 } 349 350 // Trigger advanced show event 351 body.trigger("gdpr:advanced"); 352 }; 353 var hideAdvanced = function() { 354 if ($.isFunction(settings.customHideChecks)) { 355 settings.customHideChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 356 } 357 else { 358 if (settings.switchAdvanced) { 359 elements.introContainer.slideDown("fast"); 360 } 361 elements.typesContainer.slideUp("fast"); 362 } 363 364 isAdvanced = false; 365 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 366 elements.buttons.advanced.text(settings.advancedBtnLabel); 367 elements.buttons.accept.text(settings.acceptBtnLabel); 368 elements.buttons.essential ? elements.buttons.essential.show() : undefined; 369 } 370 371 // Trigger advanced show event 372 body.trigger("gdpr:unadvanced"); 373 }; 374 375 if (isAdvanced) { 376 if (settings.allowUnadvanced) { 377 hideAdvanced(); 378 } 379 } 380 else { 381 showAdvanced(); 382 } 383 }; 384 385 // Save settings when advanced settings are visible on default 386 var saveSettingsClick = function() { 387 isAdvanced = seenAdvanced = true; 388 acceptClick(); 389 }; 390 391 // Build cookie message to display later on 392 var cookieMessage; 393 if (settings.showAdvancedOnDefault) { 394 cookieMessage = (elements.container = $("<div class=gdprcookie "+(settings.showEssentialBtn?'wide':'')+"' data-options="+settings.cookieTypes.length+">")).append([ 395 (elements.introContainer = $("<div class=gdprcookie-intro>")).append([ 396 settings.title ? $("<h1/>", { text: settings.title }).get(0) : undefined, 397 settings.message ? $("<p/>", { html: settings.message }).get(0) : undefined 398 ]).get(0), 399 (elements.typesContainer = $("<div class=gdprcookie-types>")).append([ 400 settings.submessage ? $("<p/>", { html: settings.submessage }).get(0) : undefined, 401 elements.types.get(0) 402 ]).get(0) 403 ]); 404 } 405 else { 406 cookieMessage = (elements.container = $("<div class='gdprcookie "+(settings.showEssentialBtn?'wide':'')+"' data-options="+settings.cookieTypes.length+">")).append([ 407 (elements.introContainer = $("<div class=gdprcookie-intro>")).append([ 408 settings.title ? $("<h1/>", { text: settings.title }).get(0) : undefined, 409 settings.message ? $("<p/>", { html: settings.message }).get(0) : undefined 410 ]).get(0), 411 (elements.typesContainer = $("<div class=gdprcookie-types>")).hide().append([ 412 settings.subtitle ? $("<h2/>", { text: settings.subtitle }).get(0) : undefined, 413 settings.submessage ? $("<p/>", { html: settings.submessage }).get(0) : undefined, 414 elements.types.get(0) 415 ]).get(0) 416 ]); 417 } 418 419 // Add Buttons 420 var cookieButtons; 421 if (settings.showEssentialBtn) { 422 cookieButtons = $("<div class=gdprcookie-buttons>").append([ 423 (elements.buttons.accept = $("<button>", { type: "button", class: "highlight", text: settings.acceptBtnLabel, click: acceptClick })).get(0), 424 (elements.buttons.advanced = $("<button/>", { type: "button", text: settings.advancedBtnLabel, click: advancedClick })).get(0), 425 (elements.buttons.essential = $("<button/>", { type: "button", text: settings.essentialBtnLabel, click: saveSettingsClick })).get(0) 426 ]); 427 } 428 else { 429 cookieButtons = $("<div class=gdprcookie-buttons>").append([ 430 (elements.buttons.accept = $("<button>", { type: "button", class: "highlight", text: settings.acceptBtnLabel, click: acceptClick })).get(0), 431 (elements.buttons.advanced = $("<button/>", { type: "button", text: settings.advancedBtnLabel, click: advancedClick })).get(0) 432 ]); 433 } 434 cookieMessage = (elements.container.append(cookieButtons)); 435 436 var show = function() { 437 if(settings.requireUserInput) { 438 body.append(cookieMessage,$("<div class=gdprcookie-mask>")); 439 } 440 else { 441 body.append(cookieMessage); 442 } 443 showing = true; 444 isAdvanced = seenAdvanced = false;
445 if ($.isFunction(settings.customShowMessage)) { 446 settings.customShowMessage.call(elements.container, elements.container); 447 } 448 else { 449 elements.container.hide().fadeIn("slow"); 450 if(settings.requireUserInput) { 451 $(".gdprcookie-mask").hide().fadeIn("slow"); 452 } 453 } 454 455 // Trigger container show event 456 body.trigger("gdpr:show"); 457 }; 458 459 if (!settings.delay || alwaysShow) { 460 show(); 461 } 462 else { 463 window.setTimeout(show, settings.delay); 464 } 465 } 466 else { 467 hide(false); 468 } 469 }; 470 471 $.gdprcookie.display = function() { 472 display(true); 473 }; 474 475 // Method to check if user cookie preference exists 476 $.gdprcookie.preference = function(value) { 477 var preferences = getPreferences(); 478 479 if (value === "essential") { 480 return true; 481 } 482 else if (!preferences) { 483 return false; 484 } 485 else if (value !== undefined) { 486 return preferences.indexOf(value) >= 0; 487 } 488 return preferences; 489 }; 490 491 $.gdprcookie.asyncLoad = function(u, t, c) { 492 var d = document, 493 o = d.createElement(t), 494 s = d.getElementsByTagName(t)[0]; 495 496 switch (t){ 497 case 'script': 498 o.src = u; 499 o.defer = 1; 500 break; 501 case 'link': 502 o.rel = 'stylesheet'; 503 o.type = 'text/css'; 504 o.href = u; 505 break; 506 } 507 if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); } 508 s.parentNode.insertBefore(o, s); 509 }; 510 511 /** Async Load Helper for JS **/ 512 $.gdprcookie.asyncJS = function(u, c) { 513 this.asyncLoad(u, 'script', c); 514 }; 515 516 /** Async Load Helper for CSS **/ 517 $.gdprcookie.asyncCSS = function(u) { 518 this.asyncLoad(u, 'link'); 519 }; 520 521 $.gdprcookie.loadcookies = function() { 522 /** Get all Scripts to load **/ 523 var elements = []; 524 if (typeof document.querySelectorAll == 'undefined') { 525 elements = document.querySelectorAll('script[data-cookiecontrol]'); 526 } else { 527 var temp = document.getElementsByTagName('script'); 528 for (var key in temp) { 529 var element = temp[key]; 530 if (typeof element.getAttribute != 'undefined' && element.getAttribute('data-cookiecontrol')) { 531 elements.push(element); 532 } 533 } 534 temp = null; 535 } 536 if (elements.length > 0) { 537 /** Loop through elements and run Code **/ 538 for (var key in elements) { 539 /** get HTML of Elements **/ 540 var code = elements[key].innerHTML; 541 /** trim Elements **/ 542 if (code && code.length) code = code.trim(); 543 /** Chekbox Access check **/ 544 var group = elements[key].dataset.cookiecontrol; 545 if (group != 'required') { 546 if ($.gdprcookie.preference(group) !== true) { 547 // abort script 548 continue; 549 } 550 } 551 /** run Code it something in in it **/ 552 if (code && code.length) { 553 /** if Is Code Eval Code **/ 554 eval.call(this, code); 555 } else { 556 /** If is SRC load that **/ 557 var element = elements[key]; 558 /** 559 * Load SRC 560 * Dont use this src="", becouse some Browser will ignore the type=text/plain 561 * prefer use data-src="" 562 */ 563 if (element.getAttribute('data-src')) { 564 this.asyncJS(element.getAttribute('data-src')); 565 } else if (element.src) { 566 this.asyncJS(element.src); 567 } 568 } 569 } 570 } 571 }; 572 573 // Protection against malicious scripts, e.g. monkey patching 574 $.gdprcookie = Object.freeze($.gdprcookie); 575 576})); 577 578$(document).ready(function() { 579 580 $(document.body) 581 .on("gdpr:accept", function() { 582 var preferences = $.gdprcookie.preference(); 583 console.log("Preferences saved:", preferences);
584 $.gdprcookie.loadcookies(); 585 }) 586});
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.