Skip to content

Instantly share code, notes, and snippets.

@kowith337
Created March 13, 2017 08:58
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 kowith337/e2c4c51d536702c873966cc33d9c440c to your computer and use it in GitHub Desktop.
Save kowith337/e2c4c51d536702c873966cc33d9c440c to your computer and use it in GitHub Desktop.
/**
* NeverBlock
*
* Version 2.13
* Copyright (C) 2016 EXADS
*/
var ExoLoader = (function () {
var version = '2.13';
var setCookie = function (name, value, minutes_ttl) {
var exdate = new Date();
exdate.setMinutes(exdate.getMinutes() + minutes_ttl);
var c_value = encodeURI(value) + "; expires=" + exdate.toUTCString() + "; path=/";
document.cookie = name + "=" + c_value;
};
var URLToArray = function(url) {
var request = {};
var pairs = url.substring(url.indexOf('?') + 1).split('&');
for (var i = 0; i < pairs.length; i++) {
if(!pairs[i])
continue;
var pair = pairs[i].split('=');
request[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
return request;
};
var openLink = function (event, dest) {
if ( typeof(event) != "undefined" ) {
event.returnValue = false;
if ( event.preventDefault ) {
event.preventDefault();
}
event.stopPropagation();
}
var url_parts = dest.split('?', 2);
var parameters = URLToArray(url_parts[1]);
var f = document.createElement("form");
f.setAttribute("action", url_parts[0]);
f.setAttribute("method", "post");
f.setAttribute("target", "_blank");
document.getElementsByTagName("body").item(0).appendChild(f);
for (var i in parameters) {
var input = document.createElement("input");
input.setAttribute("type", "hidden");
input.setAttribute("name", i);
input.setAttribute("value", parameters[i]);
f.appendChild(input);
}
f.submit();
document.getElementsByTagName("body").item(0).removeChild(f);
return false;
};
var stylesheet = "{ border: 0px solid #000000; width: %width%px; height: %height%px; display: inline-block; background-color: rgba(0, 0, 0, 0); margin: 0px 0px; padding: 0px 0px; }";
var ad_types = ['banner', 'popunder'];
var zone_params = {};
var dom = {};
var debug_messages = [];
var error_messages = [];
var addDebugMessage = function (message) {
var date = new Date();
debug_messages.push(date.toISOString() + ": " + message);
};
var addErrorMessage = function (message) {
var date = new Date();
error_messages.push(date.toISOString() + ": " + message);
console.error(message);
};
var stringify = function (value) {
var reassign_when_finished = false;
if (typeof Array.prototype.toJSON !== 'undefined') {
reassign_when_finished = true;
var array_to_json = Array.prototype.toJSON;
delete Array.prototype.toJSON;
}
var val = JSON.stringify(value);
if (reassign_when_finished) {
Array.prototype.toJSON = array_to_json;
}
return val;
};
var randStr = function (length, possibleChars)
{
var text = "";
var possible = possibleChars || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < length; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
};
var createStyle = function (doc, dom_anchor, style_text)
{
var class_name = randStr(1,"abcdefghijklmnopqrstuvwxyz") + randStr(7);
style_text = "." + class_name + " " + style_text;
var style = doc.createElement('style');
style.setAttribute('type', 'text/css');
style.innerHTML = style_text;
dom_anchor.parentNode.insertBefore(style, dom_anchor);
return class_name;
};
var loader = {
cookie_name: "exo_zones",
addZone: function(params) {
if (typeof exo99HL3903jjdxtrnLoad != "undefined" && exo99HL3903jjdxtrnLoad) {
return false;
}
if (typeof params != 'object'
|| typeof params.type == 'undefined'
|| ad_types.indexOf(params.type) == -1
) {
addErrorMessage("addZone() invalid params");
return false;
}
var doc = params.doc || document;
var scripts = doc.getElementsByTagName('script');
// The current <script> tag where the method is called
var here = scripts[ scripts.length - 1 ];
var type = params.type;
delete params.type;
if (typeof zone_params[type] == 'undefined') {
dom[type] = [];
zone_params[type] = [];
}
zone_params[type].push(params);
if (type == 'banner') {
var style_text = stylesheet.replace('%width%', params.width)
.replace('%height%', params.height);
var class_name = createStyle(doc, here, style_text);
var placeholder = doc.createElement('div');
placeholder.setAttribute('class', class_name);
here.parentNode.insertBefore(placeholder, here);
dom[type].push({'placeholder': placeholder, 'doc_reference': doc});
}
addDebugMessage("addZone() " + type + " " + params.idzone + " added");
return true;
},
renderBannerZone: function (id, img_data, dest) {
var idzone = zone_params['banner'][id]['idzone'];
addDebugMessage("renderBannerZone() #" + id + " called for zone " + idzone);
if (typeof dom['banner'][id] == 'undefined'
|| typeof img_data != 'object'
|| typeof img_data.img == 'undefined'
|| typeof img_data.content_type == 'undefined'
|| typeof dest == 'undefined'
) {
addErrorMessage("renderBannerZone() #" + id + " corrupt params for zone " + idzone);
return false;
}
if (
typeof dom['banner'][id]["doc_reference"] == 'undefined' ||
typeof dom['banner'][id]["doc_reference"].body == 'undefined' ||
!dom['banner'][id]["doc_reference"].body.contains(dom['banner'][id]['placeholder'])
) {
addErrorMessage("renderBannerZone() #" + id + " dom placeholder is not present for zone " + idzone);
return false;
}
var style_text = "{ background-image: url('data:" + img_data.content_type + ";base64," + img_data.img + "'); background-repeat: no-repeat; cursor: pointer; }";
var class_name = createStyle(dom['banner'][id]["doc_reference"], dom['banner'][id]['placeholder'], style_text);
var current_class = dom['banner'][id]['placeholder'].getAttribute('class');
dom['banner'][id]['placeholder'].setAttribute('class', current_class + " " + class_name);
dom['banner'][id]['placeholder'].onclick = (function(dest) {
return function(event) {
openLink(event, dest);
};
})(dest);
},
renderBannerZones: function (response) {
addDebugMessage("renderBannerZones() called");
if (typeof response != 'object'
|| typeof response.zones != 'object'
|| typeof response.images != 'object'
) {
addDebugMessage("renderBannerZones() empty zones or images");
return;
}
for (var i = 0; i < response.zones.length; i++) {
if (typeof zone_params['banner'][i] == 'undefined' ||
typeof zone_params['banner'][i]['idzone'] == 'undefined'
) {
addErrorMessage("renderBannerZones() zone info missing");
}
var idzone = zone_params['banner'][i]['idzone'];
if (response.zones[i] == false) {
addDebugMessage("renderBannerZones() nothing to show for zone " + idzone);
continue;
}
var img_key = response.zones[i].img_key;
this.renderBannerZone(i, response.images[img_key], response.zones[i].dest);
}
},
serve: function(params) {
if (typeof exo99HL3903jjdxtrnLoad != "undefined" && exo99HL3903jjdxtrnLoad) {
addDebugMessage("serve() ad blocker not enabled");
return false;
}
var zones_added = false;
for (var type_index = 0; type_index < ad_types.length; type_index++) {
if (typeof zone_params[ad_types[type_index]] !== 'undefined' && zone_params[ad_types[type_index]].length > 0) {
zones_added = true;
break;
}
}
if (!zones_added) {
addErrorMessage("serve() called but no zones added");
return false;
}
window.exoNoExternalUI38djdkjDDJsio96 = true;
addDebugMessage("serve() called");
setCookie(this.cookie_name, stringify(zone_params), 5);
var loadDataScript = function () {
var dataScript = document.createElement("script");
dataScript.async = true;
dataScript.setAttribute('type', 'text/javascript');
dataScript.setAttribute('src', params.script_url);
dataScript.onload = function(){
addDebugMessage("serve() hosted script loaded");
};
document.getElementsByTagName("body").item(0).appendChild(dataScript);
};
if (!params.force) {
if (window.addEventListener) {
window.addEventListener("load", loadDataScript, false);
} else if (window.attachEvent) {
window.attachEvent("onload", loadDataScript);
} else {
window.onload = loadDataScript;
}
} else {
loadDataScript();
}
return true;
},
getDebug: function() {
for (var i = 0; i < debug_messages.length; i++) {
console.log(debug_messages[i]);
}
},
getVersion: function() {
return version;
}
};
return loader;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment