Wanikani Egg Timer

Adds a timer during reviews and displays the final time afterward

  1. // ==UserScript==
  2. // @name Wanikani Egg Timer
  3. // @namespace wkeggtimer
  4. // @description Adds a timer during reviews and displays the final time afterward
  5. // @include http://www.wanikani.com/review*
  6. // @include https://www.wanikani.com/review*
  7. // @version 0.4
  8. // @author Horus Scope
  9. // @grant none
  10. // @license GPL version 3 or later: http://www.gnu.org/copyleft/gpl.html
  11. // ==/UserScript==
  12.  
  13. function timeStamp( inc ) {
  14. var prev = parseInt(window.localStorage.eggtimer,10) + inc;
  15. window.localStorage.eggtimer = prev;
  16. // Yes, parseInt is prettier.
  17. var hours = Math.floor(prev / 60 / 60);
  18. var minutes = Math.floor( (prev - (hours*60*60)) / 60 );
  19. var seconds = prev - hours*60*60 - minutes*60;
  20. return ""
  21. + (hours? hours+"h " : "")
  22. + (minutes? minutes+"m " : "")
  23. + (seconds? seconds+"s" : "");
  24. }
  25. var timeSpan; // referenced in go( )
  26. function generate( ) {
  27. var display = document.createElement('div');
  28. display.className = 'timerSessionDisplay'; // no style actually defined
  29. timeSpan = document.createElement('span');
  30. timeSpan.className = 'timerSessionSpan'; // no style actually defined
  31. timeSpan.textContent = "Last review: " + timeStamp( 0 );
  32. display.appendChild(timeSpan);
  33. return display;
  34. }
  35.  
  36. // start counting. [or, dont]
  37. function go( )
  38. {
  39. // change behavior depending on screen [summary, reviewing now]
  40. if(/session$/.exec(window.location.href)) { // review/session [ reviewing now ]
  41. window.localStorage.eggtimer = 0; // time start
  42. var header = document.getElementById('summary-button'); // because easy
  43. var display = generate( ); // makes div object
  44. header.appendChild( display );
  45.  
  46. var showHideButton = document.createElement('div');
  47. var footer = document.getElementsByTagName('footer');
  48. showHideButton.onclick = function( ) {
  49. var displayTimer = window.localStorage.displayTimer;
  50. if( displayTimer === null || typeof displayTimer === "undefined" ) {
  51. displayTimer = false;
  52. } else {
  53. displayTimer = (displayTimer == "true" ? false : true);
  54. }
  55. window.localStorage.displayTimer = displayTimer;
  56. timeSpan.style.cssText = displayTimer ? "display: inline;" : "display: none;";
  57. console.log("pressed");
  58. };
  59. showHideButton.style.cssText = "background-color: #003377; color: white; cursor: pointer;"
  60. + "display: inline; float: left; font-size: 0.8125em; padding: 10px; vertical-align: bottom;";
  61. showHideButton.textContent = "Show/hide Timer";
  62. footer[0].appendChild( showHideButton );
  63. timeSpan.style.cssText = window.localStorage.displayTimer == "false" ? "display: none" : "display: inline";
  64. setInterval(function() {timeSpan.textContent = "Elapsed: " + timeStamp( 1 );}, 1000);
  65. } else { // review [ summary screen ]
  66. var footer = document.getElementById('last-session-date'); // makes sense
  67. var display = generate( );
  68. footer.insertBefore(display, footer.childNodes[0]); // probably float:left btw
  69. }
  70. }
  71.  
  72. window.onload = go( );