[DP] PlanetDP Listeler

Planetdp portalında kendinize özel listeler oluşturmasına olanak sağlar.

  1. // ==UserScript==
  2. // @name [DP] PlanetDP Listeler
  3. // @description Planetdp portalında kendinize özel listeler oluşturmasına olanak sağlar.
  4. // @version 1.2
  5. // @author nht.ctn
  6. // @namespace https://github.com/nhtctn
  7. // @icon data:image/png;base64,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
  8. // @run-at document-end
  9.  
  10. // @include *://*planetdp.org*
  11. // @include *://*forum.planetdp.org*
  12.  
  13. // @grant GM_addStyle
  14. // @grant GM_getValue
  15. // @grant GM_setValue
  16. // @grant GM_addValueChangeListener
  17. // @grant GM_xmlhttpRequest
  18.  
  19. /* global $ */
  20. // ==/UserScript==
  21. /*jshint esversion: 6 */
  22.  
  23. (function() {
  24. 'use strict';
  25.  
  26. var defaultQueueForm = {name: "", description: "", counter: 1, delay: 0, note: 1, sortBy: "created", color: "olive"};
  27. var version = 1.1;
  28. // var defaultContentForm = {};
  29. // var oldContentDeleteTime = millisecondConverter(2, "year", "ms"); // 2 Year
  30. var checkWaitingTime = millisecondConverter(10, "minute", "ms"); // 10 minutes
  31.  
  32. var pageUrl = window.location.href;
  33. var x;
  34. var enter = `
  35. `;
  36. if (pageUrl.search(/forum\.planetdp\.org\/.+/) > 0) {
  37. waitForKeyElements('.cke_toolbar.cke_toolbar_last > .cke_toolbar_end', function() {addForumExport();}, false);
  38. }
  39. else {
  40. if (pageUrl.search( /planetdp\.org\/title\// ) >= 0) {
  41. var babaMain = document.querySelector('div.baba_main');
  42. var cardId = pageUrl.replace(/.+planetdp\.org\/title\/.+-dp(\d+)(.+)?/,"$1");
  43. var cardInfos = getCardInfos(babaMain, cardId);
  44. }
  45.  
  46. if (document.querySelector( '[href="/logout"]' ) != null)
  47. {
  48. // Üye menüsüne Kuyruk ikonu ve içine kuyruk oluştur seçeneğini yerleştir.
  49. var queueHtmlZero = `
  50. <li class="dropdown">
  51. <a data-toggle="dropdown" data-placement="bottom" class="lists-menu648" title="Listeler" class="dropdown-toggle" data-secondary-toggle="tooltip">
  52. <span class="badge"></span>
  53. <i class="fa fa-tasks"></i>
  54. </a>
  55. <ul class="dropdown-menu user-dropdown"><li id="queue648"><a href="#">Liste Oluştur</a></li></ul>
  56. </li>
  57. `;
  58. $('.user-buttons > .seperator:first').after(queueHtmlZero);
  59. document.getElementById("queue648").onclick = function() {insertQueueForm("new");};
  60.  
  61. // Varsa mevcut kuyrukları da ekle.
  62. isertQueues();
  63.  
  64. // Kuyruklar güncellendiğinde eski seçenek ve butonları temizle, baştan oluşturan fonksiyonu çlıştır.
  65. GM_addValueChangeListener("queueArray", function(name, old_value, new_value, remote) {
  66. var oldOptions = document.querySelectorAll('[id^="queue648_"]');
  67. for (x = 0; x < oldOptions.length; x++) {
  68. oldOptions[x].remove();
  69. }
  70. isertQueues();
  71. });
  72. }
  73.  
  74. // CSS eklemeleri (Her sayfada gerekli css'ler yok.)
  75. GM_addStyle(`
  76. .window-header {
  77. padding-bottom: 15px;
  78. border-bottom: 1px solid #000;
  79. display: contents;
  80. }
  81. .mfp-close-btn-in .mfp-close {
  82. color: #333;
  83. }
  84. button.mfp-close, button.mfp-arrow {
  85. overflow: visible;
  86. cursor: pointer;
  87. background: transparent;
  88. border: 0;
  89. -webkit-appearance: none;
  90. display: block;
  91. outline: none;
  92. padding: 0;
  93. z-index: 1046;
  94. -webkit-box-shadow: none;
  95. box-shadow: none;
  96. }
  97. .mfp-close {
  98. width: 44px;
  99. height: 44px;
  100. line-height: 44px;
  101. position: absolute;
  102. right: 0;
  103. top: 0;
  104. text-decoration: none;
  105. text-align: center;
  106. opacity: .65;
  107. filter: alpha(opacity=65);
  108. padding: 0 0 18px 10px;
  109. color: #fff;
  110. font-style: normal;
  111. font-size: 28px;
  112. font-family: Arial,Baskerville,monospace;
  113. }
  114. .mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter {
  115. -webkit-user-select: none;
  116. -moz-user-select: none;
  117. user-select: none;
  118. }
  119. .mfp-bg {
  120. top: 0;
  121. left: 0;
  122. width: 100%;
  123. height: 100%;
  124. z-index: 1042;
  125. overflow: hidden;
  126. position: fixed;
  127. background: #0b0b0b;
  128. opacity: .8;
  129. filter: alpha(opacity=80);
  130. }
  131. .mfp-wrap {
  132. top: 0;
  133. left: 0;
  134. width: 100%;
  135. height: 100%;
  136. z-index: 1043;
  137. position: fixed;
  138. outline: none!important;
  139. -webkit-backface-visibility: hidden;
  140. }
  141. .mfp-container {
  142. text-align: center;
  143. position: absolute;
  144. width: 100%;
  145. height: 100%;
  146. left: 0;
  147. top: 0;
  148. padding: 0 8px;
  149. -webkit-box-sizing: border-box;
  150. -moz-box-sizing: border-box;
  151. box-sizing: border-box;
  152. }
  153. .mfp-container:before {
  154. content: '';
  155. display: inline-block;
  156. height: 100%;
  157. vertical-align: middle;
  158. }
  159. .mfp-auto-cursor .mfp-content {
  160. cursor: auto;
  161. }
  162. .mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content {
  163. width: 100%;
  164. cursor: auto;
  165. }
  166. .mfp-content {
  167. position: relative;
  168. display: inline-block;
  169. vertical-align: middle;
  170. margin: 0 auto;
  171. text-align: left;
  172. z-index: 1045;
  173. }
  174. .window-content .btn {
  175. margin-right: 15px;
  176. }
  177. .btn {
  178. display: inline-block;
  179. padding: 6px 12px;
  180. margin-bottom: 0;
  181. font-size: 14px;
  182. font-weight: 400;
  183. line-height: 1.42857143;
  184. text-align: center;
  185. white-space: nowrap;
  186. vertical-align: middle;
  187. -ms-touch-action: manipulation;
  188. touch-action: manipulation;
  189. cursor: pointer;
  190. -webkit-user-select: none;
  191. -moz-user-select: none;
  192. -ms-user-select: none;
  193. user-select: none;
  194. background-image: none;
  195. border: 1px solid transparent;
  196. border-radius: 4px;
  197. }
  198. .btn-default {
  199. color: #333;
  200. background-color: #fff;
  201. border-color: #ccc;
  202. }` +
  203. // Ekstra CSS'ler
  204. `
  205.  
  206. ul[id^="queueWindow_list"] {
  207. height: 450px;
  208. overflow-y: auto;
  209. }
  210. ul[id^="queueWindow_list"] > li {
  211. padding: 7px 5px;
  212. border-bottom: 1px dotted #000;
  213. list-style: none;
  214. display: flex;
  215. }
  216. .div-left {
  217. display: inline-block;
  218. width: 70%;
  219. padding-right: 15px;
  220. }
  221. .div-right {
  222. display: inline-block;
  223. width: 30%;
  224. }
  225. .div-left > *, .div-right > * {
  226. display: block;
  227. width: 100%;
  228. word-break: break-word;
  229. }
  230. .queue_list_hide {
  231. display: none;
  232. }
  233. .queButtons {
  234. display: flex;
  235. flex-direction: row-reverse;
  236. align-items: center;
  237. }
  238. .waitingButtons {
  239. flex: 1;
  240. }
  241. .editButtons > i {
  242. font-size: 15px;
  243. border-radius: 15px;
  244. margin-left: 10px;
  245. user-select: none;
  246. }
  247. #deleteQueue:hover, #editQueue:hover, #exportQueue:hover {
  248. color: #f00;
  249. }
  250. .badge.no-counter {
  251. opacity: 0.6;
  252. }
  253.  
  254. /* MOBİL GÖRÜNÜM */
  255. @media only screen and (max-width: 767px) and (min-width: 320px){
  256. #queueWindow-form {margin: 0;}
  257. .queButtons { flex-direction: column; }
  258. .queButtons > * { width: 100%; text-align: left; }
  259. .editButtons > i { margin: 0 15px 0 0; }
  260. .waitingButtons { margin-top: 10px; }
  261. ul[id^="queueWindow_list"] > li { flex-direction: column; }
  262. .div-right, .div-left { width: 100%; }
  263. }
  264. `);
  265.  
  266. $('#dpDarkCss').after('<style id="queueCss_dark">queueWindow-form li, [id*="-form"] .window-header { border-color: #4c4c4c!important; }</style>');
  267. darkToggle();
  268. $('#darkSwitchButton').on("click", function() {darkToggle();} );
  269. }
  270.  
  271. function darkToggle() {
  272. if ($('#dpDarkCss').attr("disabled")) { $('#queueCss_dark').prop("disabled", "disabled"); }
  273. else { $('#queueCss_dark').prop("disabled", ""); }
  274. }
  275.  
  276. function getCardInfos(page, c_ID) {
  277. var cardTitle = page.querySelector( 'h1[itemprop="name"]' ).textContent.trim();
  278. var year = page.querySelector('span[itemprop="copyrightYear"]');
  279. year = (year) ? year.textContent.trim().replace(/\n/gi,"").replace(/(\d{4})\s?-?\s?(\d{4})?/,"$1") : "?";
  280. var dpRaiting = page.querySelector('span[itemprop="ratingValue"]');
  281. dpRaiting = (dpRaiting) ? dpRaiting.textContent.trim() : "-";
  282. var imdbBoxLink = page.querySelector('ul.pd [href*="imdb.com/title/tt"]');
  283. var imdbID = (imdbBoxLink) ? imdbBoxLink.href.replace(/.+imdb\.com\/title\/tt(\d+)/,"$1") : "-";
  284. var imdbRating = (imdbBoxLink) ? imdbBoxLink.closest("ul").querySelector('li.active').textContent.trim().replace(/\/10/,"") : "-";
  285. imdbRating = (imdbRating == "") ? "-" : imdbRating;
  286. return {cardId: c_ID, cardTitle: cardTitle, year: year, dpRaiting: dpRaiting, imdbID: imdbID, imdbRating: imdbRating};
  287. }
  288.  
  289. function activateElements() {
  290. var db = GM_getValue("queueArray");
  291. var lastActivate = GM_getValue("lastActivateTime");
  292. var currentTime = new Date().getTime();
  293. if (currentTime - lastActivate >= checkWaitingTime || lastActivate == null) {
  294. for (let y = 0; y < db.length; y++) {
  295. var activeWitingArray = db[y][1];
  296. for (let z = 0; z < activeWitingArray.length; z++) {
  297. var w = activeWitingArray[z];
  298. if (w != null) {
  299. if (w.active == 0) {
  300. if (currentTime >= w.activateTime) {
  301. w.active = 1;
  302. }
  303. }
  304. }
  305. }
  306. }
  307. GM_setValue("queueArray", db);
  308. GM_setValue("lastActivateTime", currentTime);
  309. }
  310. }
  311.  
  312. function downloadQueue(no) {
  313. var queue = GM_getValue("queueArray")[no];
  314. var infos = queue[0];
  315. var s = ` `;
  316. var d = new Date();
  317. var date = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
  318. var filename = infos.name + "_" + date;
  319. var array = [];
  320. arrayFilter(queue[1], array);
  321. arraySorter(array, "object", infos.sortBy);
  322.  
  323. var data = `Yapım Adı` + s + `Yıl` + s + `IMDb ID` + s + `DP ID` + s + `Aktif mi?` + s + `Not` + s + `Gecikme` + s + `Oluşturma Zamanı` + s + `Aktifleşme Zamanı` + enter;
  324. for (let x = 0; x < array.length; x++) {
  325. var q = array[x];
  326. if (q != null) {
  327. data += q.cardTitle + s + q.year + s + q.imdbID + s + q.cardId + s + q.active + s + q.note + s + q.delay + s + q.created + s + q.activateTime + enter;
  328. }
  329. }
  330.  
  331. var element = document.createElement('a');
  332. element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data));
  333. element.setAttribute('download', filename);
  334. element.style.display = 'none';
  335. document.body.appendChild(element);
  336. element.click();
  337. document.body.removeChild(element);
  338. }
  339.  
  340. function isUpToDate(no) {
  341. var infos = GM_getValue("queueArray")[no][0];
  342. if (infos.version == version) {
  343. return true;
  344. }
  345. else {
  346. upDateQueue(no);
  347. }
  348. }
  349.  
  350. function upDateQueue(no) {
  351. var queueArray = GM_getValue("queueArray");
  352. var infos = queueArray[no][0];
  353. var array = queueArray[no][1];
  354. var filtredArray = [];
  355. arrayFilter(queueArray[no][1], filtredArray);
  356.  
  357. if(confirm("Bu listenin yeni versiyona göre güncellenmesi gerekmektedir." + enter +"Sürüm " + infos.version + " => Sürüm " + version + enter + enter + "Bu işlem birkaç dakika sürebilir. Lütfen sekmeyi kapatmayın.")) {
  358. try {
  359. // İlk verisonlu sürüme geçiş. ========
  360. if (infos.version == null) {
  361. var change1 = (function(t) { // Version no ekle. Sıralama türü ekle[addedtime].
  362. return function (e) {
  363. var n_que = GM_getValue("queueArray");
  364. infos.version = version;
  365. infos.sortBy = "created";
  366. n_que[no][0] = infos;
  367. GM_setValue("queueArray", n_que);
  368. };
  369. })(no);
  370.  
  371. upDateQueueContent(no, filtredArray, 0, change1); // Öğe bilgilerini güncellemek için request at. [yıl,imdb ID,imdb puan,dp puan]
  372. alert("Güncelleme işlemi tamamlandı.");
  373. }
  374. // 1.1'e geçiş. ======================= (Henüz yayınlanmadı.)
  375. else if (infos.version == 1.0) {
  376. for (let x = 0; x < filtredArray.length; x++) {
  377. array[filtredArray[x].cardId].year = array[filtredArray[x].cardId].year.replace(/(\d{4})\s?-?\s?(\d{4})?/,"$1");
  378. }
  379. queueArray[no][0].version = version;
  380. queueArray[no][1] = array;
  381. GM_setValue("queueArray", queueArray);
  382. alert("Güncelleme işlemi tamamlandı.");
  383. }
  384. }
  385. catch(err) {
  386. alert("Güncelleme işlemi sırasında bir sorun oluştu." + enter +"Sürüm " + infos.version + " => Sürüm " + version + enter + enter + "Lütfen aşağıdaki hata mesajı ile birlikte uygulama yazarına haber verin." + enter + enter + err.message);
  387. }
  388. }
  389. }
  390.  
  391. function upDateQueueContent(no, array, index, myFunction) {
  392. if (index < array.length) {
  393. var ax = array[index];
  394. var id = ax.cardId;
  395. GM_xmlhttpRequest({
  396. method: "GET",
  397. url: "https://www.planetdp.org/title/-" + id,
  398. onload: function(response) {
  399. var json = response.responseText;
  400. var htmlObj = $(json);
  401. var page = htmlObj.find( 'div.baba_main' )[0];
  402.  
  403. var cardInfos2 = getCardInfos(page, id);
  404. createContentLog(id, no, ax.delay, ax.note, cardInfos2, ax.created);
  405.  
  406. setTimeout(function() {upDateQueueContent(no, array, index+1, myFunction);}, 500);
  407. }
  408. });
  409. }
  410. else if (index == array.length) {
  411. myFunction();
  412. }
  413. }
  414.  
  415. function createQueueWindow(queueNo) {
  416. if (isUpToDate(queueNo) == true) {
  417.  
  418. var infos = GM_getValue("queueArray")[queueNo][0];
  419. insertWindow("queueWindow", "tasks", infos.name, false, infos.color);
  420.  
  421. var buttons = `
  422. <div class="queButtons">
  423. <div class="editButtons">
  424. <i id="exportQueue" class="fa fa-file-excel-o" aria-hidden="true" title="Bu Listenin Çıktısını Al"> Çıktı Al</i>
  425. <i id="editQueue" class="fa fa-pencil" aria-hidden="true" title="Bu Listeyi Düzenle"> Düzenle</i>
  426. <i id="deleteQueue" class="fa fa-trash" aria-hidden="true" title="Bu Listeyi Sil"> Sil</i>
  427. </div>
  428. <div class="waitingButtons">
  429. <a id="queueWindow_button_active" href="#" class="btn btn-info">Aktif</a>
  430. <a id="queueWindow_button_waiting" href="#" class="btn btn-default">Beklemede</a>
  431. <a id="queueWindow_button_done" href="#" class="btn btn-default" style="display: none;">Tamamlanmış</a>
  432. </div>
  433. </div>
  434. `;
  435.  
  436. var listCovers = `
  437. <fieldset class="window-content margintop10">
  438. <ul id="queueWindow_list_active" class="queue_list_show">
  439. </ul>
  440. <ul id="queueWindow_list_waiting" class="queue_list_hide">
  441. </ul>
  442. <ul id="queueWindow_list_done" class="queue_list_hide">
  443. </ul>
  444. </fieldset>
  445. `;
  446. var listFieldset = document.querySelector('#queueWindow-form > .window-content');
  447. listFieldset.insertAdjacentHTML("beforeend", buttons + listCovers);
  448.  
  449. // Sil, düzenle, çıktı al butonlarına fonksiyonları bağla.
  450. document.querySelector('#queueWindow-form #exportQueue').onclick = function() {
  451. if (confirm("İnecek olan Txt dosyasının içindekileri kopyalayıp bir Excel dosyasına yapıştırabilirsiniz.")) {
  452. downloadQueue(queueNo);
  453. }
  454. };
  455. document.querySelector('#queueWindow-form #editQueue').onclick = function() {removeForm("queueWindow"); insertQueueForm("edit", queueNo);};
  456. document.querySelector('#queueWindow-form #deleteQueue').onclick = (function(t, inf) {
  457. return function (e) {
  458. if (confirm("Bu listeyi silmek istediğinize emin misiniz? Bu işlem geri alınamaz.")) {
  459. var library = GM_getValue("queueArray");
  460. library.splice(t, 1);
  461. GM_setValue("queueArray", library);
  462. removeForm("queueWindow");
  463. alert("\"" + infos.name + "\" adlı kuruk silindi.");
  464. }
  465. };
  466. })(queueNo, infos);
  467.  
  468. // Listelerin içini doldur ve güncelle
  469. insertLists(queueNo);
  470.  
  471. GM_addValueChangeListener("queueArray", function(name, old_value, new_value, remote) {
  472. var oldLists = document.querySelectorAll('[id^="queueWindow_list"]');
  473. for (x = 0; x < oldLists.length; x++) {
  474. oldLists[x].innerHTML = "";
  475. }
  476. insertLists(queueNo);
  477. });
  478.  
  479. // Listelerin ve butonların toggle'larını ayarla
  480. var listButtons = listFieldset.querySelectorAll('[id^="queueWindow_button"]');
  481. for (let x = 0; x < listButtons.length; x++) {
  482. listButtons[x].onclick = (function(t) {
  483. return function (e) {
  484. // Butonlar
  485. var oldButton = listFieldset.querySelector('a.btn-info');
  486. classToogle( oldButton, ["btn-info", "btn-default"] );
  487. classToogle( listButtons[x], ["btn-info", "btn-default"] );
  488.  
  489. // Listeler
  490. var oldListElement = listFieldset.querySelector( 'ul.queue_list_show' );
  491. classToogle( oldListElement, ["queue_list_show", "queue_list_hide"] );
  492. var listElement = listFieldset.querySelector( '#' + listButtons[x].id.replace('button','list') );
  493. classToogle( listElement, ["queue_list_show", "queue_list_hide"] );
  494. };
  495. })(x);
  496. }
  497.  
  498. }
  499. }
  500.  
  501. function insertLists(queueNo) {
  502. var library = GM_getValue("queueArray");
  503. var sortBy = library[queueNo][0].sortBy;
  504. sortBy = sortBy ? sortBy : "cardTitle";
  505.  
  506. // Aktif
  507. var activeArray = [];
  508. arrayFilter(library[queueNo][1], activeArray, "active");
  509. arraySorter(activeArray, "object", sortBy);
  510. var activeList = document.querySelector('#queueWindow_list_active');
  511. activeList.innerHTML = listHTML(activeArray);
  512.  
  513. // Beklemede
  514. var waitingArray = [];
  515. arrayFilter(library[queueNo][1], waitingArray, "waiting");
  516. arraySorter(activeArray, "object", sortBy);
  517. var waitingList = document.querySelector('#queueWindow_list_waiting');
  518. waitingList.innerHTML = listHTML(waitingArray);
  519.  
  520. // Tamamlanmış (Sonra)
  521. }
  522.  
  523. function listHTML(array) {
  524. var result = '';
  525. for (let x = 0; x < array.length; x++) {
  526. var a = array[x];
  527.  
  528. var d = new Date(a.created);
  529. var date = d.getDate() + "/" + (d.getMonth() + 1) + "/" + d.getFullYear();
  530.  
  531. result += `
  532. <li>
  533. <div class="div-left">
  534. <a href="/title/-` + a.cardId + `"><strong>` + a.cardTitle + ` (` + a.year + `)</strong></a>
  535. <span>` + (a.note == "" ? "" : "<strong>Not:</strong> " + a.note) + `</span>
  536. </div>
  537. <div class="div-right">
  538. <span><strong>Eklenme:</strong> ` + date + `</span>
  539. <span><strong>Gecikme:</strong> ` + (a.delay == 0 ? "Yok" : a.delay + " gün") + `</span>
  540. </div>
  541. </li>
  542. `;
  543. }
  544. result = (result == '') ? "Bu listede hiçbir öğe yok." : result;
  545. return result;
  546. }
  547.  
  548. function isertQueues() {
  549. var queues = GM_getValue("queueArray");
  550. if (queues != null && Array.isArray(queues) && queues.length >= 1) {
  551. // Aktifleşecek varsa aktifleştir.
  552. activateElements();
  553.  
  554. // Üst menüye eklemeleri yap.
  555. for (x = 0; x < queues.length; x++) {
  556. var infos = queues[x][0];
  557. var activeArray = [];
  558. arrayFilter(queues[x][1], activeArray, "active");
  559. var queueOption = '<li id="queue648_' + infos.id + '_menu"><a href="#">' + infos.name + (infos.counter == 0 ? ' <span class="badge">' + activeArray.length + '</span>' : ' <span class="badge no-counter">' + activeArray.length + '</span>') + '</a></li>';
  560. $('#queue648').parent().append(queueOption);
  561.  
  562. // Aktif öğe penceresi için fonksiyonu bağla.
  563. document.querySelector('#queue648_' + infos.id + '_menu').onclick = (function(t) {
  564. return function (e) {
  565. createQueueWindow(t);
  566. };
  567. })(x);
  568. }
  569.  
  570. // Üst menü için tooltip ve bildirimi çalıştır.
  571. // $('script[src^="/js/jquery.min.12.4.js"]').remove();
  572. $('.lists-menu648').tooltip();
  573. $('.user-buttons > li.dropdown').each(function() {
  574. var counter = countCalculator(this);
  575. $(this).find('a[data-toggle="dropdown"] > .badge').html( (counter > 0 ? counter : "") );
  576. });
  577.  
  578. // Yapım sayfasındaysa karta eklemeleri yap.
  579. if (pageUrl.search( /planetdp\.org\/title\// ) >= 0) {
  580. var readMore = document.querySelector('div[itemprop="description"] + a[data-readmore-moretext="Devamını gör"]');
  581. if (readMore) {
  582. readMore.style.position = "relative";
  583. readMore.style.marginRight = "15px";
  584. }
  585. for (x = 0; x < queues.length; x++) {
  586. var queueNo = queues.length - (x + 1);
  587. var infos2 = queues[queueNo][0];
  588. var isInQueue = queues[queueNo][1][cardId] != null;
  589. var buttonTitle = (isInQueue ? 'Listeden çıkar: ' : 'Listeye ekle: ') + infos2.name;
  590. if (isInQueue) {
  591. var q = queues[queueNo][1][cardId];
  592. var currentTime = new Date().getTime();
  593. buttonTitle += (q.active == 1 ? '' : enter + 'Aktifleşme: ' + millisecondConverter( (q.activateTime - currentTime) , "ms", "day") + ' gün sonra') + enter + (q.note == '' ? '' : 'Not: ' + q.note);
  594. }
  595. var queuButton = '<a href="#" id="queue648_' + infos2.id + '" title="' + buttonTitle + '" onclick="this.classList.toggle(`inQueue`)" class="' + (isInQueue ? 'inQueue': '') + '" style="margin-right: 10px; float: left;"><i class="fa fa-tasks" aria-hidden="true"></i></a>';
  596. document.querySelector('div.baba_main_right > div.text-right.marginver10').insertAdjacentHTML('afterbegin', queuButton);
  597. GM_addStyle('#queue648_' + infos2.id + ':hover, #queue648_' + infos2.id + '.inQueue {color: ' + infos2.color + '!important;}');
  598.  
  599. // Kuyruğa yapım ekleme/çıkarma fonksiyonunu bağla.
  600. if (isInQueue) {
  601. document.querySelector('div.baba_main_right #queue648_' + infos2.id).onclick = (function(t, id) {
  602. return function (e) {
  603. removeQueueContent(t, id);
  604. };
  605. })(x, cardId);
  606. }
  607. else {
  608. document.querySelector('div.baba_main_right #queue648_' + infos2.id).onclick = (function(t) {
  609. return function (e) {
  610. createQueueContent(t);
  611. };
  612. })(x);
  613. }
  614. }
  615. }
  616. }
  617. }
  618.  
  619. function countCalculator(dropdownLi) {
  620. var number = 0;
  621. $(dropdownLi).find('a:not([data-toggle="dropdown"]) > .badge:not(.no-counter)').each(function() {
  622. number += parseInt( this.textContent.trim().replace( /(\d+) - \d+/, "$1" ) );
  623. });
  624. return number;
  625. }
  626.  
  627. function createQueueContent(queueNo) {
  628. var queues = GM_getValue("queueArray");
  629. var r_queueNo = queues.length - (queueNo + 1);
  630. var infos = queues[r_queueNo][0];
  631. var c_delay = infos.delay;
  632. var c_note = infos.note;
  633. var note = '';
  634. var delay = c_delay;
  635.  
  636. // Lazımsa notu ve/veya gecikme süresini al.
  637. if (c_note == 0 || c_delay == "?") {
  638. insertWindow("content", "tasks", "Listeye ekle: " + infos.name, true, infos.color);
  639. var formContent = [];
  640. if (c_note == 0) {formContent.push( {name: 'Açıklama', element: 'textarea', elementProperties: 'id="queue_content_note" placeholder="Yapılacak iş ile ilgili bir not bırakabilirsiniz. Bu alan zorunlu değildir." style="resize: vertical;"'} );}
  641. if (c_delay == "?") {formContent.push( {name: 'Öğe Aktifleşme Gecikmesi', element: 'select', elementProperties: 'id="queue_content_delay"', inside: function() {return optionsHTML(this.options);}, options: [
  642. {value: '0', text: 'Yok'},
  643. {value: '1', text: '1 gün sonra'},
  644. {value: '2', text: '2 gün sonra'},
  645. {value: '3', text: '3 gün sonra'},
  646. {value: '7', text: '7 gün sonra'},
  647. {value: '15', text: '15 gün sonra'},
  648. {value: '30', text: '30 gün sonra'},
  649. {value: '*', text: 'Gün sayısını elle gir'}] }
  650. );}
  651. document.querySelector('#content-form > .window-content').insertAdjacentHTML("afterbegin", createformHTML(formContent) );
  652. if (c_delay == "?") {askToPerson( document.querySelector('select#queue_content_delay'), 7 );} // Gün sayısını elle girme fonksiyonu
  653. document.querySelector('button#save_content').onclick = function() {
  654. note = (c_note == 0 ? document.querySelector("#queue_content_note").value : '');
  655. delay = (c_delay == "?" ? getSelected("queue_content_delay") : c_delay);
  656.  
  657. // Öğeyi oluştur.
  658. createContentLog(cardId, r_queueNo, delay, note, cardInfos, new Date().getTime());
  659. removeForm("content");
  660. };
  661. }
  662. else {
  663. // Öğeyi oluştur.
  664. createContentLog(cardId, r_queueNo, delay, note, cardInfos, new Date().getTime());
  665. }
  666. }
  667.  
  668. function createContentLog(c_id, c_no, delay, note, c_Infos, added) {
  669. let que = GM_getValue("queueArray");
  670. var created = added;
  671. var activateTime = created + (delay*86400000);
  672. var active = (delay == 0 ? 1 : 0);
  673. var contentInfos = {cardId: c_id, cardTitle: c_Infos.cardTitle, active: active, note: note, created: created, activateTime: activateTime, delay: delay, year: c_Infos.year, dpRaiting: c_Infos.dpRaiting, imdbID: c_Infos.imdbID, imdbRating: c_Infos.imdbRating};
  674. que[c_no][1][c_id] = contentInfos;
  675. console.log(contentInfos);
  676. GM_setValue("queueArray", que);
  677. activateElements(); // Bekleyenleri kontrol ederek kaydet.
  678. }
  679.  
  680. function removeQueueContent(queueNo, c_cardId) {
  681. var validation = confirm("Bu yapımı listeden çıkarmak istediğinize emin misiniz?");
  682. if (validation) {
  683. var queues = GM_getValue("queueArray");
  684. var r_queueNo = queues.length - (queueNo + 1);
  685. queues[r_queueNo][1][c_cardId] = null;
  686. GM_setValue("queueArray",queues);
  687. console.log("removed");
  688. }
  689. }
  690.  
  691. function insertQueueForm(newOrEdit, queueNo) {
  692. var windowTitle, queueColor, oldInfos;
  693. if (newOrEdit == "new") {
  694. windowTitle = "Liste Oluştur";
  695. }
  696. else if (newOrEdit == "edit") {
  697. var library = GM_getValue("queueArray");
  698. oldInfos = library[queueNo][0];
  699. queueColor = oldInfos.color;
  700. windowTitle = "Listeyi Düzenle";
  701. }
  702.  
  703. insertWindow("queue", "tasks", windowTitle, true, queueColor);
  704.  
  705. var formContent = [
  706. {
  707. name: 'Liste Adı',
  708. element: 'input',
  709. elementProperties: 'id ="queue_name" type="text"'
  710. },
  711. {
  712. name: 'Açıklama',
  713. element: 'textarea',
  714. elementProperties: 'id="queue_description" placeholder="Listenin amacı, kullanışı vs. Bu alan zorunlu değildir." style="resize: vertical;"'
  715. },
  716. {
  717. name: 'Bildirim Olarak Göster',
  718. element: 'select',
  719. elementProperties: 'id="queue_counter"',
  720. inside: function() {return optionsHTML(this.options);},
  721. options: [
  722. {value:'0', text:'Evet'},
  723. {value:'1', text:'Hayır'}
  724. ]
  725. },
  726. {
  727. name: 'Öğe Notu',
  728. element: 'select',
  729. elementProperties: 'id="queue_note"',
  730. inside: function() {return optionsHTML(this.options);},
  731. options: [
  732. {value:'0', text:'Evet'},
  733. {value:'1', text:'Hayır'}] },
  734. {
  735. name: 'Öğe Aktifleşme Gecikmesi',
  736. element: 'select',
  737. elementProperties: 'id="queue_delay"',
  738. inside: function() {return optionsHTML(this.options);},
  739. options: [
  740. {value: '?', text: 'Ekleyişte sor'},
  741. {value: '0', text: 'Yok'},
  742. {value: '1', text: '1 gün sonra'},
  743. {value: '2', text: '2 gün sonra'},
  744. {value: '3', text: '3 gün sonra'},
  745. {value: '7', text: '7 gün sonra'},
  746. {value: '15', text: '15 gün sonra'},
  747. {value: '30', text: '30 gün sonra'},
  748. {value: '*', text: 'Gün sayısını elle gir'},
  749. ]
  750. },
  751. {
  752. name: 'Sıralama',
  753. element: 'select',
  754. elementProperties: 'id="queue_sortBy"',
  755. inside: function() {return optionsHTML(this.options);},
  756. options: [
  757. {value: 'created', text: 'Ekleme Tarihine Göre'},
  758. {value: 'activateTime', text: 'Aktifleşme Tarihine Göre'},
  759. {value: 'cardTitle', text: 'Alfabetik'},
  760. {value: 'year', text: 'Yıla Göre'},
  761. {value: 'imdbRating', text: 'IMDb Puanına Göre'},
  762. {value: 'dpRaiting', text: 'PlanetDP Puanına Göre'},
  763. ]
  764. },
  765. {
  766. name: 'Liste Rengi',
  767. element: 'select',
  768. elementProperties: 'id="queue_color" onchange="this.className = `form-control ` + this.options[this.selectedIndex].value"',
  769. inside: function() {return colorOptionsHTML();}
  770. }
  771. ];
  772. document.querySelector('#queue-form > .window-content').insertAdjacentHTML("afterbegin", createformHTML(formContent) );
  773. askToPerson( document.querySelector('select#queue_delay'), 8 ); // Gün sayısını elle girme fonksiyonu
  774.  
  775. if (newOrEdit == "new") {
  776. document.querySelector('button#save_queue').onclick = function() { createEditQueue(); };
  777. fillNewEditQueueForm(defaultQueueForm);
  778. }
  779. else if (newOrEdit == "edit") {
  780. fillNewEditQueueForm(oldInfos);
  781. document.querySelector('button#save_queue').onclick = function() { createEditQueue(queueNo); createQueueWindow(queueNo); };
  782. document.querySelector('#queue-form button#close').onclick = function() { removeForm("queue"); createQueueWindow(queueNo); };
  783. }
  784. }
  785.  
  786. function fillNewEditQueueForm(i_infos) {
  787. document.querySelector('input#queue_name').value = i_infos.name;
  788. document.querySelector('textarea#queue_description').value = i_infos.description;
  789. setSelected("queue_counter", i_infos.counter);
  790. setSelected("queue_note", i_infos.note);
  791. setSelected("queue_delay", i_infos.delay);
  792. setSelected("queue_sortBy", i_infos.sortBy);
  793. setSelected("queue_color", i_infos.color);
  794. }
  795.  
  796. function setSelected(selectId, option) {
  797. $('select#' + selectId + ' option[value="' + option + '"]').prop('selected', true);
  798. }
  799.  
  800. function askToPerson(delaySelection, askIndex) {
  801. delaySelection.onchange = function() {
  802. if(delaySelection.selectedIndex === askIndex) {
  803. var manualDelay;
  804. for (x = 0; !Number.isInteger( parseInt(manualDelay) ); x++) {
  805. manualDelay = prompt("Listeye eklenen öğeler kaç gün sonra aktifleşsin?");
  806. if (manualDelay == null) { break; }
  807. }
  808. if (manualDelay != null) {
  809. delaySelection.insertAdjacentHTML("beforeend", '<option value="' + manualDelay + '">' + manualDelay + ' gün sonra</option>');
  810. delaySelection.querySelector('option[value="' + manualDelay + '"]').selected = true;
  811. }
  812. else {
  813. delaySelection.firstElementChild.selected = true;
  814. }
  815. }
  816. };
  817. }
  818.  
  819. function createformHTML(object) {
  820. var formContentHTML = '';
  821. for (x = 0; x < object.length; x++) {
  822. var f = object[x];
  823. formContentHTML += `
  824. <div class="row margintop10">
  825. <div class="col-md-4">` + f.name + `</div>
  826. <div class="col-md-8">
  827. <` + f.element + ` ` + f.elementProperties + ` class="form-control">` + (f.inside ? f.inside(): '') + `</` + f.element + `>
  828. </div>
  829. </div>`;
  830. }
  831. return formContentHTML;
  832. }
  833.  
  834. function optionsHTML(object) {
  835. var html = '';
  836. for (var y = 0; y < object.length; y++ ) {
  837. html += '<option value="' + object[y].value + '">' + object[y].text + '</option>';
  838. }
  839. return html;
  840. }
  841.  
  842. function colorOptionsHTML() {
  843. var queueColorsHTML = "";
  844. var queueColors = ["blueviolet", "brown", "cadetblue", "chocolate", "crimson", "darkgoldenrod", "dodgerblue", "forestgreen", "lightseagreen", "mediumvioletred", "olive", "orangered", "orchid", "palevioletred", "peru", "rebeccapurple", "royalblue", "teal", "tomato"];
  845. for (x = 0; x < queueColors.length; x++) {
  846. queueColorsHTML += '<option value="' + queueColors[x] + '" style="background-color: ' + queueColors[x] + '"' + (x==0 ? 'selected': '') + '>' + queueColors[x] + '</option>';
  847. GM_addStyle('.' + queueColors[x] + ' {background-color: ' + queueColors[x] + '}');
  848. }
  849. return queueColorsHTML;
  850. }
  851.  
  852. function createEditQueue(c_queueNo) {
  853. var name = document.querySelector('input#queue_name').value;
  854. var description = document.querySelector('textarea#queue_description').value;
  855. var counter = getSelected("queue_counter");
  856. var note = getSelected("queue_note");
  857. var delay = getSelected("queue_delay");
  858. var sortBy = getSelected("queue_sortBy");
  859. var color = getSelected("queue_color");
  860.  
  861. if (name == "") {
  862. alert("Bir liste adı girmeniz gerekiyor.");
  863. }
  864. else {
  865. var id = name.replace(/[\[\]\(\)\"\!\'\^\#\+\%\&\/\\\{\}\=\*\|\-\_\@\,\;\`\:\.<>\¨\~]/gi,"").replace(/\s+/g,"_").toLowerCase();
  866. var currentTime = new Date().getTime();
  867.  
  868. var queueArray = GM_getValue("queueArray");
  869. if (queueArray == null) {
  870. queueArray = [];
  871. }
  872.  
  873. if (c_queueNo == null) {
  874. var infos = {id: id, created: currentTime, name: name, description: description, counter: counter, note: note, delay: delay, sortBy: sortBy, color: color, version: version};
  875. var newQueue = [ infos, [], [] ]; // infos, active/waiting, completed
  876. queueArray.push(newQueue);
  877. }
  878. else {
  879. var oldInfos = queueArray[c_queueNo][0];
  880. var editedInfos = {id: id, created: oldInfos.created, name: name, description: description, counter: counter, note: note, delay: delay, sortBy: sortBy, color: color, version: version};
  881. queueArray[c_queueNo][0] = editedInfos;
  882. }
  883.  
  884. // Kaydet ve pencereyi kapat.
  885. GM_setValue("queueArray", queueArray);
  886. removeForm("queue");
  887. }
  888. }
  889.  
  890. function getSelected(selectId) {
  891. var selected = document.querySelector('select#' + selectId);
  892. if (selected != null) {
  893. selected = selected.options[selected.selectedIndex].value;
  894. return selected;
  895. }
  896. else {
  897. return null;
  898. }
  899. }
  900.  
  901. function insertWindow(formName, faIcon, title, saveButton, iconColor) {
  902. // Formu ekle
  903. var formContainerHTML = `
  904. <div class="mfp-bg mfp-ready"></div>
  905. <div class="mfp-wrap mfp-close-btn-in mfp-auto-cursor mfp-ready" tabindex="-1" style="overflow: hidden auto;"><div class="mfp-container mfp-inline-holder"><div class="mfp-content">
  906. <form id="` + formName + `-form" class="white-popup-block" style="padding-top: 30px">
  907. <fieldset class="window-header">
  908. <h1 style="font-size: 25px;">
  909. <i class="fa fa-` + faIcon + `" aria-hidden="true" style="margin-right: 10px; color:` + (iconColor =! null ? iconColor : 'inherit') + `"></i>` + title + `
  910. </h1>
  911. </fieldset>
  912. <fieldset class="window-content margintop10">` + (saveButton ? `<div class="row margintop10 text-center"><button id="save_` + formName + `" type="button" class="btn btn-info" style="margin-top: 10px;">KAYDET</button></div>` : '') + `
  913. </fieldset>
  914. <button id="close" title="Kapat (Esc)" type="button" class="mfp-close">×</button>
  915. </form></div></div></div>
  916. `;
  917. document.querySelector('body').insertAdjacentHTML("afterbegin", formContainerHTML);
  918.  
  919. // Kapat tuşuyla formu kapat
  920. document.querySelector('#' + formName + '-form > button#close').onclick = function() { removeForm(formName); };
  921.  
  922. // Esc ile formu kapat
  923. function doc_keyUp(e) {
  924. if (e.key === "Escape") {
  925. removeForm(formName);
  926. }
  927. }
  928. document.addEventListener('keyup', doc_keyUp, false);
  929.  
  930. /* Bu kod firefox'da her daim çalıştığı için sorun çıkardı.
  931. // Form dışı bir yere tıklama ile formu kapat
  932. window.onclick = function(event) {
  933. if (event.target.closest('#' + formName + '-form') == null) {
  934. removeForm(formName);
  935. }
  936. };
  937. */
  938. }
  939.  
  940. function removeForm(formName) {
  941. if ( document.querySelector('#' + formName + '-form') ) {
  942. var formDiv = document.querySelector('#' + formName + '-form').parentElement.parentElement.parentElement;
  943. formDiv.previousElementSibling.remove();
  944. formDiv.remove();
  945. }
  946. }
  947.  
  948. function classToogle(element, classes) {
  949. for (let x = 0; x < classes.length; x++) {
  950. element.classList.toggle( classes[x] );
  951. }
  952. }
  953.  
  954. function arrayFilter(sourceArray, targetArray, type) {
  955. for (let x = 0; x < sourceArray.length; x++) {
  956. if (sourceArray[x] != null) {
  957. if (type == "active") {
  958. if (sourceArray[x].active == 1) targetArray.push(sourceArray[x]);
  959. }
  960. else if (type == "waiting") {
  961. if (sourceArray[x].active == 0) targetArray.push(sourceArray[x]);
  962. }
  963. else {
  964. targetArray.push(sourceArray[x]);
  965. }
  966. }
  967. }
  968. }
  969.  
  970. function arraySorter(array, objectOrNot, objectType) {
  971. if (objectOrNot == "object") {
  972. array.sort(function(a, b) {
  973. var x = ( isFinite(a[objectType]) ) ? Number(a[objectType]) : a[objectType].toString().toLowerCase();
  974. var y = ( isFinite(b[objectType]) ) ? Number(b[objectType]) : b[objectType].toString().toLowerCase();
  975. if (x < y) {return -1;}
  976. if (x > y) {return 1;}
  977. return 0;
  978. });
  979. if (objectType == "imdbRating" || objectType == "dpRaiting") array.reverse();
  980. }
  981. else if (objectOrNot == "nonObject") {
  982. array.sort();
  983. }
  984. }
  985.  
  986. function millisecondConverter( unit, from, to ) {
  987. var result;
  988. switch (from) {
  989. case "ms" :
  990. switch (to) {
  991. case "year": result = Math.round(unit / 31556952000); break;
  992. case "month" : result = Math.round(unit / 2592000000); break;
  993. case "week" : result = Math.round(unit / 604800000); break;
  994. case "day" : result = Math.round(unit / 86400000); break;
  995. case "hour" : result = Math.round(unit / 3600000); break;
  996. case "minute" : result = Math.round(unit / 60000); break;
  997. case "second" : result = Math.round(unit / 1000); break;
  998. }
  999. break;
  1000. case "year":
  1001. switch (to) {case "ms": result = unit * 31556952000; break;} break;
  1002. case "month":
  1003. switch (to) {case "ms": result = unit * 2592000000; break;} break;
  1004. case "week":
  1005. switch (to) {case "ms": result = unit * 604800000; break;} break;
  1006. case "day":
  1007. switch (to) {case "ms": result = unit * 86400000; break;} break;
  1008. case "hour":
  1009. switch (to) {case "ms": result = unit * 3600000; break;} break;
  1010. case "minute":
  1011. switch (to) {case "ms": result = unit * 60000; break;} break;
  1012. case "second":
  1013. switch (to) {case "ms": result = unit * 1000; break;} break;
  1014. }
  1015. return result;
  1016. }
  1017.  
  1018. function addForumExport() {
  1019. var appsArea = document.querySelector('.cke_toolbar.cke_toolbar_last > .cke_toolbar_end').previousElementSibling;
  1020. var appButton = `
  1021. <a id="cke_queue" class="cke_button cke_button_off" href="javascript:void('Queue')" title="Liste Çıktısı Al" role="button">
  1022. <span class="cke_button_icon" style="background-image: url('https://images2.imgbox.com/6a/18/KWBxXjc7_o.png'); background-position: 0 0px; background-size: 16px;"></span>
  1023. </a>
  1024. `;
  1025. appsArea.insertAdjacentHTML("beforeend", appButton);
  1026. appsArea.querySelector('#cke_queue').onclick = function() {
  1027. var library = GM_getValue("queueArray");
  1028. var promtText = 'Aşağıdaki listelerden çıktısını almak istediğinizin numarısını girin:' + enter;
  1029. for (let x = 0; x < library.length; x++) {
  1030. promtText += enter + x + " - " + library[x][0].name;
  1031. }
  1032. var queueNo = prompt(promtText);
  1033. if (queueNo) {
  1034. var infos = library[queueNo][0];
  1035. var array = [];
  1036. arrayFilter(library[queueNo][1], array);
  1037. arraySorter(array, "object", infos.sortBy);
  1038. var queueHTMLli = '';
  1039. for (let x = 0; x < array.length; x++) {
  1040. var a =array[x];
  1041. queueHTMLli += `<li><strong><a href="https://www.planetdp.org/title/-dp` + a.cardId + `" rel="external nofollow">PlanetDP</a> | <a href="https://www.imdb.com/title/tt` + a.imdbID + `" rel="external nofollow">IMDb</a></strong> >> <strong>` + a.cardTitle + ` (` + a.year + `)</strong></li>`;
  1042. }
  1043. var queueHTML = '<p>Liste: <strong>' + infos.name + ' (' + array.length + ')</strong></p><ul>' + queueHTMLli + '</ul>';
  1044. appsArea.closest('.cke_inner.cke_reset').querySelector('div.cke_enable_context_menu.cke_editable[role="textbox"]').insertAdjacentHTML("beforeend", queueHTML);
  1045. }
  1046. };
  1047. }
  1048.  
  1049. function waitForKeyElements (
  1050. selectorTxt, /* Required: The jQuery selector string that
  1051. specifies the desired element(s).
  1052. */
  1053. actionFunction, /* Required: The code to run when elements are
  1054. found. It is passed a jNode to the matched
  1055. element.
  1056. */
  1057. bWaitOnce, /* Optional: If false, will continue to scan for
  1058. new elements even after the first match is
  1059. found.
  1060. */
  1061. iframeSelector /* Optional: If set, identifies the iframe to
  1062. search.
  1063. */
  1064. ) {
  1065. var targetNodes, btargetsFound;
  1066.  
  1067. if (typeof iframeSelector == "undefined")
  1068. targetNodes = $(selectorTxt);
  1069. else
  1070. targetNodes = $(iframeSelector).contents ()
  1071. .find (selectorTxt);
  1072.  
  1073. if (targetNodes && targetNodes.length > 0) {
  1074. btargetsFound = true;
  1075. /*--- Found target node(s). Go through each and act if they
  1076. are new.
  1077. */
  1078. targetNodes.each ( function () {
  1079. var jThis = $(this);
  1080. var alreadyFound = jThis.data ('alreadyFound') || false;
  1081.  
  1082. if (!alreadyFound) {
  1083. //--- Call the payload function.
  1084. var cancelFound = actionFunction (jThis);
  1085. if (cancelFound)
  1086. btargetsFound = false;
  1087. else
  1088. jThis.data ('alreadyFound', true);
  1089. }
  1090. } );
  1091. }
  1092. else {
  1093. btargetsFound = false;
  1094. }
  1095.  
  1096. //--- Get the timer-control variable for this selector.
  1097. var controlObj = waitForKeyElements.controlObj || {};
  1098. var controlKey = selectorTxt.replace (/[^\w]/g, "_");
  1099. var timeControl = controlObj [controlKey];
  1100.  
  1101. //--- Now set or clear the timer as appropriate.
  1102. if (btargetsFound && bWaitOnce && timeControl) {
  1103. //--- The only condition where we need to clear the timer.
  1104. clearInterval (timeControl);
  1105. delete controlObj [controlKey];
  1106. }
  1107. else {
  1108. //--- Set a timer, if needed.
  1109. if ( ! timeControl) {
  1110. timeControl = setInterval ( function () {
  1111. waitForKeyElements ( selectorTxt,
  1112. actionFunction,
  1113. bWaitOnce,
  1114. iframeSelector
  1115. );
  1116. },
  1117. 300
  1118. );
  1119. controlObj [controlKey] = timeControl;
  1120. }
  1121. }
  1122. waitForKeyElements.controlObj = controlObj;
  1123. }
  1124.  
  1125. })();