Full Queue

All 25 hits on one page, return all, return by requester name and open by requester name.

  1. // ==UserScript==
  2. // @name Full Queue
  3. // @description All 25 hits on one page, return all, return by requester name and open by requester name.
  4. // @version 0.6
  5. // @include https://www.mturk.com/mturk/*
  6. // @grant GM_setValue
  7. // @grant GM_getValue
  8. // @grant GM_deleteValue
  9. // @grant GM_openInTab
  10. // @author Cristo
  11. // @copyright 2012+
  12. // @namespace https://greasyfork.org/users/1973
  13. // ==/UserScript==
  14.  
  15. var capArr = [], time = 1000, working = false;
  16. var que25 = 'https://www.mturk.com/mturk/sortmyhits?searchSpec=HITSearch%23T%231%2325%23-1%23T%23%21Status%210%21rO0ABXQACEFzc2lnbmVk%21%23%21Deadline%211%21%23%21';
  17. var trdLink = document.getElementById('subtabs').getElementsByTagName('a')[2];
  18.  
  19. if (trdLink.href === 'https://www.mturk.com/mturk/myhits'){
  20. trdLink.href = que25;
  21. }
  22.  
  23. if (window.location.href === que25 && document.getElementById('collapseall')){
  24. //Return all link
  25. var collapseall = document.getElementById('collapseall');
  26.  
  27. var nonBr1 = document.createTextNode('\u00a0\u00a0');
  28. collapseall.parentNode.appendChild(nonBr1);
  29.  
  30. var bar = document.createElement('font');
  31. bar.innerHTML = '|';
  32. bar.setAttribute('color', '#9ab8ef');
  33. collapseall.parentNode.appendChild(bar);
  34.  
  35. var nonBr2 = document.createTextNode('\u00a0\u00a0');
  36. collapseall.parentNode.appendChild(nonBr2);
  37.  
  38. var retunLink = document.createElement('a');
  39. retunLink.addEventListener('click', returnAll, false);
  40. retunLink.innerHTML='Return all hits';
  41. retunLink.setAttribute('id', 'retunall');
  42. retunLink.setAttribute('class', 'footer_links');
  43. retunLink.setAttribute('href', '#');
  44. bar.parentNode.appendChild(retunLink);
  45.  
  46. //Delay settings
  47. var timeTd = document.getElementsByTagName('table')[5].getElementsByTagName('td')[2];
  48. var delayTextN = document.createElement('span');
  49. delayTextN.setAttribute('class', 'capsule_black_text');
  50. delayTextN.innerHTML='Time delay:';
  51. var nonBr3 = document.createTextNode('\u00a0');
  52. var delayTextI = document.createElement('input');
  53. delayTextI.addEventListener('keyup', saveTime, false);
  54. delayTextN.setAttribute('input', 'delaytextn');
  55. delayTextI.type = 'text';
  56. delayTextI.title = 'Delay between page requests in seconds';
  57. delayTextI.style.width ='25px';
  58.  
  59. if(GM_getValue('QueueDelay') === undefined){
  60. GM_setValue('QueueDelay','0.5');
  61. }
  62. delayTextI.value = GM_getValue('QueueDelay');
  63. time *= delayTextI.value;
  64.  
  65. timeTd.appendChild(delayTextN);
  66. timeTd.appendChild(nonBr3);
  67. timeTd.appendChild(delayTextI);
  68.  
  69. //Open/Return Sets
  70. var queTable = document.getElementsByTagName('table')[6];
  71. var container = queTable.firstElementChild;
  72. var singleContainer = container.children;
  73.  
  74. //Add open/return
  75. for (var f = 0; f < singleContainer.length; f++){
  76.  
  77. var newD = document.createElement('td');
  78. newD.style.paddingRight = "80px";
  79. var handle = singleContainer[f].getElementsByClassName('requesterIdentity')[0];
  80. handle.parentNode.parentNode.insertBefore(newD, handle.parentNode.nextSibling);
  81.  
  82. var butO = document.createElement("span");
  83. butO.addEventListener('click', openSome, false);
  84. butO.title = 'Open all ' + handle.innerHTML + ' hits';
  85. butO.style.color = "#1170A0";
  86. butO.style.cursor = "pointer";
  87. butO.style.paddingRight = "50%";
  88. butO.innerHTML = "Open";
  89. newD.appendChild(butO);
  90.  
  91. var butR = document.createElement("span");
  92. butR.addEventListener('click', returnSome, false);
  93. butR.title = 'Return all ' + handle.innerHTML + ' hits';
  94. butR.style.color = "#1170A0";
  95. butR.style.cursor = "pointer";
  96. butR.innerHTML = "Return";
  97. newD.appendChild(butR);
  98.  
  99. //Current Links
  100. /*
  101. var requesterName = singleContainer[f].getElementsByClassName('requesterIdentity')[0].innerHTML;
  102. var returnCap = singleContainer[f].getElementsByClassName('capsulelink')[1];
  103. returnCap.addEventListener('click', returnOne, false);
  104. var continueCaps = singleContainer[f].getElementsByClassName('capsulelink')[2];
  105.  
  106. var singleBits = new Object();
  107. singleBits.Name = requesterName;
  108. singleBits.Id = returnCap.getElementsByTagName('a')[0].href.split('hitId=')[1];
  109. singleBits.Place = f;
  110. capArr.push(singleBits);
  111. */
  112. }
  113. currenHits();
  114. }
  115. //Keep arry updated temp fix
  116. function currenHits(){
  117. capArr = [];
  118. for (var f = 0; f < singleContainer.length; f++){
  119. if (singleContainer[f].getAttribute('temp') != 'h'){
  120. var requesterName = singleContainer[f].getElementsByClassName('requesterIdentity')[0].innerHTML;
  121. var returnCap = singleContainer[f].getElementsByClassName('capsulelink')[1];
  122. returnCap.addEventListener('click', returnOne, false);
  123. var continueCaps = singleContainer[f].getElementsByClassName('capsulelink')[2];
  124.  
  125. var singleBits = new Object();
  126. singleBits.Name = requesterName;
  127. singleBits.Id = returnCap.getElementsByTagName('a')[0].href.split('hitId=')[1];
  128. singleBits.Place = f;
  129. capArr.push(singleBits);
  130. }
  131. }
  132. console.log(capArr);
  133. console.log(singleContainer);
  134. }
  135. //UI Functions
  136. function returnAll(rA){
  137. if(working === false){
  138. working = true;
  139. masterLoop(0,capArr);
  140. }
  141. }
  142. function returnSome(rS){
  143. if(working === false){
  144. working = true;
  145. var returns = [];
  146. var clickedName = rS.target.parentNode.parentNode.getElementsByClassName('requesterIdentity')[0].innerHTML;
  147. for (var f = 0; f < capArr.length; f++){
  148. if (capArr[f].Name === clickedName){
  149. var someBundle = new Object();
  150. someBundle.Id = capArr[f].Id;
  151. someBundle.Place = capArr[f].Place;
  152. returns.push(someBundle);
  153. }
  154. }
  155. masterLoop(0,returns);
  156. }
  157. }
  158. function returnOne(rO){
  159. rO.preventDefault();
  160. if(working === false){
  161. working = true;
  162. var hitId = rO.target.href.split('hitId=')[1];
  163. for (var f = 0; f < capArr.length; f++){
  164. if(capArr[f].Id === hitId){
  165. break;
  166. }
  167. }
  168. var oneBundle = new Object();
  169. oneBundle.Id = capArr[f].Id;
  170. oneBundle.Place = capArr[f].Place;
  171. masterLoop(0,[oneBundle]);
  172. }
  173. }
  174. function openSome(oS){
  175. if(working === false){
  176. working = true;
  177. var openings = [];
  178. var clickedName = oS.target.parentNode.parentNode.getElementsByClassName('requesterIdentity')[0].innerHTML;
  179. for (var f = 0; f < capArr.length; f++){
  180. if (capArr[f].Name === clickedName){
  181. openings.push(capArr[f].Id);
  182. }
  183. }
  184. masterLoop(1,openings);
  185. }
  186. }
  187. function saveTime(){
  188. time = 1000;
  189. GM_setValue('QueueDelay',delayTextI.value);
  190. time *= GM_getValue('QueueDelay');
  191. }
  192. //Time Loop
  193. function masterLoop(ty,mL){
  194. setTimeout(function () {
  195. if(ty === 1){
  196. openTab(mL[0]);
  197. } else if(ty === 0){
  198. fadeHit(mL[0].Place);
  199. returnHit(mL[0].Id);
  200. } else{
  201. console.log('tY NF');
  202. }
  203.  
  204. if(mL.length > 1) {
  205. mL.shift();
  206. masterLoop(ty,mL);
  207. } else {
  208. working = false;
  209. currenHits();//Update array after bundles are done
  210. console.log('timeLoop',singleContainer)
  211. }
  212. }, time);
  213. }
  214. //Page events
  215. function returnHit(rH){
  216. var returnUrl = 'https://www.mturk.com/mturk/return?inPipeline=false&hitId='+ rH;
  217. getHttp = new XMLHttpRequest();
  218. getHttp.open( 'GET', returnUrl, true );
  219. getHttp.send(null);
  220. }
  221. function fadeHit(fH){
  222. singleContainer[fH].setAttribute('temp', 'h');//due to timer element is still visable when arry is updated
  223. var orangeT = document.getElementsByClassName('title_orange_text')[0];
  224. var oragneAmount = orangeT.innerHTML.split('1-')[1].split(' of')[0];
  225. if(oragneAmount > 1){
  226. orangeT.innerHTML = '1-'+(oragneAmount-1)+' of '+(oragneAmount-1)+' Results';
  227. } else {
  228. document.getElementsByTagName('table')[5].style.display = 'none';
  229. orangeT.innerHTML = '0-'+(oragneAmount-1)+' of '+(oragneAmount-1)+' Results';
  230. }
  231.  
  232. var op = 1;
  233. var timer = setInterval(function () {
  234. if (op <= 0.1){
  235. clearInterval(timer);
  236. singleContainer[fH].style.display = 'none';
  237. }
  238. singleContainer[fH].style.opacity = op;
  239. op -= op * 0.1;
  240.  
  241. }, 20);
  242. }
  243. function openTab(oT){
  244. GM_openInTab('https://www.mturk.com/mturk/continue?hitId='+ oT,{active: false, insert: true});
  245. }