window.targeting = (function(options) { var storageKey = "wc.trg", cookieKey = "cookieinfo", data = { keys: {} }; var persistent = false; function readStorage() { if (persistent) { var json = localStorage ? localStorage.getItem(storageKey) : null; if (json) { try { data = JSON.parse(json); if (!data.keys) { data = { keys: data }; } } catch (e) { } } } } function writeStorage() { if (persistent && localStorage) { localStorage.setItem(storageKey, JSON.stringify(data)); } } function getCookie(key) { var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)'); return keyValue ? keyValue[2] : null; } function setCookie(key, value) { document.cookie = key + "=" + value + "; path=/"; } function toArray(value) { return Array.isArray(value) ? value : [value]; } function isConsent(category) { var consent = getCookie("cookieConsent") if (consent) { try { categories = JSON.parse(decodeURIComponent(consent)); if (Array.isArray(categories)) { for (var i = 0, entry; entry = categories[i]; i++) { if (entry.name === category && entry.value === "on") { return true; } } } } catch (e) { } } return false; } function setPersistence() { if (options.persistent) { persistent = isConsent("marketing"); } if (localStorage && !persistent) { localStorage.removeItem(storageKey); } } function setDynatrace() { if (window.dtrum) { if (isConsent("statistik")) { window.dtrum.enable(); } else { window.dtrum.disable(); }; } } setPersistence(); setDynatrace(); var now = Date.now(); var cookie, values; readStorage(); var keys = data.keys; if (options) { for (var key in options.keys) { if (Object.prototype.hasOwnProperty.call(options.keys, key)) { keys[key] = options.keys[key]; } } } cookie = getCookie(cookieKey); if (cookie) { values = cookie.split("/"); if (values.length > 1) { keys.geschlecht = values[0]; keys.alter = values[1]; } } else { keys.geschlecht = keys.geschlecht || "0"; keys.alter = keys.alter || "0"; if (persistent) { setCookie(cookieKey, keys.geschlecht + "/" + keys.alter); } } keys.kunde = keys.geschlecht == "0" ? "0" : "1"; if (options && options.interests) { data.interests = data.interests || {}; for (var i = 0, tag; tag = options.interests[i]; i++) { if (data.interests[tag]) { data.interests[tag]++; } else { data.interests[tag] = 1; } } } writeStorage(); function isBetween(value, list) { return list.some(function(data) { var start = data[0]; var end = data[1]; return (end < start) ? !(value > end && value < start) : (value >= start && value <= end); }); } function checkTimes(times) { var result = true; var jetzt = new Date(); if (times.datum) { result = isBetween(now, times.datum); } if (result && times.tag) { result = isBetween(jetzt.getDay(), times.tag); } if (result && times.zeit) { var zeit = jetzt.getSeconds() + (60 * (jetzt.getMinutes() + (60 * jetzt.getHours()))); result = isBetween(zeit, times.zeit); } return result; } function checkList(jsb, property, checker) { var key, cached, values, match; var list = jsb[property]; for (key in list) { if (list.hasOwnProperty(key)) { cached = getProperty(property, key); if (cached != null) { values = toArray(list[key]); match = false; for (var i = 0; i < values.length; i++) { if (checker(values[i], cached)) { match = true; break; } } if (!match) { return false; } } else { return false; } } } return true; } function keyChecker(value, cached) { var values = toArray(cached); return values.indexOf(value) != -1; } function interestChecker(item, count) { switch (item.op) { case "<": return count < item.value case ">": return count > item.value case "<=": return count <= item.value case ">=": return count >= item.value case "==": return count == item.value } return false; } function kbvChecker(value, kbv) { return now < kbv.end && kbv.count <= kbv.max; } function getProperty(property, key) { return data[property] ? (data[property][key] || null) : null; } return { get: function(key) { return getProperty("keys", key); }, set: function(key, value) { data.keys[key] = value; if (persistent && localStorage) { localStorage.setItem(storageKey, JSON.stringify(data)); } }, add: function(key, value) { var current = data.keys[key]; if (current) { if (Array.isArray(current)) { if (current.indexOf(value) == -1) { current.push(value); } } else if (current != value) { data.keys[key] = [current, value]; } } else { data.keys[key] = value; } if (persistent && localStorage) { localStorage.setItem(storageKey, JSON.stringify(data)); } }, getInterest: function(key) { return getProperty("interests", key); }, isVisible: function(jsb) { var result = true; var kbv = null; if (jsb.keys) { if (jsb.keys.kbv) { jsb.kbv = {}; var kbvs = toArray(jsb.keys.kbv); for (var i = 0; i < kbvs.length; i++) { jsb.kbv[kbvs[i]] = true; } delete jsb.keys.kbv; } result = checkList(jsb, "keys", keyChecker); } if (result && jsb.interests) { result = checkList(jsb, "interests", interestChecker); } if (result && jsb.kbv) { result = checkList(jsb, "kbv", kbvChecker); } if (result && jsb.times) { result = checkTimes(jsb.times); } if (result && jsb.count) { var count = getProperty("count", jsb.count[0]); if (count) { result = count <= jsb.count[1]; } } return result == jsb.hide; }, setState: function(jsb, shown) { if (shown) { if (jsb.kbv) { parent.wckbvs = parent.wckbvs || {}; var update = []; for (var kbv in jsb.kbv) { if (!parent.wckbvs[kbv]) { parent.wckbvs[kbv] = true; update.push(kbv); } } if (update.length > 0) { readStorage(); if (data.kbv) { for (var i = 0; i < update.length; i++) { if (data.kbv[update[i]]) { data.kbv[update[i]].count++; } } writeStorage(); } } } if (jsb.count) { readStorage(); var key = jsb.count[0]; if (data.count) { data.count[key] = data.count[key] ? data.count[key] + 1 : 1; } else { data.count = {}; data.count[key] = 1; } writeStorage(); } } }, stateChanged: function(state) { setPersistence(); setDynatrace(); } }; }(window.ogr.targeting));