Skip to content

Instantly share code, notes, and snippets.

@reatlat
Last active December 1, 2015 15:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reatlat/11a95aad202988b9213f to your computer and use it in GitHub Desktop.
Save reatlat/11a95aad202988b9213f to your computer and use it in GitHub Desktop.
!function(){if(!window.hasCookieConsent){window.hasCookieConsent=!0;var a="update_cookieconsent_options",b="cookieconsent_dismissed";if(!(document.cookie.indexOf(b)>-1||window.navigator&&window.navigator.CookiesOK)){"function"!=typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")});var c,d={isArray:function(a){var b=Object.prototype.toString.call(a);return"[object Array]"==b},isObject:function(a){return"[object Object]"==Object.prototype.toString.call(a)},each:function(a,b,c,e){if(d.isObject(a)&&!e)for(var f in a)a.hasOwnProperty(f)&&b.call(c,a[f],f,a);else for(var g=0,h=a.length;h>g;g++)b.call(c,a[g],g,a)},merge:function(a,b){a&&d.each(b,function(b,c){d.isObject(b)&&d.isObject(a[c])?d.merge(a[c],b):a[c]=b})},bind:function(a,b){return function(){return a.apply(b,arguments)}},queryObject:function(a,b){var c,d=0,e=a;for(b=b.split(".");(c=b[d++])&&e.hasOwnProperty(c)&&(e=e[c]);)if(d===b.length)return e;return null},setCookie:function(a,b,c,d,e){c=c||365;var f=new Date;f.setDate(f.getDate()+c);var g=[a+"="+b,"expires="+f.toUTCString(),"path="+e||"/"];d&&g.push("domain="+d),document.cookie=g.join(";")},addEventListener:function(a,b,c){a.addEventListener?a.addEventListener(b,c):a.attachEvent("on"+b,c)}},e=function(){var a="data-cc-event",b="data-cc-if",c=function(a,b,e){return d.isArray(b)?d.each(b,function(b){c(a,b,e)}):void(a.addEventListener?a.addEventListener(b,e):a.attachEvent("on"+b,e))},e=function(a,b){return a.replace(/\{\{(.*?)\}\}/g,function(a,c){for(var e,f,g=c.split("||");f=g.shift();){if(f=f.trim(),'"'===f[0])return f.slice(1,f.length-1);if(e=d.queryObject(b,f))return e}return""})},f=function(a){var b=document.createElement("div");return b.innerHTML=a,b.children[0]},g=function(a,b,c){var e=a.parentNode.querySelectorAll("["+b+"]");d.each(e,function(a){var d=a.getAttribute(b);c(a,d)},window,!0)},h=function(b,e){g(b,a,function(a,b){var f=b.split(":"),g=d.queryObject(e,f[1]);c(a,f[0],d.bind(g,e))})},i=function(a,c){g(a,b,function(a,b){var e=d.queryObject(c,b);e||a.parentNode.removeChild(a)})};return{build:function(a,b){d.isArray(a)&&(a=a.join("")),a=e(a,b);var c=f(a);return h(c,b),i(c,b),c}}}(),f={options:{message:"This website uses cookies to ensure you get the best experience on this website. ",dismiss:"Got it",learnMore:"More info",link:"../cookies.html",target:"_self",container:null,domain:null,path:"/",expiryDays:365,markup:['<div class="cc_banner-wrapper {{containerClasses}}">','<div class="cc_banner cc_container cc_container--open">','<p class="cc_message">{{options.message}} <a data-cc-if="options.link" target="{{ options.target }}" href="{{options.link || "#null"}}">{{options.learnMore}}</a>','<a href="#null" data-cc-event="click:dismiss" target="_blank">{{options.dismiss}}</a>',"</p></div>","</div>"]},init:function(){this.setContainer(),this.loadTheme(this.render)},setOptionsOnTheFly:function(a){this.setOptions(a),this.render()},setOptions:function(a){d.merge(this.options,a)},setContainer:function(){this.options.container?this.container=document.querySelector(this.options.container):this.container=document.body,this.containerClasses="",navigator.appVersion.indexOf("MSIE 8")>-1&&(this.containerClasses+=" cc_ie8")},loadTheme:function(a){var b=document.createElement("style");b.rel="stylesheet",b.type="text/css",b.textContent="@media print{.cc_banner-wrapper,.cc_container{display:none}}.cc_banner-wrapper{z-index:9001;position:relative;height:66px;font-family:roboto,Arial}.cc_container .cc_message{font-size:12px;margin:0;padding:0;line-height:1.5em;text-align:center}.cc_container{padding:15px;overflow:hidden;position:fixed;top:0;left:0;right:0;background:#222;color:#fff}.cc_container a,.cc_container a:visited{font-weight:700;text-transform:UPPERCASE;white-space:nowrap;color:#eee;margin-left:8px;padding:0 6px;text-decoration:none}.cc_container a:active,.cc_container a:hover{color:#fff}",document.getElementsByTagName("head")[0].appendChild(b);var c=!1;b.onload=d.bind(function(){!c&&a&&(a.call(this),c=!0)},this)},render:function(){this.element&&this.element.parentNode&&(this.element.parentNode.removeChild(this.element),delete this.element),this.element=e.build(this.options.markup,this),this.container.firstChild?this.container.insertBefore(this.element,this.container.firstChild):this.container.appendChild(this.element)},dismiss:function(a){a.preventDefault&&a.preventDefault(),a.returnValue=!1,this.setDismissedCookie(),this.container.removeChild(this.element)},setDismissedCookie:function(){d.setCookie(b,"yes",this.options.expiryDays,this.options.domain,this.options.path)}},g=!1;(c=function(){g||"complete"!=document.readyState||(f.init(),g=!0,window[a]=d.bind(f.setOptionsOnTheFly,f))})(),d.addEventListener(document,"readystatechange",c)}}}();
.cc_banner-wrapper {
z-index: 9001;
position: relative
}
.cc_container .cc_btn {
cursor: pointer;
text-align: center;
font-size: 0.6em;
transition: font-size 200ms;
line-height: 1em
}
.cc_container .cc_message {
font-size: 0.6em;
transition: font-size 200ms;
margin: 0;
padding: 0;
line-height: 1.5em;
text-align: center;
}
@media screen and (min-width: 500px) {
.cc_container .cc_btn {
font-size: 0.8em
}
.cc_container .cc_message {
font-size: 0.8em
}
}
@media screen and (min-width: 768px) {
.cc_container .cc_btn {
font-size: 1em
}
.cc_container .cc_message {
font-size: 1em;
line-height: 1em
}
}
@media screen and (min-width: 992px) {
.cc_container .cc_message {
font-size: 1em
}
}
@media print {
.cc_banner-wrapper,
.cc_container {
display: none
}
}
.cc_banner-wrapper {
height: 66px
}
.cc_container {
padding: 15px 15px 15px;
overflow: hidden;
position: fixed;
top: 0;
left: 0;
right: 0
}
.cc_container .cc_btn {
padding: 8px 10px;
background-color: #f1d600;
cursor: pointer;
text-align: center;
width: 33%;
margin-left: 10px;
max-width: 120px
}
.cc_container .cc_message {
display: block
}
@media screen and (min-width: 500px) {
.cc_container .cc_message {
margin-top: 0.5em
}
}
@media screen and (min-width: 768px) {
.cc_container {
padding: 15px 30px 15px
}
.cc_container .cc_btn {
padding: 8px 15px
}
}
.cc_container {
background: #222;
color: #fff;
font-size: 17px;
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial;
box-sizing: border-box
}
.cc_container::-moz-selection {
background: #ff5e99;
color: #fff;
text-shadow: none
}
.cc_container .cc_btn,
.cc_container .cc_btn:visited {
color: #000;
background-color: #f1d600;
transition: background 200ms ease-in-out, color 200ms ease-in-out, box-shadow 200ms ease-in-out;
-webkit-transition: background 200ms ease-in-out, color 200ms ease-in-out, box-shadow 200ms ease-in-out;
border-radius: 5px;
-webkit-border-radius: 5px
}
.cc_container .cc_btn:hover,
.cc_container .cc_btn:active {
background-color: #fff;
color: #000
}
.cc_container a,
.cc_container a:visited {
text-decoration: none;
color: #31a8f0;
transition: 200ms color
}
.cc_container a:hover,
.cc_container a:active {
color: #b2f7ff
}
@-webkit-keyframes slideDown {
0% {
margin-top: -66px
}
100% {
margin-top: 0
}
}
@keyframes slideDown {
0% {
margin-top: -66px
}
100% {
margin-top: 0px
}
}
@-webkit-keyframes growDown {
0% {
height: 0
}
100% {
height: 66px
}
}
@keyframes growDown {
0% {
height: 0
}
100% {
height: 66px
}
}
.cc_container {
-webkit-animation-duration: 0.8s;
-moz-animation-duration: 0.8s;
-o-animation-duration: 0.8s;
animation-duration: 0.8s;
-webkit-animation-name: slideDown;
animation-name: slideDown
}
.cc_banner-wrapper {
-webkit-animation-duration: 0.8s;
-moz-animation-duration: 0.8s;
-o-animation-duration: 0.8s;
animation-duration: 0.8s;
-webkit-animation-name: growDown;
animation-name: growDown
}
(function() {
// Stop from running again, if accidently included more than once.
if (window.hasCookieConsent) return;
window.hasCookieConsent = true;
// Change cookie consent options on the fly.
var OPTIONS_UPDATER = 'update_cookieconsent_options';
// Name of cookie to be set when dismissed
var DISMISSED_COOKIE = 'cookieconsent_dismissed';
// No point going further if they've already dismissed.
if (document.cookie.indexOf(DISMISSED_COOKIE) > -1 || (window.navigator && window.navigator.CookiesOK)) {
return;
}
// IE8...
if (typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
};
}
/*
Helper methods
*/
var Util = {
isArray: function(obj) {
var proto = Object.prototype.toString.call(obj);
return proto == '[object Array]';
},
isObject: function(obj) {
return Object.prototype.toString.call(obj) == '[object Object]';
},
each: function(arr, callback, /* optional: */ context, force) {
if (Util.isObject(arr) && !force) {
for (var key in arr) {
if (arr.hasOwnProperty(key)) {
callback.call(context, arr[key], key, arr);
}
}
} else {
for (var i = 0, ii = arr.length; i < ii; i++) {
callback.call(context, arr[i], i, arr);
}
}
},
merge: function(obj1, obj2) {
if (!obj1) return;
Util.each(obj2, function(val, key) {
if (Util.isObject(val) && Util.isObject(obj1[key])) {
Util.merge(obj1[key], val);
} else {
obj1[key] = val;
}
})
},
bind: function(func, context) {
return function() {
return func.apply(context, arguments);
};
},
/*
find a property based on a . separated path.
i.e. queryObject({details: {name: 'Adam'}}, 'details.name') // -> 'Adam'
returns null if not found
*/
queryObject: function(object, query) {
var queryPart;
var i = 0;
var head = object;
query = query.split('.');
while ((queryPart = query[i++]) && head.hasOwnProperty(queryPart) && (head = head[queryPart])) {
if (i === query.length) return head;
}
return null;
},
setCookie: function(name, value, expiryDays, domain, path) {
expiryDays = expiryDays || 365;
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiryDays);
var cookie = [
name + '=' + value,
'expires=' + exdate.toUTCString(),
'path=' + path || '/'
];
if (domain) {
cookie.push(
'domain=' + domain
);
}
document.cookie = cookie.join(';');
},
addEventListener: function(el, event, eventListener) {
if (el.addEventListener) {
el.addEventListener(event, eventListener);
} else {
el.attachEvent('on' + event, eventListener);
}
}
};
var DomBuilder = (function() {
/*
The attribute we store events in.
*/
var eventAttribute = 'data-cc-event';
var conditionAttribute = 'data-cc-if';
/*
Shim to make addEventListener work correctly with IE.
*/
var addEventListener = function(el, event, eventListener) {
// Add multiple event listeners at once if array is passed.
if (Util.isArray(event)) {
return Util.each(event, function(ev) {
addEventListener(el, ev, eventListener);
});
}
if (el.addEventListener) {
el.addEventListener(event, eventListener);
} else {
el.attachEvent('on' + event, eventListener);
}
};
/*
Replace {{variable.name}} with it's property on the scope
Also supports {{variable.name || another.name || 'string'}}
*/
var insertReplacements = function(htmlStr, scope) {
return htmlStr.replace(/\{\{(.*?)\}\}/g, function(_match, sub) {
var tokens = sub.split('||');
var value, token;
while (token = tokens.shift()) {
token = token.trim();
// If string
if (token[0] === '"') return token.slice(1, token.length - 1);
// If query matches
value = Util.queryObject(scope, token);
if (value) return value;
}
return '';
});
};
/*
Turn a string of html into DOM
*/
var buildDom = function(htmlStr) {
var container = document.createElement('div');
container.innerHTML = htmlStr;
return container.children[0];
};
var applyToElementsWithAttribute = function(dom, attribute, func) {
var els = dom.parentNode.querySelectorAll('[' + attribute + ']');
Util.each(els, function(element) {
var attributeVal = element.getAttribute(attribute);
func(element, attributeVal);
}, window, true);
};
/*
Parse event attributes in dom and set listeners to their matching scope methods
*/
var applyEvents = function(dom, scope) {
applyToElementsWithAttribute(dom, eventAttribute, function(element, attributeVal) {
var parts = attributeVal.split(':');
var listener = Util.queryObject(scope, parts[1]);
addEventListener(element, parts[0], Util.bind(listener, scope));
});
};
var applyConditionals = function(dom, scope) {
applyToElementsWithAttribute(dom, conditionAttribute, function(element, attributeVal) {
var value = Util.queryObject(scope, attributeVal);
if (!value) {
element.parentNode.removeChild(element);
}
});
};
return {
build: function(htmlStr, scope) {
if (Util.isArray(htmlStr)) htmlStr = htmlStr.join('');
htmlStr = insertReplacements(htmlStr, scope);
var dom = buildDom(htmlStr);
applyEvents(dom, scope);
applyConditionals(dom, scope);
return dom;
}
};
})();
/*
Plugin
*/
var cookieconsent = {
options: {
message: 'This website uses cookies to ensure you get the best experience on this website. ',
dismiss: 'Got it!',
learnMore: 'More info',
link: '../cookies.html',
target: '_self',
container: null, // selector
domain: null, // default to current domain.
path: '/',
expiryDays: 365,
markup: [
'<div class="cc_banner-wrapper {{containerClasses}}">',
'<div class="cc_banner cc_container cc_container--open">',
'<p class="cc_message">{{options.message}} <a data-cc-if="options.link" target="{{ options.target }}" class="cc_more_info" href="{{options.link || "#null"}}">{{options.learnMore}}</a>',
'<a href="#null" data-cc-event="click:dismiss" target="_blank" class="cc_btn cc_btn_accept_all">{{options.dismiss}}</a>',
'</p></div>',
'</div>'
]
},
init: function() {
this.setContainer();
this.loadTheme(this.render);
},
setOptionsOnTheFly: function(options) {
this.setOptions(options);
this.render();
},
setOptions: function(options) {
Util.merge(this.options, options);
},
setContainer: function() {
if (this.options.container) {
this.container = document.querySelector(this.options.container);
} else {
this.container = document.body;
}
// Add class to container classes so we can specify css for IE8 only.
this.containerClasses = '';
if (navigator.appVersion.indexOf('MSIE 8') > -1) {
this.containerClasses += ' cc_ie8'
}
},
loadTheme: function(callback) {
var request = new XMLHttpRequest();
request.open('GET', '../css/cookiechoices.css', true);
request.onload = function() {
sessionStorage.cookiechoices = request.responseText;
}, request.send();
var style = document.createElement('style');
style.rel = 'stylesheet';
style.type = 'text/css';
style.textContent = sessionStorage.cookiechoices;
var loaded = false;
style.onload = Util.bind(function() {
if (!loaded && callback) {
callback.call(this);
loaded = true;
}
}, this);
document.getElementsByTagName("head")[0].appendChild(style);
},
render: function() {
// remove current element (if we've already rendered)
if (this.element && this.element.parentNode) {
this.element.parentNode.removeChild(this.element);
delete this.element;
}
this.element = DomBuilder.build(this.options.markup, this);
if (!this.container.firstChild) {
this.container.appendChild(this.element);
} else {
this.container.insertBefore(this.element, this.container.firstChild);
}
},
dismiss: function(evt) {
evt.preventDefault && evt.preventDefault();
evt.returnValue = false;
this.setDismissedCookie();
this.container.removeChild(this.element);
},
setDismissedCookie: function() {
Util.setCookie(DISMISSED_COOKIE, 'yes', this.options.expiryDays, this.options.domain, this.options.path);
}
};
var init;
var initialized = false;
(init = function() {
if (!initialized && document.readyState == 'complete') {
cookieconsent.init();
initialized = true;
window[OPTIONS_UPDATER] = Util.bind(cookieconsent.setOptionsOnTheFly, cookieconsent);
}
})();
Util.addEventListener(document, 'readystatechange', init);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment