IGDB List Extra Info

Adds additional information (genre, rating, keywords)to igdb.com lists. They can be loaded witha button // click. Needs an IGDB api key.

当前为 2018-12-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name IGDB List Extra Info
  3. // @namespace https://greasyfork.org/de/users/155913-nkay08
  4. // @description Adds additional information (genre, rating, keywords)to igdb.com lists. They can be loaded witha button // click. Needs an IGDB api key.
  5. //
  6. // @author NKay
  7. // @include http*://www.igdb.com/*
  8. // @grant none
  9. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  10. // @version 0.0.2.201808121415
  11. // ==/UserScript==
  12.  
  13.  
  14. //insert your API-KEY here
  15.  
  16. var apikey = '';
  17.  
  18.  
  19. var apiurl;
  20. var req;
  21. var reqid;
  22. var corsproxy;
  23. var fields;
  24. var fieldsall
  25.  
  26.  
  27. var myheaders;
  28.  
  29. var gametextarray;
  30. var gameidarray;
  31. var genresnodearray;
  32. var keywordsnodearray;
  33. var ratingnodearray;
  34. var ttbnodearray;
  35.  
  36. var keyword_dict = {};
  37. var genres_dict = {};
  38. var id_list = {};
  39. var genres_list_list = {};
  40. var genres_list = {};
  41. var keyword_list = {};
  42. var games_info = {};
  43. var games_text_info = {};
  44.  
  45. var idortext;
  46.  
  47. var keyelement = "div.content-left.col-md-pull-10.col-md-2";
  48. //only execute function if this element is loaded via ajax
  49. waitForKeyElements(keyelement, checkForElement);
  50.  
  51. //waitForKeyElements(keyelement,alert1);
  52.  
  53. function alert1() {
  54. alert('alert');
  55. }
  56.  
  57. function init() {
  58. apiurl = 'https://api-endpoint.igdb.com';
  59. req = '/games/?search=';
  60. reqid = '/games/1942?fields=*';
  61. corsproxy = 'https://cors-anywhere.herokuapp.com/';
  62. fields = '?fields=genres,keywords,rating,rating_count,aggregated_rating,aggregated_rating_count,total_rating,total_rating_count,time_to_beat';
  63. fieldsall = 'fields=*';
  64. myheaders = new Headers();
  65. myheaders.append('user-key', apikey);
  66. myheaders.append('Accept', 'application/json');
  67. gametextarray = [];
  68. gameidarray = [];
  69. genresnodearray = [];
  70. keywordsnodearray = [];
  71. ratingnodearray = [];
  72. ttbnodearray = [];
  73.  
  74. reset_data();
  75.  
  76. idortext = 'text';
  77.  
  78. /*var fe = fetch('https://cors-anywhere.herokuapp.com/https://api-endpoint.igdb.com/games/?search=Halo&fields=*', {headers: myheaders})
  79. .then(res2 => res2.json())
  80. .then(data => console.log("halo",data))
  81. .catch(function (err) {
  82. console.log(err.message);
  83. console.log(err.stack);
  84. })
  85. .catch(function (err) {
  86. console.log(err.message);
  87. console.log(err.stack);
  88. });*/
  89.  
  90.  
  91. }
  92.  
  93. function checkForElement(jnode) {
  94. if (!document.getElementById('btnaddinfo')) {
  95. init();
  96. addButton();
  97. addAdditionalInfo();
  98. }
  99. }
  100.  
  101. function populateGametextarray(element) {
  102. //get the game name
  103. var span1 = element.getElementsByTagName('span');
  104. var gametext = span1[0].innerHTML;
  105. var cururl = corsproxy + apiurl + req + gametext;
  106. gametextarray.push(gametext);
  107. //gametextarray.push(cururl);
  108. //console.log(cururl)
  109.  
  110. }
  111.  
  112. function populateGameidarray(element) {
  113. // get sibling. sibling has game id
  114. var sib = element.nextSibling;
  115. var gameid = sib.getAttribute("data-game");
  116. }
  117.  
  118. function addTextNodes(div) {
  119. for (var i = 0; i < div.length; i++) {
  120. // console.log(div[i]);
  121. addTextNode(div[i], i);
  122. }
  123. }
  124.  
  125. function addTextNode(el, i) {
  126. var genrestext = document.createTextNode('Genres: ');
  127. var genresspan = document.createElement('span');
  128. genresspan.style.fontSize = 'medium';
  129. genresspan.style.textDecoration = 'underline';
  130. genresspan.appendChild(genrestext);
  131. el.appendChild(genresspan);
  132. var genresnode = document.createElement('span');
  133. genresnode.setAttribute("id", "usgenre" + i.toString());
  134. el.appendChild(genresnode);
  135. genresnodearray.push(genresnode);
  136. el.appendChild(document.createTextNode(' | '));
  137. var keywordstext = document.createTextNode('Keywords: ');
  138. var kwspan = document.createElement('span');
  139. kwspan.style.fontSize = 'medium';
  140. kwspan.style.textDecoration = "underline";
  141. kwspan.appendChild(keywordstext);
  142. el.appendChild(kwspan);
  143. var keywordsnode = document.createElement('span');
  144. keywordsnode.setAttribute("id", "uskw" + i.toString());
  145. el.appendChild(keywordsnode);
  146. keywordsnodearray.push(keywordsnode);
  147. el.appendChild(document.createTextNode(' | '));
  148. var ratingtext = document.createTextNode('Rating: ');
  149. var rtspan = document.createElement('span');
  150. rtspan.style.fontSize = 'medium';
  151. rtspan.style.textDecoration = "underline";
  152. rtspan.appendChild(ratingtext);
  153. el.appendChild(rtspan);
  154. var ratingnode = document.createTextNode('');
  155. el.appendChild(ratingnode);
  156. ratingnodearray.push(ratingnode);
  157. el.appendChild(document.createTextNode(' | '));
  158. var ttbtext = document.createTextNode('TTB: ');
  159. var ttbspan = document.createElement('span');
  160. ttbspan.style.fontSize = 'medium';
  161. ttbspan.style.textDecoration = 'underline';
  162. ttbspan.appendChild(ttbtext);
  163. var ttbnode = document.createElement('span');
  164. el.appendChild(ttbspan);
  165. el.appendChild(ttbnode);
  166. ttbnodearray.push(ttbnode);
  167.  
  168. if (idortext == 'text') {
  169. populateGametextarray(el);
  170. }
  171. if (idortext == 'id') {
  172. populateGameidarray(el);
  173. }
  174.  
  175.  
  176. }
  177.  
  178.  
  179. function addButton() {
  180. //add Button
  181. var btn = document.createElement("button");
  182. var btntext = document.createTextNode('Load info (less hits)');
  183. btn.appendChild(btntext);
  184. btn.addEventListener("click", function () {
  185. load(idortext);
  186. }, false);
  187. btn.setAttribute("id", "btnaddinfo");
  188. var btn2 = document.createElement("button");
  189. var btntext2 = document.createTextNode('Load genres (more hits)');
  190. btn2.appendChild(btntext2);
  191. btn2.addEventListener("click", function () {
  192. loadgenres(idortext);
  193. }, false);
  194. btn2.setAttribute("id", "btnaddinfo2");
  195. var btn3 = document.createElement("button");
  196. var btntext3 = document.createTextNode('Load keywords (more hits)');
  197. btn3.appendChild(btntext3);
  198. btn3.addEventListener("click", function () {
  199. loadkws(idortext);
  200. }, false);
  201. btn3.setAttribute("id", "btnaddinfo3");
  202. var sidebar = document.getElementsByClassName("user-details-sidebar");
  203. if (sidebar) {
  204. var sibling = sidebar[0].nextSibling;
  205.  
  206. sibling.parentNode.insertBefore(btn, sibling);
  207. sibling.parentNode.insertBefore(btn2, sibling);
  208. sibling.parentNode.insertBefore(btn3, sibling);
  209. sibling.parentNode.insertBefore(document.createElement("hr"), sibling);
  210. }
  211.  
  212. function load(str) {
  213. loadbytext4(gametextarray, 1, 1, 0, 0, 0);
  214. }
  215.  
  216. function loadgenres(str) {
  217. loadbytext4(gametextarray, 0, 0, 1, 0, 0);
  218. }
  219.  
  220. function loadkws(str) {
  221. loadbytext4(gametextarray, 0, 0, 0, 1, 0);
  222. }
  223.  
  224. // var firstbtn = document.getElementsByClassName("panel-title");
  225. // firstbtn[0].parentNode.insertBefore(document.createElement('hr'), firstbtn[0]);
  226. // firstbtn[0].parentNode.insertBefore(btn, firstbtn[0]);
  227. // firstbtn[0].parentNode.insertBefore(document.createElement('hr'), firstbtn[0]);
  228. }
  229.  
  230. function addAdditionalInfo(jnode) {
  231. console.log('Adding button and placeholders for extra info');
  232. // var pageDivs = document.getElementsByClassName("media-body");
  233. // addTextNodes(pageDivs);
  234.  
  235. var selector = "#content-page > div > div.content-left.col-md-push-2.col-md-10 > div:nth-child(2) > div.panel-body.listentries > div > div:nth-child(n) > div.media-body";
  236. var selector2 = "#content-page > div > div.content-left.col-md-push-2.col-md-10 > div > div.panel-body.listentries > div > div:nth-child(5) > div";
  237. var selectorgen = "div.listentries div.media div.media-body";
  238. var queryres = document.querySelectorAll(selectorgen);
  239. addTextNodes(queryres);
  240. // console.log(queryres);
  241.  
  242. }
  243.  
  244. function removeChildren(element) {
  245. while (element.firstChild) {
  246. element.removeChild(element.firstChild);
  247. }
  248. }
  249.  
  250. async function loadbytext4(textarray, r = 0, ttb = 0, g = 0, k = 0, reset = 0) {
  251. console.log("Try loading data");
  252. if (reset != 0) {
  253. reset_data();
  254. } else {
  255.  
  256. if (r != 0) {
  257. ratingnodearray.forEach(element => element.nodeValue = 'loading..');
  258. }
  259. if (g != 0) {
  260. genresnodearray.forEach(element => element.innerHTML = 'loading..');
  261. }
  262. if (k != 0) {
  263. keywordsnodearray.forEach(element => element.innerHTML = 'loading..');
  264. }
  265. if (ttb != 0) {
  266. //console.log(ttbnodearray);
  267. ttbnodearray.forEach(element => element.innerHTML = 'loading..');
  268. }
  269. if (r != 0 || g != 0 || k != 0) {
  270. console.log("games_text_info", Object.keys(games_text_info).length, ", gametextarray", gametextarray.length);
  271. if (Object.keys(games_text_info).length == gametextarray.length) {
  272. console.log("processing data cached");
  273. if (r != 0) {
  274. gather_ratings();
  275. }
  276. if (g != 0) {
  277. gather_genres();
  278. }
  279. if (k != 0) {
  280. gather_kws();
  281. }
  282. if (ttb != 0) {
  283. gather_ttb();
  284. }
  285. } else {
  286. reset_data();
  287. var gamespromise = gather_games_text_info(textarray);
  288. gamespromise
  289. .then(function (result) {
  290. console.log("processing data");
  291. //console.log("gg",games_text_info);
  292. if (r != 0) {
  293. gather_ratings();
  294. }
  295. if (g != 0) {
  296. gather_genres();
  297. }
  298. if (k != 0) {
  299. gather_kws();
  300. }
  301. if (ttb != 0) {
  302. gather_ttb();
  303. }
  304. })
  305. .then(function () {
  306. //console.log("2. ", "id_list", Object.keys(id_list).length, ", games_info", Object.keys(games_info).length, ", gametextarray", gametextarray.length);
  307. })
  308. .catch(function (err) {
  309. console.log(err.message);
  310. console.log(err.stack);
  311. });
  312. }
  313.  
  314.  
  315. }
  316.  
  317. }
  318.  
  319.  
  320. }
  321.  
  322. function reset_data() {
  323.  
  324. keyword_dict = {};
  325. genres_dict = {};
  326. id_list = {};
  327. genres_list_list = {};
  328. genres_list = {};
  329. keyword_list = {};
  330. games_info = {};
  331. games_text_info = {};
  332.  
  333. }
  334.  
  335. function gather_ttb() {
  336. console.log("gather ttb");
  337. ttbnodearray.forEach(function (element, index) {
  338. //var curr_id = id_list[gametextarray[index]];
  339. var curr_text = gametextarray[index];
  340. //console.log(curr_id);
  341. var game_info = games_text_info[curr_text];
  342. //console.log(game_info);
  343. removeChildren(element);
  344. if (game_info.time_to_beat) {
  345. var ttb = game_info.time_to_beat;
  346. var ttbstr = "";
  347. if (ttb.hastly) {
  348. ttbstr += +(ttb.hastly / 3600).toFixed(2) + "(h), ";
  349. }
  350. if (ttb.normally) {
  351. ttbstr += +(ttb.normally / 3600).toFixed(2) + "(n), ";
  352. }
  353. if (ttb.completely) {
  354. ttbstr += (ttb.completely / 3600).toFixed(2) + "(c)";
  355. }
  356.  
  357. element.appendChild(document.createTextNode(ttbstr));
  358. //console.log("ttb", game_info.time_to_beat);
  359. } else {
  360. element.appendChild(document.createTextNode('n/a'));
  361. }
  362. });
  363. }
  364.  
  365. function gather_ratings() {
  366. console.log("gather ratings");
  367. ratingnodearray.forEach(function (element, index) {
  368. //console.log("ratingelement",element, index);
  369. //var curr_id = id_list[gametextarray[index]];
  370. //var game_info = games_info[curr_id];
  371.  
  372. var curr_text = gametextarray[index];
  373. var game_info = games_text_info[curr_text];
  374. //console.log("curr", curr_id, game_info);
  375.  
  376. removeChildren(element);
  377. var ratingstr = '';
  378. ratingstr = ratingstr.concat('User: ');
  379. if (game_info.rating) {
  380. ratingstr = ratingstr.concat(Math.round(game_info.rating).toString());
  381. ratingstr = ratingstr.concat(' (' + game_info.rating_count.toString() + ')');
  382. } else {
  383. ratingstr = ratingstr.concat('/');
  384. }
  385. ratingstr = ratingstr.concat(', ');
  386. ratingstr = ratingstr.concat('Critics: ');
  387. if (game_info.aggregated_rating) {
  388. ratingstr = ratingstr.concat(Math.round(game_info.aggregated_rating).toString());
  389. ratingstr = ratingstr.concat(' (' + game_info.aggregated_rating_count.toString() + ')');
  390. } else {
  391. ratingstr = ratingstr.concat('/');
  392. }
  393. ratingstr = ratingstr.concat(', ');
  394. ratingstr = ratingstr.concat('Total: ');
  395. if (game_info.total_rating) {
  396. ratingstr = ratingstr.concat(Math.round(game_info.total_rating).toString());
  397. ratingstr = ratingstr.concat(' (' + game_info.total_rating_count.toString() + ')');
  398. } else {
  399. ratingstr = ratingstr.concat('/');
  400. }
  401. element.nodeValue = ratingstr;
  402. });
  403. }
  404.  
  405. async function gather_genres() {
  406. var genresurl = corsproxy + apiurl + '/genres/' + Object.keys(genres_list).toString();
  407. //console.log("genres list", genres_list);
  408. console.log("genres url", genresurl);
  409. fetch(genresurl, {headers: myheaders})
  410. .then(res => res.json())
  411. .then(function (data) {
  412. //console.log("gg", genrenodesarray);
  413. console.log('genres', data);
  414. //console.log("games_info",games_info);
  415. //console.log("id_list",id_list);
  416. genresnodearray.forEach(function (element, index) {
  417. removeChildren(element);
  418. //console.log("index", index);
  419. //var curr_id = id_list[gametextarray[index]];
  420. var curr_text = gametextarray[index];
  421. //console.log("curr_id", curr_id);
  422. var game_info = games_text_info[curr_text];
  423. var curr_genre_ids = game_info.genres;
  424. for (let genre_id of curr_genre_ids) {
  425. //console.log("genre_id",genre_id);
  426. var curr_genre = data.find(item => item.id == genre_id);
  427. //console.log("curr_genre", curr_genre);
  428. var newgenre = document.createElement('a');
  429. newgenre.setAttribute("href", curr_genre.url);
  430. newgenre.appendChild(document.createTextNode(curr_genre.name + ', '));
  431. element.appendChild(newgenre);
  432. }
  433. });
  434. })
  435. .catch(function (err) {
  436. console.log(err.message);
  437. console.log(err.stack);
  438. });
  439. }
  440.  
  441. async function gather_kws() {
  442. var kwurl = corsproxy + apiurl + '/genres/' + Object.keys(genres_list).toString();
  443. //console.log("genres list", genres_list);
  444. console.log("kw", kwurl);
  445. fetch(kwurl, {headers: myheaders})
  446. .then(res => res.json())
  447. .then(function (data) {
  448. //console.log("gg", genrenodesarray);
  449. console.log('kws', data);
  450. //console.log("games_info",games_info);
  451. //console.log("id_list",id_list);
  452. keywordsnodearray.forEach(function (element, index) {
  453. removeChildren(element);
  454. //console.log("index", index);
  455. //var curr_id = id_list[gametextarray[index]];
  456. var curr_text = gametextarray[index];
  457. //console.log("curr_id", curr_id);
  458. var game_info = games_text_info[curr_text];
  459. var curr_kw_ids = game_info.keywords;
  460. for (let kw_id of curr_kw_ids) {
  461. //console.log("genre_id",genre_id);
  462. var curr_kw = data.find(item => item.id == kw_id);
  463. //console.log("curr_genre", curr_genre);
  464. var newkw = document.createElement('a');
  465. newgenre.setAttribute("href", curr_kw.url);
  466. newgenre.appendChild(document.createTextNode(curr_kw.name + ', '));
  467. element.appendChild(newkw);
  468. }
  469. });
  470. })
  471. .catch(function (err) {
  472. console.log(err.message);
  473. console.log(err.stack);
  474. });
  475. }
  476.  
  477. function gather_games_text_info(textarray) {
  478. var sliced = textarray;
  479. return Promise.all(sliced.map(text =>
  480. new Promise((resolve, reject) => {
  481. var info = load_info_by_text(text);
  482. info
  483. .then(data =>
  484. new Promise((resolve2, reject2) => {
  485.  
  486. var curr_info = data[0];
  487. //console.log("curr_info",curr_info);
  488. games_text_info[text] = curr_info;
  489. if (curr_info.genres) {
  490. for (let genre of curr_info.genres) {
  491. //console.log("genre_num",genre);
  492. genres_list[genre] = genre;
  493.  
  494. }
  495. }
  496. if (curr_info.keywords) {
  497. for (let kw of curr_info.keywords) {
  498. keyword_list[kw] = kw;
  499. }
  500. }
  501. resolve2("resolve2");
  502. })
  503. .catch(function (err) {
  504. console.log(err.message);
  505. console.log(err.stack);
  506. })
  507. )
  508. .then(function () {
  509. console.log("resolve", text)
  510. resolve("resolve");
  511. })
  512. .catch(function (err) {
  513. console.log(err.message);
  514. console.log(err.stack);
  515. });
  516. })
  517. ))
  518. .catch(function (err) {
  519. console.log(err.message);
  520. console.log(err.stack);
  521. });
  522.  
  523.  
  524. }
  525.  
  526.  
  527. function gather_games_info(textarray) {
  528.  
  529.  
  530. //var sliced = textarray.slice(0,2);
  531. var sliced = textarray;
  532. console.log("Try loading for:", sliced);
  533. return Promise.all(sliced.map(text =>
  534. new Promise((resolve, reject) => {
  535. var curr_id = get_game_id_by_text(text);
  536. curr_id
  537. .then(id =>
  538. new Promise((resolve2, reject2) => {
  539. id_list[text] = id;
  540. var info = load_info_by_id(id);
  541. info.then(
  542. function (result) {
  543. return result;
  544. }
  545. )
  546. .then(data =>
  547. new Promise((resolve3, reject3) => {
  548. var curr_info = data[0];
  549. games_info[id] = curr_info;
  550.  
  551. //console.log("curr_info",curr_info);
  552. if (curr_info.genres) {
  553. for (let genre of curr_info.genres) {
  554. //console.log("genre_num",genre);
  555. genres_list[genre] = genre;
  556.  
  557. }
  558. //console.log("genres",curr_info.genres);
  559. }
  560. if (curr_info.keywords) {
  561. for (let kw of curr_info.keywords) {
  562. keyword_list[kw] = kw;
  563. }
  564. }
  565. //console.log("resolve3");
  566. resolve3("resolve3");
  567. })
  568. )
  569. .then(function () {
  570. //console.log("resolve2");
  571. resolve2("resolve2");
  572. })
  573. .catch(function (err) {
  574. console.log(err.message);
  575. console.log(err.stack);
  576. });
  577.  
  578. })
  579. )
  580. .then(function () {
  581. //console.log("info", games_info);
  582. console.log("resolve", text);
  583.  
  584. resolve("resolve");
  585. //return true;
  586. })
  587. .catch(function (err) {
  588. console.log(err.message);
  589. console.log(err.stack);
  590. });
  591. })
  592. ))
  593. .then(function (data2) {
  594. console.log("glist", genres_list);
  595. })
  596. .catch(function (err) {
  597. console.log(err.message);
  598. console.log(err.stack);
  599. });
  600. }
  601.  
  602. async function load_info_by_text(text) {
  603. var text_url = (corsproxy + apiurl + req + text + "&" + fieldsall);
  604. return fetch(text_url,
  605. {
  606. headers: myheaders
  607. }
  608. )
  609. .then(res => res.json())
  610. .then(function (data) {
  611. //console.log("data",data);
  612. return data;
  613. })
  614. .catch(function (err) {
  615. console.log(err.message);
  616. console.log(err.stack);
  617. });
  618. }
  619.  
  620. async function load_info_by_id(id) {
  621. var id_url = (corsproxy + apiurl + '/games/' + id + fields);
  622. return fetch(id_url, {headers: myheaders})
  623. .then(res => res.json())
  624. .then(function (data) {
  625. return data;
  626. })
  627. .catch(function (err) {
  628. console.log(err.message);
  629. console.log(err.stack);
  630. });
  631. }
  632.  
  633. function get_game_id_by_text(text) {
  634. return fetch(corsproxy + apiurl + req + text, {headers: myheaders})
  635. .then(res => res.json())
  636. .then(function (data) {
  637. var game_id_num = data[0].id;
  638. var game_id = game_id_num.toString();
  639. return game_id;
  640. })
  641. .catch(function (err) {
  642. console.log(err.message);
  643. console.log(err.stack);
  644. });
  645. }
  646.  
  647. function load_single_by_text(text, index) {
  648. var result = fetch(corsproxy + apiurl + req + text, {headers: myheaders})
  649. .then(res => res.json())
  650. .then(function (data) {
  651. var game_id_num = data[0].id;
  652. id_list.push(game_id_num);
  653. console.log("pushed", game_id_num);
  654. var game_id = game_id_num.toString();
  655. load_single_by_id(game_id, index, 1, 0, 0);
  656. return data;
  657. });
  658. }
  659.  
  660. /*--- waitForKeyElements(): A utility function, for Greasemonkey scripts,
  661. that detects and handles AJAXed content.
  662.  
  663. Usage example:
  664.  
  665. waitForKeyElements (
  666. "div.comments"
  667. , commentCallbackFunction
  668. );
  669.  
  670. //--- Page-specific function to do what we want when the node is found.
  671. function commentCallbackFunction (jNode) {
  672. jNode.text ("This comment changed by waitForKeyElements().");
  673. }
  674.  
  675. IMPORTANT: This function requires your script to have loaded jQuery.
  676. */
  677. function waitForKeyElements(
  678. selectorTxt,
  679. /* Required: The jQuery selector string that
  680. specifies the desired element(s).
  681. */
  682. actionFunction,
  683. /* Required: The code to run when elements are
  684. found. It is passed a jNode to the matched
  685. element.
  686. */
  687. bWaitOnce,
  688. /* Optional: If false, will continue to scan for
  689. new elements even after the first match is
  690. found.
  691. */
  692. iframeSelector
  693. /* Optional: If set, identifies the iframe to
  694. search.
  695. */
  696. ) {
  697. var targetNodes, btargetsFound;
  698.  
  699. if (typeof iframeSelector == "undefined")
  700. targetNodes = $(selectorTxt);
  701. else
  702. targetNodes = $(iframeSelector).contents()
  703. .find(selectorTxt);
  704.  
  705. if (targetNodes && targetNodes.length > 0) {
  706. btargetsFound = true;
  707. /*--- Found target node(s). Go through each and act if they
  708. are new.
  709. */
  710. targetNodes.each(function () {
  711. var jThis = $(this);
  712. var alreadyFound = jThis.data('alreadyFound') || false;
  713.  
  714. if (!alreadyFound) {
  715. //--- Call the payload function.
  716. var cancelFound = actionFunction(jThis);
  717. if (cancelFound)
  718. btargetsFound = false;
  719. else
  720. jThis.data('alreadyFound', true);
  721. }
  722. });
  723. } else {
  724. btargetsFound = false;
  725. }
  726.  
  727. //--- Get the timer-control variable for this selector.
  728. var controlObj = waitForKeyElements.controlObj || {};
  729. var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  730. var timeControl = controlObj[controlKey];
  731.  
  732. //--- Now set or clear the timer as appropriate.
  733. if (btargetsFound && bWaitOnce && timeControl) {
  734. //--- The only condition where we need to clear the timer.
  735. clearInterval(timeControl);
  736. delete controlObj[controlKey];
  737. } else {
  738. //--- Set a timer, if needed.
  739. if (!timeControl) {
  740. timeControl = setInterval(function () {
  741. waitForKeyElements(selectorTxt,
  742. actionFunction,
  743. bWaitOnce,
  744. iframeSelector
  745. );
  746. },
  747. 300
  748. );
  749. controlObj[controlKey] = timeControl;
  750. }
  751. }
  752. waitForKeyElements.controlObj = controlObj;
  753. }