Skip to content

Instantly share code, notes, and snippets.

@heathdutton
Created December 30, 2011 17:17
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 heathdutton/1540656 to your computer and use it in GitHub Desktop.
Save heathdutton/1540656 to your computer and use it in GitHub Desktop.
the offending script
(function (window, document) {
var doc = document;
document._write = document.write;
var _tcproto = (window.location.protocol == "https:") ? "https" : "http";
var _tchost = _tcproto + "://tc.convertro.com/tagroot";
var _log_request = 0;
if (getQueryParam("tclogging") == 1) {
_log_request = 1
}
var _args = {};
var _tcid;
var _tcparams = "";
var _tcdebug = 1;
window.set_tc_vars = function (key, param) {
_tcparams += "&" + escape(key) + "=" + escape(param)
};
function clog(u) {
if (_tcdebug && typeof (console) != "undefined" && typeof (console.log) != "undefined") {
console.log(u)
}
}
var target = [];
function evalInner(script) {
if ((!target.length || target[target.length - 1] !== script) && script.docwriteTarget && script.docwriteTarget.inner && script.docwriteTarget.inner.length) {
var text = script.docwriteTarget.inner;
var i1 = text.indexOf("<script");
if (-1 !== i1) {
var i2 = text.indexOf("<\/script>", i1) + 9;
if (-1 != i2) {
var textBefore = text.substring(0, i1);
var textScript = text.substring(i1, i2);
var textAfter = text.substring(i2 + 1);
script.docwriteTarget.inner = textBefore + textAfter;
docwriteScript(textScript, script)
}
}
}
}
function docwriteScript(textScript, before) {
var aMatches = textScript.match(/src='([^']*)/i) || textScript.match(/src="([^"]*)/i) || textScript.match(/src=([^ >]*)/i);
if (aMatches) {
var url = aMatches[1];
cvo_head.js(url, undefined, function () {
newDocWrite("", 1)
})
} else {
aMatches = textScript.match(/>(.*)</);
if (aMatches) {
eval(aMatches[1])
}
}
}
var newDocWrite = function (text, force) {
if (document.readyState == "loading") {
return document._write(text)
}
var scripts = document.getElementsByTagName("script");
var script = target.length ? target[target.length - 1] : scripts[scripts.length - 1];
if (script.docwriteTarget && script.docwriteTarget.timer) {
clearTimeout(script.docwriteTarget.timer)
}
if (!script.docwriteTarget) {
script.docwriteTarget = document.createElement("div");
script.docwriteTarget.inner = "";
script.parentNode.insertBefore(script.docwriteTarget, script)
}
if (api.browser.ie && text.indexOf("<link") != -1) {
text = "<div style='position:absolute'>&nbsp;</div>" + text
}
script.docwriteTarget.inner += text;
script.docwriteTarget.innerHTML = script.docwriteTarget.inner;
(function (script) {
script.docwriteTarget.timer = setTimeout(function () {
evalInner(script)
}, 100)
})(script)
};
var head = doc.documentElement,
smallwait, isDomReady, domWaiters = [],
queue = [],
handlers = {},
scripts = {},
isAsync = doc.createElement("script").async === true || "MozAppearance" in doc.documentElement.style || window.opera;
var scriptObjects = [];
function log(obj, stat, error, rand) {
if (_log_request != 1) {
return true
}
var img = new Image();
if (typeof (obj) == "string" || typeof (obj) == "number") {
img.src = _tchost + "/log?url=" + escape(window.location) + "&referrer=" + escape(document.referrer) + "&time=" + escape(timems()) + "&timeout=&id=" + _tcid + "&js=" + escape(obj) + "&ua=" + escape(navigator.userAgent) + "&rand=" + escape(rand) + "&status=" + stat + (error ? "&error=" + error : "")
} else {
img.src = _tchost + "/log?url=" + escape(window.location) + "&referrer=" + escape(document.referrer) + "&time=" + escape(timems()) + "&timeout=" + escape(obj.timeout * 1000) + "&id=" + _tcid + "&js=" + escape(obj.src) + "&ua=" + escape(navigator.userAgent) + "&rand=" + escape(obj.rand) + "&status=" + stat
}
return img
}
function scriptWatches(wait) {
var waitObj = 0;
try {
var curTime = time();
var x;
var img;
for (var i = 0; i < scriptObjects.length; i++) {
x = scriptObjects[i];
if (time(x.created) + x.timeout <= curTime) {
clog("max time! oops!");
var img = log(x, "timeout");
x.element.src = "#";
scriptObjects.splice(i, 1);
x.element.parentNode.removeChild(x.element)
} else {
if (x.wait) {
waitObj++
}
}
}
} catch (err) {}
if (wait) {
if (waitObj) {}
}
watchTimer = window.setTimeout(scriptWatches, 1000)
}
var head_var = window.head_conf && head_conf.head || "cvo_head",
api = window[head_var] = (window[head_var] ||
function () {
api.ready.apply(null, arguments)
});
var ua = navigator.userAgent.toLowerCase();
ua = /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || !/compatible/.test(ua) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec(ua) || [];
if (ua[1] == "msie") {
ua[1] = "ie";
ua[2] = document.documentMode || ua[2]
}
api.browser = {
version: ua[2]
};
api.browser[ua[1]] = true;
api.url_params = {};
var PRELOADED = 0,
PRELOADING = 1,
LOADING = 2,
LOADED = 3;
if (isAsync) {
api.js = function () {
var args = arguments,
els = [],
url = args[0],
wait = args[1],
fn = args[2];
if (!wait) {
wait = 60
}
if (!fn) {
fn = function () {}
}
if (!isFunc(fn)) {
fn = null
}
url = getScript(url);
els.push(url);
load(wait, url, isFunc(fn) ?
function () {
if (allLoaded(els)) {
one(fn)
}
} : null);
return api
}
} else {
api.js = function () {
var args = arguments,
url = args[0],
wait = args[1],
fn = args[2];
if (!wait) {
wait = 60
}
if (!fn) {
fn = function () {}
}
if (!smallwait) {
queue.push(function () {
api.js.apply(null, args)
});
return api
}
if (typeof (url) == "string") {
load(wait, getScript(url), isFunc(fn) ? fn : function () {
api.js.apply(null, fn)
})
}
return api
}
}
api.ready = function (key, fn) {
if (key == "dom") {
if (isDomReady) {
one(fn)
} else {
domWaiters.push(fn)
}
return api
}
if (isFunc(key)) {
fn = key;
key = "ALL"
}
var script = scripts[key];
if (script && script.state == LOADED || key == "ALL" && allLoaded() && isDomReady) {
one(fn);
return api
}
var arr = handlers[key];
if (!arr) {
arr = handlers[key] = [fn]
} else {
arr.push(fn)
}
return api
};
api.enable_logging = function () {
_log_request = 1
};
api.cvo_try = function (codeid, func) {
var err;
var rand = Math.random();
log(codeid, "loading", undefined, rand);
try {
func()
} catch (e) {
err = e
}
log(codeid, err ? "error" : "success", err, rand)
};
var globalFuncList = [];
api.register_tag = function (tagLabel, tagFunc) {
if (typeof (globalFuncList[tagLabel]) !== "object") {
globalFuncList[tagLabel] = []
}
globalFuncList[tagLabel].push(tagFunc)
};
api.invoke_tag = function () {
var tagLabel = arguments[0];
var theArgs = [];
for (var i = 1; i < arguments.length; i++) {
theArgs[i - 1] = arguments[i]
}
for (var x = 0; x < globalFuncList[tagLabel].length; x++) {
globalFuncList[tagLabel][x](theArgs)
}
};
api.pcload = function () {
document.write = newDocWrite;
var args = arguments,
rest = [].slice.call(args, 1),
next = rest[0];
_tcid = args[0];
var url;
if (readCookie("convertro") == "test") {
url = _tchost + "/container/" + args[0] + "-test.js?" + _tcparams
} else {
url = _tchost + "/container/" + args[0] + ".js?" + _tcparams
}
if (api.browser.ie) {
api.js(url)
} else {
document._write("<script src='" + url + "'><\/script>")
}
};
api._parse_query_string = function () {
var e, a = /\+/g,
r = /([^&=]+)=?([^&]*)/g,
d = function (s) {
return decodeURIComponent(s.replace(a, " "))
},
q = window.location.search.substring(1);
api.url_params = {};
while (e = r.exec(q)) {
api.url_params[d(e[1])] = d(e[2])
}
};
api.get_query_param = function (param) {
if (!api.url_params.hasOwnProperty(param)) {
api._parse_query_string()
}
return api.url_params[param]
};
api.ready("dom", function () {
if (smallwait && allLoaded()) {
each(handlers.ALL, function (fn) {
one(fn)
})
}
if (api.feature) {
api.feature("domloaded", true)
}
});
function one(fn) {
if (fn) {
if (fn._done) {
return
}
fn();
fn._done = 1
}
}
function toLabel(url) {
var els = url.split("/"),
name = els[els.length - 1],
i = name.indexOf("?");
return i != -1 ? name.substring(0, i) : name
}
function getScript(url) {
var script;
if (typeof url == "object") {
for (var key in url) {
if (url[key]) {
script = {
name: key,
url: url[key]
}
}
}
} else {
script = {
name: toLabel(url),
url: url
}
}
var existing = scripts[script.name];
if (existing && existing.url === script.url) {
return existing
}
scripts[script.name] = script;
return script
}
function each(arr, fn) {
if (!arr) {
return
}
if (typeof arr == "object") {
arr = [].slice.call(arr)
}
for (var i = 0; i < arr.length; i++) {
fn.call(arr, arr[i], i)
}
}
function allLoaded(els) {
els = els || scripts;
var loaded = false,
count = 0;
for (var name = 0; name < els.length; name++) {
if (els[name].state != LOADED) {
return false
}
loaded = true;
count++
}
return loaded || count === 0
}
function isFunc(el) {
return Object.prototype.toString.call(el) == "[object Function]"
}
function onPreload(script) {
script.state = PRELOADED;
each(script.onpreload, function (el) {
el.call()
})
}
function preload(wait, script, callback) {
if (!script.state) {
script.state = PRELOADING;
script.onpreload = [];
scriptTag(wait, {
src: script.url,
type: "cache"
}, function () {
onPreload(script)
})
}
}
function load(wait, script, callback) {
if (script.state == LOADED && callback) {
return callback()
}
if (script.state == LOADING) {
return api.ready(script.name, callback)
}
if (script.state == PRELOADING) {
return script.onpreload.push(function () {
load(wait, script, callback)
})
}
script.state = LOADING;
scriptTag(wait, script.url, function () {
script.state = LOADED;
if (callback) {
callback()
}
each(handlers[script.name], function (fn) {
one(fn)
});
if (isDomReady && allLoaded()) {
each(handlers.ALL, function (fn) {
one(fn)
})
}
})
}
function sleep(ms) {
var sleeping = true;
var startingMSeconds = timems();
while (sleeping) {
alarmMSeconds = timems();
if (alarmMSeconds - startingMSeconds > ms) {
sleeping = false
}
}
}
function getArgs() {
var args = "?";
for (var i = 0; i < _args.length; i++) {
for (var j in _args[i]) {
args += "&" + escape(j) + "=" + escape(_args[i][j])
}
}
return args
}
function scriptTag(wait, src, callback) {
var elem = doc.createElement("script");
if (!scriptObjects.length) {
scriptWatches(0)
}
var newsrc = src.src || src;
newsrc += getArgs();
var idnum = scriptObjects.length;
scriptObjects.push({
element: elem,
src: newsrc,
wait: wait,
"in": head,
rand: Math.random(),
created: timems(),
timeout: wait
});
var x = scriptObjects[idnum];
elem.type = "text/" + (src.type || "javascript");
elem.src = src.src || src;
elem.async = false;
log(x, "loading");
elem.onerror = function (e) {
for (var i = 0; i < scriptObjects.length; i++) {
if (elem === scriptObjects[i].element) {
clog("NOT loaded " + idnum + " " + scriptObjects[i].src);
scriptObjects.splice(i, 1)
}
}
};
elem.onreadystatechange = elem.onload = function () {
var state = this.readyState;
for (var i = 0; i < scriptObjects.length; i++) {
if (elem === scriptObjects[i].element) {
var x = scriptObjects[i];
log(x, "success");
scriptObjects.splice(i, 1)
}
}
if (!callback.done && (!state || /loaded|complete/.test(state))) {
callback();
callback.done = true
}
};
var h = doc.getElementsByTagName("script")[0];
h.parentNode.insertBefore(elem, h);
scriptWatches(1)
}
setTimeout(function () {
smallwait = true;
each(queue, function (fn) {
fn()
})
}, 0);
function fireReady() {
if (!isDomReady) {
isDomReady = true;
each(domWaiters, function (fn) {
one(fn)
})
}
}
if (window.addEventListener) {
doc.addEventListener("DOMContentLoaded", fireReady, false);
window.addEventListener("onload", fireReady, false)
} else {
if (window.attachEvent) {
doc.attachEvent("onreadystatechange", function () {
if (doc.readyState === "complete") {
fireReady()
}
});
var frameElement = 1;
try {
frameElement = window.frameElement
} catch (e) {}
if (!frameElement && head.doScroll) {
(function () {
try {
head.doScroll("left");
fireReady()
} catch (e) {
setTimeout(arguments.callee, 1);
return
}
})()
}
window.attachEvent("onload", fireReady)
}
}
if (!doc.readyState && doc.addEventListener) {
doc.readyState = "loading";
doc.addEventListener("DOMContentLoaded", handler = function () {
doc.removeEventListener("DOMContentLoaded", handler, false);
doc.readyState = "complete"
}, false)
}
function getQueryParam(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1]
}
}
}
function time(curtime) {
if (!curtime) {
curtime = timems()
}
return parseInt(curtime / 1000)
}
function timems() {
return new Date().getTime()
}
function createCookie(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString()
} else {
var expires = ""
}
document.cookie = name + "=" + value + expires + "; path=/"
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(";");
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == " ") {
c = c.substring(1, c.length)
}
if (c.indexOf(nameEQ) == 0) {
return c.substring(nameEQ.length, c.length)
}
}
return null
}
function eraseCookie(name) {
createCookie(name, "", -1)
}
})(this, this.document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment