-
-
Save englehardt/db3ecea255ccd6aa2b0cb73ca76257d6 to your computer and use it in GitHub Desktop.
No boundaries: OnAudience script (http://api.behavioralengine.com/scripts/be-init.js)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var JSON; | |
if (!JSON) JSON = {}; | |
(function() { | |
function f(a) { | |
return a < 10 ? "0" + a : a | |
} | |
function quote(a) { | |
escapable.lastIndex = 0; | |
return escapable.test(a) ? '"' + a.replace(escapable, function(a) { | |
var b = meta[a]; | |
return typeof b === "string" ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) | |
}) + '"' : '"' + a + '"' | |
} | |
function str(a, b) { | |
var c, d, e, f, g = gap, | |
h, i = b[a]; | |
if (i && typeof i === "object" && typeof i.toJSON === "function") i = i.toJSON(a); | |
if (typeof rep === "function") i = rep.call(b, a, i); | |
switch (typeof i) { | |
case "string": | |
return quote(i); | |
case "number": | |
return isFinite(i) ? String(i) : "null"; | |
case "boolean": | |
case "null": | |
return String(i); | |
case "object": | |
if (!i) return "null"; | |
gap += indent; | |
h = []; | |
if (Object.prototype.toString.apply(i) === "[object Array]") { | |
f = i.length; | |
for (c = 0; c < f; c += 1) h[c] = str(c, i) || "null"; | |
e = h.length === 0 ? "[]" : gap ? "[\n" + gap + h.join(",\n" + gap) + "\n" + g + "]" : "[" + h.join(",") + "]"; | |
gap = g; | |
return e | |
}; | |
if (rep && typeof rep === "object") { | |
f = rep.length; | |
for (c = 0; c < f; c += 1) | |
if (typeof rep[c] === "string") { | |
d = rep[c]; | |
e = str(d, i); | |
if (e) h.push(quote(d) + (gap ? ": " : ":") + e) | |
} | |
} else | |
for (d in i) | |
if (Object.prototype.hasOwnProperty.call(i, d)) { | |
e = str(d, i); | |
if (e) h.push(quote(d) + (gap ? ": " : ":") + e) | |
}; | |
e = h.length === 0 ? "{}" : gap ? "{\n" + gap + h.join(",\n" + gap) + "\n" + g + "}" : "{" + h.join(",") + "}"; | |
gap = g; | |
return e | |
} | |
}; | |
"use strict"; | |
if (typeof Date.prototype.toJSON !== "function") { | |
Date.prototype.toJSON = function(a) { | |
return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null | |
}; | |
String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function(a) { | |
return this.valueOf() | |
} | |
}; | |
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | |
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, | |
gap, indent, meta = { | |
"\b": "\\b", | |
" ": "\\t", | |
"\n": "\\n", | |
"\f": "\\f", | |
"\r": "\\r", | |
'"': '\\"', | |
"\\": "\\\\" | |
}, | |
rep; | |
if (typeof JSON.stringify !== "function") JSON.stringify = function(a, b, c) { | |
var d; | |
gap = ""; | |
indent = ""; | |
if (typeof c === "number") { | |
for (d = 0; d < c; d += 1) indent += " " | |
} else if (typeof c === "string") indent = c; | |
rep = b; | |
if (b && typeof b !== "function" && (typeof b !== "object" || typeof b.length !== "number")) throw new Error("JSON.stringify"); | |
return str("", { | |
"": a | |
}) | |
}; | |
if (typeof JSON.parse !== "function") JSON.parse = function(text, reviver) { | |
function walk(a, b) { | |
var c, d, e = a[b]; | |
if (e && typeof e === "object") | |
for (c in e) | |
if (Object.prototype.hasOwnProperty.call(e, c)) { | |
d = walk(e, c); | |
if (d !== undefined) { | |
e[c] = d | |
} else delete e[c] | |
}; | |
return reviver.call(a, b, e) | |
}; | |
var j; | |
text = String(text); | |
cx.lastIndex = 0; | |
if (cx.test(text)) text = text.replace(cx, function(a) { | |
return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) | |
}); | |
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { | |
j = eval("(" + text + ")"); | |
return typeof reviver === "function" ? walk({ | |
"": j | |
}, "") : j | |
}; | |
throw new SyntaxError("JSON.parse") | |
} | |
})(); | |
var MD5 = function(string) { | |
function RotateLeft(lValue, iShiftBits) { | |
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) | |
} | |
function AddUnsigned(lX, lY) { | |
var lX4, lY4, lX8, lY8, lResult; | |
lX8 = (lX & 0x80000000); | |
lY8 = (lY & 0x80000000); | |
lX4 = (lX & 0x40000000); | |
lY4 = (lY & 0x40000000); | |
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); | |
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8); | |
if (lX4 | lY4) { | |
if (lResult & 0x40000000) { | |
return (lResult ^ 0xC0000000 ^ lX8 ^ lY8) | |
} else return (lResult ^ 0x40000000 ^ lX8 ^ lY8) | |
} else return (lResult ^ lX8 ^ lY8) | |
} | |
function F(x, y, z) { | |
return (x & y) | ((~x) & z) | |
} | |
function G(x, y, z) { | |
return (x & z) | (y & (~z)) | |
} | |
function H(x, y, z) { | |
return (x ^ y ^ z) | |
} | |
function I(x, y, z) { | |
return (y ^ (x | (~z))) | |
} | |
function FF(a, b, c, d, x, s, ac) { | |
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); | |
return AddUnsigned(RotateLeft(a, s), b) | |
} | |
function GG(a, b, c, d, x, s, ac) { | |
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); | |
return AddUnsigned(RotateLeft(a, s), b) | |
} | |
function HH(a, b, c, d, x, s, ac) { | |
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); | |
return AddUnsigned(RotateLeft(a, s), b) | |
} | |
function II(a, b, c, d, x, s, ac) { | |
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); | |
return AddUnsigned(RotateLeft(a, s), b) | |
} | |
function ConvertToWordArray(string) { | |
var lWordCount, lMessageLength = string.length, | |
lNumberOfWords_temp1 = lMessageLength + 8, | |
lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64, | |
lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16, | |
lWordArray = Array(lNumberOfWords - 1), | |
lBytePosition = 0, | |
lByteCount = 0; | |
while (lByteCount < lMessageLength) { | |
lWordCount = (lByteCount - (lByteCount % 4)) / 4; | |
lBytePosition = (lByteCount % 4) * 8; | |
lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); | |
lByteCount++ | |
}; | |
lWordCount = (lByteCount - (lByteCount % 4)) / 4; | |
lBytePosition = (lByteCount % 4) * 8; | |
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); | |
lWordArray[lNumberOfWords - 2] = lMessageLength << 3; | |
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; | |
return lWordArray | |
} | |
function WordToHex(lValue) { | |
var WordToHexValue = "", | |
WordToHexValue_temp = "", | |
lByte, lCount; | |
for (lCount = 0; lCount <= 3; lCount++) { | |
lByte = (lValue >>> (lCount * 8)) & 255; | |
WordToHexValue_temp = "0" + lByte.toString(16); | |
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2) | |
}; | |
return WordToHexValue | |
} | |
function Utf8Encode(string) { | |
string = string.replace(/\r\n/g, "\n"); | |
var utftext = ""; | |
for (var n = 0; n < string.length; n++) { | |
var c = string.charCodeAt(n); | |
if (c < 128) { | |
utftext += String.fromCharCode(c) | |
} else if ((c > 127) && (c < 2048)) { | |
utftext += String.fromCharCode((c >> 6) | 192); | |
utftext += String.fromCharCode((c & 63) | 128) | |
} else { | |
utftext += String.fromCharCode((c >> 12) | 224); | |
utftext += String.fromCharCode(((c >> 6) & 63) | 128); | |
utftext += String.fromCharCode((c & 63) | 128) | |
} | |
}; | |
return utftext | |
}; | |
var x = Array(), | |
k, AA, BB, CC, DD, a, b, c, d, S11 = 7, | |
S12 = 12, | |
S13 = 17, | |
S14 = 22, | |
S21 = 5, | |
S22 = 9, | |
S23 = 14, | |
S24 = 20, | |
S31 = 4, | |
S32 = 11, | |
S33 = 16, | |
S34 = 23, | |
S41 = 6, | |
S42 = 10, | |
S43 = 15, | |
S44 = 21; | |
string = Utf8Encode(string); | |
x = ConvertToWordArray(string); | |
a = 0x67452301; | |
b = 0xEFCDAB89; | |
c = 0x98BADCFE; | |
d = 0x10325476; | |
for (k = 0; k < x.length; k += 16) { | |
AA = a; | |
BB = b; | |
CC = c; | |
DD = d; | |
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); | |
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); | |
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB); | |
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); | |
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); | |
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); | |
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613); | |
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501); | |
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8); | |
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); | |
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); | |
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); | |
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122); | |
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193); | |
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E); | |
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821); | |
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); | |
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340); | |
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); | |
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); | |
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); | |
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453); | |
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); | |
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); | |
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); | |
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); | |
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); | |
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); | |
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); | |
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); | |
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); | |
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); | |
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); | |
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681); | |
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); | |
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); | |
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); | |
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); | |
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); | |
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); | |
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); | |
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); | |
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); | |
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05); | |
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); | |
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); | |
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); | |
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); | |
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244); | |
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97); | |
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); | |
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039); | |
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3); | |
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); | |
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); | |
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1); | |
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); | |
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); | |
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314); | |
b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); | |
a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82); | |
d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); | |
c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); | |
b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391); | |
a = AddUnsigned(a, AA); | |
b = AddUnsigned(b, BB); | |
c = AddUnsigned(c, CC); | |
d = AddUnsigned(d, DD) | |
}; | |
var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d); | |
return temp.toLowerCase() | |
}, | |
SHA1 = function(a) { | |
function b(a, b) { | |
var c = a << b | a >>> 32 - b; | |
return c | |
} | |
function c(a) { | |
var b = "", | |
c, d, e; | |
for (c = 0; c <= 6; c += 2) { | |
d = a >>> c * 4 + 4 & 15; | |
e = a >>> c * 4 & 15; | |
b += d.toString(16) + e.toString(16) | |
}; | |
return b | |
} | |
function d(a) { | |
var b = "", | |
c, d; | |
for (c = 7; c >= 0; c--) { | |
d = a >>> c * 4 & 15; | |
b += d.toString(16) | |
}; | |
return b | |
} | |
function e(a) { | |
a = a.replace(/\r\n/g, "\n"); | |
var b = ""; | |
for (var c = 0; c < a.length; c++) { | |
var d = a.charCodeAt(c); | |
if (d < 128) { | |
b += String.fromCharCode(d) | |
} else if (d > 127 && d < 2048) { | |
b += String.fromCharCode(d >> 6 | 192); | |
b += String.fromCharCode(d & 63 | 128) | |
} else { | |
b += String.fromCharCode(d >> 12 | 224); | |
b += String.fromCharCode(d >> 6 & 63 | 128); | |
b += String.fromCharCode(d & 63 | 128) | |
} | |
}; | |
return b | |
}; | |
var f, g, h, i = new Array(80), | |
j = 1732584193, | |
k = 4023233417, | |
l = 2562383102, | |
m = 271733878, | |
n = 3285377520, | |
o, p, q, r, s, t; | |
a = e(a); | |
var u = a.length, | |
v = new Array(); | |
for (g = 0; g < u - 3; g += 4) { | |
h = a.charCodeAt(g) << 24 | a.charCodeAt(g + 1) << 16 | a.charCodeAt(g + 2) << 8 | a.charCodeAt(g + 3); | |
v.push(h) | |
}; | |
switch (u % 4) { | |
case 0: | |
g = 2147483648; | |
break; | |
case 1: | |
g = a.charCodeAt(u - 1) << 24 | 8388608; | |
break; | |
case 2: | |
g = a.charCodeAt(u - 2) << 24 | a.charCodeAt(u - 1) << 16 | 32768; | |
break; | |
case 3: | |
g = a.charCodeAt(u - 3) << 24 | a.charCodeAt(u - 2) << 16 | a.charCodeAt(u - 1) << 8 | 128; | |
break | |
}; | |
v.push(g); | |
while (v.length % 16 != 14) v.push(0); | |
v.push(u >>> 29); | |
v.push(u << 3 & 4294967295); | |
for (f = 0; f < v.length; f += 16) { | |
for (g = 0; g < 16; g++) i[g] = v[f + g]; | |
for (g = 16; g <= 79; g++) i[g] = b(i[g - 3] ^ i[g - 8] ^ i[g - 14] ^ i[g - 16], 1); | |
o = j; | |
p = k; | |
q = l; | |
r = m; | |
s = n; | |
for (g = 0; g <= 19; g++) { | |
t = b(o, 5) + (p & q | ~p & r) + s + i[g] + 1518500249 & 4294967295; | |
s = r; | |
r = q; | |
q = b(p, 30); | |
p = o; | |
o = t | |
}; | |
for (g = 20; g <= 39; g++) { | |
t = b(o, 5) + (p ^ q ^ r) + s + i[g] + 1859775393 & 4294967295; | |
s = r; | |
r = q; | |
q = b(p, 30); | |
p = o; | |
o = t | |
}; | |
for (g = 40; g <= 59; g++) { | |
t = b(o, 5) + (p & q | p & r | q & r) + s + i[g] + 2400959708 & 4294967295; | |
s = r; | |
r = q; | |
q = b(p, 30); | |
p = o; | |
o = t | |
}; | |
for (g = 60; g <= 79; g++) { | |
t = b(o, 5) + (p ^ q ^ r) + s + i[g] + 3395469782 & 4294967295; | |
s = r; | |
r = q; | |
q = b(p, 30); | |
p = o; | |
o = t | |
}; | |
j = j + o & 4294967295; | |
k = k + p & 4294967295; | |
l = l + q & 4294967295; | |
m = m + r & 4294967295; | |
n = n + s & 4294967295 | |
}; | |
var t = d(j) + d(k) + d(l) + d(m) + d(n); | |
return t.toLowerCase() | |
}; | |
if (typeof BUtilities === 'undefined') BUtilities = { | |
serverPath: '//api.behavioralengine.com/', | |
getCookie: function(cookieName) { | |
var i, name, value, cookies = document.cookie.split(';'); | |
for (var i = 0; i < cookies.length; i++) { | |
name = cookies[i].substr(0, cookies[i].indexOf('=')); | |
value = cookies[i].substr(cookies[i].indexOf('=') + 1); | |
name = name.replace(/^\s+|\s+$/g, ''); | |
if (name === cookieName) return unescape(value) | |
} | |
}, | |
setCookie: function(name, value, exdays) { | |
var exdate = new Date(); | |
exdate.setDate(exdate.getDate() + exdays); | |
var cookieValue = escape(value) + ((exdays === null) ? '' : ';path=/; expires=' + exdate.toUTCString()); | |
document.cookie = name + '=' + cookieValue | |
}, | |
prepareGet: function(params) { | |
if (typeof params === 'undefined') return ''; | |
var get = []; | |
for (var param in params) get.push(param + '=' + params[param]); | |
if (get.length > 0) return '?' + get.join('&'); | |
return '' | |
}, | |
sendRequest: function(action, params, callback) { | |
BCallbackManager.setCallback(action, callback); | |
var url = BUtilities.serverPath + action + '/'; | |
if (typeof params === 'undefined') params = {}; | |
params.v = '3.0'; | |
BUtilities.getScript(url, params) | |
}, | |
sendApiRequest: function(action, params, callback) { | |
BCallbackManager.setCallback(action, callback); | |
var url = BUtilities.serverPath + 'api/' + action + '/'; | |
if (typeof params === 'undefined') params = {}; | |
params.v = '3.0'; | |
BUtilities.getScript(url, params) | |
}, | |
sendPostRequest: function(action, getParams, postParams, callback) { | |
BCallbackManager.setCallback(action, callback); | |
BUtilities.sendPost(BUtilities.serverPath + action + BUtilities.prepareGet(getParams), postParams, function() { | |
BCallbackManager.callback(action, {}) | |
}) | |
}, | |
sendPost: function(target, params, callback) { | |
var transactionHash = BUtilities.generateHash('' + Math.random()), | |
iframe = document.createElement('iframe'); | |
document.getElementsByTagName('body')[0].appendChild(iframe); | |
iframe.contentWindow.name = transactionHash; | |
iframe.style.display = 'none'; | |
iframe.onload = function() { | |
if (typeof callback === 'function') callback(); | |
window.setTimeout(function() { | |
if (typeof iframe.parentNode !== 'undefined' && iframe.parentNode !== null) iframe.parentNode.removeChild(iframe); | |
if (typeof form.parentNode !== 'undefined' && form.parentNode !== null) form.parentNode.removeChild(form) | |
}, 500) | |
}; | |
var form = document.createElement('form'); | |
form.target = transactionHash; | |
form.action = target; | |
form.method = 'POST'; | |
var inputs = []; | |
for (var name in params) { | |
var input = document.createElement('input'); | |
input.type = 'hidden'; | |
input.name = name; | |
input.value = params[name]; | |
form.appendChild(input); | |
inputs.push(input) | |
}; | |
document.getElementsByTagName('body')[0].appendChild(form); | |
form.submit() | |
}, | |
sendScriptRequest: function(name, action, callback) { | |
BCallbackManager.setCallback(name, callback); | |
BUtilities.getScript(BUtilities.serverPath + action) | |
}, | |
generateHash: function(string) { | |
return window.SHA1(string) | |
}, | |
newThread: function(toRun) { | |
setTimeout(function() { | |
try { | |
toRun() | |
} catch (exc) {} | |
}, 1) | |
}, | |
getScript: function(url, getParams, scriptParams) { | |
var trigger = false, | |
crossInit = document.createElement('script'); | |
crossInit.setAttribute('type', 'text/javascript'); | |
crossInit.setAttribute('src', url + BUtilities.prepareGet(getParams)); | |
if (typeof scriptParams !== 'undefined') | |
for (var currentParam in scriptParams) crossInit.setAttribute('data-' + currentParam, params[currentParam]); | |
if (typeof document.head !== 'undefined') { | |
document.head.appendChild(crossInit) | |
} else document.getElementsByTagName('head')[0].appendChild(crossInit); | |
crossInit.onload = function() { | |
if (typeof this.parentNode !== 'undefined' && this.parentNode !== null) { | |
trigger = true; | |
this.parentNode.removeChild(this) | |
} | |
}; | |
if (trigger === false) crossInit.onreadystatechange = function() { | |
if (this.readyState === 'loaded' && typeof this.parentNode !== 'undefined') this.parentNode.removeChild(this) | |
} | |
}, | |
getNumericHash: function(plain) { | |
var hash = 0, | |
i, char; | |
plain = plain + ""; | |
if (plain.length === 0) return hash; | |
for (i = 0, l = plain.length; i < l; i++) { | |
char = plain.charCodeAt(i); | |
hash = ((hash << 5) - hash) + char; | |
hash |= 0 | |
}; | |
return hash | |
}, | |
isNumber: function(value) { | |
return !isNaN(parseFloat(value)) && isFinite(value) | |
} | |
} | |
function BAdblockChecker(target) { | |
var self = this; | |
this.cause = function() { | |
function loadAdblockCauses(globalConf) { | |
var container = createAdblockCauses(globalConf.causesConf); | |
return function(key) { | |
return container[key] | |
} | |
} | |
function createAdblockCauses(causesConf) { | |
var container = {}; | |
for (var i = 0; i < causesConf.length; ++i) container[causesConf[i].key] = causesConf[i].value; | |
return container | |
} | |
function createInstanceLoader(instance) { | |
return function() { | |
return instance | |
} | |
} | |
function load() { | |
var instance = loadAdblockCauses(self.globals()); | |
self.cause = createInstanceLoader(instance); | |
return instance | |
}; | |
return load() | |
}; | |
this.globals = function() { | |
var Internals = null | |
function init() { | |
Internals = self.Internals(); | |
return globalData() | |
} | |
function getHttpHeaders() { | |
return { | |
contentType: Internals.CONTENT_TYPE, | |
contentLength: Internals.CONTENT_LENGTH | |
} | |
} | |
function getMimeTypes() { | |
return { | |
form: Internals.FORM_WWW | |
} | |
} | |
function getHttpConf() { | |
return { | |
post: Internals.POST, | |
get: Internals.GET, | |
headersContainer: getHttpHeaders(), | |
mimeTypes: getMimeTypes(), | |
keyValueSeparator: Internals.KEY_VALUE_SEPARATOR, | |
querySeparator: Internals.QUERY_SEPARATOR, | |
queryMarker: Internals.QUERY_MARKER | |
} | |
} | |
function getLoggerConf() { | |
return { | |
success: Internals.ADBLOCK_SUCCESS, | |
error: Internals.ADBLOCK_ERR | |
} | |
} | |
function loadCausesConf() { | |
return [{ | |
key: Internals.AJAXFAIL_CODE, | |
value: Internals.AJAXFAIL_MESSAGE | |
}, { | |
key: Internals.IMAGEFAIL_CODE, | |
value: Internals.IMAGEFAIL_MESSAGE | |
}, { | |
key: Internals.IMAGEHIDDEN_CODE, | |
value: Internals.IMAGEHIDDEN_MESSAGE | |
}, { | |
key: Internals.NOADBLOCK_CODE, | |
value: Internals.NOADBLOCK_MESSAGE | |
}] | |
} | |
function causesCodes() { | |
return { | |
AJAX: Internals.AJAXFAIL_CODE, | |
IMAGE_ERR: Internals.IMAGEFAIL_CODE, | |
IMAGE_EMPTY: Internals.IMAGEHIDDEN_CODE, | |
NO_ADBLOCK: Internals.NOADBLOCK_CODE | |
} | |
} | |
function globalData() { | |
return { | |
domain: Internals.AD_DOMAIN, | |
imageDest: Internals.IMAGE_DEST, | |
imageDestWidth: Internals.IMAGE_DEST_WIDTH, | |
responseType: Internals.ARRAYBUFFER, | |
showMode: Internals.NONE, | |
causesConf: loadCausesConf(), | |
codes: causesCodes(), | |
logger: self.logger(getLoggerConf()), | |
http: self.http(getHttpConf()) | |
} | |
} | |
function createInstanceLoader(instance) { | |
return function() { | |
return instance | |
} | |
} | |
function loadGlobals() { | |
var instance = init(); | |
self.globals = createInstanceLoader(instance); | |
return instance | |
}; | |
return loadGlobals() | |
}; | |
this.handler = function() { | |
function createResponseHandler(conf, cause) { | |
return { | |
response: { | |
type: conf.responseType, | |
onstart: function() {}, | |
handle: function() {} | |
}, | |
cause: cause | |
} | |
} | |
function createHandler(conf) { | |
var logger = conf.logger(), | |
ajax = conf.http(), | |
responseHandler = createResponseHandler(conf, self.cause()); | |
return new Handler(ajax, logger, responseHandler) | |
} | |
function Handler(ajax, logger, responseHandler) { | |
var userConf = null; | |
this.success = function(code) { | |
var dmp; | |
for (var i = 0; i < userConf.length; i++) { | |
dmp = userConf[i]; | |
new Image().src = this.getUrl(dmp, code) | |
} | |
}; | |
this.getUrl = function(dmp, code) { | |
var params = this.buildParams(dmp.keys, dmp.codes[code]), | |
url = dmp.url; | |
if (params.length > 0) url += '?' + params.join('&'); | |
return url | |
}; | |
this.buildParams = function(keys, params) { | |
var urlParams = []; | |
for (var i = 0; i < keys.length; i++) | |
if (params[keys[i]]) urlParams.push(keys[i] + "=" + params[keys[i]]); | |
return urlParams | |
}; | |
this.loadUserConf = function(confData) { | |
userConf = confData | |
}; | |
this.ping = function(dest, parameters) { | |
ajax.get(dest, parameters, responseHandler.response) | |
} | |
} | |
function createInstanceLoader(instance) { | |
return function() { | |
return instance | |
} | |
} | |
function load() { | |
var instance = createHandler(self.globals()); | |
self.handler = createInstanceLoader(instance); | |
return instance | |
}; | |
return load() | |
}; | |
this.http = function(conf) { | |
var instance = null | |
function Http(headersContainer, mimeTypes) { | |
function setHeaders(xhr, headers) { | |
for (var i = 0; i < headers.length; ++i) xhr.setRequestHeader(headers[i].name, headers[i].content) | |
} | |
function sendRequest(request) { | |
setHeaders(request.xhr, request.headers); | |
request.xhr.send(request.data) | |
} | |
function createRequest(response) { | |
var request = null; | |
if (window.XMLHttpRequest) { | |
request = new XMLHttpRequest() | |
} else request = new ActiveXObject(); | |
return prepareResponseHandler(request, response) | |
} | |
function makeRequest(dest, method, response) { | |
var xhr = createRequest(response); | |
xhr.open(method, dest, true); | |
return xhr | |
} | |
function buildQueryElement(key, value) { | |
return [key, value].join(conf.keyValueSeparator) | |
} | |
function buildQuery(parameters) { | |
var queryElements = []; | |
for (var key in parameters) queryElements.push(buildQueryElement(key, parameters[key])); | |
return queryElements.join(conf.querySeparator) | |
} | |
function getMimeType(xhr) { | |
return xhr.getResponseHeader(headersContainer.contentType) | |
} | |
function onStartHandler(xhr, response) { | |
xhr.responseType = response.type; | |
response.onstart() | |
} | |
function handleResponse(xhr, response) { | |
switch (xhr.readyState) { | |
case 1: | |
onStartHandler(xhr, response); | |
break; | |
case 2: | |
break; | |
case 3: | |
break; | |
case 4: | |
response.handle(xhr.status, xhr.response, getMimeType(xhr)); | |
break; | |
default: | |
break | |
} | |
} | |
function createResponseHandler(xhr, response) { | |
return function() { | |
handleResponse(xhr, response) | |
} | |
} | |
function prepareResponseHandler(xhr, response) { | |
xhr.onreadystatechange = createResponseHandler(xhr, response); | |
return xhr | |
} | |
function getPostHeaders(length) { | |
return [{ | |
name: headersContainer.contentType, | |
content: mimeTypes.form | |
}, { | |
name: headersContainer.contentLength, | |
content: length | |
}] | |
} | |
function getDestination(dest, parameters) { | |
if (Object.keys(parameters).length > 0) { | |
var query = buildQuery(parameters); | |
dest += conf.queryMarker + query | |
}; | |
return dest | |
}; | |
this.get = function(dest, parameters, response) { | |
dest = getDestination(dest, parameters); | |
var request = { | |
xhr: makeRequest(dest, conf.get, response), | |
headers: [], | |
data: null | |
}; | |
sendRequest(request) | |
}; | |
this.post = function(dest, parameters, response) { | |
var query = buildQuery(parameters), | |
request = { | |
xhr: makeRequest(dest, conf.post, response), | |
headers: getPostHeaders(query.length), | |
data: query | |
}; | |
sendRequest(request) | |
} | |
} | |
function getInstance() { | |
if (instance == null) instance = new Http(conf.headersContainer, conf.mimeTypes); | |
return instance | |
}; | |
return getInstance | |
}; | |
this.Internals = function() { | |
var internals = { | |
AD_DOMAIN: "http://ced.sascdn.com", | |
IMAGE_DEST: "http://hit.behavioralengine.com/advertisement/ad.png", | |
IMAGE_DEST_WIDTH: 100, | |
KEY_VALUE_SEPARATOR: '=', | |
POST: "POST", | |
GET: "GET", | |
QUERY_SEPARATOR: '&', | |
QUERY_MARKER: '?', | |
CONTENT_TYPE: "Content-Type", | |
CONTENT_LENGTH: "Content-Length", | |
FORM_WWW: "application/x-www-form-urlencoded", | |
ADBLOCK_SUCCESS: "Adblock due to ", | |
ADBLOCK_ERR: "No adblock", | |
ARRAYBUFFER: "arraybuffer", | |
NONE: 'none', | |
AJAXFAIL_CODE: 1, | |
IMAGEFAIL_CODE: 2, | |
IMAGEHIDDEN_CODE: 3, | |
NOADBLOCK_CODE: 4, | |
AJAXFAIL_MESSAGE: "XmlHttpRequest failed (Adblock Plus in Gecko)", | |
IMAGEFAIL_MESSAGE: "image loading failed (Adblock Plus in Webkit)", | |
IMAGEHIDDEN_MESSAGE: "hiding loaded resource (old version of Adblock)", | |
NOADBLOCK_MESSAGE: "no adblock or adblock disabled" | |
} | |
function loadInternals(internals) { | |
return function() { | |
return internals | |
} | |
} | |
function load() { | |
self.Internals = loadInternals(internals); | |
return internals | |
}; | |
return load() | |
}; | |
this.logger = function(conf) { | |
var instance = null | |
function Logger() { | |
function format(cause) { | |
return conf.success + cause | |
}; | |
this.success = function(cause) { | |
console.log(format(cause)) | |
}; | |
this.error = function() { | |
console.log(conf.error) | |
} | |
} | |
function getInstance() { | |
if (instance == null) instance = new Logger(); | |
return instance | |
}; | |
return getInstance | |
}; | |
this.adblockCheck = function(target) { | |
var handler = null, | |
conf = null, | |
codes = null | |
function init() { | |
handler = self.handler(); | |
conf = self.globals(); | |
handler.loadUserConf(prepareUserConf(conf.userConf)); | |
codes = conf.codes | |
} | |
function prepareUserConf(clientConf) { | |
return BehavioralEngine.getBAdblockCheckerUserConf() | |
} | |
function ajaxCheck() { | |
var result = false; | |
try { | |
handler.ping(conf.domain, {}); | |
result = true | |
} catch (err) {}; | |
return result | |
} | |
function imageCheck() { | |
var image = createTestImage(); | |
image.onload = createImageLoadHandler(); | |
image.onerror = createImageErrorHandler(); | |
image.src = conf.imageDest | |
} | |
function createTestImage() { | |
var image = new Image(); | |
image.style.display = conf.showMode; | |
image.width = conf.imageDestWidth; | |
target.appendChild(image); | |
return image | |
} | |
function check() { | |
if (!ajaxCheck()) { | |
handler.success(codes.AJAX) | |
} else imageCheck() | |
} | |
function checkBlocked(image) { | |
return (image.width == 0) | |
} | |
function createImageLoadHandler() { | |
return function() { | |
var isBlocked = checkBlocked(this); | |
target.removeChild(this); | |
if (isBlocked) { | |
handler.success(codes.IMAGE_EMPTY) | |
} else handler.success(codes.NO_ADBLOCK) | |
} | |
} | |
function createImageErrorHandler() { | |
return function() { | |
target.removeChild(this); | |
handler.success(codes.IMAGE_ERR) | |
} | |
} | |
function run() { | |
init(); | |
check() | |
}; | |
run() | |
}; | |
this.adblockCheck(target) | |
}; | |
if (typeof BEvent === 'undefined') { | |
var BEvent = function BEvent(name, callbacks, enabled) { | |
this.name = (typeof name === 'undefined' ? '' : name); | |
this.callbacks = (typeof callbacks === 'undefined' ? [] : callbacks); | |
this.enabled = (typeof enabled === 'undefined' ? true : enabled) | |
}; | |
BEvent.prototype = { | |
name: '', | |
callbacks: [], | |
enabled: true, | |
call: function(self, params) { | |
var result = true; | |
for (var i = 0; i < self.callbacks.length; i++) { | |
var callback = self.callbacks[i]; | |
if (typeof callback === 'function') result &= callback(params) | |
}; | |
return result | |
}, | |
addCallback: function(self, callback) { | |
self.callbacks.push(callback) | |
} | |
} | |
}; | |
if (typeof BEventManager === 'undefined') { | |
var BEventManager = function() {}; | |
BEventManager.prototype = { | |
events: {}, | |
registerEvent: function(self, event) { | |
self.events[event.name] = event | |
}, | |
disableEvent: function(self, name) { | |
self.events[name].enabled = false | |
}, | |
callEvent: function(self, name, params) { | |
var event = self.events[name]; | |
return event.call(event, params) | |
}, | |
addCallbackToEvent: function(self, name, callback) { | |
var event = self.events[name]; | |
event.addCallback(event, callback) | |
} | |
} | |
}; | |
if (typeof BCallbackManager === 'undefined') var BCallbackManager = { | |
callbacks: {}, | |
callback: function(name, data) { | |
if (typeof BCallbackManager.callbacks[name] === 'function') BCallbackManager.callbacks[name](data) | |
}, | |
setCallback: function(name, callback) { | |
BCallbackManager.callbacks[name] = callback | |
} | |
}; | |
if (typeof BBlock === 'undefined') { | |
var BBlock = function(reference, weight, instant, seenBeginning, seenEnding) { | |
this.reference = (typeof reference === 'undefined' ? null : reference); | |
this.weight = (typeof weight === 'undefined' ? null : weight); | |
this.instant = (typeof instant === 'undefined' ? false : instant); | |
this.seenBeginning = (typeof seenBeginning === 'undefined' ? false : seenBeginning); | |
this.seenEnding = (typeof seenEnding === 'undefined' ? false : seenEnding) | |
}; | |
BBlock.prototype = { | |
reference: null, | |
weight: null, | |
instant: false, | |
seenBeginning: false, | |
seenEnding: false | |
} | |
}; | |
if (typeof BDebug === 'undefined') var BDebug = { | |
isDebugEnabled: false, | |
data: [], | |
init: function() { | |
BDebug.log('BDebug initiated'); | |
if (BUtilities.getCookie('debug') == 1) BDebug.isDebugEnabled = true | |
}, | |
log: function(param) { | |
BDebug.data.push(param) | |
}, | |
print: function() { | |
var data = BDebug.data; | |
for (var i = 0; i < data.length; i++) console.log(data[i]) | |
} | |
}; | |
if (typeof BProfiler === 'undefined') BProfiler = { | |
map: {}, | |
startTest: function(name) { | |
var item = { | |
name: name, | |
start: new Date().getTime(), | |
end: null, | |
diff: 0 | |
}; | |
BProfiler.map[name] = item.start; | |
BProfiler.saveItem(item.start, item, true) | |
}, | |
endTest: function(name) { | |
var k = BProfiler.map[name]; | |
if (typeof k === 'undefined') return false; | |
var item = BProfiler.getItem(k); | |
if (!item) return false; | |
item.end = new Date().getTime(); | |
item.diff = item.end - item.start; | |
BProfiler.saveItem(k, item) | |
}, | |
saveItem: function(key, value, isInsert) { | |
if (typeof localStorage === 'undefined') return false; | |
if (typeof localStorage.BProfiler === 'undefined') localStorage.BProfiler = '{"items":0}'; | |
var storage = JSON.parse(localStorage.BProfiler); | |
if (!storage) return; | |
if (typeof isInsert !== 'undefined' && isInsert === true) storage.items++; | |
storage[key] = value; | |
localStorage.BProfiler = JSON.stringify(storage) | |
}, | |
getItem: function(key) { | |
if (typeof localStorage === 'undefined') return null; | |
if (typeof localStorage.BProfiler === 'undefined') return null; | |
var storage = JSON.parse(localStorage.BProfiler); | |
if (!storage) return null; | |
return storage[key] | |
}, | |
sendItems: function() { | |
if (typeof localStorage === 'undefined') return false; | |
if (typeof localStorage.BProfiler === 'undefined') return false; | |
var storage = JSON.parse(localStorage.BProfiler); | |
if (!storage) return false; | |
if (storage.items > 20) { | |
if (Math.floor(Math.random() * 100) === 1) BUtilities.sendPostRequest('profiler/saveRequestStats', {}, { | |
data: localStorage.BProfiler | |
}); | |
localStorage.BProfiler = '{"items":0}' | |
} | |
}, | |
showStats: function() { | |
var storage = JSON.parse(localStorage.BProfiler); | |
for (var i in storage) console.log(i, storage[i]) | |
} | |
}; | |
if (typeof BAnalitic === 'undefined') { | |
var BAnalitic = function() {}; | |
BAnalitic.prototype = { | |
behavioralEngine: null, | |
browserData: null, | |
data: { | |
emailHahs: null, | |
gender: null, | |
FBIdHash: null | |
}, | |
flags: { | |
browserDataReady: false, | |
FBDataReady: false | |
}, | |
checkBlockTimeOut: null, | |
emailRegexp: /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, | |
onCreate: function(self, behavioralEngine) { | |
self.behavioralEngine = behavioralEngine; | |
var eventManager = self.behavioralEngine.eventManager; | |
eventManager.registerEvent(eventManager, new BEvent('callbackCheckBlockRequest', [function() { | |
self.setBlockFlag(self, false) | |
}])) | |
}, | |
onStart: function(self) { | |
self.generateBrowserData(self); | |
self.fetchFBData(self); | |
self.checkBlock(self); | |
self.checkPrivacy(self); | |
self.checkId(self); | |
self.checkInputId(self) | |
}, | |
generateBrowserData: function(self) { | |
var date = new Date(); | |
self.browserData = { | |
datetime: date.toString(), | |
navigator: { | |
bro: window.navigator.appCodeName, | |
osa: window.navigator.platform, | |
osv: window.navigator.appVersion | |
}, | |
screen: { | |
wid: window.screen.width, | |
hei: window.screen.height | |
}, | |
language: { | |
lan: window.navigator.language, | |
lanie: window.navigator.userLanguage | |
}, | |
location: encodeURIComponent(window.location.href), | |
referrer: document.referrer, | |
signature: self.getSignature(self) | |
}; | |
self.browserDataReady = true | |
}, | |
getBrowserData: function(self) { | |
return self.browserData | |
}, | |
isBrowserDataSet: function(self) { | |
return self.browserDataReady | |
}, | |
getSignature: function(self) { | |
var date = new Date(), | |
signature = ',' + self.getBrowserPlugins() + ',' + self.getMimeTypes() + ',' + window.navigator.appCodeName + ',' + window.navigator.appVersion + ',' + window.navigator.userAgent + ',' + window.navigator.appName + ',' + window.navigator.platform + ',' + window.navigator.cookieEnabled + ',' + window.navigator.onLine + ',' + window.navigator.product + ',' + window.navigator.buildID + ',' + window.navigator.oscpu + ',' + window.navigator.language + ',' + window.navigator.userLanguage + ',' + window.navigator.javaEnabled() + ',' + window.screen.width + ',' + window.screen.height + ',' + window.screen.colorDepth + ',' + window.screen.pixelDepth + ',' + date.getTimezoneOffset(); | |
return BUtilities.generateHash(signature) | |
}, | |
getBrowserPlugins: function(self) { | |
var BrowserPluginsString = '', | |
browserPlugins = window.navigator.plugins, | |
browserPluginLength = browserPlugins.length; | |
for (var j = 0; j < browserPluginLength; j++) BrowserPluginsString += browserPlugins[j].name + ','; | |
return BrowserPluginsString | |
}, | |
getMimeTypes: function(self) { | |
var MimeTypesString = '', | |
browserMimeTypes = window.navigator.mimeTypes, | |
browserMimeTypesLength = browserMimeTypes.length; | |
for (var i = 0; i < browserMimeTypesLength; i++) MimeTypesString += browserMimeTypes[i].type + ','; | |
return MimeTypesString | |
}, | |
fetchFBData: function(self) { | |
if (typeof FB !== 'undefined') self.sendFBApiRequest('gender, age_range, email', function(result) { | |
if (typeof result.error === 'undefined') { | |
self.data['data-hash-e'] = MD5(result.email); | |
self.data['data-hash-f'] = MD5(result.id); | |
self.data['data-attribute-s'] = self.parseGender(self, result.gender); | |
self.flags.FBDataReady = true; | |
self.behavioralEngine.flags.demographyData = true | |
} else self.sendFBApiRequest('gender, age_range', function(result) { | |
if (typeof result.error === 'undefined') { | |
self.data['data-hash-f'] = MD5(result.id); | |
self.data['data-attribute-s'] = self.parseGender(self, result.gender); | |
self.flags.FBDataReady = true; | |
self.behavioralEngine.flags.demographyData = true | |
} | |
}) | |
}) | |
}, | |
sendFBApiRequest: function(fields, callback) { | |
try { | |
FB.api('/me', 'get', { | |
fields: fields | |
}, function(result) { | |
callback(result) | |
}) | |
} catch (e) {} | |
}, | |
parseGender: function(self, gender) { | |
switch (gender) { | |
case 'male': | |
return 'm'; | |
case 'female': | |
return 'f'; | |
default: | |
return '' | |
} | |
}, | |
isFBDataReady: function(self) { | |
return self.flags.FBDataReady | |
}, | |
getFBData: function(self) { | |
return self.data | |
}, | |
checkBlock: function(self) { | |
self.checkBlockTimeOut = window.setTimeout(function() { | |
self.setBlockFlag(self, true) | |
}, 1e3); | |
BUtilities.getScript('//cdn.behavioralengine.com/scripts/btest/advertisement.js') | |
}, | |
setBlockFlag: function(self, block) { | |
window.clearTimeout(self.checkBlockTimeOut); | |
if (block) { | |
self.behavioralEngine.flags.miscSet = true; | |
self.behavioralEngine.data.misc.ab = 1 | |
} | |
}, | |
checkPrivacy: function(self) { | |
var userAgent = window.navigator.userAgent; | |
if (window.webkitRequestFileSystem) { | |
window.webkitRequestFileSystem(window.TEMPORARY, 1, function() { | |
self.setPrivacy(self, false) | |
}, function(e) { | |
self.setPrivacy(self, true) | |
}) | |
} else if (window.indexedDB && /Firefox/.test(userAgent)) { | |
var request; | |
try { | |
request = window.indexedDB.open('btest') | |
} catch (e) { | |
self.setPrivacy(self, true); | |
return | |
}; | |
request.onerror = function(event) { | |
self.setPrivacy(self, true) | |
}; | |
request.onsuccess = function() { | |
self.setPrivacy(self, false) | |
} | |
} else if (self.isIe(self, userAgent)) { | |
self.setPrivacy(self, false) | |
} else if (window.localStorage && /Safari/.test(userAgent)) self.setPrivacy(self, false) | |
}, | |
setPrivacy: function(self, private) { | |
if (private) { | |
self.behavioralEngine.flags.miscSet = true; | |
self.behavioralEngine.data.misc.inc = 1 | |
} | |
}, | |
isIe: function(self, userAgent) { | |
userAgent = userAgent.toLowerCase(); | |
if (userAgent.indexOf('msie') < 0 && userAgent.indexOf('trident') < 0) return false; | |
var match = /(?:msie|rv:)\s?([\d\.]+)/.exec(userAgent); | |
return (match && parseInt(match[1], 10) >= 10) | |
}, | |
checkId: function(self) { | |
var container = document.createElement('div'); | |
container.id = 'be-container'; | |
container.style.display = 'none'; | |
var form = document.createElement('form'); | |
form.attributes.autocomplete = 'on'; | |
var emailInput = document.createElement('input'); | |
emailInput.attributes.vcard_name = 'vCard.Email'; | |
emailInput.id = 'email'; | |
emailInput.type = 'email'; | |
emailInput.name = 'email'; | |
form.appendChild(emailInput); | |
var passwordInput = document.createElement('input'); | |
passwordInput.id = 'password'; | |
passwordInput.type = 'password'; | |
passwordInput.name = 'password'; | |
form.appendChild(passwordInput); | |
container.appendChild(form); | |
document.body.appendChild(container); | |
window.setTimeout(function() { | |
if (self.emailRegexp.test(emailInput.value)) self.sendHash(self, MD5(emailInput.value)); | |
document.body.removeChild(container) | |
}, 1e3) | |
}, | |
checkInputId: function(self) { | |
var inputs = document.getElementsByTagName('input'); | |
for (var i = 0; i < inputs.length; i++) { | |
inputs[i].addEventListener('blur', BehavioralEngine.analitic.inputIdBlurHandle, false); | |
if (self.emailRegexp.test(inputs[i].value)) self.sendHash(self, MD5(inputs[i].value)) | |
} | |
}, | |
inputIdBlurHandle: function() { | |
var self = BehavioralEngine.analitic; | |
if (self.emailRegexp.test(this.value)) { | |
self.sendHash(self, MD5(this.value)); | |
this.removeEventListener('blur', BehavioralEngine.analitic.inputIdBlurHandle, false) | |
} | |
}, | |
sendHash: function(self, hash) { | |
new Image().src = 'http://api.behavioralengine.com/pixel?data-hash-e=' + hash + '&data-p=be_input' | |
} | |
} | |
}; | |
if (typeof BSemantic === 'undefined') { | |
var BSemantic = function() {}; | |
BSemantic.prototype = { | |
behavioralEngine: null, | |
allowedBlockTypes: [{ | |
tag: 'td', | |
weight: 1, | |
instant: false | |
}, { | |
tag: 'div', | |
weight: 1, | |
instant: false | |
}, { | |
tag: 'p', | |
weight: 1, | |
instant: false | |
}, { | |
tag: 'span', | |
weight: 1, | |
instant: false | |
}, { | |
weight: 1.5, | |
tag: 'strong', | |
instant: true | |
}, { | |
weight: 1.4, | |
tag: 'em', | |
instant: true | |
}, { | |
weight: 1.4, | |
tag: 'i', | |
instant: true | |
}, { | |
weight: 1.5, | |
tag: 'b', | |
instant: true | |
}, { | |
weight: 1.2, | |
tag: 'blockquote', | |
instant: true | |
}, { | |
weight: 3, | |
tag: 'caption', | |
instant: true | |
}, { | |
weight: 1.2, | |
tag: 'q', | |
instant: true | |
}, { | |
weight: 1.3, | |
tag: 'th', | |
instant: true | |
}, { | |
weight: 1.2, | |
tag: 'cite', | |
instant: true | |
}, { | |
weight: 5, | |
tag: 'h1', | |
instant: true | |
}, { | |
weight: 2.5, | |
tag: 'h2', | |
instant: true | |
}, { | |
weight: 2, | |
tag: 'h3', | |
instant: true | |
}, { | |
weight: 6, | |
tag: 'title', | |
instant: true | |
}, { | |
weight: 3, | |
tag: 'meta', | |
instant: true | |
}], | |
blocks: [], | |
viewPort: {}, | |
words: [], | |
scrollMaxDiff: 100, | |
minimumDisplacementLimit: 1, | |
ready: false, | |
seenWordsCount: 0, | |
onCreate: function(self, behavioralEngine) { | |
self.behavioralEngine = behavioralEngine | |
}, | |
onStart: function(self) { | |
self.updateViewPort(self); | |
self.gatherAllBlocks(self); | |
self.setScrollWatcher(self); | |
self.pushInstantBlocks(self); | |
self.ready = true | |
}, | |
gatherAllBlocks: function(self) { | |
for (i = 0; i < self.allowedBlockTypes.length; i++) { | |
var htmlTags = self.findHtmlTagsByType(self, self.allowedBlockTypes[i]); | |
for (j = 0; j < htmlTags.length; j++) self.blocks.push(new BBlock(htmlTags[j], self.allowedBlockTypes[i].weight, self.allowedBlockTypes[i].instant)) | |
} | |
}, | |
pushInstantBlocks: function(self) { | |
var toDelete = []; | |
for (i = 0; i < self.blocks.length; i++) | |
if (self.blocks[i].instant) { | |
self.pushBlock(self, self.blocks[i]); | |
toDelete.push(self.blocks[i]) | |
}; | |
self.removeBlocks(self, toDelete) | |
}, | |
pushBlock: function(self, block) { | |
self.words = self.words.concat(self.getWordsFromBlock(self, block)) | |
}, | |
removeBlocks: function(self, blocks) { | |
for (var i = 0; i < blocks.length; i++) self.blocks.splice(self.blocks.indexOf(blocks[i]), 1) | |
}, | |
popWords: function(self) { | |
var words = self.words; | |
self.seenWordsCount += words.length; | |
self.words = []; | |
return words | |
}, | |
getSeenWordsCount: function(self) { | |
return self.seenWordsCount | |
}, | |
getWordsCount: function(self) { | |
return self.words.length | |
}, | |
getWordsFromBlock: function(self, block) { | |
var text = '', | |
nodeName = block.reference.nodeName.toLowerCase(), | |
allowedShortWords = { | |
cv: 1 | |
}; | |
switch (nodeName) { | |
case 'meta': | |
text = self.getTextFromMeta(self, block); | |
break; | |
default: | |
text = self.getTextFromBlockWithTextNodes(self, block) | |
}; | |
if (text.length < 3) return []; | |
text = text.toLowerCase(); | |
text = text.replace(/[.,\?!\:\t\n\r\[\]\{\}\%\^\!\_\-\'\"\(\)/„”]/g, ' '); | |
text = text.replace(/&[a-z0-9#]+;/gi, ''); | |
text = text.replace(/\s+/gi, ' '); | |
text = text.replace(/^\s+|\s+$/g, ''); | |
var words = text.split(' '), | |
wordsArray = []; | |
for (var i = 0; i < words.length; i++) { | |
if (BUtilities.isNumber(words[i])) continue; | |
if (words[i].length < 3 && allowedShortWords[words[i]] !== 1) continue; | |
wordsArray.push({ | |
w: words[i], | |
s: block.weight | |
}) | |
}; | |
return wordsArray | |
}, | |
getTextFromMeta: function(self, block) { | |
if (block.reference.name.toLowerCase() !== 'description') return ''; | |
return block.reference.content | |
}, | |
getTextFromBlockWithTextNodes: function(self, block) { | |
var text = '', | |
childNodes = block.reference.childNodes; | |
for (var i = 0; i < childNodes.length; i++) | |
if (childNodes[i].nodeType === 3) | |
if (typeof childNodes[i].textContent !== 'undefined') { | |
text += ' ' + childNodes[i].textContent | |
} else text += ' ' + childNodes[i].innerText; | |
return text | |
}, | |
findHtmlTagsByType: function(self, type) { | |
return document.getElementsByTagName(type.tag) | |
}, | |
setScrollWatcher: function(self) { | |
if (window.addEventListener) { | |
window.addEventListener('scroll', self.scrollEvent, false) | |
} else if (window.attachEvent) { | |
window.attachEvent('onscroll', self.scrollEvent) | |
} else if (typeof document.onscroll === 'function') { | |
document.onscroll = self.scrollEvent | |
} else { | |
var onScrollChain = document.onscroll; | |
document.onscroll = function() { | |
self.scrollEvent; | |
onScrollChain() | |
} | |
} | |
}, | |
scrollEvent: function() { | |
var self = BehavioralEngine.semantic; | |
if (Math.abs(self.viewPort.top - self.getScrollY()) > self.scrollMaxDiff) { | |
self.readWordsFromBlocksInViewPort(self) | |
} else if (self.getScrollY() + window.innerHeight === self.getDocumentHeight()) { | |
self.readWordsFromBlocksInViewPort(self) | |
} else if (self.getScrollY() === 0) self.readWordsFromBlocksInViewPort(self) | |
}, | |
getScrollY: function() { | |
return Math.max(document.documentElement.scrollTop, document.getElementsByTagName('body')[0].scrollTop) | |
}, | |
getDocumentHeight: function() { | |
return Math.max(document.getElementsByTagName('body')[0].scrollHeight, document.documentElement.scrollHeight, document.getElementsByTagName('body')[0].offsetHeight, document.documentElement.offsetHeight, document.getElementsByTagName('body')[0].clientHeight, document.documentElement.clientHeight) | |
}, | |
updateViewPort: function(self) { | |
self.viewPort = { | |
top: self.getScrollY(), | |
bottom: self.getScrollY() + window.innerHeight | |
} | |
}, | |
readWordsFromBlocksInViewPort: function(self) { | |
self.updateViewPort(self); | |
self.pushVisibleBlocks(self); | |
self.behavioralEngine.eventManager.callEvent(self.behavioralEngine.eventManager, 'insertProbe') | |
}, | |
isBlockVisible: function(self, block) { | |
var top = block.reference.offsetTop, | |
bottom = block.reference.offsetTop + block.reference.scrollHeight * self.minimumDisplacementLimit; | |
if (self.viewPort.top <= top && top <= self.viewPort.bottom) block.seenBeginning = true; | |
if (self.viewPort.top <= bottom && bottom <= self.viewPort.bottom) block.seenEnding = true; | |
if (block.seenBeginning && block.seenEnding) return true; | |
return false | |
}, | |
pushVisibleBlocks: function(self) { | |
var toDelete = []; | |
for (i = 0; i < self.blocks.length; i++) | |
if (self.isBlockVisible(self, self.blocks[i])) { | |
self.pushBlock(self, self.blocks[i]); | |
toDelete.push(self.blocks[i]) | |
}; | |
self.removeBlocks(self, toDelete) | |
} | |
} | |
}; | |
if (typeof BTagger === 'undefined') { | |
var BTagger = function() {}; | |
BTagger.prototype = { | |
flags: { | |
retargetingDataRequestDone: false, | |
tagUserRequestDone: false, | |
getCookieRequestDone: false | |
}, | |
behavioralEngine: null, | |
tags: null, | |
tagsToDelete: null, | |
retargetingData: null, | |
pixelsToDisplay: [], | |
onCreate: function(self, behavioralEngine) { | |
behavioralEngine.eventManager.addCallbackToEvent(behavioralEngine.eventManager, 'callbackTagUserRequest', function(data) { | |
self.tagUserRequestCallbackHandler(self, data) | |
}); | |
behavioralEngine.eventManager.addCallbackToEvent(behavioralEngine.eventManager, 'callbackRetargetingDataRequest', function(data) { | |
self.retargetingDataRequestCallbackHandler(self, data) | |
}); | |
behavioralEngine.eventManager.addCallbackToEvent(behavioralEngine.eventManager, 'callbackGetCookieRequest', function(data) { | |
self.getCookieRequestCallbackHandler(self, data) | |
}); | |
self.behavioralEngine = behavioralEngine | |
}, | |
onStart: function(self) {}, | |
tagUserRequestCallbackHandler: function(self, data) { | |
self.setTagUserData(self, data); | |
self.flags.tagUserRequestDone = true; | |
self.startTagging(self, data) | |
}, | |
retargetingDataRequestCallbackHandler: function(self, data) { | |
self.setRetargetingDataData(self, data); | |
self.flags.retargetingDataRequestDone = true; | |
self.startTagging(self) | |
}, | |
getCookieRequestCallbackHandler: function(self) { | |
if (!self.behavioralEngine.flags.optOut) { | |
self.flags.getCookieRequestDone = true; | |
self.startTagging(self) | |
} | |
}, | |
setTagUserData: function(self, data) { | |
self.tags = data.tags; | |
self.tagsToDelete = data.tagsToDelete; | |
self.businessclick = data.businessclick; | |
self.retargetingLinks = data.retargetingLinks; | |
self.cookieMatchingUrls = data.cookieMatchingUrls | |
}, | |
setRetargetingDataData: function(self, data) { | |
self.retargetingData = data | |
}, | |
getSimplyList: function(self, tags) { | |
var list = []; | |
for (var i = 0; i < tags.length; i++) list.push(tags[i].name); | |
return list | |
}, | |
startTagging: function(self) { | |
if (!self.flags.tagUserRequestDone || !self.flags.retargetingDataRequestDone || !self.flags.getCookieRequestDone) return false; | |
self.runTargetingTagging(self); | |
self.runCustomTagger(self) | |
}, | |
runTargetingTagging: function(self) { | |
for (var i = 0; i < self.retargetingData.targeting.length; i++) { | |
var campaign = self.retargetingData.targeting[i]; | |
if (!self.checkPartner(self, campaign)) continue; | |
self.checkCampaign(self, campaign) | |
}; | |
self.displayPixels(self) | |
}, | |
runFlagsTagger: function(self) {}, | |
runCustomTagger: function(self) { | |
for (var i = 0; i < self.retargetingData.custom.length; i++) { | |
if (!self.checkPartner(self, self.retargetingData.custom[i])) continue; | |
if (typeof self.retargetingData.custom[i].code === 'function') self.retargetingData.custom[i].code(self) | |
} | |
}, | |
checkPartner: function(self, item) { | |
var partner = self.behavioralEngine.data.partner; | |
if (item.allow.indexOf('*') < 0) | |
if (item.allow.indexOf(partner) < 0) return false; | |
if (item.deny.indexOf(partner) > -1) return false; | |
return true | |
}, | |
checkCampaign: function(self, campaign) { | |
for (var i = 0; i < campaign.targets.length; i++) self.checkCampaignTarget(self, campaign.targets[i]) | |
}, | |
checkCampaignTarget: function(self, target) { | |
if (self.isUserATarget(self, self.tags, target)) | |
for (var i = 0; i < target.pixels.length; i++) | |
if (typeof target.pixels[i] === 'string' && (target.pixels[i].substr(0, 4) === 'http' || target.pixels[i].substr(0, 2) === '//')) self.pixelsToDisplay.push(target.pixels[i]) | |
}, | |
displayPixels: function(self) { | |
if (self.pixelsToDisplay.length > 7) { | |
for (var i = 0; i < 7; i++) { | |
var index = Math.round(Math.random() * 1e6) % self.pixelsToDisplay.length; | |
new Image().src = self.pixelsToDisplay[index]; | |
self.pixelsToDisplay.splice(index, 1) | |
} | |
} else | |
for (var i = 0; i < self.pixelsToDisplay.length; i++) new Image().src = self.pixelsToDisplay[i] | |
}, | |
isUserATarget: function(self, tags, target) { | |
var interestTopics = self.getSimplyList(self, tags.groups), | |
interestTags = self.getSimplyList(self, tags.tags), | |
intentionTopics = self.getSimplyList(self, tags.intentionTopics), | |
intentionTags = self.getSimplyList(self, tags.intentionTags), | |
demographics = tags.demographics, | |
flags = tags.flags; | |
return self.isElementFromArrayContainInArray(self, interestTopics, target.interestGroups) && self.isElementFromArrayContainInArray(self, interestTags, target.interestWords) && self.isElementFromArrayContainInArray(self, intentionTopics, target.intentionGroups) && self.isElementFromArrayContainInArray(self, intentionTags, target.intentionWords) && self.checkDemographics(self, demographics, target.demographics) && self.checkFlags(self, flags, target.flags) | |
}, | |
isElementFromArrayContainInArray: function(self, user, target) { | |
if (target.length == 0) return true; | |
for (var i in user) | |
if (target.indexOf(user[i]) >= 0) return true; | |
return false | |
}, | |
checkDemographics: function(self, user, target) { | |
return self.checkSex(self, user, target) && self.checkAge(self, user, target) | |
}, | |
checkFlags: function(self, user, target) { | |
if (target.length == 0) return true; | |
if (typeof user == 'undefined' && user.length < 1) return false; | |
for (var i = 0; i < target.length; i++) | |
for (var j = 0; j < user.length; j++) | |
if (target[i] == user[j].flag) return true; | |
return false | |
}, | |
checkSex: function(self, user, target) { | |
if (target.sex == '') return true; | |
if (typeof user.s == 'undefined') return false; | |
if (target.sex == user.s) return true; | |
return false | |
}, | |
checkAge: function(self, user, target) { | |
if (target.ageFrom == '' && target.ageTo == '') return true; | |
if (typeof user.y === 'undefined') return false; | |
var age = new Date().getFullYear() - user.y; | |
if (age < target.ageFrom || age > target.ageTo) return false; | |
return true | |
} | |
} | |
}; | |
if (typeof BWord === 'undefined') { | |
var BWord = function(w, s) { | |
this.w = w; | |
this.s = s | |
}; | |
BWord.prototype = { | |
w: '', | |
s: null | |
} | |
}; | |
if (typeof BehavioralEngine === 'undefined') { | |
var BehavioralEngine = { | |
eventManager: null, | |
semantic: null, | |
analitic: null, | |
tagger: null, | |
scriptDataByPartner: {}, | |
partners: [], | |
sendingProbeLimitation: { | |
minWords: 20, | |
minTimeInterval: 15 | |
}, | |
lastProbeSentAt: 0, | |
probeSendInterval: 15e3, | |
flags: { | |
cookieReceived: false, | |
tagsReceived: false, | |
optOut: false, | |
goodQualityPage: true, | |
scriptDataByPartnerReady: false, | |
demographyData: false, | |
miscSet: false | |
}, | |
data: { | |
cookie: null, | |
domainQuality: null, | |
firstProbeSend: false, | |
partner: null, | |
misc: {} | |
}, | |
probe: {}, | |
startTime: new Date().getTime(), | |
bcookie: { | |
emergencyRequestTimeout: null, | |
iframe: null, | |
received: false, | |
callback: false | |
}, | |
onCreate: function(self) { | |
var eventManager = new BEventManager(); | |
self.eventManager = eventManager; | |
BDebug.init(); | |
eventManager.registerEvent(eventManager, new BEvent('beforeBCookieRequest')); | |
eventManager.registerEvent(eventManager, new BEvent('afterBCookieRequest', [function() { | |
BProfiler.startTest('BCookie'); | |
return true | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('callbackBCookieRequest', [function() { | |
BProfiler.endTest('BCookie'); | |
self.sendGetCookieRequest(self) | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('beforeGetCookieRequest')); | |
eventManager.registerEvent(eventManager, new BEvent('afterGetCookieRequest', [function() { | |
BProfiler.startTest('getCookie'); | |
return true | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('callbackGetCookieRequest', [function() { | |
BProfiler.endTest('getCookie'); | |
self.sendTagUserRequest(self) | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('beforeTagUserRequest')); | |
eventManager.registerEvent(eventManager, new BEvent('afterTagUserRequest', [function() { | |
BProfiler.startTest('tagUser') | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('callbackTagUserRequest', [function() { | |
BProfiler.endTest('tagUser') | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('beforeInsertProbeRequest', [function() { | |
return self.assembleProbe(self) | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('afterInsertProbeRequest', [function() { | |
BProfiler.startTest('insertProbe'); | |
return true | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('callbackInsertProbeRequest', [function() { | |
BProfiler.endTest('insertProbe') | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('beforeRetargetingDataRequest')); | |
eventManager.registerEvent(eventManager, new BEvent('afterRetargetingDataRequest', [function() { | |
BProfiler.startTest('retargetingData'); | |
return true | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('callbackRetargetingDataRequest', [function() { | |
BProfiler.endTest('retargetingData'); | |
return true | |
}])); | |
eventManager.registerEvent(eventManager, new BEvent('insertProbe', [function() { | |
self.sendinsertProbeRequest(self) | |
}])); | |
self.semantic = new BSemantic(); | |
self.semantic.onCreate(self.semantic, self); | |
self.analitic = new BAnalitic(); | |
self.analitic.onCreate(self.analitic, self); | |
self.tagger = new BTagger(); | |
self.tagger.onCreate(self.tagger, self); | |
self.runIfReady(self, function() { | |
self.onStart(self) | |
}) | |
}, | |
onStart: function(self) { | |
BUtilities.newThread(function() { | |
BProfiler.sendItems() | |
}); | |
BUtilities.newThread(function() { | |
self.sendBCookieRequest(self) | |
}); | |
BUtilities.newThread(function() { | |
self.sendRetargetingDataRequest(self) | |
}); | |
BUtilities.newThread(function() { | |
self.semantic.onStart(self.semantic) | |
}); | |
BUtilities.newThread(function() { | |
self.analitic.onStart(self.analitic) | |
}); | |
BUtilities.newThread(function() { | |
self.tagger.onStart(self.tagger) | |
}); | |
BUtilities.newThread(function() { | |
self.setProbeSendInterval(self) | |
}) | |
}, | |
setProbeSendInterval: function(self) { | |
var interval = setInterval(function() { | |
if ((new Date()).getTime() - self.lastProbeSentAt > self.probeSendInterval) self.eventManager.callEvent(self.eventManager, 'insertProbe'); | |
if ((new Date()).getTime() - self.startTime > 18e4) clearInterval(interval); | |
if ((new Date()).getTime() - self.startTime > 6e4) self.startTime = 6e4 | |
}, 1e3) | |
}, | |
runIfReady: function(self, callback) { | |
if (document.readyState === 'complete') { | |
callback() | |
} else window.addEventListener('load', callback, false) | |
}, | |
sendBCookieRequest: function(self) { | |
if (!self.eventManager.callEvent(self.eventManager, 'beforeBCookieRequest')) return; | |
self.bcookie.emergencyRequestTimeout = window.setTimeout(function() { | |
if (!self.bcookie.callback) self.eventManager.callEvent(self.eventManager, 'callbackBCookieRequest') | |
}, 2500); | |
window.addEventListener("message", self.sendBCookieRequestCallback, false); | |
self.bcookie.iframe = document.createElement('iframe'); | |
self.bcookie.iframe.style.height = '1px'; | |
self.bcookie.iframe.style.width = '1px'; | |
self.bcookie.iframe.style.border = 0; | |
self.bcookie.iframe.style.opacity = 0; | |
self.bcookie.iframe.style.display = "none"; | |
self.bcookie.iframe.src = '//cdn.behavioralengine.com/scripts/bcookie/bcookie.html'; | |
document.getElementsByTagName('body')[0].appendChild(self.bcookie.iframe); | |
self.eventManager.callEvent(self.eventManager, 'afterBCookieRequest') | |
}, | |
sendBCookieRequestCallback: function(event) { | |
var self = BehavioralEngine; | |
BDebug.log('BCookie callback: '); | |
BDebug.log(event.data); | |
if (self.bcookie.callback) return; | |
if (!event.data || typeof event.data.bcookie === 'undefined' && !event.data.bcookie) return; | |
self.bcookie.callback = true; | |
window.clearTimeout(self.bcookie.emergencyRequestTimeout); | |
BDebug.log('cookie from bcookie script: ' + event.data.cookie); | |
self.bcookie.received = true; | |
self.data.cookie = event.data.cookie; | |
self.eventManager.callEvent(self.eventManager, 'callbackBCookieRequest') | |
}, | |
sendGetCookieRequest: function(self) { | |
if (!self.eventManager.callEvent(self.eventManager, 'beforeGetCookieRequest')) return; | |
self.preparePartnersDataFromScripts(self); | |
var params = { | |
cookie: self.data.cookie, | |
p: self.getPartnersFromScripts(self).join(','), | |
domain: encodeURI(('https:' == document.location.protocol ? 'https://' : 'http://') + window.location.host) | |
}; | |
BDebug.log('cookie sent: ' + self.data.cookie); | |
BUtilities.sendRequest('getCookie', params, function(data) { | |
BDebug.log('cookie received: ' + data.cookie); | |
self.data.cookie = data.cookie; | |
self.bcookie.iframe.contentWindow.postMessage(data.cookie, '*'); | |
self.data.domainQuality = data.domainQuality; | |
if (typeof data.partner !== 'undefined') self.data.partner = data.partner.name; | |
self.data.probeHash = self.getProbeHash(self, data.cookie); | |
self.flags.optOut = false; | |
self.flags.goodQualityPage = self.isPageGoodQuality(self); | |
self.flags.cookieReceived = true; | |
self.flags.scriptDataByPartnerReady = true; | |
self.eventManager.callEvent(self.eventManager, 'callbackGetCookieRequest', data) | |
}); | |
self.eventManager.callEvent(self.eventManager, 'afterGetCookieRequest') | |
}, | |
sendTagUserRequest: function(self) { | |
if (!self.eventManager.callEvent(self.eventManager, 'beforeTagUserRequest')) return; | |
BUtilities.sendApiRequest('tagUser', {}, function(data) { | |
self.flags.tagsReceived = true; | |
self.eventManager.callEvent(self.eventManager, 'callbackTagUserRequest', data) | |
}); | |
self.eventManager.callEvent(self.eventManager, 'afterTagUserRequest') | |
}, | |
sendinsertProbeRequest: function(self) { | |
if (!self.eventManager.callEvent(self.eventManager, 'beforeInsertProbeRequest')) return; | |
var params = { | |
v: '3.0' | |
}; | |
if (self.data.firstProbeSend) params.update = 1; | |
BUtilities.sendPostRequest('insertProbe', params, self.probe, function(data) { | |
self.data.firstProbeSend = true; | |
self.eventManager.callEvent(self.eventManager, 'callbackInsertProbeRequest', data) | |
}); | |
self.lastProbeSentAt = new Date().getTime(); | |
self.eventManager.callEvent(self.eventManager, 'afterInsertProbeRequest') | |
}, | |
sendRetargetingDataRequest: function(self) { | |
if (!self.eventManager.callEvent(self.eventManager, 'beforeRetargetingDataRequest')) return; | |
BUtilities.sendScriptRequest('retargeting', 'scripts/retargeting.js', function(data) { | |
self.eventManager.callEvent(self.eventManager, 'callbackRetargetingDataRequest', data) | |
}); | |
self.eventManager.callEvent(self.eventManager, 'afterRetargetingDataRequest') | |
}, | |
isPageGoodQuality: function(self) { | |
if (self.data.domainQuality == 0) return false; | |
return true | |
}, | |
preparePartnersDataFromScripts: function(self) { | |
var allScriptBlocks = document.getElementsByTagName('script'), | |
src; | |
for (var i = 0; i < allScriptBlocks.length; i++) { | |
src = allScriptBlocks[i].getAttribute('src'); | |
if (src !== null) | |
if (/\/\/[a-z.]*api\.behavioralengine\.com\/scripts.*\/be[-a-z0-9]*\.js$/.test(src)) self.parseScriptBlock(self, allScriptBlocks[i]) | |
} | |
}, | |
parseScriptBlock: function(self, scriptBlock) { | |
var partner = 'ct', | |
data = {}; | |
for (var i = 0; i < scriptBlock.attributes.length; i++) | |
if (scriptBlock.attributes[i].name.indexOf('data-') > -1) | |
if (scriptBlock.attributes[i].value !== '') | |
if (scriptBlock.attributes[i].name === 'data-p') { | |
partner = scriptBlock.attributes[i].value | |
} else { | |
data[scriptBlock.attributes[i].name] = scriptBlock.attributes[i].value; | |
self.flags.demographyData = true | |
}; | |
self.scriptDataByPartner[partner] = data; | |
self.partners.push(partner) | |
}, | |
getPartnersFromScripts: function(self) { | |
return self.partners | |
}, | |
getProbeHash: function(self, cookie) { | |
return BUtilities.generateHash(cookie + '_' + (new Date().getTime())) | |
}, | |
canSendProbe: function(self) { | |
if (self.flags.optOut) return false; | |
if (!self.flags.goodQualityPage && !self.flags.demographyData) return false; | |
if (!self.flags.cookieReceived) return false; | |
if (!self.analitic.isBrowserDataSet(self.analitic)) return false; | |
if (!self.semantic.ready) return false; | |
var timeDiff = (new Date().getTime() - self.lastProbeSentAt) / 1e3; | |
if (timeDiff < self.sendingProbeLimitation.minTimeInterval) return false; | |
if (self.semantic.getWordsCount(self.semantic) < self.sendingProbeLimitation.minWords) return false; | |
return true | |
}, | |
assembleProbe: function(self) { | |
if (!self.canSendProbe(self)) return false; | |
var words = self.semantic.popWords(self.semantic), | |
wordsCount = self.semantic.getSeenWordsCount(self.semantic); | |
self.probe = { | |
'data-probe': JSON.stringify({ | |
analitic: self.analitic.getBrowserData(self.analitic), | |
semantic: { | |
words: words, | |
readTime: Math.floor((new Date().getTime() - self.startTime) / 1e3), | |
seenAccepted: wordsCount | |
} | |
}), | |
'data-cookie': self.data.cookie, | |
'data-probeHash': self.data.probeHash | |
}; | |
if (self.data.partner !== null) self.probe['data-p'] = self.data.partner; | |
if (self.analitic.isFBDataReady(self.analitic)) { | |
var FBData = self.analitic.getFBData(self.analitic); | |
for (var i in FBData) self.probe[i] = FBData[i] | |
}; | |
if (self.flags.miscSet) { | |
self.probe['data-misc'] = JSON.stringify(self.data.misc); | |
self.flags.miscSet = false; | |
self.data.misc = {} | |
}; | |
if (self.flags.scriptDataByPartnerReady && self.data.partner !== null) | |
if (typeof self.scriptDataByPartner[self.data.partner] !== 'undefined') { | |
var data = self.scriptDataByPartner[self.data.partner]; | |
for (var i in data) self.probe[i] = data[i] | |
}; | |
return true | |
} | |
}; | |
try { | |
BehavioralEngine.onCreate(BehavioralEngine) | |
} catch (exc) {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment