mtb Floating Timers

Adds total time elapsed, time remaining, and task time elapsed to a floating display.

当前为 2015-02-04 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name mtb Floating Timers
  3. // @author mmmturkeybacon
  4. // @description Adds total time elapsed, time remaining, and task time elapsed to a floating display.
  5. // @namespace http://userscripts.org/users/523367
  6. // @match https://*.mturk.com/mturk/preview*
  7. // @match https://*.mturk.com/mturk/accept*
  8. // @match https://*.mturk.com/mturk/continue*
  9. // @match https://*.mturk.com/mturk/submit*
  10. // @match https://*.mturk.com/mturk/return*
  11. // @require http://code.jquery.com/jquery-latest.min.js
  12. // @version 1.0
  13. // @grant none
  14. // ==/UserScript==
  15.  
  16. /* Code for calculating time remaining modified from mTurk Title Bar Timer (http://userscripts-mirror.org/scripts/review/169153)
  17. * The offset calculation is much more simplistic than https://www.mturk.com/js/timer.js uses but it is probably sufficient. */
  18.  
  19. // try to get serverTimestamp and set offset immediately, if that fails try again when the document is ready.
  20. var offset;
  21. var serverTimestamp = unsafeWindow.serverTimestamp;
  22. if (serverTimestamp)
  23. {
  24. offset = (new Date()).getTime() - serverTimestamp;
  25. }
  26.  
  27. $(document).ready(function()
  28. {
  29. if (offset)
  30. {
  31. serverTimestamp = unsafeWindow.serverTimestamp;
  32. if (serverTimestamp)
  33. {
  34. offset = (new Date()).getTime() - serverTimestamp;
  35. }
  36. }
  37.  
  38. var endTime = unsafeWindow.endTime;
  39. if (endTime)
  40. {
  41. endTime = endTime.getTime();
  42. }
  43.  
  44. var task_start_time;
  45.  
  46. var timer_holder = document.createElement("DIV");
  47. timer_holder.style = "position: fixed; top: 0px; left: 0px; z-index: 20; background-color: black; filter:alpha(opacity=75); /* IE */ opacity: 0.75; /* Safari, Opera */ -moz-opacity:0.75; /* FireFox */";
  48. timer_holder.align = "right";
  49.  
  50. var timer_holder_innerHTML = '<div><span id="elapsed_timer" class="title_orange_text" style="text-align: right;"></span></div>';
  51. timer_holder_innerHTML += '<div><span id="remaining_timer" class="title_orange_text" style="text-align: right;"></span></div>';
  52. timer_holder_innerHTML += '<div><span id="task_timer" class="title_orange_text" style="text-align: right;"></span></div>';
  53.  
  54. timer_holder.innerHTML = timer_holder_innerHTML;
  55.  
  56. document.body.insertBefore(timer_holder, document.body.firstChild);
  57.  
  58. var theTime = document.getElementById("theTime");
  59. var elapsed_timer = document.getElementById("elapsed_timer");
  60. var remaining_timer = document.getElementById("remaining_timer");
  61. var task_timer = document.getElementById("task_timer");
  62.  
  63. var observer = new MutationObserver(function (mutations)
  64. {
  65. var now = (new Date()).getTime();
  66.  
  67. elapsed_timer.innerHTML = theTime.innerHTML;
  68.  
  69. /* Want task_start_time to be as close as possible to when the page is fully loaded
  70. * and work can begin. */
  71. if (!task_start_time) {task_start_time = now;};
  72. var task_seconds_elapsed = Math.floor((now - task_start_time)/1000);
  73. task_timer.innerHTML = format_time(task_seconds_elapsed);
  74.  
  75. if (endTime && offset)
  76. {
  77. var seconds_remaining = Math.floor((endTime - (now + offset))/1000);
  78. remaining_timer.innerHTML = format_time(seconds_remaining);
  79. }
  80. else
  81. {
  82. remaining_timer.innerHTML = "error";
  83. }
  84.  
  85. });
  86. var options = {
  87. subtree: true,
  88. childList: true,
  89. attributes: false
  90. };
  91.  
  92. observer.observe(theTime, options);
  93.  
  94. });
  95.  
  96.  
  97. function format_time(time_in_seconds)
  98. {
  99. var time_str = "error";
  100.  
  101. if (time_in_seconds >= 0)
  102. {
  103. // time formatting code modified from http://userscripts.org/scripts/show/169154
  104. var days = Math.floor((time_in_seconds/(60*60*24)));
  105. var hours = Math.floor((time_in_seconds/(60*60)) % 24);
  106. var minutes = Math.floor((time_in_seconds/60) % 60);
  107. var seconds = time_in_seconds % 60;
  108.  
  109. time_str = (days == 0 ? '' : days + (days > 1 ? ' days ' : ' day '));
  110.  
  111. if (hours < 10) {hours = "0"+hours;}
  112. if (minutes < 10) {minutes = "0"+minutes;}
  113. if (seconds < 10) {seconds = "0"+seconds;}
  114.  
  115. time_str += hours + ':' +minutes + ':' + seconds;
  116. }
  117.  
  118. return time_str;
  119. }