function CookieBlock(args) { var APP = {}, DOM = {}, LAW = {}, UTILS = {}, ERROR = {}, COOKIE = {}, INTERFACE = {}, ANALYTICS = {}, PARAMS = {}, REQUIRED = {}, args = args || {}, doc = document, win = window, bounce = 0, ms = 86400000, isDebug = false, cookieBlock = this; INTERFACE.values = { accept: 'cookie-accept', refuse: 'cookie-refuse', advice: 'cookie-compliant', }; ANALYTICS.values = { trackid: undefined, }; PARAMS.values = { cookie: 'ALLOW_COOKIES', host: win.location.hostname, browsing: args.browsing || true, scrolling: args.scrolling || false, days: args.days || 30, ignore: [], }; REQUIRED.files = [ '//cdnjs.cloudflare.com/ajax/libs/postscribe/2.0.8/postscribe.min.js' ]; REQUIRED.load = function() { var files = REQUIRED.files, create = DOM.create, append = DOM.append, target = doc.head, ele, i; for (i in files) { ele = create('script'); ele.type = 'text/javascript'; ele.src = files[i]; append(target, ele); } }; APP.init = function() { var addInterface = INTERFACE.add, setBrowsing = APP.browsing, setScrolling = APP.scrolling, setAnonymous = ANALYTICS.anonymous, params = PARAMS.values; addInterface(); setAnonymous(); setBrowsing(); setScrolling(); }; APP.browsing = function() { var acceptInterface = INTERFACE.accept, params = PARAMS.values, referrer = doc.referrer, href = win.location.href, ignore = params.ignore, host = params.host, i; if (!params.browsing) { return; } if (referrer.indexOf(host) == -1) { return; } for (i in ignore) { if (href.indexOf(ignore[i]) != -1) { return; } } acceptInterface(); }; APP.scrolling = function() { var params = PARAMS.values, addListener = UTILS.addListener, acceptInterface = INTERFACE.accept; if (!params.scrolling) { return; } addListener('scroll', win, acceptInterface); }; INTERFACE.add = function() { var getId = DOM.getId, show = UTILS.show, values = INTERFACE.values, accept = INTERFACE.accept, refuse = INTERFACE.refuse, addListener = UTILS.addListener, acceptBtn = getId(values.accept), refuseBtn = getId(values.refuse), adviceMsg = getId(values.advice); addListener('click', acceptBtn, accept); addListener('click', refuseBtn, refuse); show(adviceMsg); }; INTERFACE.remove = function() { var values = INTERFACE.values, getId = DOM.getId, hide = UTILS.hide, adviceMsg = getId(values.advice); hide(adviceMsg); }; INTERFACE.accept = function() { var params = PARAMS.values, setCookie = COOKIE.set, consentLaw = LAW.consent, acceptInterface = INTERFACE.accept, removeInterface = INTERFACE.remove, setIdentified = ANALYTICS.identified, removeListener = UTILS.removeListener; removeListener('scroll', win, acceptInterface); setCookie(params.cookie, 1); setIdentified(); removeInterface(); consentLaw(); }; INTERFACE.refuse = function() { var params = PARAMS.values, setCookie = COOKIE.set, removeInterface = INTERFACE.remove; setCookie(params.cookie, 0); removeInterface(); }; ANALYTICS.check = function() { var analytics = ANALYTICS.values, trackid = analytics.trackid; return typeof(ga) != 'undefined' && trackid != undefined; }; ANALYTICS.anonymous = function() { var analytics = ANALYTICS.values, checkAnalytics = ANALYTICS.check, trackid = analytics.trackid; if (!checkAnalytics()) { return; } ga('create', trackid, 'auto'); ga('set', 'displayFeaturesTask', null); ga('set', 'anonymizeIp', true); //ga('send', 'pageview', '/usuario-anonimo'); }; ANALYTICS.identified = function() { var checkAnalytics = ANALYTICS.check; if (!checkAnalytics()) { return; } ga('set', 'anonymizeIp', false); }; DOM.getId = function(str) { var exception = ERROR.exception, msg = "Element ID not found " + str; return doc.getElementById(str) || exception(msg); }; DOM.getClass = function(str) { return doc.getElementsByClassName(str); }; DOM.create = function(tag) { return doc.createElement(tag); }; DOM.append = function(target, ele) { target.appendChild(ele); }; DOM.remove = function(target) { target.parentElement.removeChild(target); }; DOM.getContent = function(ele) { return ele.textContent; }; DOM.replace = function(target) { var remove = DOM.remove, getContent = DOM.getContent, content = getContent(target), parent = target.parentNode; postscribe(parent, content); remove(target); }; LAW.consent = function() { var replace = DOM.replace, getClass = DOM.getClass, consentLaw = LAW.consent, debounce = UTILS.debounce, items = getClass('cookie-block'); if (typeof(postscribe) == 'undefined') { debounce(consentLaw); } else { while (items.length) { replace(items[0]); } } }; LAW.refuse = function() { var setAnonymous = ANALYTICS.anonymous, exception = ERROR.exception; setAnonymous(); exception("Cookies refused"); }; COOKIE.get = function(name) { var phrase = '(^| )' + name + '=([^;]+)', regexp = new RegExp(phrase), match = doc.cookie.match(regexp), result = undefined; if (match) { result = match[2]; } return result; }; COOKIE.set = function(name, val) { var params = PARAMS.values, format = COOKIE.format, date = new Date(), now = date.getTime(), total = params.days * ms, time = date.setTime(now + total), exp = date.toUTCString(), result = format(name, val, exp); doc.cookie = result; }; COOKIE.format = function(name, val, exp) { var params = PARAMS.value, result = []; result.push(name + '=' + val); result.push('expires=' + exp); result.push('path=/'); return result.join(';'); }; ERROR.exception = function(str) { throw str || 'Generic error'; }; UTILS.debounce = function(callback) { var trace = UTILS.trace; if (bounce < 1000) { bounce++; setTimeout(callback, 100); } else { trace("Connection timeout") } }; UTILS.show = function(ele) { ele.style.display = 'block'; }; UTILS.hide = function(ele) { ele.style.display = 'none'; }; UTILS.addListener = function(event, obj, callback) { var exception = ERROR.exception; if (obj.addEventListener) { obj.addEventListener(event, callback, false); } else { exception("Browser not suported"); } }; UTILS.removeListener = function(event, obj, callback) { var exception = ERROR.exception; if (obj.removeEventListener) { obj.removeEventListener(event, callback, false); } else { exception("Browser not suported"); } }; UTILS.trace = function() { var args = arguments, msg = []; for (var i = 0; i < args.length; i++) { msg.push(args[i]); } if (isDebug && win.console) { console.log(msg); } }; cookieBlock.setAnalytics = function(trackid) { var analytics = ANALYTICS.values; if (trackid) { analytics.trackid = trackid; } }; cookieBlock.setIgnore = function(ignore) { var params = PARAMS.values; if (ignore) { params.ignore = ignore; } }; cookieBlock.setInterface = function(obj) { var values = INTERFACE.values; if (obj.accept) { values.accept = obj.accept; } if (obj.refuse) { values.refuse = obj.refuse; } if (obj.advice) { values.advice = obj.advice; } }; cookieBlock.setDebug = function(boo) { isDebug = boo; } cookieBlock.init = function() { var initApp = APP.init, consentLaw = LAW.consent, refuseLaw = LAW.refuse, getCookie = COOKIE.get, params = PARAMS.values, exception = ERROR.exception, loadRequired = REQUIRED.load, cookie = getCookie(params.cookie), trace = UTILS.trace; try { if (cookie === undefined) { initApp(); } else if (cookie === '1') { consentLaw(); } else if (cookie === '0') { refuseLaw(); } else { exception("Initialize error"); } loadRequired(); } catch (err) { trace(err); } }; }