Advertisement
access2godzilla

Analysis of Sourceforge's adware infested installer

Nov 25th, 2013
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 112.47 KB | None | 0 0
  1. Analysis of Sourceforge's adware infested installer.
  2. ---------------------------------------------------------------------------
  3.  
  4. Sourceforge was recently sold to Dice Holdings, which started its DevShare program. FileZilla has been bundling this installer; many others are too. So I decided to analyse it in real depth.
  5.  
  6. General information:
  7. ---------------------------------------------------------------------------
  8. Filename: SFInstaller_SFFZ_filezilla_8992693_.exe
  9. SHA256 : 8d29ac224f4bd9a6671c037ffb1ae0265aaa41581e7bb6f168f301517a16e18a
  10. Entropy : 4.32056
  11.  
  12. TrID: 67.3% (.EXE) Win32 Executable MS Visual C++ (generic) (31206/45/13)
  13.  
  14. Resource segment:
  15. ---------------------------------------------------------------------------
  16. It reveals quite a bit. The full contents have been posted, if anyone else wants to analyse. If you lack time, read the notes at the top of each file's contents.
  17.  
  18. List of files:
  19. ./BITMAP/109.bmp
  20. ./BITMAP/208.bmp
  21. ./BITMAP/209.bmp
  22. ./BITMAP/210.bmp
  23. ./BKG/ERROR.PNG
  24. ./BKG/FINISH.PNG
  25. ./BKG/SATTB.PNG
  26. ./BKG/TB.PNG
  27. ./DIALOG/106
  28. ./DIALOG/108
  29. ./DIALOG/109
  30. ./GROUP_ICON/99
  31. ./HTM/ORCHESTRATOR.HTML
  32. ./ICON/1.ico
  33. ./ICON/2.ico
  34. ./ICON/3.ico
  35. ./ICON/4.ico
  36. ./JAVASCRIPT/JSON.JS
  37. ./JAVASCRIPT/OBJECTMODEL.JS
  38. ./JAVASCRIPT/RULES.JS
  39. ./MANIFEST/1
  40. ./MANIFEST/204
  41. ./string.txt
  42. ./TYPELIB/1
  43. ./VERSION/1
  44. ./XML/ANALYTICS.XML
  45. ./XML/UI.XML
  46.  
  47. Contents of interesting files are given below:
  48.  
  49. string.txt
  50. ===========================================================================
  51. 100 AskInstaller
  52. 104 www.ask.com
  53. 107 Connecting...
  54. 110 http://apnpip.ask.com/PIP/partners/{partnerid}/config.xml
  55. 112 Are you sure you want to cancel installation?
  56. 113 1
  57. 114 Unknown command line argument:
  58. 118 http://www.163.com
  59. 119 City
  60. ===========================================================================
  61.  
  62. XML/ANALYTICS.XML
  63. ===========================================================================
  64. <?xml version="1.0" encoding="utf-8"?>
  65. <root>
  66. <GeneralParameters>
  67. <PreviousX>250</PreviousX>
  68. <PreviousY>37</PreviousY>
  69. <NextX>169</NextX>
  70. <NextY>37</NextY>
  71. <CancelX>88</CancelX>
  72. <CancelY>37</CancelY>
  73. <Height>399</Height>
  74. <Width>513</Width>
  75. <bgColor>EFEBDF</bgColor>
  76. <RegistryKey>HKEY_CURRENT_USER\Software\APN PIP\Analytics\{partnerid}</RegistryKey>
  77. <ReportSever>anx.apnanalytics.com/200/pip/test.gif?</ReportSever>
  78. <PIPReportSever>pipoffers.apnpartners.com/PIP/OfferAccept.jhtml</PIPReportSever>
  79. <HideEula>1</HideEula>
  80. <GetServer>http://pipoffers.apnpartners.com/PIP/Server.jhtml?partner_id={partnerid}&amp;language={locale}</GetServer>
  81. <HideTitleBar>1</HideTitleBar>
  82. <CustomTitleHeight>50</CustomTitleHeight>
  83. <CustomCloseWidth>70</CustomCloseWidth>
  84. <CustomCloseHeight>25</CustomCloseHeight>
  85. <DefaultUiReadyTimeout>30</DefaultUiReadyTimeout>
  86. <Parameters>
  87. <pAppID id="pAppID" position="2" report="N" get="Y"/>
  88. <pProductID id="pProductID" position="3" report="Y" get="Y"/>
  89.  
  90. </Parameters>
  91. </GeneralParameters>
  92. <stringtable>
  93. <Language langID="en">
  94. <string id="STRID_TITLE">FrostWire Setup</string>
  95. <string id="STRID_TEXT1">Press Page Down to see the rest of the agreement.</string>
  96. <string id="STRID_EULA">If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install FrostWire 4.21.3</string>
  97. <string id="STRID_EULA1">www.FrostWire.com</string>
  98. <string id="STRID_NEXT">I Agree</string>
  99. <string id="STRID_CANCEL">Cancel</string>
  100. <string id="STRID_CANCEL_TEXT">Are you sure you want to cancel installation?</string>
  101. </Language>
  102. </stringtable>
  103. <offereula>
  104. <offer id = "{cpf1}" title="STRID_TITLE" icUrl="" icParams="" icProceed="" color="" transparency="255" display="true" bkgImage="" imagewidth= "" bgcolor="#EFEBDF" imageheight="" displayname="" switchcontroltype="checkbox">
  105. <apps>
  106. </apps>
  107. <!-- UI button controls-->
  108. <controls>
  109. <control id="txt1-of10" type="text" text="" width="420" height="190" x="30" y="80" color="" bgcolor="#ffffff" isBold="false">
  110. <control id="eula" type="checkbox" text="STRID_EULA" width="400" height="40" x="50" y="90" color="" bgcolor="" checked="false" isBold="true" ctrltype="offer" ctrlvalue="true" subctr=""></control>
  111.  
  112. <control id="txt1-of11" type="text" text="Frostwire Demo Starting....." width="400" height="60" x="0" y="0" color="" bgcolor="#FFD793" fontsize="20" isBold="true"></control>
  113. </control>
  114. </controls>
  115. </offer>
  116. </offereula>
  117. <apnanalytics>
  118. </apnanalytics>
  119. </root>
  120. ===========================================================================
  121.  
  122. XML/UI.XML
  123. ===========================================================================
  124. <?xml version="1.0" encoding="UTF-8"?>
  125. <root>
  126. <OwnerInformation>
  127. <owner>
  128. <name>Vishal Shah</name>
  129. <organization>APN Toolbar</organization>
  130. </owner>
  131. </OwnerInformation>
  132. <GeneralParameters>
  133. <Height>560</Height>
  134. <Width>660</Width>
  135. <bgcolor>efebdf</bgcolor>
  136. <dlg_transparency>255</dlg_transparency>
  137. <defaultLanguage>en</defaultLanguage>
  138. <ShowOfferScreensOnly>true</ShowOfferScreensOnly>
  139. <MessageUser>false</MessageUser>
  140. <BalloonIconPath>http://ak.pipoffers.apnpartners.com/static/partners/{partnerid}/images/install.ico</BalloonIconPath>
  141. <TrayTipTime>2000</TrayTipTime>
  142. <PreviousX>0</PreviousX>
  143. <PreviousY>0</PreviousY>
  144. <NextX>185</NextX>
  145. <NextY>32</NextY>
  146. <CancelX>622</CancelX>
  147. <CancelY>32</CancelY>
  148. <CancelDeclinesOffer>true</CancelDeclinesOffer>
  149. <RetryTimeout>300</RetryTimeout>
  150. <NumberOfSecOffersToShow>1</NumberOfSecOffersToShow>
  151. <Orchestrator>http://ak.pipoffers.apnpartners.com/static/resources/ui/html/orchestrator.html?PIPPID=SF1&amp;PTBPartnerID=&amp;STBPartnerID=&amp;tbType=vanilla&amp;version={version}</Orchestrator>
  152. <CBID>B0E</CBID>
  153. <TrackID>default</TrackID>
  154. <Title>SourceForge Installer</Title>
  155. <HidePrevious>true</HidePrevious>
  156. <optintextsize>12</optintextsize>
  157. <ProgressBarCancelClickable>true</ProgressBarCancelClickable>
  158. <ShowLoadingScreen>false</ShowLoadingScreen>
  159. <showprogcanceldlg>false</showprogcanceldlg>
  160. <ShowProgressDlg>false</ShowProgressDlg>
  161. <BtnBkg_Cancel>http://ak.pipoffers.apnpartners.com/static/partners/SF1/images/decline.png</BtnBkg_Cancel>
  162. <BtnBkg_Finish>http://ak.pipoffers.apnpartners.com/static/partners/SF1/images/accept.png</BtnBkg_Finish>
  163. <BtnBkg_Next>http://ak.pipoffers.apnpartners.com/static/partners/SF1/images/accept.png</BtnBkg_Next>
  164. <CancelHeight>34</CancelHeight>
  165. <CancelWidth>146</CancelWidth>
  166. <IsImageButton>true</IsImageButton>
  167. <NextHeight>34</NextHeight>
  168. <NextWidth>146</NextWidth>
  169. </GeneralParameters>
  170. <LanguageParameters>
  171. <ExecutingText id="default">STRID_ExeText</ExecutingText>
  172. <FailureText id="default">STRID_FAILURE</FailureText>
  173. <CancelContinue id="default">STRID_CContinue</CancelContinue>
  174. <CancelForce id="default">STRID_CForce</CancelForce>
  175. <WaitAndTerminate id="default">STRID_WaitAndTerminate</WaitAndTerminate>
  176. <Previous id="default">STRID_Previous</Previous>
  177. <Next id="default">STRID_Next</Next>
  178. <Finish id="default">STRID_Finish</Finish>
  179. <Cancel id="default">STRID_Cancel</Cancel>
  180. <CancelText id="default">STRID_Cancel_Text</CancelText>
  181. <EulaText id="default">STRID_Eula_Text</EulaText>
  182. <OptinText id="default">STRID_Optin_Text</OptinText>
  183. <DownloadingText id="default">STRID_Downloading_Text</DownloadingText>
  184. <NoOfferText id="default">No Offer Text</NoOfferText>
  185. <DownloadingError id="default">STRID_Downloading_Error</DownloadingError>
  186. <LoadingText id="default">STRID_Loading_Text</LoadingText>
  187. <LoadingTitle id="default">STRID_Loading_Title</LoadingTitle>
  188. <AnalyticsFail id="default">STRID_Access_Analytics_Fail</AnalyticsFail>
  189. <AccessConfigFail id="default">STRID_Access_Config_Fail</AccessConfigFail>
  190. <AccessOfferXmlFail id="default">STRID_Access_OfferXml_Fail</AccessOfferXmlFail>
  191. <OfferXmlMiss id="default">STRID_OfferXml_Miss</OfferXmlMiss>
  192. <UnexpectedDownLoadFail id="default">STRID_Unexpected_DownLoad_Fail</UnexpectedDownLoadFail>
  193. <CancelInstalling id="default">STRID_Cancel_Install_text</CancelInstalling>
  194. <CancelOptContinue id="default">STRID_Cancel_Continue</CancelOptContinue>
  195. <CancelOptForce id="default">STRID_Cancel_Force</CancelOptForce>
  196. <CancelOptWait id="default">STRID_Cancel_Wait</CancelOptWait>
  197. <Executingfile id="default">STRID_Executingfile</Executingfile>
  198. <BalloonText id="default">STRID_BallonText</BalloonText>
  199. <BalloonIconTitle id="default">STRID_BALLOONICONTITLE</BalloonIconTitle>
  200. <MessageBoxTitle id="default">STRID_MessageBoxTitle</MessageBoxTitle>
  201. <MESSAGE_BOX_ID_YES id="default">STRID_MESSAGE_ID_YES</MESSAGE_BOX_ID_YES>
  202. <MESSAGE_BOX_ID_NO id="default">STRID_MESSAGE_ID_NO</MESSAGE_BOX_ID_NO>
  203. </LanguageParameters>
  204. <stringtable>
  205. <language langid="en">
  206. <string id="STRID_CContinue">Continue</string>
  207. <string id="STRID_CForce">Force Cancel</string>
  208. <string id="STRID_Previous">Previous</string>
  209. <string id="STRID_Back">Back</string>
  210. <string id="STRID_Back_FXTV5">&lt; Back</string>
  211. <string id="STRID_Next">Next</string>
  212. <string id="STRID_Accept">Accept</string>
  213. <string id="STRID_Accept_BCPA">I Accept</string>
  214. <string id="STRID_Run">Run</string>
  215. <string id="STRID_Accept_Continue">Accept and Continue</string>
  216. <string id="STRID_Install_BCPA">Install</string>
  217. <string id="STRID_Accept_SFT">I Agree</string>
  218. <string id="STRID_Agree">Agree</string>
  219. <string id="STRID_Decline">Decline</string>
  220. <string id="STRID_Next_FXTV5">Next &gt;</string>
  221. <string id="STRID_Finish">Next</string>
  222. <string id="STRID_Finish2">Finish</string>
  223. <string id="STRID_Install">Install</string>
  224. <string id="STRID_OK">OK</string>
  225. <string id="STRID_Cancel">Cancel</string>
  226. <string id="STRID_IAgree">I Agree</string>
  227. <string id="STRID_Idisagree">I Disagree</string>
  228. <string id="STRID_Cancel_Text">Are you sure you want to cancel?</string>
  229. <string id="STRID_FXTV5_Cancel_Text">Setup is not complete. If you exit now, the program will not be installed. You may run Setup again another time to complete the installation. Exit Setup?</string>
  230. <string id="STRID_Success_Text">The installation has completed successfully.</string>
  231. <string id="STRID_Eula_Text">If you do not want to share technical information with ASK, please un_check and click Next</string>
  232. <string id="STRID_Optin_Text">By clicking 'NEXT', I agree to the</string>
  233. <string id="STRID_Downloading_Text">Downloading file</string>
  234. <string id="STRID_No_Offer_Text">There is a problem with the installer. Please contact your software provider and inform them of the issue.</string>
  235. <string id="STRID_Downloading_Error">There was a problem downloading the files. Please check that you have a valid Internet connection and try again.</string>
  236. <string id="STRID_Decline_TEST2">Cancel</string>
  237. <string id="STRID_Downloading_Error_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  238. <string id="STRID_DIC2V5_Loading_Text">Loading Dictionary.com required files...</string>
  239. <string id="STRID_DIC2V5_Loading_Title">Dictionary.com Setup</string>
  240. <string id="STRID_TEST2_Loading_Text">Loading Download.com required files...</string>
  241. <string id="STRID_TEST2_Loading_Title">Cnet Download.com Setup</string>
  242. <string id="STRID_DIC3V5_Loading_Text">Loading Dictionary.com required files...</string>
  243. <string id="STRID_DIC3V5_Loading_Title">Dictionary.com Setup</string>
  244. <string id="STRID_Loading_Text">Loading required files...</string>
  245. <string id="STRID_AD5_Loading_Text">Loading Avery Template Installer required files...</string>
  246. <string id="STRID_AD5_Loading_Title">Avery Template Installer</string>
  247. <string id="STRID_Loading_Title">Loading</string>
  248. <string id="STRID_Access_Analytics_Fail">There was a problem accessing the analytics file!</string>
  249. <string id="STRID_Access_Analytics_Fail_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  250. <string id="STRID_Access_Config_Fail">There was a problem accessing the config file!</string>
  251. <string id="STRID_Access_Config_Fail_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  252. <string id="STRID_Access_OfferXml_Fail">There was a problem accessing the offer definition file!</string>
  253. <string id="STRID_Access_OfferXml_Fail_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  254. <string id="STRID_OfferXml_Miss">The installation files have been corrupted. Please re-download the application and try again.</string>
  255. <string id="STRID_OfferXml_Miss_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  256. <string id="STRID_Unexpected_DownLoad_Fail">There was a problem downloading the files. Please check that you have a valid Internet connection and try again.</string>
  257. <string id="STRID_Unexpected_DownLoad_Fail_Avery">There was a problem downloading the files. Please try the Template Only option on the Avery.com template page.</string>
  258. <string id="STRID_Cancel_Install_text">Cancelling this process is not advised. You will need to uninstall via Add/Remove programs.</string>
  259. <string id="STRID_Executingfile">PIP Installing...</string>
  260. <string id="STRID_MESSAGE_ID_YES">OK</string>
  261. <string id="STRID_MESSAGE_ID_NO">Cancel</string>
  262. <string id="STRID_ExeText_CouponFinder">{PERCENT}%</string>
  263. <string id="STRID_DownloadingText_CouponFinder">{PERCENT}%</string>
  264. </language>
  265. </stringtable>
  266. <primary_offers>
  267.  
  268. <offer bkgImage="http://ak.pipoffers.apnpartners.com/static/partners/error.png" cancelX="0" cancelY="0" id="SF_error" imageheight="560" imagewidth="660" isMainOffer="false" nextBkg="http://ak.pipoffers.apnpartners.com/static/partners/SF1/images/finish.png" nextHeight="34" nextWidth="146" nextX="185" nextY="32" offerType="Static" optout="true" transparency="255">
  269. <apps>
  270. </apps>
  271. <controls>
  272.  
  273. </controls>
  274. </offer>
  275.  
  276. </primary_offers>
  277. </root>
  278. ===========================================================================
  279.  
  280. HTM/ORCHESTRATOR.HTML (The code was lifted perhaps from somewhere else. So much comments?)
  281. ===========================================================================
  282. <HTML>
  283. <HEAD>
  284. <script type="text/javascript">
  285.  
  286. var JSON;
  287. if (!JSON) {
  288. JSON = {};
  289. }
  290.  
  291. (function () {
  292. "use strict";
  293.  
  294. function f(n) {
  295. // Format integers to have at least two digits.
  296. return n < 10 ? '0' + n : n;
  297. }
  298.  
  299. if (typeof Date.prototype.toJSON !== 'function') {
  300.  
  301. Date.prototype.toJSON = function (key) {
  302.  
  303. return isFinite(this.valueOf()) ?
  304. this.getUTCFullYear() + '-' +
  305. f(this.getUTCMonth() + 1) + '-' +
  306. f(this.getUTCDate()) + 'T' +
  307. f(this.getUTCHours()) + ':' +
  308. f(this.getUTCMinutes()) + ':' +
  309. f(this.getUTCSeconds()) + 'Z' : null;
  310. };
  311.  
  312. String.prototype.toJSON =
  313. Number.prototype.toJSON =
  314. Boolean.prototype.toJSON = function (key) {
  315. return this.valueOf();
  316. };
  317. }
  318.  
  319. var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  320. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  321. gap,
  322. indent,
  323. meta = { // table of character substitutions
  324. '\b': '\\b',
  325. '\t': '\\t',
  326. '\n': '\\n',
  327. '\f': '\\f',
  328. '\r': '\\r',
  329. '"' : '\\"',
  330. '\\': '\\\\'
  331. },
  332. rep;
  333.  
  334.  
  335. function quote(string) {
  336.  
  337. // If the string contains no control characters, no quote characters, and no
  338. // backslash characters, then we can safely slap some quotes around it.
  339. // Otherwise we must also replace the offending characters with safe escape
  340. // sequences.
  341.  
  342. escapable.lastIndex = 0;
  343. return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
  344. var c = meta[a];
  345. return typeof c === 'string' ? c :
  346. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  347. }) + '"' : '"' + string + '"';
  348. }
  349.  
  350.  
  351. function str(key, holder) {
  352.  
  353. // Produce a string from holder[key].
  354.  
  355. var i, // The loop counter.
  356. k, // The member key.
  357. v, // The member value.
  358. length,
  359. mind = gap,
  360. partial,
  361. value = holder[key];
  362.  
  363. // If the value has a toJSON method, call it to obtain a replacement value.
  364.  
  365. if (value && typeof value === 'object' &&
  366. typeof value.toJSON === 'function') {
  367. value = value.toJSON(key);
  368. }
  369.  
  370. // If we were called with a replacer function, then call the replacer to
  371. // obtain a replacement value.
  372.  
  373. if (typeof rep === 'function') {
  374. value = rep.call(holder, key, value);
  375. }
  376.  
  377. // What happens next depends on the value's type.
  378.  
  379. switch (typeof value) {
  380. case 'string':
  381. return quote(value);
  382.  
  383. case 'number':
  384.  
  385. // JSON numbers must be finite. Encode non-finite numbers as null.
  386.  
  387. return isFinite(value) ? String(value) : 'null';
  388.  
  389. case 'boolean':
  390. case 'null':
  391.  
  392. // If the value is a boolean or null, convert it to a string. Note:
  393. // typeof null does not produce 'null'. The case is included here in
  394. // the remote chance that this gets fixed someday.
  395.  
  396. return String(value);
  397.  
  398. // If the type is 'object', we might be dealing with an object or an array or
  399. // null.
  400.  
  401. case 'object':
  402.  
  403. // Due to a specification blunder in ECMAScript, typeof null is 'object',
  404. // so watch out for that case.
  405.  
  406. if (!value) {
  407. return 'null';
  408. }
  409.  
  410. // Make an array to hold the partial results of stringifying this object value.
  411.  
  412. gap += indent;
  413. partial = [];
  414.  
  415. // Is the value an array?
  416.  
  417. if (Object.prototype.toString.apply(value) === '[object Array]') {
  418.  
  419. // The value is an array. Stringify every element. Use null as a placeholder
  420. // for non-JSON values.
  421.  
  422. length = value.length;
  423. for (i = 0; i < length; i += 1) {
  424. partial[i] = str(i, value) || 'null';
  425. }
  426.  
  427. // Join all of the elements together, separated with commas, and wrap them in
  428. // brackets.
  429.  
  430. v = partial.length === 0 ? '[]' : gap ?
  431. '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
  432. '[' + partial.join(',') + ']';
  433. gap = mind;
  434. return v;
  435. }
  436.  
  437. // If the replacer is an array, use it to select the members to be stringified.
  438.  
  439. if (rep && typeof rep === 'object') {
  440. length = rep.length;
  441. for (i = 0; i < length; i += 1) {
  442. if (typeof rep[i] === 'string') {
  443. k = rep[i];
  444. v = str(k, value);
  445. if (v) {
  446. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  447. }
  448. }
  449. }
  450. } else {
  451.  
  452. // Otherwise, iterate through all of the keys in the object.
  453.  
  454. for (k in value) {
  455. if (Object.prototype.hasOwnProperty.call(value, k)) {
  456. v = str(k, value);
  457. if (v) {
  458. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  459. }
  460. }
  461. }
  462. }
  463.  
  464. // Join all of the member texts together, separated with commas,
  465. // and wrap them in braces.
  466.  
  467. v = partial.length === 0 ? '{}' : gap ?
  468. '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
  469. '{' + partial.join(',') + '}';
  470. gap = mind;
  471. return v;
  472. }
  473. }
  474.  
  475. // If the JSON object does not yet have a stringify method, give it one.
  476.  
  477. if (typeof JSON.stringify !== 'function') {
  478. JSON.stringify = function (value, replacer, space) {
  479.  
  480. // The stringify method takes a value and an optional replacer, and an optional
  481. // space parameter, and returns a JSON text. The replacer can be a function
  482. // that can replace values, or an array of strings that will select the keys.
  483. // A default replacer method can be provided. Use of the space parameter can
  484. // produce text that is more easily readable.
  485.  
  486. var i;
  487. gap = '';
  488. indent = '';
  489.  
  490. // If the space parameter is a number, make an indent string containing that
  491. // many spaces.
  492.  
  493. if (typeof space === 'number') {
  494. for (i = 0; i < space; i += 1) {
  495. indent += ' ';
  496. }
  497.  
  498. // If the space parameter is a string, it will be used as the indent string.
  499.  
  500. } else if (typeof space === 'string') {
  501. indent = space;
  502. }
  503.  
  504. // If there is a replacer, it must be a function or an array.
  505. // Otherwise, throw an error.
  506.  
  507. rep = replacer;
  508. if (replacer && typeof replacer !== 'function' &&
  509. (typeof replacer !== 'object' ||
  510. typeof replacer.length !== 'number')) {
  511. throw new Error('JSON.stringify');
  512. }
  513.  
  514. // Make a fake root object containing our value under the key of ''.
  515. // Return the result of stringifying the value.
  516.  
  517. return str('', {'': value});
  518. };
  519. }
  520.  
  521.  
  522. // If the JSON object does not yet have a parse method, give it one.
  523.  
  524. if (typeof JSON.parse !== 'function') {
  525. JSON.parse = function (text, reviver) {
  526.  
  527. // The parse method takes a text and an optional reviver function, and returns
  528. // a JavaScript value if the text is a valid JSON text.
  529.  
  530. var j;
  531.  
  532. function walk(holder, key) {
  533.  
  534. // The walk method is used to recursively walk the resulting structure so
  535. // that modifications can be made.
  536.  
  537. var k, v, value = holder[key];
  538. if (value && typeof value === 'object') {
  539. for (k in value) {
  540. if (Object.prototype.hasOwnProperty.call(value, k)) {
  541. v = walk(value, k);
  542. if (v !== undefined) {
  543. value[k] = v;
  544. } else {
  545. delete value[k];
  546. }
  547. }
  548. }
  549. }
  550. return reviver.call(holder, key, value);
  551. }
  552.  
  553.  
  554. // Parsing happens in four stages. In the first stage, we replace certain
  555. // Unicode characters with escape sequences. JavaScript handles many characters
  556. // incorrectly, either silently deleting them, or treating them as line endings.
  557.  
  558. text = String(text);
  559. cx.lastIndex = 0;
  560. if (cx.test(text)) {
  561. text = text.replace(cx, function (a) {
  562. return '\\u' +
  563. ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  564. });
  565. }
  566.  
  567. // In the second stage, we run the text against regular expressions that look
  568. // for non-JSON patterns. We are especially concerned with '()' and 'new'
  569. // because they can cause invocation, and '=' because it can cause mutation.
  570. // But just to be safe, we want to reject all unexpected forms.
  571.  
  572. // We split the second stage into 4 regexp operations in order to work around
  573. // crippling inefficiencies in IE's and Safari's regexp engines. First we
  574. // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
  575. // replace all simple value tokens with ']' characters. Third, we delete all
  576. // open brackets that follow a colon or comma or that begin the text. Finally,
  577. // we look to see that the remaining characters are only whitespace or ']' or
  578. // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
  579.  
  580. if (/^[\],:{}\s]*$/
  581. .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
  582. .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
  583. .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
  584.  
  585. // In the third stage we use the eval function to compile the text into a
  586. // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
  587. // in JavaScript: it can begin a block or an object literal. We wrap the text
  588. // in parens to eliminate the ambiguity.
  589.  
  590. j = eval('(' + text + ')');
  591.  
  592. // In the optional fourth stage, we recursively walk the new structure, passing
  593. // each name/value pair to a reviver function for possible transformation.
  594.  
  595. return typeof reviver === 'function' ?
  596. walk({'': j}, '') : j;
  597. }
  598.  
  599. // If the text is not JSON parseable, then a SyntaxError is thrown.
  600.  
  601. throw new SyntaxError('JSON.parse');
  602. };
  603. }
  604. }());
  605.  
  606. </script>
  607. <script type="text/javascript" src="./objectModel.js"></script>
  608. <script type="text/javascript" src="./rules.js"></script>
  609. <script type="text/javascript">
  610. var primaryTlbrID = getURLParameters("PTBPartnerID");
  611. var satTlbrID = getURLParameters("STBPartnerID");
  612. var pipPartnerID = getURLParameters("PIPPID");
  613. var tbType=getURLParameters("tbType");
  614. var version=getURLParameters("version");
  615. var hidePtnrSecondaryOffer=getURLParameters("hideSecondary");
  616. var paramName;
  617.  
  618. function getURLParameters(paramName)
  619. {
  620.  
  621. var sURL = window.document.URL.toString();
  622. if (sURL.indexOf("?") > 0)
  623. {
  624. var arrParams = sURL.split("?");
  625. var arrURLParams = arrParams[1].split("&");
  626. var arrParamNames = new Array(arrURLParams.length);
  627. var arrParamValues = new Array(arrURLParams.length);
  628. var i = 0;
  629. for (i=0;i<arrURLParams.length;i++)
  630. {
  631. var sParam = arrURLParams[i].split("=");
  632. arrParamNames[i] = sParam[0];
  633. if (sParam[1] != "")
  634. arrParamValues[i] = unescape(sParam[1]);
  635. else
  636. arrParamValues[i] = "No Value";
  637. }
  638. for (i=0;i<arrURLParams.length;i++)
  639. {
  640. if(arrParamNames[i] == paramName){
  641. return arrParamValues[i];
  642. }
  643. }
  644. return "No Parameters Found";
  645. }
  646. return "";
  647. }
  648.  
  649. </script>
  650. <SCRIPT type="text/javascript">
  651. init();
  652. function load() {
  653. try{
  654. piprule.setRuleCallback(
  655. function(ruleName){
  656. try{
  657. logger.log("\r\n ****** pirule setRule callBackFired : function called is " + "Rule name: " + ruleName + "Number: " + arguments.length);
  658. var params = Array.prototype.slice.call(arguments, 1);
  659. return window[ruleName].apply(this, params);
  660. }
  661. catch(e)
  662. {
  663. logger.log("\r\n ****** inside load " + e.message + " Rule name: " + ruleName);
  664.  
  665. }
  666. }
  667. );
  668. } catch(e) {
  669. logger.log("\r\n ****** Load Function Error " + e.message);
  670. }
  671. }
  672. </SCRIPT>
  673. </HEAD>
  674. <BODY onload="load()">
  675. </BODY>
  676. </HTML>
  677.  
  678. JAVASCRIPT/JSON.HTML
  679. (They forgot to minify! Of course, I can excuse them, since top programmers hardly make adware.)
  680. ===========================================================================
  681. /*
  682. http://www.JSON.org/json2.js
  683. 2011-02-23
  684.  
  685. Public Domain.
  686.  
  687. NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
  688.  
  689. See http://www.JSON.org/js.html
  690.  
  691.  
  692. This code should be minified before deployment.
  693. See http://javascript.crockford.com/jsmin.html
  694.  
  695. USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
  696. NOT CONTROL.
  697.  
  698.  
  699. This file creates a global JSON object containing two methods: stringify
  700. and parse.
  701.  
  702. JSON.stringify(value, replacer, space)
  703. value any JavaScript value, usually an object or array.
  704.  
  705. replacer an optional parameter that determines how object
  706. values are stringified for objects. It can be a
  707. function or an array of strings.
  708.  
  709. space an optional parameter that specifies the indentation
  710. of nested structures. If it is omitted, the text will
  711. be packed without extra whitespace. If it is a number,
  712. it will specify the number of spaces to indent at each
  713. level. If it is a string (such as '\t' or '&nbsp;'),
  714. it contains the characters used to indent at each level.
  715.  
  716. This method produces a JSON text from a JavaScript value.
  717.  
  718. When an object value is found, if the object contains a toJSON
  719. method, its toJSON method will be called and the result will be
  720. stringified. A toJSON method does not serialize: it returns the
  721. value represented by the name/value pair that should be serialized,
  722. or undefined if nothing should be serialized. The toJSON method
  723. will be passed the key associated with the value, and this will be
  724. bound to the value
  725.  
  726. For example, this would serialize Dates as ISO strings.
  727.  
  728. Date.prototype.toJSON = function (key) {
  729. function f(n) {
  730. // Format integers to have at least two digits.
  731. return n < 10 ? '0' + n : n;
  732. }
  733.  
  734. return this.getUTCFullYear() + '-' +
  735. f(this.getUTCMonth() + 1) + '-' +
  736. f(this.getUTCDate()) + 'T' +
  737. f(this.getUTCHours()) + ':' +
  738. f(this.getUTCMinutes()) + ':' +
  739. f(this.getUTCSeconds()) + 'Z';
  740. };
  741.  
  742. You can provide an optional replacer method. It will be passed the
  743. key and value of each member, with this bound to the containing
  744. object. The value that is returned from your method will be
  745. serialized. If your method returns undefined, then the member will
  746. be excluded from the serialization.
  747.  
  748. If the replacer parameter is an array of strings, then it will be
  749. used to select the members to be serialized. It filters the results
  750. such that only members with keys listed in the replacer array are
  751. stringified.
  752.  
  753. Values that do not have JSON representations, such as undefined or
  754. functions, will not be serialized. Such values in objects will be
  755. dropped; in arrays they will be replaced with null. You can use
  756. a replacer function to replace those with JSON values.
  757. JSON.stringify(undefined) returns undefined.
  758.  
  759. The optional space parameter produces a stringification of the
  760. value that is filled with line breaks and indentation to make it
  761. easier to read.
  762.  
  763. If the space parameter is a non-empty string, then that string will
  764. be used for indentation. If the space parameter is a number, then
  765. the indentation will be that many spaces.
  766.  
  767. Example:
  768.  
  769. text = JSON.stringify(['e', {pluribus: 'unum'}]);
  770. // text is '["e",{"pluribus":"unum"}]'
  771.  
  772.  
  773. text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
  774. // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
  775.  
  776. text = JSON.stringify([new Date()], function (key, value) {
  777. return this[key] instanceof Date ?
  778. 'Date(' + this[key] + ')' : value;
  779. });
  780. // text is '["Date(---current time---)"]'
  781.  
  782.  
  783. JSON.parse(text, reviver)
  784. This method parses a JSON text to produce an object or array.
  785. It can throw a SyntaxError exception.
  786.  
  787. The optional reviver parameter is a function that can filter and
  788. transform the results. It receives each of the keys and values,
  789. and its return value is used instead of the original value.
  790. If it returns what it received, then the structure is not modified.
  791. If it returns undefined then the member is deleted.
  792.  
  793. Example:
  794.  
  795. // Parse the text. Values that look like ISO date strings will
  796. // be converted to Date objects.
  797.  
  798. myData = JSON.parse(text, function (key, value) {
  799. var a;
  800. if (typeof value === 'string') {
  801. a =
  802. /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
  803. if (a) {
  804. return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
  805. +a[5], +a[6]));
  806. }
  807. }
  808. return value;
  809. });
  810.  
  811. myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
  812. var d;
  813. if (typeof value === 'string' &&
  814. value.slice(0, 5) === 'Date(' &&
  815. value.slice(-1) === ')') {
  816. d = new Date(value.slice(5, -1));
  817. if (d) {
  818. return d;
  819. }
  820. }
  821. return value;
  822. });
  823.  
  824.  
  825. This is a reference implementation. You are free to copy, modify, or
  826. redistribute.
  827. */
  828.  
  829. /*jslint evil: true, strict: false, regexp: false */
  830.  
  831. /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
  832. call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
  833. getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
  834. lastIndex, length, parse, prototype, push, replace, slice, stringify,
  835. test, toJSON, toString, valueOf
  836. */
  837.  
  838.  
  839. // Create a JSON object only if one does not already exist. We create the
  840. // methods in a closure to avoid creating global variables.
  841.  
  842. var JSON;
  843. if (!JSON) {
  844. JSON = {};
  845. }
  846.  
  847. (function () {
  848. "use strict";
  849.  
  850. function f(n) {
  851. // Format integers to have at least two digits.
  852. return n < 10 ? '0' + n : n;
  853. }
  854.  
  855. if (typeof Date.prototype.toJSON !== 'function') {
  856.  
  857. Date.prototype.toJSON = function (key) {
  858.  
  859. return isFinite(this.valueOf()) ?
  860. this.getUTCFullYear() + '-' +
  861. f(this.getUTCMonth() + 1) + '-' +
  862. f(this.getUTCDate()) + 'T' +
  863. f(this.getUTCHours()) + ':' +
  864. f(this.getUTCMinutes()) + ':' +
  865. f(this.getUTCSeconds()) + 'Z' : null;
  866. };
  867.  
  868. String.prototype.toJSON =
  869. Number.prototype.toJSON =
  870. Boolean.prototype.toJSON = function (key) {
  871. return this.valueOf();
  872. };
  873. }
  874.  
  875. var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  876. escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
  877. gap,
  878. indent,
  879. meta = { // table of character substitutions
  880. '\b': '\\b',
  881. '\t': '\\t',
  882. '\n': '\\n',
  883. '\f': '\\f',
  884. '\r': '\\r',
  885. '"' : '\\"',
  886. '\\': '\\\\'
  887. },
  888. rep;
  889.  
  890.  
  891. function quote(string) {
  892.  
  893. // If the string contains no control characters, no quote characters, and no
  894. // backslash characters, then we can safely slap some quotes around it.
  895. // Otherwise we must also replace the offending characters with safe escape
  896. // sequences.
  897.  
  898. escapable.lastIndex = 0;
  899. return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
  900. var c = meta[a];
  901. return typeof c === 'string' ? c :
  902. '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  903. }) + '"' : '"' + string + '"';
  904. }
  905.  
  906.  
  907. function str(key, holder) {
  908.  
  909. // Produce a string from holder[key].
  910.  
  911. var i, // The loop counter.
  912. k, // The member key.
  913. v, // The member value.
  914. length,
  915. mind = gap,
  916. partial,
  917. value = holder[key];
  918.  
  919. // If the value has a toJSON method, call it to obtain a replacement value.
  920.  
  921. if (value && typeof value === 'object' &&
  922. typeof value.toJSON === 'function') {
  923. value = value.toJSON(key);
  924. }
  925.  
  926. // If we were called with a replacer function, then call the replacer to
  927. // obtain a replacement value.
  928.  
  929. if (typeof rep === 'function') {
  930. value = rep.call(holder, key, value);
  931. }
  932.  
  933. // What happens next depends on the value's type.
  934.  
  935. switch (typeof value) {
  936. case 'string':
  937. return quote(value);
  938.  
  939. case 'number':
  940.  
  941. // JSON numbers must be finite. Encode non-finite numbers as null.
  942.  
  943. return isFinite(value) ? String(value) : 'null';
  944.  
  945. case 'boolean':
  946. case 'null':
  947.  
  948. // If the value is a boolean or null, convert it to a string. Note:
  949. // typeof null does not produce 'null'. The case is included here in
  950. // the remote chance that this gets fixed someday.
  951.  
  952. return String(value);
  953.  
  954. // If the type is 'object', we might be dealing with an object or an array or
  955. // null.
  956.  
  957. case 'object':
  958.  
  959. // Due to a specification blunder in ECMAScript, typeof null is 'object',
  960. // so watch out for that case.
  961.  
  962. if (!value) {
  963. return 'null';
  964. }
  965.  
  966. // Make an array to hold the partial results of stringifying this object value.
  967.  
  968. gap += indent;
  969. partial = [];
  970.  
  971. // Is the value an array?
  972.  
  973. if (Object.prototype.toString.apply(value) === '[object Array]') {
  974.  
  975. // The value is an array. Stringify every element. Use null as a placeholder
  976. // for non-JSON values.
  977.  
  978. length = value.length;
  979. for (i = 0; i < length; i += 1) {
  980. partial[i] = str(i, value) || 'null';
  981. }
  982.  
  983. // Join all of the elements together, separated with commas, and wrap them in
  984. // brackets.
  985.  
  986. v = partial.length === 0 ? '[]' : gap ?
  987. '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
  988. '[' + partial.join(',') + ']';
  989. gap = mind;
  990. return v;
  991. }
  992.  
  993. // If the replacer is an array, use it to select the members to be stringified.
  994.  
  995. if (rep && typeof rep === 'object') {
  996. length = rep.length;
  997. for (i = 0; i < length; i += 1) {
  998. if (typeof rep[i] === 'string') {
  999. k = rep[i];
  1000. v = str(k, value);
  1001. if (v) {
  1002. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  1003. }
  1004. }
  1005. }
  1006. } else {
  1007.  
  1008. // Otherwise, iterate through all of the keys in the object.
  1009.  
  1010. for (k in value) {
  1011. if (Object.prototype.hasOwnProperty.call(value, k)) {
  1012. v = str(k, value);
  1013. if (v) {
  1014. partial.push(quote(k) + (gap ? ': ' : ':') + v);
  1015. }
  1016. }
  1017. }
  1018. }
  1019.  
  1020. // Join all of the member texts together, separated with commas,
  1021. // and wrap them in braces.
  1022.  
  1023. v = partial.length === 0 ? '{}' : gap ?
  1024. '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
  1025. '{' + partial.join(',') + '}';
  1026. gap = mind;
  1027. return v;
  1028. }
  1029. }
  1030.  
  1031. // If the JSON object does not yet have a stringify method, give it one.
  1032.  
  1033. if (typeof JSON.stringify !== 'function') {
  1034. JSON.stringify = function (value, replacer, space) {
  1035.  
  1036. // The stringify method takes a value and an optional replacer, and an optional
  1037. // space parameter, and returns a JSON text. The replacer can be a function
  1038. // that can replace values, or an array of strings that will select the keys.
  1039. // A default replacer method can be provided. Use of the space parameter can
  1040. // produce text that is more easily readable.
  1041.  
  1042. var i;
  1043. gap = '';
  1044. indent = '';
  1045.  
  1046. // If the space parameter is a number, make an indent string containing that
  1047. // many spaces.
  1048.  
  1049. if (typeof space === 'number') {
  1050. for (i = 0; i < space; i += 1) {
  1051. indent += ' ';
  1052. }
  1053.  
  1054. // If the space parameter is a string, it will be used as the indent string.
  1055.  
  1056. } else if (typeof space === 'string') {
  1057. indent = space;
  1058. }
  1059.  
  1060. // If there is a replacer, it must be a function or an array.
  1061. // Otherwise, throw an error.
  1062.  
  1063. rep = replacer;
  1064. if (replacer && typeof replacer !== 'function' &&
  1065. (typeof replacer !== 'object' ||
  1066. typeof replacer.length !== 'number')) {
  1067. throw new Error('JSON.stringify');
  1068. }
  1069.  
  1070. // Make a fake root object containing our value under the key of ''.
  1071. // Return the result of stringifying the value.
  1072.  
  1073. return str('', {'': value});
  1074. };
  1075. }
  1076.  
  1077.  
  1078. // If the JSON object does not yet have a parse method, give it one.
  1079.  
  1080. if (typeof JSON.parse !== 'function') {
  1081. JSON.parse = function (text, reviver) {
  1082.  
  1083. // The parse method takes a text and an optional reviver function, and returns
  1084. // a JavaScript value if the text is a valid JSON text.
  1085.  
  1086. var j;
  1087.  
  1088. function walk(holder, key) {
  1089.  
  1090. // The walk method is used to recursively walk the resulting structure so
  1091. // that modifications can be made.
  1092.  
  1093. var k, v, value = holder[key];
  1094. if (value && typeof value === 'object') {
  1095. for (k in value) {
  1096. if (Object.prototype.hasOwnProperty.call(value, k)) {
  1097. v = walk(value, k);
  1098. if (v !== undefined) {
  1099. value[k] = v;
  1100. } else {
  1101. delete value[k];
  1102. }
  1103. }
  1104. }
  1105. }
  1106. return reviver.call(holder, key, value);
  1107. }
  1108.  
  1109.  
  1110. // Parsing happens in four stages. In the first stage, we replace certain
  1111. // Unicode characters with escape sequences. JavaScript handles many characters
  1112. // incorrectly, either silently deleting them, or treating them as line endings.
  1113.  
  1114. text = String(text);
  1115. cx.lastIndex = 0;
  1116. if (cx.test(text)) {
  1117. text = text.replace(cx, function (a) {
  1118. return '\\u' +
  1119. ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
  1120. });
  1121. }
  1122.  
  1123. // In the second stage, we run the text against regular expressions that look
  1124. // for non-JSON patterns. We are especially concerned with '()' and 'new'
  1125. // because they can cause invocation, and '=' because it can cause mutation.
  1126. // But just to be safe, we want to reject all unexpected forms.
  1127.  
  1128. // We split the second stage into 4 regexp operations in order to work around
  1129. // crippling inefficiencies in IE's and Safari's regexp engines. First we
  1130. // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
  1131. // replace all simple value tokens with ']' characters. Third, we delete all
  1132. // open brackets that follow a colon or comma or that begin the text. Finally,
  1133. // we look to see that the remaining characters are only whitespace or ']' or
  1134. // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
  1135.  
  1136. if (/^[\],:{}\s]*$/
  1137. .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
  1138. .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
  1139. .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
  1140.  
  1141. // In the third stage we use the eval function to compile the text into a
  1142. // JavaScript structure. The '{' operator is subject to a syntactic ambiguity
  1143. // in JavaScript: it can begin a block or an object literal. We wrap the text
  1144. // in parens to eliminate the ambiguity.
  1145.  
  1146. j = eval('(' + text + ')');
  1147.  
  1148. // In the optional fourth stage, we recursively walk the new structure, passing
  1149. // each name/value pair to a reviver function for possible transformation.
  1150.  
  1151. return typeof reviver === 'function' ?
  1152. walk({'': j}, '') : j;
  1153. }
  1154.  
  1155. // If the text is not JSON parseable, then a SyntaxError is thrown.
  1156.  
  1157. throw new SyntaxError('JSON.parse');
  1158. };
  1159. }
  1160. }());
  1161. ===========================================================================
  1162.  
  1163. JAVASCRIPT/OBJECTMODEL.JS
  1164. ===========================================================================
  1165.  
  1166. var objectModel = {};
  1167. objectModel.initialized = false;
  1168.  
  1169. function init() {
  1170. if (objectModel.initialized === false && typeof window !== "undefined" &&
  1171. typeof window.external !== "undefined") {
  1172.  
  1173. logger = {};
  1174. _logger = window.external.GetObject("logger");
  1175.  
  1176.  
  1177. try {
  1178. logger.log = function(var1) {
  1179. return _logger.log(var1);
  1180. };
  1181. logger.error = function(var1) {
  1182. return _logger.error(var1);
  1183. };
  1184. logger.debug = function(var1) {
  1185. return _logger.debug(var1);
  1186. };
  1187. logger.info = function(var1) {
  1188. return _logger.info(var1);
  1189. };
  1190. logger.warn = function(var1) {
  1191. return _logger.warn(var1);
  1192. };
  1193. logger.group = function(var1) {
  1194. return _logger.group(var1);
  1195. };
  1196. logger.dir = function(var1) {
  1197. return _logger.dir(var1);
  1198. };
  1199. } catch (x) {
  1200. logger.error(x);
  1201. }
  1202.  
  1203. browser = window.external.GetObject("browserinfo");
  1204. system = window.external.GetObject("system");
  1205. piprule = window.external.GetObject("piprule");
  1206. pipclient = window.external.GetObject("pipclient");
  1207.  
  1208. }
  1209. };
  1210. ===========================================================================
  1211.  
  1212. JAVASCRIPT/RULES.JS
  1213. (Hardcoded list of offers, and even maximum limits as to how many toolbars can be installed. Also, it collects data about what is installed.)
  1214. ===========================================================================
  1215. var regsistryPathx64 = "HKEY_LOCAL_MACHINE\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\";
  1216. var registryPathx86 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\";
  1217. var checkObj;
  1218. var n;
  1219. var registryPath;
  1220. var regValue="";
  1221. var partnerID;
  1222. var v5toolbarOffered = false;
  1223. var v6SaturationToolbarOfferFlag = false;
  1224. var overinstallFlag=false;
  1225. var reasonString="";
  1226. var showSecondaryOffer=true;
  1227. var defBrowser="";
  1228. var FIREFOX="firefox";
  1229. var IE="Internet Explorer";
  1230. var CHROME="Google Chrome";
  1231. var offerAviraV6NewInstall = false;
  1232. var primaryToolbarOfferFlag=false;
  1233.  
  1234. var v5ToolbarInstalled = "1:Offer cannot be installed as offer already exists";
  1235. var V6OfferAlreadyPresentWithSamePartnerID = "1:V6 Offer already present with same partnerID";
  1236. var unsupportedBrowser = "2:Unsupported default browser";
  1237. var IneligibleChrome = "3:Ineligible Chrome";
  1238. var v6SatInstalled = "4:Prior toolbar typet (Shopping)";
  1239. var PriorToolbarType_Vanilla_SecureVanilla = "4:Prior toolbar type(Vanilla)/Secure Vanilla ";
  1240. var blocklistedPartner = "5:Block V6 ? New toolbar listed in the block list";
  1241. var BlockListV6IncumbentToolbarIsListedInLockList = "6:Block list v6 - incumbent toolbar is listed as block list ";
  1242. var v5Offerpresented = "7:Saturation offer was not made because primary offer was made";
  1243. var SideBySideLimitExceeded = "8:Side by side limit exceeded";
  1244. var secondaryOfferRejected = "9:Secondary offer rejected as Primary or Saturation offer was made";
  1245. var precheckSecondary = "10:Secondary offer rejected as Manycam Saturation offer was made";
  1246. var secondaryOfferInstalled = "11:Secondary Offer was not made as offer already exists";
  1247. var UnsupportedOSXP64bit = "11:Unsupported OS XP 64 bit";
  1248.  
  1249. var XPServicePackNotCompatible = "13:XP Service Pack not compatible ";
  1250. var CPUSpeedLessThan1000MHZ = "14:CPU speed less than 1000 MHZ ";;
  1251. var MachineDiskFreeSpaceLessThan2000MB = "15:64 bit machine Disk free space less than 2000MB ";
  1252. var MachineDiskFreeSpaceLessThan850MB = "16:32 bit machine Disk free space less than 850MB ";
  1253. var SystemPhysicalMemoryIsVeryLow = "17:System Physical Memory is very low";
  1254. var NortonSafeSearchToolbarInstalled = "17:Norton Safe search Toolbar installed";
  1255. var AnchorFreeUnsupportedOS = "18: AnchorFree unsupported OS XP or Vista 64bit ";
  1256. var AviraToolbarPresentAskSecureOfferRejected = "19: Avira Toolbar present, Ask secure offer rejected";
  1257. var AskSecureToolbarPresentAviraOfferRejected = "20:Ask Secure toolbar present, Avira offer rejected";
  1258. var AudialsOfferNotEligibleUnsupportedOSXP32orVista64bit = "20: Audials offer not eligible as unsupported OS XP 32 or Vista 64 bit";
  1259. var AviraV6InstallOfferPresentedAviraV6UpgradeRejected = "21:Avira V6 new Install offer presented, Avira V6 Upgrade rejected";
  1260. var AviraV6InstallOfferRejectedAviraV6UpgradeOfferPresented = "22:Avira V6 new Install offer rejected, Avira V6 Upgrade Offer/Ask Secure Offer presented";
  1261. var PrimaryToolbarOfferPresentedDefaultPrimaryOfferRejected = "23:Primary Toolbar Offer presented, The default primary offer rejected";
  1262. var OldClientAskSecureOfferNotSupported = "24:Old Client AskSecure offer not supported";
  1263.  
  1264. var maxNumberOfPartnersExceeded = "25:Maximum Number of Unique Partners Already Exists";
  1265. var tbtypeOfBlockPIDNotEqual = "26:A Toolbar Type is of type block, PIDs are NOT equal";
  1266. var inputBrowserTypeNotSupported = "27:Input Browser Type is NOT Supported";
  1267. var inputIEBrowserVersionNotSupported = "28:IE Browser Version Is NOT Supported";
  1268. var inputCRBrowserVersionNotSupported = "29:CR Browser Version Is NOT Supported";
  1269. var inputFFBrowserVersionNotSupported = "30:FF Browser Version Is NOT Supported";
  1270. var PIDsAreSameOnSameBrowser = "31:PIDs Are the Same, On the Same Browser";
  1271. var toolbarTypeCollision = "32:On the Same Browser, Toolbar Types Collide";
  1272. var PIDIsOnBlockedList = "33:PID is on Block List"
  1273. var AlreadyAtMaxNumberOfPartnersPerBrowser = "34:Already At Maximum Number of Partners Per Browser";
  1274. var uniquePIDTbType = "35:Toolbar Type is already owned by PID";
  1275.  
  1276. var jsonString={
  1277. "blocklistedPartners": ["FTB","FTB4","OVO2","WCL2","WCL3"],
  1278. "makeofferdisabled": [
  1279. "WCL2","ACDS","ADS","AF3-SRS","AGH","ALSV5-DL","AM2","AM3","AMG","APLV5","APL1V5","APL2V5","ATR","ATU","ATU-DL","ATU-ASK","ATU-QBD","ATU-SRS","AXBX","BBY","BBY-SRS","BBY2","BBY2-SRS","BCC","BCPAP","BUD","BLP-DL","BGM","BOO","BOO2","BS","BT-SRS-T3","BT-T1","BT-T2","BT-T3","BT-ASK-T4","BUD","BW","C2P","CCS","CDS","CDS2","CDS3","CDS4","CEBV5","CFTPV5","CFTP2V5","CIE","CLA","CLM-DL","CNB","CNET","CNET2","CNET3","CPUID-DL","CPUID-ST","CS","CS-ST","CS2","CS3","CWN","DAT","DDI","DDIS","DDIS2","DGY","DIG-A","DIG-N","DIG-OFF","DIG-ON","DIG-P","DIG-S","DNA","DNA2","DPO","DVDX","DVDX2","EAC","F-CT","F-ET","FAC","FF2-DL","FJS","FKR","FLV","FM","FTB","FTB2","FTB3","FW-ASK","FW-QBD","FW-SRS","FWT","FW2V5","FXTV5-DL","GAM4","GAM-ASK-T4","GAM-SRS","GAM-SRS-T3","GAM-QBD","GAM-T1","GAM-T2","GAM-T3","GET-SRS","GET2-SRS","GET3-SRS","GGSV5","GGSV5-DL","GOM","GYG","HIY-SRS","HULU","ICM-SRS","IEAK9","IMB","IMB-DL","IMT","JDR","JMYV5","KG-ASK","KYT","LMW","LMW2","LMW3","LMW4","LMW-BETA","LMW-BETA2","LOL","LPLV5","LUC","MDG","MEB","MGN","MGX","MMB","MMG","MOV","MOV-DL","MP3","MP3DS","MP3FB","MP3P2","MP3R-ASK","MP3R-DL","MP3R-QBD","MP3R-SRS","MP3R4","MP3R5","MP3R6","MP3SF","MP3SW","MP3TR","MP3SD","MPC","MPC2","MROV5","MYC","MYC-ASK","MYC-DL","MYC-SRS","MYC-QBD","NG1V5","NG2V5","NG3V5","NG4V5","NSC-S","NSC-O","NSC-E","NSC-P","NSC-A","NSC-N","NSC-NS","NR1V5","NRV5","NXZ","ORJ-SAT","ORJ2","ORJ2-SAT","OSUB","OTV5","OVO","PCH","PDF","PDF2","PDO","PFN","PLF3","PLF4","PLTV5","PLTV5-DL","PLTV5-DL2","POS","POS2","PTF","PTJ","PTV2","PTV2-DL","PTV5","QSYS","RAD","S99","SBES","SCV5","SDT","SE","SF","SKR","SNAPT","SNP-ST","SP","SP2","SPC","SPT","SRFV5","SS2V5","SS3V5","STC2","STC4","STC-SRS","STC2-SRS","STC3-SRS","STC4-SRS","STK","STK2","STK3","STK4","TEMU","THE","TKR","TM","TMN2","TTB","TTR","TVTYV5","UKT","UNI","URS","VDJ","VRS","VD","VD-DL","VZ3","WBG-DL","WBG-ST","WBM2","WBV5-DL","WCL","WCLV5","WCL2V5","WCR","WCV5","WME","WSV5","WZP","YLC","ZMR","ZTV","ZTV-DL","FBK","FB-BETA","FB-PRO","FB-APP","FB-ASK","FB-OD","FB-SEM","MDF","MDF-BETA","NRO","NRO2","NRO3","UTR","UTR2","WID","WID-BETA"]}
  1280.  
  1281. function cmpVersions (a, b) {
  1282. var i, l, d;
  1283.  
  1284. a = a.split('.');
  1285. b = b.split('.');
  1286. l = Math.min(a.length, b.length);
  1287.  
  1288. for (i=0; i<l; i++) {
  1289. d = parseInt(a[i], 10) - parseInt(b[i], 10);
  1290. if (d !== 0) {
  1291. return d;
  1292. }
  1293. }
  1294.  
  1295. return a.length - b.length;
  1296. }
  1297.  
  1298. function isLatestClient(clientversion) {
  1299. try{
  1300. var versionresult=cmpVersions(clientversion,"2.6.8.0");
  1301. if(versionresult >= 0){
  1302. return true;
  1303. }
  1304. }catch(e){
  1305. }
  1306. return false;
  1307. }
  1308.  
  1309. function is64Bit(){
  1310. if(window.navigator.userAgent.indexOf('WOW64')>-1 || window.navigator.platform=='Win64')
  1311. return true;
  1312. else
  1313. return false;
  1314.  
  1315. }
  1316.  
  1317. function isSupportedOS() {
  1318. try {
  1319. if (window.navigator.appVersion.indexOf("Windows NT 5.1") != -1 || window.navigator.appVersion.indexOf("Windows NT 5.2") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.0") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.1") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.2") != -1 ) {
  1320. return true
  1321. }
  1322. } catch(e)
  1323. {
  1324. }
  1325. return false;
  1326. }
  1327.  
  1328. function makeoffer(partnerID) {
  1329. try {
  1330. for (var i=0; i < jsonString.makeofferdisabled.length; i++) {
  1331. if(partnerID == jsonString.makeofferdisabled[i]){
  1332. unsupportedBrowser = IneligibleChrome;
  1333. return false;
  1334. }
  1335. }
  1336. } catch(e)
  1337. {
  1338. }
  1339. return true;
  1340. }
  1341.  
  1342. function isEmpty (checkObj) {
  1343. var key;
  1344. if (checkObj === "" || checkObj === 0 || checkObj === "0" || checkObj === null || checkObj === false || typeof checkObj === 'undefined') {
  1345. return true;
  1346. }
  1347. if (typeof checkObj == 'object') {
  1348. for (key in checkObj) {
  1349. return false;
  1350. }
  1351. return true;
  1352. }
  1353. return false;
  1354. }
  1355.  
  1356. function getIncumbentPartners() {
  1357. var incumbentPartners;
  1358. var incumbentPartnerIDs="";
  1359. try {
  1360. if(is64Bit()){
  1361. incumbentPartners = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\AskPartnerNetwork\\Toolbar\\shared\\","tbsinstalled",0);
  1362. }else{
  1363. incumbentPartners = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\AskPartnerNetwork\\Toolbar\\shared\\","tbsinstalled",0);
  1364. }
  1365. if(isEmpty(incumbentPartners)){
  1366. return incumbentPartnerIDs;
  1367. }
  1368. incumbentPartnerIDs = incumbentPartners.split(",");
  1369. }catch (e)
  1370. {
  1371. }
  1372. return incumbentPartnerIDs;
  1373. }
  1374.  
  1375. function isBlockListed(tlbrID) {
  1376. try {
  1377. for(var j=0; j<jsonString.blocklistedPartners.length;j++){
  1378. if(tlbrID == jsonString.blocklistedPartners[j]) {
  1379. return true;
  1380. }
  1381. }
  1382. } catch (e)
  1383. {
  1384. }
  1385. return false;
  1386. }
  1387.  
  1388. function getReasonCode(reasonDescription) {
  1389. if(isLatestClient(version)) return reasonDescription;
  1390. return false;
  1391. }
  1392.  
  1393. function v6eligibleChecklist(partnerID,incPartners){
  1394. try{
  1395. var incumbentTbType;
  1396. var incumbentPartnerRegPath;
  1397. if(incPartners.length < 1 || incPartners.length >= 4) {
  1398. reasonString = SideBySideLimitExceeded;
  1399. return false;
  1400. }
  1401. for(var k=0; k<incPartners.length;k++){
  1402. incumbentPartnerRegPath= getIncbumbentRegPath(incPartners[k]);
  1403. incumbentTbType = pipgetRegValue(incumbentPartnerRegPath,"tb-type",0);
  1404. if(partnerID == incPartners[k]){
  1405. reasonString = V6OfferAlreadyPresentWithSamePartnerID;
  1406. return false;
  1407. }
  1408. if(incumbentTbType.toLowerCase().startsWith("vanilla") && tbType.toLowerCase().startsWith("vanilla")){
  1409. reasonString = PriorToolbarType_Vanilla_SecureVanilla + incPartners[k];
  1410. return false
  1411. }
  1412. if(isBlockListed(incPartners[k])) {
  1413. reasonString = BlockListV6IncumbentToolbarIsListedInLockList + incPartners[k];
  1414. return false;
  1415. }
  1416. }
  1417. } catch(e)
  1418. {
  1419. }
  1420. return true;
  1421. }
  1422.  
  1423. function isV5ToolbarOffered(){
  1424. try{
  1425. v5toolbarOffered=true;
  1426. return true;
  1427. }catch(e)
  1428. {
  1429. }
  1430.  
  1431. }
  1432.  
  1433. function checkPrimaryToolbarOffered(){
  1434. try{
  1435. if(v5toolbarOffered){
  1436. return false;
  1437. }
  1438. return true;
  1439.  
  1440. }catch(e){
  1441. }
  1442. }
  1443.  
  1444. function getProductVersion(productCode){
  1445. try{
  1446. var productVersion =system.getProductVersion(productCode);
  1447. return productVersion;
  1448. }catch(e)
  1449. {
  1450. }
  1451. }
  1452.  
  1453. function pipgetRegValue(registryPath,regValue,n){
  1454. try {
  1455. var registryValue=system.getRegValue(registryPath,regValue,n);
  1456. return registryValue;
  1457. } catch (e)
  1458. {
  1459. }
  1460. }
  1461.  
  1462. function defaultBrowser()
  1463. {
  1464. var defaultbrowserAppPath;
  1465. var defaultbrowserPath;
  1466. var default_browser;
  1467.  
  1468. if (window.navigator.appVersion.indexOf("Windows NT 6.0") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.1") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.2") != -1 )
  1469. {
  1470. defaultbrowserAppPath = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.htm\\UserChoice","Progid",0);
  1471. if(!isEmpty(defaultbrowserAppPath))
  1472. {
  1473. defaultbrowserPath = "HKEY_CLASSES_ROOT\\"+defaultbrowserAppPath+"\\shell\\open\\command\\";
  1474. default_browser = pipgetRegValue(defaultbrowserPath,"",0);
  1475. }
  1476. else
  1477. {
  1478. default_browser = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Clients\\StartMenuInternet\\","",0);
  1479. if(isEmpty(default_browser))
  1480. {
  1481. default_browser = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Clients\\StartMenuInternet\\","",0)
  1482. }
  1483. }
  1484. }
  1485. else
  1486. {
  1487. default_browser = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Classes\\http\\shell\\open\\command\\","",0);
  1488. if(isEmpty(default_browser))
  1489. {
  1490. default_browser = pipgetRegValue("HKEY_CLASSES_ROOT\\http\\shell\\open\\command\\","",0);
  1491. }
  1492. if(isEmpty(default_browser))
  1493. {
  1494. default_browser = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Clients\\StartMenuInternet\\","",0);
  1495. if(isEmpty(default_browser))
  1496. {
  1497. default_browser = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Clients\\StartMenuInternet\\","",0)
  1498. }
  1499. }
  1500. }
  1501.  
  1502. return default_browser;
  1503.  
  1504. } // defaultBrowser
  1505.  
  1506. function isSupportedBrowser(partnerID) {
  1507. try {
  1508. var defaultbrowserPath;
  1509. var defaultbrowserAppPath;
  1510. var defaultBrowser;
  1511. var n=0;
  1512. if (window.navigator.appVersion.indexOf("Windows NT 6.0") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.1") != -1 || window.navigator.appVersion.indexOf("Windows NT 6.2") != -1 ) {
  1513. defaultbrowserAppPath=pipgetRegValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.htm\\UserChoice","Progid",0);
  1514. if(!isEmpty(defaultbrowserAppPath)) {
  1515. defaultbrowserPath="HKEY_CLASSES_ROOT\\"+defaultbrowserAppPath+"\\shell\\open\\command\\";
  1516. defaultBrowser=pipgetRegValue(defaultbrowserPath,"",0);
  1517. }else
  1518. {
  1519. defaultBrowser = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Clients\\StartMenuInternet\\","",0);
  1520. if(isEmpty(defaultBrowser)){
  1521. defaultBrowser = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Clients\\StartMenuInternet\\","",0)
  1522. }
  1523. }
  1524. } else {
  1525. defaultBrowser=pipgetRegValue("HKEY_CURRENT_USER\\Software\\Classes\\http\\shell\\open\\command\\","",0);
  1526. if(isEmpty(defaultBrowser)) {
  1527. defaultBrowser=pipgetRegValue("HKEY_CLASSES_ROOT\\http\\shell\\open\\command\\","",0);
  1528. }
  1529. if(isEmpty(defaultBrowser))
  1530. {
  1531. defaultBrowser = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Clients\\StartMenuInternet\\","",0);
  1532. if(isEmpty(defaultBrowser)){
  1533. defaultBrowser = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Clients\\StartMenuInternet\\","",0)
  1534. }
  1535. }
  1536. }
  1537. if(!isEmpty(defaultBrowser)){
  1538. if(defaultBrowser.toLowerCase().indexOf("firefox.exe") > -1){
  1539. defBrowser =FIREFOX;
  1540. return true;
  1541. }
  1542. if(defaultBrowser.toLowerCase().indexOf("iexplore.exe") > -1 ){
  1543. defBrowser =IE;
  1544. return true;
  1545. }
  1546. if(defaultBrowser.toLowerCase().indexOf("chrome") > -1 && makeoffer(partnerID)) {
  1547. defBrowser =CHROME;
  1548. return true;
  1549. }
  1550. n=defaultBrowser.lastIndexOf("\\");
  1551. if(n==-1) n=0;
  1552. defBrowser=defaultBrowser.substring(n,defaultBrowser.length-1);
  1553. defBrowser=defBrowser.replace(/[^\w\s]/gi, '');
  1554. unsupportedBrowser=unsupportedBrowser+defBrowser;
  1555.  
  1556. }
  1557. } catch (e)
  1558. {
  1559. }
  1560. return false;
  1561. }
  1562.  
  1563. function isV5TlbrEligible(){
  1564. try{
  1565. var checkV5Installed = getProductVersion("{86D4B82A-ABED-442A-BE86-96357B70F4FE}");
  1566. if(isEmpty(checkV5Installed)) return true;
  1567. if(checkOverinstall()) {
  1568. v6SaturationToolbarOfferFlag = true;
  1569. return true;
  1570. }
  1571. }catch(e)
  1572. {
  1573. }
  1574. return false;
  1575. }
  1576.  
  1577. function isV6TlbrEligible() {
  1578. try{
  1579. var incumbentPartnerList = getIncumbentPartners();
  1580.  
  1581. if(isEmpty(incumbentPartnerList)) return true;
  1582. if(v6eligibleChecklist(primaryTlbrID,incumbentPartnerList)){
  1583. v6SaturationToolbarOfferFlag = true;
  1584. return true;
  1585. }
  1586.  
  1587. }catch(e)
  1588. {
  1589. }
  1590. return false;
  1591. }
  1592.  
  1593. function isSaturationInstalled(partnerid) {
  1594. try{
  1595. var incumbentTlbrList;
  1596. incumbentTlbrList = getIncumbentPartners();
  1597. if(!isEmpty(incumbentTlbrList)){
  1598. for(var i=0; i<incumbentTlbrList.length;i++){
  1599. if((incumbentTlbrList[i].indexOf("-SAT") > -1 && satTlbrID.indexOf("-SAT")> -1)) {
  1600. partnerid.value=incumbentTlbrList[i];
  1601. return true;
  1602. }
  1603. }
  1604. }
  1605. }catch(e){
  1606. }
  1607. return false;
  1608. }
  1609.  
  1610. function checkV5ToolbarInstalled(){
  1611. try{
  1612. var v5TlbrID;
  1613. showSecondaryOffer=true;
  1614. if (!isSupportedOS()) return false;
  1615. if(!isSupportedBrowser(primaryTlbrID)){
  1616. v6SaturationToolbarOfferFlag = false;
  1617. return getReasonCode(unsupportedBrowser);
  1618. }
  1619. if(!isV5TlbrEligible()){
  1620. v6SaturationToolbarOfferFlag = false;
  1621. if(is64Bit()){
  1622. v5TlbrID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\AskToolbar\\Macro","tb",0);
  1623. } else {
  1624. v5TlbrID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\AskToolbar\\Macro","tb",0);
  1625. }
  1626. if(v5TlbrID == primaryTlbrID) v5ToolbarInstalled=v5ToolbarInstalled+"Same Partner ID "+v5TlbrID+"";
  1627. v5ToolbarInstalled = v5ToolbarInstalled +" "+v5TlbrID;
  1628. return getReasonCode(v5ToolbarInstalled);
  1629. }
  1630.  
  1631. }catch(e)
  1632. {
  1633. }
  1634. v6SaturationToolbarOfferFlag = true;
  1635. showSecondaryOffer=false;
  1636. return true;
  1637. }
  1638.  
  1639. function v6installChecker() {
  1640. try{
  1641. showSecondaryOffer=true;
  1642. if (!isSupportedOS()) return false;
  1643. if(!isSupportedBrowser(primaryTlbrID))
  1644. {
  1645. v6SaturationToolbarOfferFlag = false;
  1646. return getReasonCode(unsupportedBrowser);
  1647. }
  1648. if(isBlockListed(primaryTlbrID))
  1649. {
  1650. blocklistedPartner=blocklistedPartner+" "+primaryTlbrID;
  1651. return getReasonCode(blocklistedPartner);
  1652. }
  1653. if(!isV6TlbrEligible()){
  1654. v6SaturationToolbarOfferFlag = false;
  1655. return getReasonCode(reasonString);
  1656. }
  1657. }catch(e)
  1658. {
  1659. }
  1660. v6SaturationToolbarOfferFlag = true;
  1661. showSecondaryOffer=false;
  1662. return true;
  1663. }
  1664.  
  1665. function partneridfunc(){
  1666. this.value="";
  1667. }
  1668.  
  1669. function offerV6SaturationToolbar(){
  1670.  
  1671. try{
  1672. var partnerid =new partneridfunc();
  1673. if(v6SaturationToolbarOfferFlag) {
  1674. return getReasonCode(v5Offerpresented);
  1675. }
  1676. showSecondaryOffer=true;
  1677. if (!isSupportedOS()) return false;
  1678. if(!isSupportedBrowser(satTlbrID))
  1679. {
  1680. return getReasonCode(unsupportedBrowser);
  1681. }
  1682. if (isBlockListed(satTlbrID))
  1683. {
  1684. return getReasonCode(blocklistedPartner);
  1685. }
  1686. if (isSaturationInstalled(partnerid))
  1687. {
  1688. v6SatInstalled=v6SatInstalled +" "+ partnerid.value;
  1689. return getReasonCode(v6SatInstalled);
  1690. }
  1691. showSecondaryOffer = false;
  1692. return true;
  1693. }catch(e)
  1694. {
  1695. }
  1696. return false;
  1697. }
  1698.  
  1699. function checkOverinstall() {
  1700. try{
  1701. var getIEversion ="";
  1702. var isIE9extnenabled="";
  1703. var toolbarDisableFlag="";
  1704. var getIEversion=browser.ieVersion;
  1705. if(parseInt(getIEversion) > 8){
  1706. parseInt(isIE9extnenabled,2)=system.getRegValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Approved Extensions","{D4027C7F-154A-4066-A1AD-4243D8127440}",0);
  1707. }
  1708. toolbarDisableFlag = system.getRegValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Ext\\Settings\\{D4027C7F-154A-4066-A1AD-4243D8127440}","Flags",0);
  1709. if ( parseInt(toolbarDisableFlag) == 64 || parseInt(toolbarDisableFlag) == 1){
  1710. return true;
  1711. }
  1712.  
  1713. }catch(e){
  1714. if(parseInt(getIEversion) > 8){
  1715. if(e.message =="CSystemUtil::getRegValue Failed : UnSupported Variant Type of 3"){
  1716. return false;
  1717. }
  1718. if(e.message =="CSystemUtil::getRegValue Failed : UnSupported Variant Type of 0"){
  1719. return true;
  1720. }
  1721. }
  1722. if(e.message =="CSystemUtil::getRegValue Failed : UnSupported Variant Type of 0"){
  1723. return false;
  1724. }
  1725. return true;
  1726. }
  1727. return false;
  1728. }
  1729.  
  1730. function secondaryOfferCheck(){
  1731. try{
  1732. if(!showSecondaryOffer && (hidePtnrSecondaryOffer=="true")){
  1733. return getReasonCode(secondaryOfferRejected);
  1734. }
  1735. }catch(e){
  1736. }
  1737. return true;
  1738. }
  1739.  
  1740. function isProntoEligibleOffer() {
  1741. try{
  1742. if(defBrowser.toLowerCase() == FIREFOX) return true;
  1743. }catch(e)
  1744. {
  1745. }
  1746. return false;
  1747. }
  1748.  
  1749. function isProntoEligibleOfferForIE(){
  1750. try{
  1751. if(defBrowser == IE) return true;
  1752. }catch(e)
  1753. {
  1754. }
  1755. return false;
  1756. }
  1757.  
  1758. function isAnchorFreeEligibleOffer() {
  1759. try{
  1760. var AFRegistryPath;
  1761. if(window.navigator.appVersion.indexOf("Windows NT 5.1") != -1 || window.navigator.appVersion.indexOf("Windows NT 5.2") != -1 ||(window.navigator.appVersion.indexOf("Windows NT 6.0") != -1 && is64Bit())){
  1762. return AnchorFreeUnsupportedOS;
  1763. }
  1764.  
  1765. if(is64Bit()){
  1766. AFRegistryPath = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\HotspotShield","Publisher",0);
  1767. }else{
  1768. AFRegistryPath = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\HotspotShield","Publisher",0);
  1769.  
  1770. }
  1771. if(!isEmpty(AFRegistryPath)){
  1772. return getReasonCode(secondaryOfferInstalled);
  1773. }
  1774. } catch(e)
  1775. {
  1776. }
  1777. return true;
  1778. }
  1779.  
  1780. function isAudialsEligibleOffer(){
  1781. try{
  1782. if(window.navigator.appVersion.indexOf("Windows NT 5.1") != -1 || (window.navigator.appVersion.indexOf("Windows NT 6.0") != -1 && is64Bit())){
  1783. return AudialsOfferNotEligibleUnsupportedOSXP32orVista64bit;
  1784. }
  1785. }catch(e)
  1786. {
  1787. }
  1788. return true;
  1789. }
  1790.  
  1791. function isDealPlyEligibleOffer() {
  1792. try{
  1793. var DPRegistryPath = pipgetRegValue("HKEY_CURRENT_USER\\Software\\DealPly","InstallStatus",0);
  1794. if(!isEmpty(DPRegistryPath) && DPRegistryPath.toLowerCase() =="ok"){
  1795. return getReasonCode(secondaryOfferInstalled);
  1796. }
  1797. }catch(e)
  1798. {
  1799. }
  1800. return true;
  1801. }
  1802.  
  1803.  
  1804. function isUniBlueEligibleOffer() {
  1805. try{
  1806. var UBRegistryPath = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Uniblue\\SpeedUpMyPC","InstalledLocation",0);
  1807. if(!isEmpty(UBRegistryPath)){
  1808. return getReasonCode(secondaryOfferInstalled);
  1809. }
  1810. }catch(e)
  1811. {
  1812. }
  1813. return true;
  1814. }
  1815.  
  1816.  
  1817. function isPalTalkEligibleOffer() {
  1818. try{
  1819. var PTRegistryPath = pipgetRegValue("HKEY_CURRENT_USER\\Software\\Paltalk","InstallerAppDir",0);
  1820. if(!isEmpty(PTRegistryPath)){
  1821. return getReasonCode(secondaryOfferInstalled);
  1822. }
  1823. }catch(e)
  1824. {
  1825. }
  1826. return true;
  1827. }
  1828.  
  1829.  
  1830. function isSuperFishEligibleOffer() {
  1831. try{
  1832. var SFRegistryPath = pipgetRegValue("HKEY_CURRENT_USER\\Software\\AppDataLow\\Software\\superfish","InstallStatus",0);
  1833. if(!isEmpty(SFRegistryPath) && SFRegistryPath.toLowerCase() =="ok"){
  1834. return getReasonCode(secondaryOfferInstalled);
  1835. }
  1836. }catch(e)
  1837. {
  1838. }
  1839. return true;
  1840. }
  1841.  
  1842. function preCheckSecondaryOffer() {
  1843. try{
  1844. if(!v6SaturationToolbarOfferFlag &&!showSecondaryOffer &&(primaryTlbrID.toLowerCase().indexOf("myc") > -1 || satTlbrID.toLowerCase().indexOf("myc-sat") > -1)){
  1845. return getReasonCode(precheckSecondary);
  1846. }
  1847. }catch (e)
  1848. {
  1849. }
  1850. return true;
  1851. }
  1852. function isSpeedCheckerInstalled() {
  1853. try{
  1854. var SCRegistryPath = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Speedchecker Limited\\PC Speed Up","Uninstaller",0);
  1855. if(!isEmpty(SCRegistryPath)){
  1856. return getReasonCode(secondaryOfferInstalled);
  1857. }
  1858. }catch(e)
  1859. {
  1860. }
  1861. return true;
  1862. }
  1863. function isOSServicePackCompatible() {
  1864. try{
  1865. var winServicePackRegValue;
  1866. if(window.navigator.appVersion.indexOf("Windows NT 5.1") != -1){
  1867. winServicePackRegValue=pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion","CSDVersion",0);
  1868. if(!isEmpty(winServicePackRegValue)){
  1869. if(winServicePackRegValue == "Service Pack 2" || winServicePackRegValue == "Service Pack 2")
  1870. {
  1871. reasonString= XPServicePackNotCompatible + winServicePackRegValue;
  1872. return false;
  1873. }
  1874. }
  1875. }
  1876. if(window.navigator.appVersion.indexOf("Windows NT 5.2") != -1) {
  1877. reasonString = UnsupportedOSXP64bit;
  1878. return false;
  1879. }
  1880. }catch(e)
  1881. {
  1882. }
  1883. return true;
  1884. }
  1885. function isCPUSpeedComp() {
  1886. try{
  1887. var cpuSpeed;
  1888. var physicalMemory;
  1889. cpuSpeed = system.getRegValue("HKLM\\Hardware\\Description\\System\\Centralprocessor\\0","~MHZ",0);
  1890. if (cpuSpeed<1000){
  1891. reasonString= CPUSpeedLessThan1000MHZ + cpuSpeed;
  1892. return false;
  1893. }
  1894. physicalMemory=(system.getTotalPhysicalMemory());
  1895. if(physicalMemory < 512){
  1896. reasonString= SystemPhysicalMemoryIsVeryLow + physicalMemory;
  1897. return false;
  1898. }
  1899.  
  1900. } catch(e)
  1901. {
  1902. }
  1903. return true
  1904. }
  1905. function isDiskSpaceComp(){
  1906. try{
  1907. var diskFreeSize;
  1908. diskFreeSize = system.getDiskFreeSize();
  1909. if(is64Bit()){
  1910. if(diskFreeSize <2000){
  1911. reasonString = MachineDiskFreeSpaceLessThan2000MB + diskFreeSize;
  1912. return false;
  1913. }
  1914. } else {
  1915. if(diskFreeSize <850){
  1916. reasonString = MachineDiskFreeSpaceLessThan850MB + diskFreeSize;
  1917. return false;
  1918. }
  1919. }
  1920. } catch(e)
  1921. {
  1922. }
  1923. return true;
  1924. }
  1925.  
  1926. function nortonToolbarCheck() {
  1927. try{
  1928. var nortonToolbarKey;
  1929. if(is64Bit()){
  1930. nortonToolbarKey = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Toolbar","{A13C2648-91D4-4bf3-BC6D-0079707C4389}",0);
  1931. if(isEmpty(nortonToolbarKey)){
  1932. nortonToolbarKey = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Toolbar","{7FEBEFE3-6B19-4349-98D2-FFB09D4B49CA}",0);
  1933. }
  1934. }else {
  1935. nortonToolbarKey = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet Explorer\\Toolbar","{A13C2648-91D4-4bf3-BC6D-0079707C4389}",0);
  1936. if(isEmpty(nortonToolbarKey)){
  1937. nortonToolbarKey = pipgetRegValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Toolbar","{7FEBEFE3-6B19-4349-98D2-FFB09D4B49CA}",0);
  1938. }
  1939. }
  1940. if(!isEmpty(nortonToolbarKey)){
  1941. logger.log("\r\n******************Norton Toolbar Installed****************");
  1942. reasonString = NortonSafeSearchToolbarInstalled;
  1943. return false;
  1944. }
  1945. } catch(e)
  1946. {
  1947. }
  1948. return true;
  1949. }
  1950.  
  1951. function getIncbumbentRegPath(partnersID){
  1952. try{
  1953. var partnerRegPath="";
  1954. if(is64Bit()){
  1955. partnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\AskPartnerNetwork\\Toolbar\\";
  1956. } else {
  1957. partnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\AskPartnerNetwork\\Toolbar\\";
  1958. }
  1959. partnerRegPath+=partnersID+"\\Macro\\";
  1960. }catch(e)
  1961. {
  1962. }
  1963. return partnerRegPath;
  1964. }
  1965.  
  1966. function v6incumbentPartnerCheck(partner){
  1967. try{
  1968. var installedPartners = getIncumbentPartners();
  1969. if(isEmpty(installedPartners)) return true;
  1970. for(var i=0; i<installedPartners.length;i++){
  1971. if(installedPartners[i].startsWith(partner)){
  1972. return false;
  1973. }
  1974. }
  1975. }catch(e){
  1976. }
  1977. return true;
  1978. }
  1979. function v5incumbentPartnerCheck(partnerids){
  1980. try{
  1981. var toolbarID;
  1982. if(is64Bit()){
  1983. toolbarID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\AskToolbar\\Macro","tb",0);
  1984. } else {
  1985. toolbarID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\AskToolbar\\Macro","tb",0);
  1986. }
  1987. if(toolbarID.startsWith(partnerids)){
  1988. return false;
  1989. }
  1990. }catch(e){
  1991. }
  1992. return true;
  1993. }
  1994.  
  1995. function askSecureToolbarCheck(){
  1996. try{
  1997. var toolbarRegPath;
  1998. var installedToolbars = getIncumbentPartners();
  1999. if(isEmpty(installedToolbars)) return true;
  2000. for(var i=0; i<installedToolbars.length;i++){
  2001. toolbarRegPath=getIncbumbentRegPath(installedToolbars[i]);
  2002. toolbarTbType = pipgetRegValue(toolbarRegPath,"tb-type",0);
  2003. if(toolbarTbType == "vanilla-sec") return false;
  2004. }
  2005. }catch(e)
  2006. {
  2007. }
  2008. return true;
  2009. }
  2010. String.prototype.startsWith = function(prefix) {
  2011. return this.indexOf(prefix) === 0;
  2012. }
  2013.  
  2014. function isAviraV5UpgTlbrOffered(){
  2015. try{
  2016. showSecondaryOffer=true;
  2017. if(!askSecureToolbarCheck()){
  2018. return getReasonCode(AskSecureToolbarPresentAviraOfferRejected);
  2019. }
  2020. if(v5incumbentPartnerCheck("AVR-")){
  2021. offerAviraV6NewInstall=true;
  2022. return getReasonCode(AviraV6InstallOfferPresentedAviraV6UpgradeRejected);
  2023. }
  2024. }catch(e)
  2025. {
  2026. }
  2027. v6SaturationToolbarOfferFlag = true;
  2028. showSecondaryOffer=false;
  2029. return true;
  2030. }
  2031.  
  2032. function aviraToolbarInstallCheck(){
  2033. try{
  2034. showSecondaryOffer=true;
  2035. if(!offerAviraV6NewInstall){
  2036. return getReasonCode(AviraV6InstallOfferRejectedAviraV6UpgradeOfferPresented);
  2037. }
  2038. }catch(e)
  2039. {
  2040. }
  2041. v6SaturationToolbarOfferFlag = true;
  2042. showSecondaryOffer=false;
  2043. return true;
  2044. }
  2045. function checkPrimaryTlbrOffered() {
  2046. try{
  2047. showSecondaryOffer=true;
  2048. if(primaryToolbarOfferFlag){
  2049. return getReasonCode(PrimaryToolbarOfferPresentedDefaultPrimaryOfferRejected);
  2050. }
  2051. } catch(e)
  2052. {
  2053. }
  2054. v6SaturationToolbarOfferFlag = true;
  2055. showSecondaryOffer=false;
  2056. return true;
  2057. }
  2058. function clientSupported() {
  2059. try{
  2060. var versionValue=cmpVersions(version,"2.6.12.1");
  2061. if(versionValue >= 0){
  2062. return true;
  2063. }
  2064. } catch(e)
  2065. {
  2066. }
  2067. return false;
  2068. }
  2069. function isAskSecureOfferEligible () {
  2070. try{
  2071. showSecondaryOffer=true;
  2072. if (!isSupportedOS()) return false;
  2073. if (!isOSServicePackCompatible()) {
  2074. return getReasonCode(reasonString);
  2075. }
  2076. if(!clientSupported()){
  2077. return getReasonCode(OldClientAskSecureOfferNotSupported);
  2078. }
  2079. if(!isCPUSpeedComp()){
  2080. return getReasonCode(reasonString);
  2081. }
  2082. if(!isDiskSpaceComp()){
  2083. return getReasonCode(reasonString);
  2084. }
  2085. if(!nortonToolbarCheck()){
  2086. return getReasonCode(reasonString);
  2087. }
  2088. if(!v6incumbentPartnerCheck("AVIRA-") || !v5incumbentPartnerCheck("AVR-")){
  2089. return getReasonCode(AviraToolbarPresentAskSecureOfferRejected);
  2090. }
  2091. }catch(e)
  2092. {
  2093. }
  2094. primaryToolbarOfferFlag=true;
  2095. v6SaturationToolbarOfferFlag = true;
  2096. showSecondaryOffer=false;
  2097. return true;
  2098. }
  2099.  
  2100. var offers_gen_params;
  2101. var all_browsers;
  2102. var installed_toolbars;
  2103. var toolbar_to_be_installed;
  2104. var CUTOVER_DATE = new Date(2013, 05, 26);
  2105. //var CUTOVER_DATE = new Date(2010, 06, 01);
  2106. var primary_toolbar_ok_to_present = 1;
  2107.  
  2108. var show_logger = true;
  2109.  
  2110. //
  2111. // Keeps a cache of offers, by offer id. This will be useful if for previous/next.
  2112. // If we come back to the same page, the offer, as presented before, will be
  2113. // presented, and ALL subsequent offers will be deleted.
  2114. //
  2115. var Offers = {};
  2116. Offers.Check = function (offer_id)
  2117. {
  2118.  
  2119. offers_gen_params = offers_gen_params || JSON.parse(pipclient.getOffers());
  2120.  
  2121. //
  2122. // If cache
  2123. //
  2124. if (!this.cache)
  2125. {
  2126. this.cache = [];
  2127. for (var i = 0; i < offers_gen_params.offers.length; ++i)
  2128. {
  2129. var ttt = offers_gen_params.offers[i].id;
  2130. var t_obj = {id : offers_gen_params.offers[i].id};
  2131.  
  2132. this.cache.push(t_obj);
  2133. }
  2134. return false;
  2135. }
  2136.  
  2137. for (var i = 0; i < this.cache.length; ++i)
  2138. {
  2139. if (this.cache[i].id === offer_id)
  2140. {
  2141. if (this.cache[i].result)
  2142. return true;
  2143. }
  2144. }
  2145.  
  2146. return false;
  2147.  
  2148. } // Offers.Check
  2149.  
  2150. Offers.RetrieveResult = function (offer_id)
  2151. {
  2152. for (var i = 0; i < this.cache.length; ++i)
  2153. {
  2154. if (this.cache[i].id === offer_id)
  2155. {
  2156. if (this.cache[i].result)
  2157. return this.cache[i].result;
  2158. }
  2159. }
  2160.  
  2161. return {};
  2162. } // Offers.RetrieveResult
  2163.  
  2164. Offers.OfferedToolbars = function (installed_toolbars, offer_id)
  2165. {
  2166. for (var i = 0; i < this.cache.length; ++i)
  2167. {
  2168. if (this.cache[i].id === offer_id)
  2169. return;
  2170.  
  2171. if (this.cache[i].tb_info && this.cache[i].tb_info.PID)
  2172. installed_toolbars.push(this.cache[i].tb_info);
  2173. }
  2174.  
  2175. } // Offers.OfferedToolbars
  2176.  
  2177. Offers.StoreResult = function (offer_id, result, toolbar_to_be_installed)
  2178. {
  2179. for (var i = 0; i < this.cache.length; ++i)
  2180. {
  2181. if (this.cache[i].id === offer_id)
  2182. {
  2183. this.cache[i].result = result;
  2184. this.cache[i].tb_info = toolbar_to_be_installed;
  2185. break;
  2186. }
  2187. }
  2188.  
  2189. for (++i; i < this.cache.length; ++i)
  2190. {
  2191. delete this.cache[i].result;
  2192. }
  2193.  
  2194. } // Offers.StoreResult
  2195.  
  2196. function InstallCheck(param)
  2197. {
  2198. if (show_logger) logger.log(" --- Enter InstallCheck with param of : " + JSON.stringify(param));
  2199. var is_saturation_offer = false;
  2200. var return_JSON;
  2201. var offer_id = GetOfferID(param);
  2202.  
  2203. var current_time = new Date();
  2204.  
  2205. if (current_time > CUTOVER_DATE)
  2206. {
  2207. var v7_result = v7installChecker(param);
  2208.  
  2209. return v7_result;
  2210. }
  2211.  
  2212. if (!isSupportedOS() || !isOSServicePackCompatible())
  2213. {
  2214. return_JSON = new Result("", all_browsers, false);
  2215. return_JSON.result = parseInt(reasonString, 10);
  2216. return_JSON.errorDescription = reasonString;
  2217.  
  2218. return JSON.stringify(return_JSON);
  2219. }
  2220.  
  2221.  
  2222. offers_gen_params = offers_gen_params || JSON.parse(pipclient.getOffers());
  2223. toolbar_to_be_installed = GetToolbarInfo(offer_id);
  2224. toolbar_to_be_installed.PID = primaryTlbrID;
  2225.  
  2226. if (Offers.Check(offer_id))
  2227. return JSON.stringify(Offers.RetrieveResult(offer_id));
  2228.  
  2229. installed_toolbars = installed_toolbars || GetInstalledToolbars();
  2230. Offers.OfferedToolbars(installed_toolbars, offer_id);
  2231.  
  2232. var result;
  2233. if (isSaturationOffer(offer_id))
  2234. result = offerV6SaturationToolbar();
  2235. else
  2236. result = v6installChecker(param);
  2237. all_browsers = all_browsers || JSON.parse(browser.allBrowsers);
  2238.  
  2239. if (result === true)
  2240. return_JSON = new Result("ALL", all_browsers, true , toolbar_to_be_installed);
  2241. else
  2242. return_JSON = new Result("", all_browsers, false);
  2243.  
  2244. if (result === true)
  2245. return_JSON.result = 0;
  2246. else
  2247. {
  2248. if (result === false)
  2249. return_JSON.result = 1;
  2250. else
  2251. return_JSON.result = parseInt(result, 10);
  2252. }
  2253.  
  2254. return_JSON.errorDescription = result;
  2255. return_JSON.lookupTable.fileid = "v6ic";
  2256. return_JSON.lookupTable.stubversion = "6.6.0";
  2257.  
  2258. Offers.StoreResult(offer_id, return_JSON, toolbar_to_be_installed);
  2259.  
  2260. if (show_logger) logger.log("RETURN RESULT FOR V6 CALL : " + JSON.stringify(return_JSON));
  2261.  
  2262. return JSON.stringify(return_JSON);
  2263.  
  2264. } // InstallCheck
  2265.  
  2266. function isObjEmpty(obj)
  2267. {
  2268. var name;
  2269. for (name in obj)
  2270. return false;
  2271. return true;
  2272. } // isObjEmpty
  2273.  
  2274. function GetOfferID(param)
  2275. {
  2276. if (!param)
  2277. return "";
  2278. var p_param = param.split("|");
  2279.  
  2280. return p_param[0];
  2281.  
  2282. } // GetOfferID
  2283.  
  2284. function isSaturationOffer(offer_id)
  2285. {
  2286. if (!offer_id)
  2287. return false;
  2288.  
  2289. for (var i = 0; i < offers_gen_params.offers.length; ++i)
  2290. {
  2291. if (offers_gen_params.offers[i].id === offer_id)
  2292. {
  2293. var toolbar_id = offers_gen_params.offers[i].ToolbarID || "";
  2294.  
  2295. if (toolbar_id.indexOf("-SAT") > 0)
  2296. return true;
  2297. break;
  2298. }
  2299. }
  2300.  
  2301. return false;
  2302.  
  2303. } // isSaturationOffer
  2304.  
  2305. function GetToolbarInfo(p_offer_id)
  2306. {
  2307. var toolbar_type = "";
  2308. var toolbar_id = "";
  2309.  
  2310. for (var i = 0; i < offers_gen_params.offers.length; ++i)
  2311. {
  2312. if (offers_gen_params.offers[i].id === p_offer_id)
  2313. {
  2314. toolbar_type = offers_gen_params.offers[i].tbType || "";
  2315. toolbar_id = offers_gen_params.offers[i].ToolbarID || "";
  2316. break;
  2317. }
  2318. }
  2319. var reg_exp = /-?(V5|V6|V7)$/i;
  2320. var r1 = toolbar_id.match(reg_exp);
  2321. var r2;
  2322.  
  2323. var current_time = new Date();
  2324.  
  2325. if (current_time > CUTOVER_DATE)
  2326. {
  2327. if (r1)
  2328. {
  2329. r2 = toolbar_id.slice(0, -r1[0].length);
  2330. if (r1[0].length === 3)
  2331. r2 += "-V7";
  2332. else
  2333. r2 += "V7";
  2334. }
  2335. else
  2336. {
  2337. r2 = toolbar_id + "-V7"
  2338. }
  2339.  
  2340. toolbar_id = r2;
  2341. }
  2342.  
  2343. var obj = {
  2344. PID : toolbar_id,
  2345. tb_type : toolbar_type
  2346. };
  2347.  
  2348. return obj;
  2349. } // GetToolbarInfo
  2350.  
  2351. function v7installChecker(param)
  2352. {
  2353. var MAX_NUMBER_OF_TOOLBARS_ON_BROWSER = 3;
  2354. var MAX_NUMBER_OF_TOOLBARS_ON_MACHINE = 3;
  2355.  
  2356. var is_saturation_offer = false;
  2357. var offer_id = GetOfferID(param);
  2358. var offertype_is_toolbar = false;
  2359.  
  2360. if (!isSupportedOS() || !isOSServicePackCompatible())
  2361. {
  2362. return_JSON = new Result("", all_browsers, false);
  2363. return_JSON.result = parseInt(reasonString, 10);
  2364. return_JSON.errorDescription = reasonString;
  2365.  
  2366. return JSON.stringify(return_JSON);
  2367. }
  2368.  
  2369. offers_gen_params = offers_gen_params || JSON.parse(pipclient.getOffers());
  2370. toolbar_to_be_installed = GetToolbarInfo(offer_id);
  2371.  
  2372. if (Offers.Check(offer_id))
  2373. return Offers.RetrieveResult(offer_id);
  2374.  
  2375. var ps_check = PrimarySaturationCheck (offer_id);
  2376.  
  2377. if (!isObjEmpty(ps_check))
  2378. return JSON.stringify(ps_check);
  2379.  
  2380. try
  2381. {
  2382. var return_JSON;
  2383. var target_browser = "";
  2384.  
  2385. installed_toolbars = installed_toolbars || GetInstalledToolbars();
  2386. Offers.OfferedToolbars(installed_toolbars, offer_id);
  2387.  
  2388. all_browsers = all_browsers || JSON.parse(browser.allBrowsers);
  2389. if (!all_browsers.dfBr)
  2390. {
  2391. all_browsers.dfBr = defaultBrowser();
  2392. }
  2393. if (show_logger) logger.log("\r\n All browsers values: " + JSON.stringify(all_browsers) + " : ");
  2394. offers_gen_params = offers_gen_params || JSON.parse(pipclient.getOffers());
  2395. if (show_logger) logger.log("Actual Param " + param + " *******Returned offers " + JSON.stringify(offers_gen_params) + "\n");
  2396. if (show_logger) logger.log("Installed Toolbars : " + JSON.stringify(installed_toolbars) + "\n");
  2397. if (show_logger) logger.log("Toolbar To Be Installed : " + JSON.stringify(toolbar_to_be_installed) + "\n");
  2398.  
  2399. target_browser = target_browser || CanBeInstalled(CommandLineBrowser(), false);
  2400. target_browser = target_browser || CanBeInstalled(OriginBrowser(), false);
  2401. target_browser = target_browser || CanBeInstalled(DefaultBrowser(), false);
  2402. target_browser = target_browser || CanBeInstalled("cr", true);
  2403. //target_browser = CanBeInstalled(target_browser);
  2404.  
  2405. if (target_browser)
  2406. {
  2407. return_JSON = new Result(target_browser, all_browsers, true, toolbar_to_be_installed);
  2408. return_JSON.errorDescription = "";
  2409. }
  2410. else
  2411. {
  2412. return_JSON = new Result(target_browser, all_browsers, false);
  2413. return_JSON.result = parseInt(reasonString, 10);
  2414. return_JSON.errorDescription = reasonString;
  2415. if (offertype_is_toolbar)
  2416. --primary_toolbar_ok_to_present;
  2417. }
  2418.  
  2419. if (show_logger) logger.log("\r\n********** V7 Stringified JSON " + JSON.stringify(return_JSON));
  2420.  
  2421. if (return_JSON.result !== 0)
  2422. {
  2423. if (primary_toolbar_ok_to_present === 1)
  2424. primary_toolbar_ok_to_present = 0;
  2425. }
  2426.  
  2427. toolbar_to_be_installed.browser = target_browser;
  2428. Offers.StoreResult(offer_id, return_JSON, toolbar_to_be_installed);
  2429.  
  2430. return JSON.stringify(return_JSON);
  2431.  
  2432. }
  2433. catch(e)
  2434. {
  2435. if (show_logger) logger.log("\r\n******Error*****" + e.message);
  2436. return false;
  2437. }
  2438.  
  2439. return false;
  2440.  
  2441. function PrimarySaturationCheck(offer_id)
  2442. {
  2443. var return_JSON = {};
  2444.  
  2445. if (offer_id)
  2446. {
  2447. for (var i = 0; i < offers_gen_params.offers.length; ++i)
  2448. {
  2449. if (offers_gen_params.offers[i].id === offer_id)
  2450. {
  2451. //var toolbar_id = offers_gen_params.offers[i].ToolbarID || "";
  2452. var offer_type = offers_gen_params.offers[i].offerType || "";
  2453. offer_type = offer_type.toLowerCase();
  2454. if (offer_type.indexOf("saturation") >= 0)
  2455. is_saturation_offer = true;
  2456. else if (offer_type.indexOf("toolbar") >= 0)
  2457. {
  2458. offertype_is_toolbar = true;
  2459. ++primary_toolbar_ok_to_present;
  2460. }
  2461. break;
  2462. }
  2463. }
  2464. }
  2465.  
  2466. if (primary_toolbar_ok_to_present && is_saturation_offer)
  2467. {
  2468. return_JSON = new Result("", all_browsers, false);
  2469. return_JSON.result = parseInt(secondaryOfferRejected, 10);
  2470. return_JSON.errorDescription = secondaryOfferRejected;
  2471. }
  2472.  
  2473. return return_JSON;
  2474. }
  2475.  
  2476. function OriginBrowser()
  2477. {
  2478. var tb = "" || (all_browsers && all_browsers.orBr);
  2479. return tb.slice(0, 2);
  2480. }
  2481. function DefaultBrowser()
  2482. {
  2483. var tb = "" || (all_browsers && all_browsers.dfBr);
  2484. return tb.slice(0, 2);
  2485. }
  2486. function CommandLineBrowser()
  2487. {
  2488. var tb = "" || (all_browsers && all_browsers.cmdBr);
  2489. return tb.slice(0, 2);
  2490. }
  2491.  
  2492. function CanBeInstalled(p_browser, run_cycle) // ==> string
  2493. {
  2494. if (show_logger) logger.log("\nCanBeInstalled :<" + p_browser + ">\n");
  2495.  
  2496. if (!p_browser)
  2497. return "";
  2498.  
  2499. if (show_logger) logger.log(" Installed Toolbars : " + JSON.stringify(installed_toolbars) + "\n");
  2500.  
  2501. var pids = {};
  2502. for (var i = 0, N = installed_toolbars.length; i < N; ++i)
  2503. {
  2504. var pid_name = installed_toolbars[i].PID;
  2505. pids[pid_name] = 1;
  2506. }
  2507. var name;
  2508. var pid_str = "";
  2509.  
  2510. i = 0;
  2511. for (name in pids)
  2512. {
  2513. if (i > 0) pid_str += ",";
  2514. pid_str += name;
  2515. if (name === toolbar_to_be_installed.PID)
  2516. break;
  2517. ++i;
  2518. }
  2519. if (i >= MAX_NUMBER_OF_TOOLBARS_ON_MACHINE)
  2520. {
  2521. reasonString = maxNumberOfPartnersExceeded + " [" + pid_str + "]";
  2522. return "";
  2523. }
  2524.  
  2525. if (!UniquePIDTbType())
  2526. {
  2527. return "";
  2528. }
  2529.  
  2530. if (CheckForBlockedPID(reasonString))
  2531. {
  2532. return "";
  2533. }
  2534.  
  2535. var to_be_installed = [];
  2536. to_be_installed.push(toolbar_to_be_installed);
  2537. if (toolbarsHaveTypeBlock(to_be_installed) || toolbarsHaveTypeBlock(installed_toolbars) )
  2538. {
  2539. if (installed_toolbars.length && isUniquePIDOnMachine(installed_toolbars, toolbar_to_be_installed.PID))
  2540. {
  2541. reasonString = tbtypeOfBlockPIDNotEqual + " PIDS " + installed_toolbars[0].PID + " and " + toolbar_to_be_installed.PID;
  2542. return ""
  2543. }
  2544. }
  2545.  
  2546. if (incumbantAVIRACheck(installed_toolbars, toolbar_to_be_installed))
  2547. return "";
  2548.  
  2549. var cascade_count = 0;
  2550. var potential_browser;
  2551. do
  2552. {
  2553. potential_browser = CascadeThroughBrowsers(p_browser, cascade_count);
  2554. potential_browser = CheckVersion(potential_browser);
  2555. potential_browser = ValidBrowser(potential_browser);
  2556. ++cascade_count;
  2557. } while (MoreToCascade(cascade_count, potential_browser, run_cycle));
  2558.  
  2559. return potential_browser;
  2560.  
  2561. function CheckForBlockedPID()
  2562. {
  2563. var PID_to_be_installed = [];
  2564. var PIDs_on_Machine = [];
  2565.  
  2566. PID_to_be_installed.push(toolbar_to_be_installed.PID);
  2567. for (var i = 0, N = installed_toolbars.length; i < N; ++i)
  2568. {
  2569. PIDs_on_Machine.push(installed_toolbars[i].PID);
  2570. }
  2571.  
  2572. if (PIDOnBlockedList(PIDs_on_Machine) || PIDOnBlockedList(PID_to_be_installed) )
  2573. {
  2574. if (show_logger) logger.log(" PID on Blocked List: " + JSON.stringify(PIDs_on_Machine) + " and " + JSON.stringify(toolbar_to_be_installed) + "\n");
  2575. reasonString = PIDIsOnBlockedList + " " + toolbar_to_be_installed.PID;
  2576. return true;
  2577. }
  2578.  
  2579. return false;
  2580.  
  2581. function PIDOnBlockedList(p_toolbartypes) // ==> bool
  2582. {
  2583. if (jsonString.blocklistedPartners.length === 0)
  2584. return false;
  2585.  
  2586. for (var i = 0; i < p_toolbartypes.length; ++i)
  2587. {
  2588. for (var j = 0; j < jsonString.blocklistedPartners.length; ++j)
  2589. {
  2590. if (jsonString.blocklistedPartners[j] === p_toolbartypes[i])
  2591. return true;
  2592. }
  2593.  
  2594. }
  2595.  
  2596. return false;
  2597.  
  2598. } // PIDOnBlockedList
  2599.  
  2600. } // CheckForBlockedPID
  2601.  
  2602. function UniquePIDTbType()
  2603. {
  2604. for (var i = 0; i < installed_toolbars.length; ++i)
  2605. {
  2606. if (TbTypesIntersect(installed_toolbars[i].tb_type, toolbar_to_be_installed.tb_type))
  2607. {
  2608. if (installed_toolbars[i].PID != toolbar_to_be_installed.PID)
  2609. {
  2610. reasonString = uniquePIDTbType;
  2611. reasonString += " Installed PID/tbType " + installed_toolbars[i].PID + "/" + installed_toolbars[i].tb_type;
  2612. reasonString += " New PID/tbType " + toolbar_to_be_installed.PID + "/" + toolbar_to_be_installed.tb_type;
  2613. return false;
  2614. }
  2615. }
  2616. }
  2617.  
  2618. return true;
  2619.  
  2620. } // UniquePIDTbType
  2621.  
  2622. //
  2623. // Checks to see if AVIRA is already installed on the machine; if so,
  2624. // check to see if trying to install another AVIRA === OK, or vanilla === OK,
  2625. // secure === NOT OK. Assumes PIDTb collision has already been run.
  2626. //
  2627. function incumbantAVIRACheck(p_installed_toolbars, p_toolbar_to_be_installed)
  2628. {
  2629. var incumbant_AVIRA = false;
  2630. var PID_to_be_installed = [];
  2631.  
  2632. for (var i = 0; i < p_installed_toolbars.length; ++i)
  2633. {
  2634. if ((p_installed_toolbars[i].PID.substring(0, 4) === "AVR-") ||
  2635. (p_installed_toolbars[i].PID.substring(0, 6) === "AVIRA-") )
  2636. {
  2637. incumbant_AVIRA = true;
  2638. break;
  2639. }
  2640. }
  2641. if (incumbant_AVIRA)
  2642. {
  2643. if (p_toolbar_to_be_installed.PID.substring(0, 6) === "AVIRA-")
  2644. return false;
  2645. if (p_toolbar_to_be_installed.tb_type.toLowerCase() === "secure")
  2646. {
  2647. reasonString = AviraToolbarPresentAskSecureOfferRejected;
  2648. return true;
  2649. }
  2650. return false;
  2651. }
  2652.  
  2653. return false;
  2654.  
  2655. } // incumbantAVIRACheck
  2656.  
  2657. function TbTypesIntersect (tb_type_1, tb_type_2)
  2658. {
  2659. var list_1 = tb_type_1.split(",");
  2660. var list_2 = tb_type_2.split(",");
  2661. for (var i = 0; i < list_1.length; ++i)
  2662. {
  2663. for (var j = 0; j < list_2.length; ++j)
  2664. {
  2665. if (list_1[i].toLowerCase() == list_2[j].toLowerCase())
  2666. return true;
  2667. }
  2668. }
  2669.  
  2670. return false;
  2671.  
  2672. } // TbTypesIntersect
  2673.  
  2674. function toolbarsHaveTypeBlock(toolbars)
  2675. {
  2676. for (var i = 0; i < toolbars.length; ++i)
  2677. {
  2678. if (toolbars[i].tb_type === "blocked")
  2679. return true;
  2680. }
  2681. return false;
  2682. } // toolbarsHaveTypeBlock
  2683.  
  2684. function isUniquePIDOnMachine(installed_toolbars, to_be_pid)
  2685. {
  2686. for (var i = 0; i < installed_toolbars.length; ++i)
  2687. {
  2688. if (installed_toolbars[i].PID == toolbar_to_be_installed.PID)
  2689. return false;
  2690. }
  2691. return true;
  2692.  
  2693. } // isUniquePIDOnMachine
  2694.  
  2695. function CascadeThroughBrowsers(p_browser, cascade_count) // ==> string
  2696. {
  2697. var lu_table = [["cr", "ie", "ff"], ["ie", "cr", "ff"], ["ff", "cr", "ie"]];
  2698.  
  2699. if (!p_browser)
  2700. return p_browser;
  2701.  
  2702. if (cascade_count <= 0)
  2703. return p_browser;
  2704.  
  2705. if (cascade_count >=3)
  2706. return "";
  2707.  
  2708. for (var i = 0; i < lu_table.length; ++i)
  2709. {
  2710. if (lu_table[i][0] === p_browser)
  2711. {
  2712. return lu_table[i][cascade_count];
  2713. }
  2714. }
  2715.  
  2716. return "";
  2717.  
  2718. } // CascadeThroughBrowsers(p_browser, cascade_count)
  2719.  
  2720. function MoreToCascade(cascade_count, potential_browser, run_cycle) // ==> bool
  2721. {
  2722. if (!run_cycle)
  2723. return false;
  2724. if (cascade_count >= 3)
  2725. return false;
  2726. if (potential_browser)
  2727. return false;
  2728. return true;
  2729. } // MoreToCascade
  2730.  
  2731. function CheckVersion(p_browser) // ==> string
  2732. {
  2733. if (show_logger) logger.log("CheckVersion :<" + p_browser + ">");
  2734.  
  2735. if (!p_browser)
  2736. return p_browser;
  2737.  
  2738. p_browser = p_browser.toLowerCase();
  2739. if (p_browser != "ie" && p_browser != "ff" && p_browser != "cr")
  2740. {
  2741. reasonString = inputBrowserTypeNotSupported + " [" + p_browser + "]";
  2742. return "";
  2743. }
  2744. if (p_browser == "ie")
  2745. {
  2746. if (all_browsers && all_browsers.ie)
  2747. {
  2748. var version = parseInt(all_browsers.ie, 10);
  2749. if (version > 6)
  2750. return "ie";
  2751. }
  2752. reasonString = inputIEBrowserVersionNotSupported + " [" + all_browsers.ie + "]";
  2753. return "";
  2754. }
  2755. if (p_browser == "cr")
  2756. {
  2757. if (show_logger) logger.log(" CheckVersion of Chrome");
  2758. if (all_browsers && all_browsers.cr)
  2759. {
  2760. var version = parseInt(all_browsers.cr, 10);
  2761. if (show_logger) logger.log(" CheckVersion of Chrome, version : " + version);
  2762. if (version > 0)
  2763. return "cr";
  2764. }
  2765. reasonString = inputCRBrowserVersionNotSupported + " [" + all_browsers.cr + "]";
  2766. return "";
  2767. }
  2768. if (p_browser == "ff")
  2769. {
  2770. if (all_browsers && all_browsers.ff)
  2771. {
  2772. var version = parseInt(all_browsers.ff, 10);
  2773. if (version > 2)
  2774. return "ff";
  2775. }
  2776. reasonString = inputFFBrowserVersionNotSupported + " [" + all_browsers.ff + "]";
  2777. return "";
  2778. }
  2779.  
  2780. } // CheckVersion
  2781.  
  2782. function ValidBrowser(p_browser) // ==> string
  2783. {
  2784. var toolbars_on_browser = [];
  2785.  
  2786. for (var i = 0, N = installed_toolbars.length; i < N; ++i)
  2787. {
  2788. if (installed_toolbars[i].browser == p_browser)
  2789. toolbars_on_browser.push(installed_toolbars[i]);
  2790. }
  2791.  
  2792. if (toolbars_on_browser.length == 0)
  2793. {
  2794. if (show_logger) logger.log(" Toolbars on Browser == 0 return " + p_browser + "\n");
  2795. return p_browser;
  2796. }
  2797. if (toolbars_on_browser[0].PID == toolbar_to_be_installed.PID)
  2798. {
  2799. if (show_logger) logger.log(" PID === PID : " + toolbars_on_browser[0].PID + " : " + toolbar_to_be_installed.PID + "\n");
  2800. reasonString = PIDsAreSameOnSameBrowser + ", Browser " + p_browser + " PIDS [" + toolbar_to_be_installed.PID + "]";
  2801. return "";
  2802. }
  2803. if (toolbars_on_browser.length >= MAX_NUMBER_OF_TOOLBARS_ON_BROWSER)
  2804. {
  2805. if (show_logger) logger.log(" >= MAX_NUMBER_OF_TOOLBARS_ON_BROWSER \n");
  2806. reasonString = AlreadyAtMaxNumberOfPartnersPerBrowser + " [" + pid_str + "]";
  2807. return "";
  2808. }
  2809.  
  2810. return p_browser;
  2811.  
  2812. } // ValidBrowser(p_browser)
  2813.  
  2814. } // CanBeInstalled
  2815.  
  2816. function ToolbarInfo(p_PID, p_tb_type, p_browser)
  2817. {
  2818. this.PID = p_PID;
  2819. this.tb_type = p_tb_type;
  2820. this.browser = p_browser;
  2821. } // ToolbarInfo
  2822.  
  2823. } // v7installChecker
  2824.  
  2825. function GetInstalledToolbars()
  2826. {
  2827. var result = [];
  2828. //
  2829. // V5
  2830. //
  2831. var checkV5Installed = getProductVersion("{86D4B82A-ABED-442A-BE86-96357B70F4FE}");
  2832. if(!isEmpty(checkV5Installed) )
  2833. {
  2834. if(is64Bit())
  2835. {
  2836. v5TlbrID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\Wow6432Node\\AskToolbar\\Macro","tb",0) || "";
  2837. }
  2838. else
  2839. {
  2840. v5TlbrID = pipgetRegValue("HKEY_LOCAL_MACHINE\\Software\\AskToolbar\\Macro","tb",0) || "";
  2841. }
  2842. result.push({PID: v5TlbrID, tb_type : "ALL", browser : "ie"});
  2843. result.push({PID: v5TlbrID, tb_type : "ALL", browser : "ff"});
  2844. result.push({PID: v5TlbrID, tb_type : "ALL", browser : "cr"});
  2845. }
  2846. //
  2847. // V6
  2848. //
  2849. var partners = getIncumbentPartners();
  2850. var incumbentPartnerRegPath;
  2851. if (!isEmpty(partners))
  2852. {
  2853. if(is64Bit())
  2854. incumbentPartnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\AskPartnerNetwork\\Toolbar\\";
  2855. else
  2856. incumbentPartnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\AskPartnerNetwork\\Toolbar\\";
  2857.  
  2858. for (i = 0; i < partners.length; ++i)
  2859. {
  2860. // Check if V7 toolbar, if so go to next;
  2861. var partner_path = incumbentPartnerRegPath + partners[i] + "\\Info\\";
  2862. var browsers = pipgetRegValue (partner_path, "Browsers", 0) || "";
  2863. if (browsers)
  2864. continue;
  2865. var partner_path = incumbentPartnerRegPath + partners[i] + "\\Macro\\";
  2866. var tb_type = pipgetRegValue (partner_path, "tb-type", 0) || "";
  2867. result.push({PID: partners[i], tb_type : tb_type, browser : "ie"});
  2868. result.push({PID: partners[i], tb_type : tb_type, browser : "ff"});
  2869. result.push({PID: partners[i], tb_type : tb_type, browser : "cr"});
  2870. }
  2871. }
  2872. //
  2873. // V7
  2874. //
  2875. if (!isEmpty(partners))
  2876. {
  2877. if(is64Bit())
  2878. incumbentPartnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\AskPartnerNetwork\\Toolbar\\";
  2879. else
  2880. incumbentPartnerRegPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\AskPartnerNetwork\\Toolbar\\";
  2881.  
  2882. var tb_incumbent_path = "HKEY_LOCAL_MACHINE\\SOFTWARE\\AskPartnerNetwork\\Toolbar\\";
  2883.  
  2884. for (i = 0; i < partners.length; ++i)
  2885. {
  2886. var partner_path = incumbentPartnerRegPath + partners[i] + "\\Info\\";
  2887. var tb_path = tb_incumbent_path + partners[i] + "\\Macro\\"
  2888. var browsers = pipgetRegValue (partner_path, "Browsers", 0) || "";
  2889. var tb_type = pipgetRegValue (tb_path, "tb-type", 0) || "";
  2890.  
  2891. if (browsers.search("_IE") > 0)
  2892. {
  2893. result.push({PID: partners[i], tb_type : tb_type, browser : "ie"});
  2894. }
  2895. if (browsers.search("_CR") > 0)
  2896. {
  2897. result.push({PID: partners[i], tb_type : tb_type, browser : "cr"});
  2898. }
  2899. if (browsers.search("_FF") > 0)
  2900. {
  2901. result.push({PID: partners[i], tb_type : tb_type, browser : "ff"});
  2902. }
  2903. }
  2904. }
  2905. return result;
  2906.  
  2907. } // GetInstalledToolbars
  2908.  
  2909. var toolbars_on_ie;
  2910. var toolbars_on_cr;
  2911. var toolbars_on_ff;
  2912.  
  2913. function Result(target_browser, all_browsers, t_f)
  2914. {
  2915. this.result = 0;
  2916. this.errorDescription = "";
  2917. this.display = t_f === true ? 1 : 0;
  2918. this.reporting = new Reporting();
  2919. this.lookupTable = t_f === true ? new LookupTable(arguments[3]) : {};
  2920. //this.tb_info = toolbar_to_be_installed;
  2921.  
  2922. function Reporting()
  2923. {
  2924. this.trgb = target_browser.toUpperCase();
  2925. this.orgb = all_browsers.orBr.toUpperCase();
  2926. this.apn_dbr = all_browsers.dfBr.toUpperCase();
  2927. this.cmdb = all_browsers.cmdBr;
  2928. this.IEVersionInstalled = all_browsers.ie;
  2929. this.FFVersionInstalled = all_browsers.ff;
  2930. this.ChromeVersionInstalled = all_browsers.cr;
  2931.  
  2932. this.TrackID = "";
  2933. if (offers_gen_params && offers_gen_params.GeneralParameters && offers_gen_params.GeneralParameters.TrackID)
  2934. this.TrackID = offers_gen_params.GeneralParameters.TrackID;
  2935.  
  2936. toolbars_on_ie = toolbars_on_ie || GetToolbarsOnBrowser("ie");
  2937. toolbars_on_cr = toolbars_on_cr || GetToolbarsOnBrowser("cr");
  2938. toolbars_on_ff = toolbars_on_ff || GetToolbarsOnBrowser("ff");
  2939.  
  2940. this.IETB = toolbars_on_ie;
  2941. this.FFTB = toolbars_on_ff;
  2942. this.ChromeTB = toolbars_on_cr;
  2943. this.TBPartnerid = toolbar_to_be_installed.PID
  2944.  
  2945. function GetToolbarsOnBrowser(p_browser) // ==> string
  2946. {
  2947. var toolbars_on_browser = "";
  2948.  
  2949. if (!p_browser)
  2950. return toolbars_on_browser;
  2951.  
  2952. for (var i = 0, N = installed_toolbars.length; i < N; ++i)
  2953. {
  2954. if (installed_toolbars[i].browser == p_browser)
  2955. {
  2956. if (toolbars_on_browser) toolbars_on_browser += ";"
  2957. toolbars_on_browser += installed_toolbars[i].PID + ":" + installed_toolbars[i].tb_type;
  2958. }
  2959. }
  2960.  
  2961. return toolbars_on_browser;
  2962.  
  2963. } // GetToolbarsOnBrowser
  2964.  
  2965. }
  2966.  
  2967. function LookupTable(tb_info)
  2968. {
  2969. this.BROWSER_TEXT = "Browser_" + target_browser.toUpperCase() + "_TXT";
  2970. this.targetBrowser = target_browser.toUpperCase();
  2971. this.fileid = "QRST_ABCD";
  2972. this.orgb = all_browsers.orBr.toUpperCase();
  2973. this.stubversion = "7.0.0";
  2974. if (tb_info)
  2975. {
  2976. this.tbType = tb_info?tb_info.tb_type:"";
  2977. this.tbID = tb_info.PID;
  2978. }
  2979. }
  2980. } // Result
  2981.  
  2982. //
  2983. // param is in the form: CurrentID|PreviousID-(checkboxID:(true|false)|)*
  2984. //
  2985. function UIRule(param)
  2986. {
  2987. var return_obj = {};
  2988. return_obj.result = 1;
  2989. return_obj.errorDescription = "Value Was False";
  2990. return_obj.display = 0;
  2991.  
  2992. try
  2993. {
  2994. var result = 1;
  2995.  
  2996. if (show_logger) logger.log("\r\n ****** Frog UI. Parameter " + param);
  2997. if (show_logger) logger.log ("type of param is " + typeof param);
  2998. var offer_ids = param.split('-');
  2999. if (show_logger) logger.log("offer_ids after split");
  3000. if (show_logger) logger.log("offer_ids " + offer_ids);
  3001. var offer_ids = param.split('-')[0].split('|');
  3002. if (show_logger) logger.log(" --- offer_ids -- " + offer_ids[0] + " : " + offer_ids[1]);
  3003. var checkness;
  3004. checkness = param.split('-');
  3005. if (show_logger) logger.log(" --- checkyness " + JSON.stringify(checkness));
  3006. checkness = checkness[checkness.length-1];
  3007. if (show_logger) logger.log(" --- checkyness " + JSON.stringify(checkness));
  3008. checkness = checkness.split('|');
  3009. if (show_logger) logger.log(" --- checkyness " + JSON.stringify(checkness));
  3010. for (var i = 0; i < checkness.length; ++i)
  3011. {
  3012. if (checkness[i].search("oi") >= 0)
  3013. {
  3014. if (show_logger) logger.log(" --- checkyness " + JSON.stringify(checkness[i]));
  3015. var checkness_parts = checkness[i].split(':');
  3016. if (checkness_parts[1] == "true")
  3017. {
  3018. if (show_logger) logger.log(" --- checkyness is true ");
  3019. return_obj.errorDescription = "";
  3020. return_obj.display = 1;
  3021. return_obj.result = 0;
  3022. }
  3023. }
  3024. }
  3025.  
  3026. if (show_logger) logger.log (JSON.stringify(return_obj));
  3027.  
  3028. }
  3029. catch(e)
  3030. {
  3031. return_obj.result = 1;
  3032. return_obj.errorDescription = "Error Executing Rule";
  3033. return_obj.display = 0;
  3034. }
  3035. return JSON.stringify(return_obj);
  3036. }
  3037.  
  3038. function summaryRule(param) {
  3039. try
  3040. {
  3041. if (show_logger) logger.log("\r\n ****** UI rule. Parameter " + param);
  3042. return "0:Not eligible for display";
  3043. }
  3044. catch(e)
  3045. {
  3046. return false;
  3047. }
  3048. return true;
  3049. }
  3050. ===========================================================================
  3051.  
  3052. BITMAP/*
  3053. ===========================================================================
  3054. 109.bmp - unknown
  3055. 20{8,10}.bmp - radio buttons?
  3056. ===========================================================================
  3057.  
  3058. BKG/*
  3059. ===========================================================================
  3060. ERROR.PNG - "internet connection required" dialog
  3061. FINISH.PNG - Finish button
  3062. SATTB.PNG, TB.PNG - Ask toolbar offer image
  3063. ===========================================================================
  3064.  
  3065. Fiddler log:
  3066. ---------------------------------------------------------------------------
  3067.  
  3068. # Result Protocol Host URL Body Caching Content-Type Process Comments Custom
  3069. 1 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFFZ/APNAnalytics.xml 2,626 max-age=86400 application/xml sfinstaller_sffz_filezilla_8992693_:1580
  3070. 2 200 HTTP pipoffers.apnpartners.com /PIP/Server.jhtml?partner_id=SFFZ&language=en&pAppID=filezilla&pProductID=8992693 20,580 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/xml;charset=UTF-8 sfinstaller_sffz_filezilla_8992693_:1580
  3071. 3 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/accept.png 1,290 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3072. 4 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/decline.png 1,064 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3073. 5 200 HTTP ak.pipoffers.apnpartners.com /static/resources/ui/html/orchestrator1.html?PIPPID=SFFZ&PTBPartnerID=&STBPartnerID=&tbType=vanilla&version=2.8.0.2 4,265 max-age=86400 text/html sfinstaller_sffz_filezilla_8992693_:1580
  3074. 6 200 HTTP ak.pipoffers.apnpartners.com /static/resources/ui/js/pipcore-min.js?vers=9799 52,598 max-age=86400 application/javascript sfinstaller_sffz_filezilla_8992693_:1580
  3075. 7 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/sf_bg.png 7,057 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3076. 8 200 HTTP c.fsdn.com /allura/p/filezilla/icon 3,340 max-age=86400; Expires: Wed, 27 Nov 2013 04:48:55 GMT image/png sfinstaller_sffz_filezilla_8992693_:1580
  3077. 9 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/shield.png 1,647 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3078. 10 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/next.png 1,212 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3079. 11 200 HTTP ak.pipoffers.apnpartners.com /static/partners/RegistryOptimizer/images/RegistryOptimizer_en_DLA.png 24,915 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3080. 12 200 HTTP ak.pipoffers.apnpartners.com /static/partners/Winzip/images/WinzipEN_DLA_NEW.png 17,104 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3081. 13 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SFSH3D/images/progress.png 312 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3082. 14 200 HTTP ak.pipoffers.apnpartners.com /static/partners/SF1/images/cancel.png 840 max-age=86400 image/png sfinstaller_sffz_filezilla_8992693_:1580
  3083. 15 302 HTTP downloads.sourceforge.net /project/filezilla/FileZilla_Client/3.7.3/FileZilla_3.7.3_win32-setup.exe?secret=fdcca4c49ed101c2ad098582d4152bd5b8f475cb3a04bc04d3a708ff03be9cf6&r=&ts=1385442145 0 text/html sandboxiebits:868
  3084. 16 200 HTTP jaist.dl.sourceforge.net /project/filezilla/FileZilla_Client/3.7.3/FileZilla_3.7.3_win32-setup.exe 0 application/octet-stream sandboxiebits:868
  3085. 17 302 HTTP downloads.sourceforge.net /project/filezilla/FileZilla_Client/3.7.3/FileZilla_3.7.3_win32-setup.exe?secret=fdcca4c49ed101c2ad098582d4152bd5b8f475cb3a04bc04d3a708ff03be9cf6&r=&ts=1385442145 0 text/html sandboxiebits:868
  3086. 18 200 HTTP jaist.dl.sourceforge.net /project/filezilla/FileZilla_Client/3.7.3/FileZilla_3.7.3_win32-setup.exe 4,812,567 application/octet-stream sandboxiebits:868
  3087. 19 200 HTTP ak.pipoffers.apnpartners.com /static/partners/RegistryOptimizer/winziprosetup.exe 0 max-age=86400 application/x-msdownload sandboxiebits:868
  3088. 20 200 HTTP ak.pipoffers.apnpartners.com /static/partners/RegistryOptimizer/winziprosetup.exe 3,735,008 max-age=86400 application/x-msdownload sandboxiebits:868
  3089. 21 404 HTTP ak.pipoffers.apnpartners.com /static/partners/SFFZ/images/install.ico 237 max-age=86400 text/html; charset=iso-8859-1 sfinstaller_sffz_filezilla_8992693_:1580
  3090. 22 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3091. 23 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3092. 24 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3093. 25 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3094. 26 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3095. 27 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3096. 28 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:1580
  3097. 29 200 HTTP pipoffers.apnpartners.com /PIP/OfferAccept.jhtml 0 no-cache; Expires: Thu, 01 Jan 1970 00:00:00 GMT text/plain sfinstaller_sffz_filezilla_8992693_:472
  3098.  
  3099. All connections made by sfinstaller_sffz_filezilla_8992693_.exe have IE's user agent, while sandboxiebits.exe(Microsoft BITS) uses "Microsoft BITS/6.7" as user agent.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement