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