diff --git a/wp-content/plugins/eu-compliance/eu-compliance-banner.php b/wp-content/plugins/eu-compliance/eu-compliance-banner.php new file mode 100644 index 0000000000000000000000000000000000000000..18e252944b4d526d5dcb4685869e2d05ab991400 --- /dev/null +++ b/wp-content/plugins/eu-compliance/eu-compliance-banner.php @@ -0,0 +1,28 @@ +<?php +/* +* Plugin Name: Ai - Eu compliant banner +* Plugin URI: +* Description: AI - Cookie Banner +* Version: 1.0 +* Author: lechuck +* Author URI: http://noblogs.org +**/ + +/** + * Proper way to enqueue scripts and styles + */ +function load_banner() { + wp_enqueue_script( 'cookiebanner', plugins_url( '/js/cookiebanner.js' , __FILE__ ), array(), '1.0.0', true ); +} + +add_action( 'wp_enqueue_scripts', 'load_banner' ); + +add_filter( 'script_loader_tag', function ( $tag, $handle ) { + + if ( 'cookiebanner' !== $handle ) + return $tag; + $stringa = ' id="cookiebanner" data-moreinfo="https://noblogs.org/privacy" data-message="To comply to EU Privacy Laws we inform you that some of the third party services used on some of our blogs could use cookies" '; + + return str_replace( ' src', "$stringa src", $tag ); +}, 10, 2 ); + diff --git a/wp-content/plugins/eu-compliance/js/cookiebanner.js b/wp-content/plugins/eu-compliance/js/cookiebanner.js new file mode 100644 index 0000000000000000000000000000000000000000..41d3d73d95015baa8382d891d2aa70d1de70557f --- /dev/null +++ b/wp-content/plugins/eu-compliance/js/cookiebanner.js @@ -0,0 +1,455 @@ +/*global window:false, setTimeout:true, console:true */ + +(function(context) { + 'use strict'; + + var win = context, doc = win.document; + + var global_instance_name = 'cbinstance'; + + /*! + * contentloaded.js + * + * Author: Diego Perini (diego.perini at gmail.com) + * Summary: cross-browser wrapper for DOMContentLoaded + * Updated: 20101020 + * License: MIT + * Version: 1.2 + * + * URL: + * http://javascript.nwbox.com/ContentLoaded/ + * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE + * + */ + // @win window reference + // @fn function reference + function contentLoaded(win, fn) { + var done = false, top = true, + doc = win.document, root = doc.documentElement, + + add = doc.addEventListener ? 'addEventListener' : 'attachEvent', + rem = doc.addEventListener ? 'removeEventListener' : 'detachEvent', + pre = doc.addEventListener ? '' : 'on', + + init = function(e) { + if (e.type == 'readystatechange' && doc.readyState != 'complete') return; + (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false); + if (!done && (done = true)) fn.call(win, e.type || e); + }, + + poll = function() { + try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; } + init('poll'); + }; + + if (doc.readyState == 'complete') fn.call(win, 'lazy'); + else { + if (doc.createEventObject && root.doScroll) { + try { top = !win.frameElement; } catch(e) { } + if (top) poll(); + } + doc[add](pre + 'DOMContentLoaded', init, false); + doc[add](pre + 'readystatechange', init, false); + win[add](pre + 'load', init, false); + } + } + + var Cookies = { + get: function (key) { + return decodeURIComponent(doc.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')) || null; + }, + set: function (key, val, end, path, domain, secure) { + if (!key || /^(?:expires|max\-age|path|domain|secure)$/i.test(key)) { + return false; + } + var expires = ''; + if (end) { + switch (end.constructor) { + case Number: + expires = end === Infinity ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' : '; max-age=' + end; + break; + case String: + expires = '; expires=' + end; + break; + case Date: + expires = '; expires=' + end.toUTCString(); + break; + } + } + doc.cookie = encodeURIComponent(key) + '=' + encodeURIComponent(val) + expires + (domain ? '; domain=' + domain : '') + (path ? '; path=' + path : '') + (secure ? '; secure' : ''); + return true; + }, + has: function (key) { + return (new RegExp('(?:^|;\\s*)' + encodeURIComponent(key).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=')).test(doc.cookie); + }, + remove: function (key, path, domain) { + if (!key || !this.has(key)) { return false; } + doc.cookie = encodeURIComponent(key) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + ( domain ? '; domain=' + domain : '') + ( path ? '; path=' + path : ''); + return true; + } + }; + + var Utils = { + + // merge objects and whatnot + merge: function(){ + var obj = {}, + i = 0, + al = arguments.length, + key; + if (0 === al) { + return obj; + } + for (; i < al; i++) { + for (key in arguments[i]) { + if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { + obj[key] = arguments[i][key]; + } + } + } + return obj; + }, + + str2bool: function(str) { + str = '' + str; + switch (str.toLowerCase()) { + case 'false': + case 'no': + case '0': + case '': + return false; + default: + return true; + } + }, + + fade_in: function(el) { + if (el.style.opacity < 1) { + el.style.opacity = (parseFloat(el.style.opacity) + 0.05).toFixed(2); + win.setTimeout(function(){ + Utils.fade_in(el); + }, 50); + } + }, + + get_data_attribs: function(script) { + var data = {}; + if (Object.prototype.hasOwnProperty.call(script, 'dataset')) { + data = script.dataset; + } else { + var attribs = script.attributes; + var key; + for (key in attribs) { + if (Object.prototype.hasOwnProperty.call(attribs, key)) { + var attr = attribs[key]; + if (/^data-/.test(attr.name)) { + var camelized = Utils.camelize(attr.name.substr(5)); + data[camelized] = attr.value; + } + } + } + } + return data; + }, + + /** + * "Standardizes" the options keys by converting and removing + * any potential "dashed-property-name" into "dashedPropertyName". + * In case both are present, the dashedPropertyName wins. + */ + normalize_keys: function(options_object) { + var camelized = {}; + for (var key in options_object) { + if (Object.prototype.hasOwnProperty.call(options_object, key)) { + var camelized_key = Utils.camelize(key); + // TODO: could this break for "falsy" values within options_object? + // avoiding "dashed-property-name" overriding a potentially existing "dashedPropertyName" + camelized[camelized_key] = options_object[camelized_key] ? options_object[camelized_key] : options_object[key]; + } + } + return camelized; + }, + + camelize: function(str) { + var separator = '-', + match = str.indexOf(separator); + while (match != -1) { + var last = (match === (str.length - 1)), + next = last ? '' : str[match + 1], + upnext = next.toUpperCase(), + sep_substr = last ? separator : separator + next; + str = str.replace(sep_substr, upnext); + match = str.indexOf(separator); + } + return str; + }, + + find_script_by_id: function(id) { + var scripts = doc.getElementsByTagName('script'); + for (var i = 0, l = scripts.length; i < l; i++) { + if (id === scripts[i].id) { + return scripts[i]; + } + } + return null; + } + + }; + + var script_el_invoker = Utils.find_script_by_id('cookiebanner'); + + var Cookiebanner = context.Cookiebanner = function(opts) { + this.init(opts); + }; + + Cookiebanner.prototype = { + + // for testing stuff from the outside mostly + cookiejar: Cookies, + + init: function(opts) { + + this.inserted = false; + this.closed = false; + this.test_mode = false; // TODO: implement + + var default_text = 'We use cookies to enhance your experience. ' + + 'By continuing to visit this site you agree to our use of cookies.'; + var default_link = 'Learn more'; + + this.default_options = { + // autorun: true, + cookie: 'cookiebanner-accepted', + closeText: '✖', + cookiePath: '/', + debug: false, + expires: Infinity, + zindex: 255, + mask: false, + maskOpacity: 0.5, + maskBackground: '#000', + height: 'auto', + minHeight: '21px', + bg: '#000', + fg: '#ddd', + link: '#aaa', + position: 'bottom', + message: default_text, + linkmsg: default_link, + moreinfo: 'http://aboutcookies.org', + effect: null, + fontSize: '14px', + fontFamily: 'arial, sans-serif', + instance: global_instance_name, + textAlign: 'center' + }; + + this.options = this.default_options; + this.script_el = script_el_invoker; + + if (this.script_el) { + var data_options = Utils.get_data_attribs(this.script_el); + this.options = Utils.merge(this.options, data_options); + } + + // allowing opts passed to the ctor to override everything + if (opts) { + // mimics the "data-option-name" HTML attribute becoming + // this.options.optionName + opts = Utils.normalize_keys(opts); + this.options = Utils.merge(this.options, opts); + } + + // allows customizing the global instance name via options too + global_instance_name = this.options.instance; + + // TODO: parse/validate other options that can benefit + this.options.zindex = parseInt(this.options.zindex, 10); + this.options.mask = Utils.str2bool(this.options.mask); + + // check for a possible global callback specified as a string + if ('string' === typeof this.options.expires) { + if ('function' === typeof context[this.options.expires]) { + this.options.expires = context[this.options.expires]; + } + } + + // check if expires is a callback + if ('function' === typeof this.options.expires) { + // TODO: this might not always be as simple as this + this.options.expires = this.options.expires(); + } + + // Proceed with our plans only if we're invoked via a <script> element + // that has the required id attribute. + // For manually created instances one must call run() explicitly. + if (this.script_el) { + this.run(); + } + }, + + log: function(){ + if ('undefined' !== typeof console) { + console.log.apply(console, arguments); + } + }, + + run: function() { + if (!this.agreed()) { + var self = this; + contentLoaded(win, function(){ + self.insert(); + }); + } + }, + + build_viewport_mask: function() { + var mask = null; + if (true === this.options.mask) { + var mask_opacity = this.options.maskOpacity; + var bg = this.options.maskBackground; + var mask_markup = '<div id="cookiebanner-mask" style="' + + 'position:fixed;top:0;left:0;width:100%;height:100%;' + + 'background:' + bg + ';zoom:1;filter:alpha(opacity=' + + (mask_opacity * 100) +');opacity:' + mask_opacity +';' + + 'z-index:' + this.options.zindex +';"></div>'; + var el = doc.createElement('div'); + el.innerHTML = mask_markup; + mask = el.firstChild; + } + return mask; + }, + + agree: function() { + this.cookiejar.set(this.options.cookie, 1, this.options.expires, this.options.cookiePath); + return true; + }, + + agreed: function(){ + return this.cookiejar.has(this.options.cookie); + }, + + close: function() { + if (this.inserted) { + if (!this.closed) { + if (this.element) { + this.element.parentNode.removeChild(this.element); + } + if (this.element_mask) { + this.element_mask.parentNode.removeChild(this.element_mask); + } + this.closed = true; + } + }/* else { + throw new Error("Not inserted but closing?!"); + }*/ + return this.closed; + }, + + agree_and_close:function() { + this.agree(); + return this.close(); + }, + + // close and remove every trace of ourselves completely + cleanup: function() { + this.close(); + return this.unload(); + }, + + unload: function() { + if (this.script_el) { + this.script_el.parentNode.removeChild(this.script_el); + } + context[global_instance_name] = undefined; + // delete context[global_instance_name]; + return true; + }, + + insert: function() { + this.element_mask = this.build_viewport_mask(); + + var zidx = this.options.zindex; + + if (this.element_mask) { + // bump notice element's zindex so it's above the mask + zidx += 1; + } + + var el = doc.createElement('div'); + el.className = 'cookiebanner'; + el.style.position = 'fixed'; + el.style.left = 0; + el.style.right = 0; + el.style.height = this.options.height; + el.style.minHeight = this.options.minHeight; + el.style.zIndex = zidx; + el.style.background = this.options.bg; + el.style.color = this.options.fg; + el.style.lineHeight = el.style.minHeight; + + el.style.padding = '5px 16px'; + + el.style.fontFamily = this.options.fontFamily; + el.style.fontSize = this.options.fontSize; + el.style.textAlign = this.options.textAlign; + + if ('top' === this.options.position) { + el.style.top = 0; + } else { + el.style.bottom = 0; + } + + el.innerHTML = '<div class="cookiebanner-close" style="float:right;padding-left:5px;">' + + this.options.closeText + '</div>' + + '<span>' + this.options.message + ' <a>' + this.options.linkmsg + '</a></span>'; + + this.element = el; + + var el_a = el.getElementsByTagName('a')[0]; + el_a.href = this.options.moreinfo; + el_a.target = '_blank'; + el_a.style.textDecoration = 'none'; + el_a.style.color = this.options.link; + + var el_x = el.getElementsByTagName('div')[0]; + el_x.style.cursor = 'pointer'; + + function on(el, ev, fn) { + var add = el.addEventListener ? 'addEventListener' : 'attachEvent', + pre = el.addEventListener ? '' : 'on'; + el[add](pre + ev, fn, false); + } + + var self = this; + on(el_x, 'click', function(){ + self.agree_and_close(); + }); + + if (this.element_mask) { + on(this.element_mask, 'click', function(){ + self.agree_and_close(); + }); + doc.body.appendChild(this.element_mask); + } + + doc.body.appendChild(this.element); + this.inserted = true; + + if ('fade' === this.options.effect) { + this.element.style.opacity = 0; + Utils.fade_in(this.element); + } else { + this.element.style.opacity = 1; + } + } + + }; + + if (script_el_invoker) { + if (!context[global_instance_name]) { + context[global_instance_name] = new Cookiebanner(); + } + } + +})(window);