1/*! 2 * gdpr-cookie - A jQuery plugin to manage cookie settings in compliance with EU law 3 https://github.com/acoustep/gdpr-cookie 4 * 5 * Copyright (c) 2018 Martijn Saly 6 * 7 * Licensed under the MIT license: 8 * http://www.opensource.org/licenses/mit-license.php 9 * 10 * Version: 0.2.0 11 * 12 */ 13 ;(function(root, factory) { 14 if (typeof define === "function" && define.amd) { 15 // AMD 16 define([ "jquery" ], factory); 17 } 18 else if (typeof module === "object" && module.exports) { 19 // CommonJS 20 module.exports = function( root, jQuery ) { 21 if (jQuery === undefined) { 22 if (typeof window !== "undefined") { 23 jQuery = require("jquery"); 24 } 25 else { 26 jQuery = require("jquery")(root); 27 } 28 } 29 factory(jQuery); 30 return jQuery; 31 }; 32 } 33 else { 34 // Plain 35 factory(root.jQuery); 36 } 37 }(this, function($) { 38 "use strict"; 39 40 var settings, showing = false, display, isAdvanced = false, seenAdvanced = false; 41 42 var setCookie = function(name, value, expires) { 43 var d = new Date(); 44 d.setTime(d.getTime() + expires * 24 * 60 * 60 * 1000); 45 document.cookie = name + "=" + value + ";expires=" + d.toUTCString() + ";path=/"; 46 return getCookie(name); 47 }; 48 49 var getCookie = function(name) { 50 var ca = decodeURIComponent(document.cookie).split(";"); 51 name += "="; 52 for (var i = 0; i < ca.length; i++) { 53 var c = ca[i]; 54 while (c.charAt(0) == " ") { 55 c = c.substring(1); 56 } 57 if (c.indexOf(name) === 0) { 58 return c.substring(name.length, c.length); 59 } 60 } 61 }; 62 63 var validateCookieName = function(name) { 64 // Cookie name may consist of \u0021-\u007e, excluding whitespace and characters , ; =
65 return name.replace(/[^\u0021-\u007e]|[,;=\s]/g, ""); 66 }; 67 68 var getPreferences = function() { 69 var preferences = getCookie(settings.cookieName); 70 try { 71 preferences = JSON.parse(preferences); 72 } 73 catch(ex) { 74 return; 75 } 76 77 if (!Array.isArray(preferences) || !preferences.length) { 78 return; 79 } 80 81 var knownTypes = settings.cookieTypes.map(function(type) { 82 return type.value; 83 }); 84 preferences = preferences.filter(function(pref) { 85 return knownTypes.indexOf(pref) >= 0; 86 }); 87 88 return preferences; 89 }; 90 91 $.gdprcookie = { }; 92 93 $.gdprcookie.init = function(options) { 94 95 // Define defaults 96 var defaultSettings = { 97 cookieTypes: [ 98 { 99 type: "Necessários", 100 value: "essential", 101 description: "Estes cookies são essenciais e necesários para que o site funcione corretamente.", 102 checked: true, 103 }, 104 { 105 type: "Personalização", 106 value: "preferences", 107 description: "Estes cookies guardam suas opções de preferência.", 108 checked: true, 109 }, 110 { 111 type: "EstatÃstica", 112 value: "analytics", 113 description: "Cookies relacionados à metricas e estatÃsticas de utilização do site.", 114 checked: true, 115 }, 116 { 117 type: "Publicidade", 118 value: "marketing", 119 description: "Cookies relacionados à exibição de conteúdo de marketing.", 120 checked: true, 121 } 122 ], 123 title: "Cookies & Privacidade", 124 subtitle: "Selecione os cookies que deseja consentir", 125 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.", 126 submessage: "", 127 delay: 2000, 128 expires: 30, 129 cookieName: "cookieControlPrefs", 130 acceptReload: false, 131 acceptBeforeAdvanced: [ "essential" ], 132 acceptAfterAdvanced: [ "essential" ], 133 allowUnadvanced: false, 134 switchAdvanced: false, 135 acceptBtnLabel: "Aceitar cookies", 136 advancedBtnLabel: "Gerenciar", 137 acceptBtnLabelWhenClose: "", 138 customShowMessage: undefined, 139 customHideMessage: undefined, 140 customShowChecks: undefined, 141 customHideChecks: undefined 142 }; 143 144 // Set defaults 145 settings = $.extend(defaultSettings, window.GdprCookieSettings, options); 146 147 // Coerce into a string because this is poured into innerHTML 148 settings.message = String(settings.message); 149 150 // Coerce into a positive number because it is passed to setTimeout 151 settings.delay = Math.max(0, +settings.delay) || 0; 152 153 // Coerce into a positive whole number between 0 and 730 (2-ish years), to ensure a well-formed cookie value 154 settings.expires = Math.round(Math.min(Math.max(0, +settings.expires), 730)) || 0; 155 156 // Coerce cookieTypes into an array containing plain objects 157 if (Array.isArray(settings.cookieTypes)) { 158 settings.cookieTypes = settings.cookieTypes.filter(function(cookieType) { 159 return $.isPlainObject(cookieType); 160 }); 161 if (!settings.cookieTypes.length) { 162 settings.cookieTypes = defaultSettings.cookieTypes; 163 } 164 } 165 else { 166 settings.cookieTypes = defaultSettings.cookieTypes; 167 } 168 169 // Coerce into a string and valid cookie name 170 settings.cookieName = validateCookieName(String(settings.cookieName || "")) || "cookieControlPrefs"; 171 172 // Coerce acceptBeforeAdvanced and acceptAfterAdvanced into arrays of str
172ings, that exist in settings.cookieTypes[].value 173 var coerce = (function() { 174 var values = settings.cookieTypes.map(function(cookieType) { return cookieType.value; }), 175 exists = function(item) { return values.indexOf(item) >= 0; }; 176 177 return function(setting) { 178 // Convert a single string into an array of 1 179 setting = typeof setting === "string" ? [ setting ] : setting; 180 181 // If it's an array, make sure it only contains known cookie types 182 return Array.isArray(setting) ? setting.map(String).filter(exists) : undefined; 183 }; 184 }()); 185 settings.acceptBeforeAdvanced = coerce(settings.acceptBeforeAdvanced); 186 settings.acceptAfterAdvanced = coerce(settings.acceptAfterAdvanced); 187 188 $(function() { display(); }); 189 }; 190 191 display = function(alwaysShow) { 192 if (showing) { 193 return; 194 } 195 196 var body = $("body"), 197 myCookiePrefs = getPreferences(); 198 199 var elements = { 200 container: undefined, 201 introContainer: undefined, 202 types: undefined, 203 typesContainer: undefined, 204 buttons: { 205 accept: undefined, 206 advanced: undefined 207 }, 208 allChecks: [ ], 209 nonessentialChecks: [ ] 210 }; 211 212 var hide = function(canreload) { 213 if (elements.container) { 214 if ($.isFunction(settings.customHideMessage)) { 215 settings.customHideMessage.call(elements.container, elements.container); 216 showing = false; 217 } 218 else { 219 elements.container.fadeOut("fast", function() { 220 $(this).remove(); 221 showing = false; 222 }); 223 } 224 } 225 if (canreload && settings.acceptReload) { 226 document.location.reload(); 227 } 228 }; 229 230 if (!Array.isArray(myCookiePrefs) || !myCookiePrefs.length) { 231 myCookiePrefs = undefined; 232 } 233 234 if (alwaysShow || !myCookiePrefs) { 235 elements.types = $("<ul/>").append( 236 $.map(settings.cookieTypes, function(field, index) { 237 if (!field.type || !field.value) { 238 return; 239 } 240 var isEssential = field.value === "essential", 241 isChecked; 242 243 if (Array.isArray(myCookiePrefs)) { 244 isChecked = myCookiePrefs.indexOf(field.value) >= 0; 245 } 246 else { 247 isChecked = field.checked === true; 248 } 249 250 var input = $("<input/>", { 251 type: "checkbox", 252 id: "gdpr-cookietype-" + index, 253 name: "gdpr[]", 254 value: field.value, 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 return $("<li/>").append([ 273 input.get(0), 274 label.get(0) 275 ]).get(0); 276 }) 277 ); 278 elements.allChecks = $(elements.allChecks); 279 elements.nonessentialChecks = $(elements.nonessentialChecks); 280 281 // When accept button is clicked drop cookie 282 var acceptClick = function() { 283 var prefsFromCheckboxes = function() { 284 return elements.allChecks 285 .filter(function() { return this.checked || this.disabled; }) 286 .map(function() { return this.value; }) 287 .get(); 288 }; 289 var prefsOutsideAdvanced = function(where) { 290 var setting = "accept" + where + "Advanced"; 291 return Array.isArray(settings[setting]) ? settings[setting] : prefsFromCheckboxes(); 292 }; 293 294 // Hide the cookie message 295 hide(true); 296 297 // Save user cookie preferences (in a cookie!) 298 var prefs = isAdvanced ? prefsFromCheckboxes() : prefsOutsideAdvanced(seenAdvanced ? "After" : "Before");
299 setCookie(settings.cookieName, JSON.stringify(prefs), settings.expires); 300 301 // Trigger cookie accept event 302 body.trigger("gdpr:accept"); 303 }; 304 305 // Toggle advanced cookie options 306 var advancedClick = function() { 307 var showAdvanced = function() { 308 if (!settings.allowUnadvanced) { 309 elements.buttons.advanced.prop("disabled", true); 310 } 311 312 if ($.isFunction(settings.customShowChecks)) { 313 settings.customShowChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 314 } 315 else { 316 if (settings.switchAdvanced) { 317 elements.introContainer.slideUp("fast"); 318 } 319 elements.typesContainer.slideDown("fast"); 320 } 321 322 isAdvanced = seenAdvanced = true; 323 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 324 elements.buttons.advanced.text(settings.unadvancedBtnLabel); 325 } 326 327 // Trigger advanced show event 328 body.trigger("gdpr:advanced"); 329 }; 330 var hideAdvanced = function() { 331 if ($.isFunction(settings.customHideChecks)) { 332 settings.customHideChecks.call(elements.typesContainer, elements.typesContainer, elements.introContainer); 333 } 334 else { 335 if (settings.switchAdvanced) { 336 elements.introContainer.slideDown("fast"); 337 } 338 elements.typesContainer.slideUp("fast"); 339 } 340 341 isAdvanced = false; 342 if (settings.allowUnadvanced && settings.unadvancedBtnLabel && settings.advancedBtnLabel !== settings.unadvancedBtnLabel) { 343 elements.buttons.advanced.text(settings.advancedBtnLabel); 344 } 345 346 // Trigger advanced show event 347 body.trigger("gdpr:unadvanced"); 348 }; 349 350 if (isAdvanced) { 351 if (settings.allowUnadvanced) { 352 hideAdvanced(); 353 } 354 } 355 else { 356 showAdvanced(); 357 } 358 }; 359 360 // Build cookie message to display later on 361 var cookieMessage = (elements.container = $("<div class='gdprcookie'>")).append([ 362 (elements.introContainer = $("<div class='gdprcookie-intro'>")).append([ 363 settings.title ? $("<h1/>", { text: settings.title }).get(0) : undefined, 364 settings.message ? $("<p/>", { html: settings.message }).get(0) : undefined, 365 settings.submessage ? $("<div/>", { html: settings.submessage }).get(0) : undefined 366 ]).get(0), 367 (elements.typesContainer = $("<div class='gdprcookie-types'>")).hide().append([ 368 settings.subtitle ? $("<h2/>", { text: settings.subtitle }).get(0) : undefined, 369 elements.types.get(0) 370 ]).get(0), 371 $("<div class='gdprcookie-buttons'>").append([ 372 (elements.buttons.accept = $("<button/>", { type: "button", text: settings.acceptBtnLabel, click: acceptClick })).get(0), 373 (elements.buttons.accept = $("<button/>", { type: "button", class: "acceptWhenCloseLGPD",text: settings.acceptBtnLabelWhenClose, click: acceptClick })).get(0), 374 (elements.buttons.advanced = $("<button/>", { type: "button", text: settings.advancedBtnLabel, click: advancedClick })).get(0) 375 ]).get(0) 376 ]); 377 378 var show = function() { 379 body.append(cookieMessage); 380 showing = true; 381 isAdvanced = seenAdvanced = false;
382 if ($.isFunction(settings.customShowMessage)) { 383 settings.customShowMessage.call(elements.container, elements.container); 384 } 385 else { 386 elements.container.hide().fadeIn("slow"); 387 } 388 389 // Trigger container show event 390 body.trigger("gdpr:show"); 391 }; 392 393 if (!settings.delay || alwaysShow) { 394 show(); 395 } 396 else { 397 window.setTimeout(show, settings.delay); 398 } 399 } 400 else { 401 hide(false); 402 } 403 }; 404 405 $.gdprcookie.display = function() { 406 display(true); 407 }; 408 409 // Method to check if user cookie preference exists 410 $.gdprcookie.preference = function(value) { 411 var preferences = getPreferences(); 412 413 if (value === "essential") { 414 return true; 415 } 416 else if (!preferences) { 417 return false; 418 } 419 else if (value !== undefined) { 420 return preferences.indexOf(value) >= 0; 421 } 422 return preferences; 423 }; 424 425 // Protection against malicious scripts, e.g. monkey patching 426 $.gdprcookie = Object.freeze($.gdprcookie); 427 428 }));
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.