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.0 10 * 11 */ 12;(function(root, factory) { 13 if (typeof define === "function" && define.amd) { 14 // AMD 15 define([ "jquery" ], factory); 16 } 17 else if (typeof module === "object" && module.exports) { 18 // CommonJS 19 module.exports = function( root, jQuery ) { 20 if (jQuery === undefined) { 21 if (typeof window !== "undefined") { 22 jQuery = require("jquery"); 23 } 24 else { 25 jQuery = require("jquery")(root); 26 } 27 } 28 factory(jQuery); 29 return jQuery; 30 }; 31 } 32 else { 33 // Plain 34 factory(root.jQuery); 35 } 36}(this, function($) { 37 "use strict"; 38 39 var settings, showing = false, display, isAdvanced = false, seenAdvanced = false; 40 41 var setCookie = function(name, value, expires) { 42 var d = new Date(); 43 d.setTime(d.getTime() + expires * 24 * 60 * 60 * 1000); 44 document.cookie = name + "=" + value + ";expires=" + d.toUTCString() + ";path=/"; 45 return getCookie(name); 46 }; 47 48 var getCookie = function(name) { 49 var ca = decodeURIComponent(document.cookie).split(";"); 50 name += "="; 51 for (var i = 0; i < ca.length; i++) { 52 var c = ca[i]; 53 while (c.charAt(0) == " ") { 54 c = c.substring(1); 55 } 56 if (c.indexOf(name) === 0) { 57 return c.substring(name.length, c.length); 58 } 59 } 60 }; 61 62 var validateCookieName = function(name) { 63 // Cookie name may consist of \u0021-\u007e, excluding whitespace and characters , ; =
64 return name.replace(/[^\u0021-\u007e]|[,;=\s]/g, ""); 65 }; 66 67 var getPreferences = function() { 68 var preferences = getCookie(settings.cookieName); 69 try { 70 preferences = JSON.parse(preferences); 71 } 72 catch(ex) { 73 return; 74 } 75 76 if (!Array.isArray(preferences) || !preferences.length) { 77 return; 78 } 79 80 var knownTypes = settings.cookieTypes.map(function(type) { 81 return type.value; 82 }); 83 preferences = preferences.filter(function(pref) { 84 return knownTypes.indexOf(pref) >= 0; 85 }); 86 87 return preferences; 88 }; 89 90 $.gdprcookie = { }; 91 92 $.gdprcookie.init = function(options) { 93 94 // Define defaults 95 var defaultSettings = { 96 cookieTypes: [ 97 { 98 type: "Essential", 99 value: "essential", 100 description: "These are cookies that are essential for the website to work correctly.", 101 checked: true, 102 }, 103 { 104 type: "Site Preferences", 105 value: "preferences", 106 description: "These are cookies that are related to your site preferences, e.g. remembering your username, site colours, etc.", 107 checked: true, 108 }, 109 { 110 type: "Analytics", 111 value: "analytics", 112 description: "Cookies related to site visits, browser types, etc.", 113 checked: true, 114 }, 115 { 116 type: "Marketing", 117 value: "marketing", 118 description: "Cookies related to marketing, e.g. newsletters, social media, etc", 119 checked: true, 120 } 121 ], 122 title: "Cookies & privacy", 123 subtitle: "Select cookies to accept", 124 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.", 125 submessage: "", 126 delay: 2000, 127 expires: 30, 128 cookieName: "cookieControlPrefs", 129 acceptReload: false, 130 acceptBeforeAdvanced: [ "essential" ], 131 acceptAfterAdvanced: [ "essential" ], 132 allowUnadvanced: false, 133 switchAdvanced: false, 134 acceptBtnLabel: "Accept cookies", 135 advancedBtnLabel: "Customize cookies", 136 unadvancedBtnLabel: "Back", 137 customShowMessage: undefined, 138 customHideMessage: undefined, 139 customShowChecks: undefined, 140 customHideChecks: undefined 141 }; 142 143 // Set defaults 144 settings = $.extend(defaultSettings, window.GdprCookieSettings, options); 145 146 // Coerce into a string because this is poured into innerHTML 147 settings.message = String(settings.message); 148 149 // Coerce into a positive number because it is passed to setTimeout 150 settings.delay = Math.max(0, +settings.delay) || 0; 151 152 // Coerce into a positive whole number between 0 and 730 (2-ish years), to ensure a well-formed cookie value 153 settings.expires = Math.round(Math.min(Math.max(0, +settings.expires), 730)) || 0; 154 155 // Coerce cookieTypes into an array containing plain objects 156 if (Array.isArray(settings.cookieTypes)) { 157 settings.cookieTypes = settings.cookieTypes.filter(function(cookieType) { 158 return $.isPlainObject(cookieType); 159 }); 160 if (!settings.cookieTypes.length) { 161 settings.cookieTypes = defaultSettings.cookieTypes; 162 } 163 } 164 else { 165 settings.cookieTypes = defaultSettings.cookieTypes; 166 } 167 168 // Coerce into a string and valid cookie name 169 settings.cookieName = validateCookieName(String(settings.cookieName || "")) || "cookieControlPrefs"; 170 171 // Coerce acceptBeforeAdvanced and acceptAfterAdvanced into arrays of str
171ings, that exist in settings.cookieTypes[].value 172 var coerce = (function() { 173 var values = settings.cookieTypes.map(function(cookieType) { return cookieType.value; }), 174 exists = function(item) { return values.indexOf(item) >= 0; }; 175 176 return function(setting) { 177 // Convert a single string into an array of 1 178 setting = typeof setting === "string" ? [ setting ] : setting; 179 180 // If it's an array, make sure it only contains known cookie types 181 return Array.isArray(setting) ? setting.map(String).filter(exists) : undefined; 182 }; 183 }()); 184 settings.acceptBeforeAdvanced = coerce(settings.acceptBeforeAdvanced); 185 settings.acceptAfterAdvanced = coerce(settings.acceptAfterAdvanced); 186 187 $(function() { display(); }); 188 }; 189 190 display = function(alwaysShow) { 191 if (showing) { 192 return; 193 } 194 195 var body = $("body"), 196 myCookiePrefs = getPreferences(); 197 198 var elements = { 199 container: undefined, 200 introContainer: undefined, 201 types: undefined, 202 typesContainer: undefined, 203 buttons: { 204 accept: undefined, 205 advanced: undefined 206 }, 207 allChecks: [ ], 208 nonessentialChecks: [ ] 209 }; 210 211 var hide = function(canreload) { 212 if (elements.container) { 213 if ($.isFunction(settings.customHideMessage)) { 214 settings.customHideMessage.call(elements.container, elements.container); 215 showing = false; 216 } 217 else { 218 elements.container.fadeOut("fast", function() { 219 $(this).remove(); 220 showing = false; 221 }); 222 } 223 } 224 if (canreload && settings.acceptReload) { 225 document.location.reload(); 226 } 227 }; 228 229 if (!Array.isArray(myCookiePrefs) || !myCookiePrefs.length) { 230 myCookiePrefs = undefined; 231 } 232 233 if (alwaysShow || !myCookiePrefs) { 234 elements.types = $("<ul/>").append( 235 $.map(settings.cookieTypes, function(field, index) { 236 if (!field.type || !field.value) { 237 return; 238 } 239 var isEssential = field.value === "essential", 240 isChecked; 241 242 if (Array.isArray(myCookiePrefs)) { 243 isChecked = myCookiePrefs.indexOf(field.value) >= 0; 244 } 245 else { 246 isChecked = field.checked === true; 247 } 248 249 var input = $("<input/>", { 250 type: "checkbox", 251 id: "gdpr-cookietype-" + index, 252 name: "gdpr[]", 253 value: field.value, 254 "class": 'styled-checkbox', 255 256 // The essential cookies checkbox is checked and cannot be unchecked 257 checked: isEssential || isChecked, 258 disabled: isEssential 259 }); 260 261 elements.allChecks.push(input.get(0)); 262 if (!isEssential) { 263 elements.nonessentialChecks.push(input.get(0)); 264 } 265 266 var label = $("<label/>", { 267 "for": "gdpr-cookietype-" + index, 268 text: field.type, 269 title: field.description 270 }); 271 272 273 274 return $("<li/>").append([ 275 input.get(0), 276 //'<span class="slider round"></span>', 277 label.get(0), 278 ]).get(0); 279 }) 280 ); 281 elements.allChecks = $(elements.allChecks); 282 elements.nonessentialChecks = $(elements.nonessentialChecks); 283 284 // When accept button is clicked drop cookie 285 var acceptClick = function() { 286 var prefsFromCheckboxes = function() { 287 return elements.allChecks 288 .filter(function() { return this.checked || this.disabled; }) 289 .map(function() { return this.value; }) 290 .get(); 291 }; 292 var prefsOutsideAdvanced = function(where) { 293 var setting = "accept" + where + "Advanced"; 294 return Array.isArray(settings[setting]) ? settings[setting] : prefsFromCheckboxes(); 295 }; 296 297 // Hide the cookie message 298 hide(true); 299 300 // Save user cookie preferences (in a cookie!) 301 var prefs = isAdvanced ? prefsFromCheckboxes() : prefsOutsideAdvanced(seenAdvanced ? "After" : "Before");
302 setCookie(settings.cookieName, JSON.stringify(prefs), settings.expires); 303 304 // Trigger cookie accept event 305 body.trigger("gdpr:accept"); 306 }; 307 308 // Toggle advanced cookie options 309 var advancedClick = function() { 310 var showAdvanced = function() { 311 if (!settings.allowUnadvanced) { 312 elements.buttons.advanced.prop("disabled", true); 313 } 314 315 if ($.isFunction(settings.customShowChecks)) { 316 settings.customShowChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 317 } 318 else { 319 if (settings.switchAdvanced) { 320 elements.introContainer.slideUp("fast"); 321 } 322 elements.typesContainer.slideDown("fast"); 323 } 324 325 isAdvanced = seenAdvanced = true; 326 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 327 elements.buttons.advanced.text(settings.unadvancedBtnLabel); 328 } 329 330 // Trigger advanced show event 331 body.trigger("gdpr:advanced"); 332 }; 333 var hideAdvanced = function() { 334 if ($.isFunction(settings.customHideChecks)) { 335 settings.customHideChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 336 } 337 else { 338 if (settings.switchAdvanced) { 339 elements.introContainer.slideDown("fast"); 340 } 341 elements.typesContainer.slideUp("fast"); 342 } 343 344 isAdvanced = false; 345 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 346 elements.buttons.advanced.text(settings.advancedBtnLabel); 347 } 348 349 // Trigger advanced show event 350 body.trigger("gdpr:unadvanced"); 351 }; 352 353 if (isAdvanced) { 354 if (settings.allowUnadvanced) { 355 hideAdvanced(); 356 } 357 } 358 else { 359 showAdvanced(); 360 } 361 }; 362 363 // Build cookie message to display later on 364 var cookieMessage = (elements.container = $("<div class=gdprcookie>")).append([ 365 (elements.introContainer = $("<div class=gdprcookie-intro/>")).append([ 366 //settings.title ? $("<h1/>", { text: settings.title }).get(0) : undefined, 367 settings.message ? $("<p/>", { html: settings.message }).get(0) : undefined 368 ]).get(0), 369 $("<div class=gdprcookie-buttons/>").append([ 370 371 (elements.buttons.advanced = $("<button/>", { type: "button", text: settings.advancedBtnLabel, click: advancedClick })).get(0), 372 (elements.buttons.accept = $("<button/>", { type: "button", id: "cookie_accept",text: settings.acceptBtnLabel, click: acceptClick, onclick: 'setCookiepref()' })).get(0) 373 374 ]).get(0), 375 (elements.typesContainer = $("<div class=gdprcookie-types/>")).hide().append([ 376 settings.subtitle ? $("<h2/>", { text: settings.subtitle }).get(0) : undefined, 377 settings.submessage ? $("<p/>", { html: settings.submessage }).get(0) : undefined, 378 elements.types.get(0) 379 ]).get(0) 380 381 382 383 ]); 384 385 var show = function() { 386 body.append(cookieMessage); 387 showing = true; 388 isAdvanced = seenAdvanced = false;
389 if ($.isFunction(settings.customShowMessage)) { 390 settings.customShowMessage.call(elements.container, elements.container); 391 } 392 else { 393 elements.container.hide().fadeIn("slow"); 394 } 395 396 // Trigger container show event 397 body.trigger("gdpr:show"); 398 }; 399 400 if (!settings.delay || alwaysShow) { 401 show(); 402 } 403 else { 404 window.setTimeout(show, settings.delay); 405 } 406 } 407 else { 408 hide(false); 409 } 410 }; 411 412 $.gdprcookie.display = function() { 413 display(true); 414 }; 415 416 // Method to check if user cookie preference exists 417 $.gdprcookie.preference = function(value) { 418 var preferences = getPreferences(); 419 420 if (value === "essential") { 421 return true; 422 } 423 else if (!preferences) { 424 return false; 425 } 426 else if (value !== undefined) { 427 return preferences.indexOf(value) >= 0; 428 } 429 return preferences; 430 }; 431 432 // Protection against malicious scripts, e.g. monkey patching 433 $.gdprcookie = Object.freeze($.gdprcookie); 434 435})); 436 437 438 439 440/*! 441 * JavaScript Cookie v2.2.0 442 * https://github.com/js-cookie/js-cookie 443 * 444 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack 445 * Released under the MIT license 446 */ 447;(function (factory) { 448 var registeredInModuleLoader; 449 if (typeof define === 'function' && define.amd) { 450 define(factory); 451 registeredInModuleLoader = true; 452 } 453 if (typeof exports === 'object') { 454 module.exports = factory(); 455 registeredInModuleLoader = true; 456 } 457 if (!registeredInModuleLoader) { 458 var OldCookies = window.Cookies; 459 var api = window.Cookies = factory(); 460 api.noConflict = function () { 461 window.Cookies = OldCookies; 462 return api; 463 }; 464 } 465}(function () { 466 function extend () { 467 var i = 0; 468 var result = {}; 469 for (; i < arguments.length; i++) { 470 var attributes = arguments[ i ]; 471 for (var key in attributes) { 472 result[key] = attributes[key]; 473 } 474 } 475 return result; 476 } 477 478 function decode (s) { 479 return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); 480 } 481 482 function init (converter) { 483 function api() {} 484 485 function set (key, value, attributes) { 486 if (typeof document === 'undefined') { 487 return; 488 } 489 490 attributes = extend({ 491 path: '/' 492 }, api.defaults, attributes); 493 494 if (typeof attributes.expires === 'number') { 495 attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5); 496 } 497 498 // We're using "expires" because "max-age" is not supported by IE 499 attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; 500 501 try { 502 var result = JSON.stringify(value); 503 if (/^[\{\[]/.test(result)) { 504 value = result; 505 } 506 } catch (e) {} 507 508 value = converter.write ? 509 converter.write(value, key) : 510 encodeURIComponent(String(value)) 511 .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); 512 513 key = encodeURIComponent(String(key)) 514 .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) 515 .replace(/[\(\)]/g, escape); 516 517 var stringifiedAttributes = ''; 518 for (var attributeName in attributes) { 519 if (!attributes[attributeName]) { 520 continue; 521 } 522 stringifiedAttributes += '; ' + attributeName; 523 if (attributes[attributeName] === true) { 524 continue; 525 } 526 527 // Considers RFC 6265 section 5.2: 528 // ... 529 // 3. If the remaining unparsed-attributes contains a %x3B (";") 530 // character: 531 // Consume the characters of the unparsed-attributes up to, 532 // not including, the first %x3B (";") character. 533 // ... 534 stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; 535 } 536 537 return (document.cookie = key + '=' + value + stringifiedAttributes); 538 } 539 540 function get (key, json) { 541 if (typeof document === 'undefined') { 542 return; 543 } 544 545 var jar = {}; 546 // To prevent the for loop in the first place assign an empty array 547 // in case there are no cookies at all. 548 var cookies = document.cookie ? document.cookie.split('; ') : []; 549 var i = 0; 550 551 for (; i < cookies.length; i++) { 552 var parts = cookies[i].split('='); 553 var cookie = parts.slice(1).join('='); 554 555 if (!json && cookie.charAt(0) === '"') { 556 cookie = cookie.slice(1, -1); 557 } 558 559 try { 560 var name = decode(parts[0]); 561 cookie = (converter.read || converter)(cookie, name) || 562 decode(cookie); 563 564 if (json) { 565 try { 566 cookie = JSON.parse(cookie); 567 } catch (e) {} 568 } 569 570 jar[name] = cookie; 571 572 if (key === name) { 573 break; 574 } 575 } catch (e) {} 576 } 577 578 return key ? jar[key] : jar; 579 } 580 581 api.set = set; 582 api.get = function (key) { 583 return get(key, false /* read as raw */); 584 }; 585 api.getJSON = function (key) { 586 return get(key, true /* read as json */); 587 }; 588 api.remove = function (key, attributes) { 589 set(key, '', extend(attributes, { 590 expires: -1 591 })); 592 }; 593 594 api.defaults = {}; 595 596 api.withConverter = init; 597 598 return api; 599 } 600 601 return init(function () {}); 602})); 603 604// Various Functions 605 606function getCookie(name) { 607 var dc = document.cookie;
608 var prefix = name + "="; 609 var begin = dc.indexOf("; " + prefix); 610 if (begin == -1) { 611 begin = dc.indexOf(prefix); 612 if (begin != 0) return null; 613 } 614 else 615 { 616 begin += 2; 617 var end = document.cookie.indexOf(";", begin); 618 if (end == -1) { 619 end = dc.length; 620 } 621 } 622 // because unescape has been deprecated, replaced with decodeURI 623 //return unescape(dc.substring(begin + prefix.length, end)); 624 return decodeURI(dc.substring(begin + prefix.length, end)); 625} 626 627
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.