/** Main class */
window.CookieTool = function() {};
/** Utility functions */
CookieTool.Utils = {
/**
* Extend an object
* @param {Object} obj1
* @param {Object} obj2
* @return {Object} the merged object
*/
extend: function(obj1, obj2) {
var ret = obj1,
prop;
for (prop in obj2) {
if(obj2.hasOwnProperty(prop)) {
ret[prop] = obj2[prop];
}
}
return ret;
},
/**
* Load a script asynchronously
* @param {String} src the script src
* @param {Function} callback an optionall callback
*/
loadScript: (function() {
var firstjs = document.getElementsByTagName('script')[0];
return function(src, callback) {
var s = document.createElement('script'),
loaded;
s.async = true;
s.onload = s.onreadystatechange = function() {
if( ! loaded && (! s.readyState || s.readyState === 'complete' || s.readyState === 'loaded') ) {
loaded = true;
if( callback && typeof callback === 'function' ) {
callback.call(null, s);
}
}
};
s.src = src;
firstjs.parentNode.insertBefore(s, firstjs);
}
}())
}
CookieTool.Config = (function() {
var config = {
'position': 'top',
'message': 'En este sitio se usan cookies para ofrecer una experiencia más personalizada. Más información.
¿Nos consiente usar cookies?',
'link': '/cookies',
'agreetext': 'Sí',
'declinetext': 'No'
}
return {
get: function(key) {
return config[key];
},
set: function(key, val) {
if( typeof key === 'string' ) {
config[key] = val;
} else {
config = CookieTool.Utils.extend(config, key);
}
}
}
}());
/**
* Event API for customisation
*/
CookieTool.Event = (function() {
/** Where the callbacks are stored */
var events = {};
return {
/**
* Add an event listener
* @param {String} name the identifier
* @param {Function} callback
* @return undefined
*/
on: function(name, callback) {
if( events[name] === undefined ) {
events[name] = [];
}
if( typeof callback === 'function' ) {
events[name].push(callback);
}
},
/**
* Trigger all event listeners for an identifier
* @param {String} name the identifier
* @return undefined
*/
trigger: function(name) {
var cbs = events[name],
i = 0,
len;
if( ! cbs ) {
return;
}
len = cbs.length;
for (; i < len; i++) {
cbs[i]();
}
}
}
}());
/**
* Cookie functions
*/
CookieTool.Cookie = {
/**
* Get a cookie value
* @param {String} key
* @return {String} the value
*/
get: function(key) {
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
},
/**
* Set a cookie value
* @param {String} key
* @param {String} value
* @param {Number} days
* @param {String} domain
* @param {String} path
*/
set: function(key, value, days, domain, path) {
var cookie = key + "=" + encodeURIComponent(value),
date;
if (days) {
date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
cookie += "; expires="+date.toGMTString();
}
if ( domain ) {
cookie += "; domain=" + domain
}
if( ! path ) {
path = "/";
}
cookie += "; path=" + path;
document.cookie = cookie;
},
/**
* Delete a cookie
* @param {String} key
* @param {String} domain necessary for GA cookies
*/
remove: function(key, domain) {
CookieTool.Cookie.set(key,"",-1, domain);
}
}
/**
* Storage functions (HTML5 localStorage based) (permanent storage)
*/
if( window.localStorage ) {
CookieTool.Storage = {
/**
* Get a stored value
* @param {String} key
* @return {String} the value
*/
get: function(key) {
return window.localStorage.getItem(key);
},
/**
* Set a value
* @param {String} key
* @param {String} value
*/
set: function(key, value) {
return window.localStorage.setItem(key, value);
},
/**
* Delete a stored value
* @param {String} key
*/
remove: function(key) {
return window.localStorage.removeItem(key);
}
}
} else {
// Cookie based storage
CookieTool.Storage = CookieTool.Cookie;
}
/**
* Main API
*/
CookieTool.API = {
/**
* Some status codes
*/
statuses: {
'AGREE': '1',
'DECLINE': '0',
'UNDETERMINED': null
},
/**
* Set/get the current status of tracking
*/
status: function(value) {
if( value === undefined ) {
return CookieTool.Storage.get('ctstatus');
}
if( CookieTool.API.statuses[value] ) {
return CookieTool.Storage.set('ctstatus', CookieTool.API.statuses[value], 365);
}
return CookieTool.Storage.set('ctstatus', value, 365);
},
/**
* Ask for cookie consenting
*/
ask: function() {
var message,
status ;
// Already agreed
if( CookieTool.API.status() === CookieTool.API.statuses.AGREE ) {
return CookieTool.API.agree();
} else if( CookieTool.API.status() === CookieTool.API.statuses.DECLINE ) {
return CookieTool.API.decline();
}
message = document.createElement('div');
message.className = 'cookietool-message cookietool-message-' + CookieTool.Config.get('position');
// No overcomplications with event listeners
message.onclick = function(e) {
var e = e || window.event,
target = e.target || e.srcElement,
action = target.getAttribute('data-action');
if( action && CookieTool.API[action] ) {
CookieTool.API[action]();
if( e.preventDefault ) {
e.preventDefault();
} else {
e.returnValue = false;
}
message.parentNode.removeChild(message);
return false;
}
}
message.innerHTML = '
' + CookieTool.Config.get('message').replace(/\{\{link\}\}/g, CookieTool.Config.get('link')) + '
'; document.body.appendChild(message); }, /** * Assume implied agreement * Note that you'll need at least somewhere in your page a link with a decline option (eg: ) */ impliedAgreement: function() { var status = CookieTool.API.status(); switch(status) { case CookieTool.API.statuses.DECLINE: CookieTool.API.decline(); break; // case CookieTool.API.statuses.UNDETERMINED: // case CookieTool.API.statuses.AGREE: default: CookieTool.API.agree(); } }, displaySettings: function(container) { var status = CookieTool.API.status(); if( ! container ) { return; } container.className += ' cookietool-settings'; container.onclick = function(e) { var e = e || window.event, target = e.target || e.srcElement, action = target.getAttribute('data-action'); console.log(); if( action && CookieTool.API[action] ) { CookieTool.API[action](); CookieTool.API.displaySettings(container); if( e.preventDefault ) { e.preventDefault(); } else { e.returnValue = false; } return false; } } if( status === CookieTool.API.statuses.AGREE ) { container.innerHTML = 'Actualmente aceptas el uso de cookies en el sitio. Pulsa aquí para no permitir cookies'; } else if ( status === CookieTool.API.statuses.DECLINE ) { container.innerHTML = 'Actualmente no aceptas el uso de cookies en el sitio. Pulsa aquí para permitir cookies' } else { container.innerHTML = 'Aún no has establecido tu configuración. Haz click aquí si quieres aceptar el uso de cookies, o aquí si no.'; } }, /** * Agree */ agree: function() { CookieTool.API.status('AGREE'); CookieTool.Event.trigger('agree'); }, /** * Decline */ decline: function() { CookieTool.API.status('DECLINE'); CookieTool.Event.trigger('decline'); } } /** * Default id for settings, allows to put the script at the footer with no worries */ if( document.getElementById('cookietool-settings') ) { CookieTool.API.displaySettings(document.getElementById('cookietool-settings')); } /** * Default behaviour on agree: Load google analytics and adsense if present */ CookieTool.Event.on('agree', function() { if( window.adsbygoogle ) { CookieTool.Utils.loadScript('http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js'); } if( window._gaq ) { CookieTool.Utils.loadScript(('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'); } }); /** * Default behaviour on decline: Delete GA cookies */ CookieTool.Event.on('decline', function() { var cookiestodelete = ['__utma', '__utmb', '__utmc', '__utmz', '__utmv'], i = 0, len = cookiestodelete.length, domain = window.location.hostname; if( (/^www\./).test(domain) ) { domain = domain.substring(4); } for( ; i < len; i++) { CookieTool.Cookie.remove(cookiestodelete[i], domain); } });