// ==UserScript==
// @name mmmturkeybacon Floating Timers
// @author mmmturkeybacon
// @description Adds total time elapsed, time remaining, and task time elapsed to a floating display.
// @namespace http://userscripts.org/users/523367
// @match https://*.mturk.com/mturk/preview*
// @match https://*.mturk.com/mturk/accept*
// @match https://*.mturk.com/mturk/continue*
// @match https://*.mturk.com/mturk/submit*
// @match https://*.mturk.com/mturk/return*
// @require http://code.jquery.com/jquery-latest.min.js
// @version 1.01
// @grant none
// @downloadURL none
// ==/UserScript==
/* Code for calculating time remaining modified from mTurk Title Bar Timer (http://userscripts-mirror.org/scripts/review/169153)
* The offset calculation is much more simplistic than https://www.mturk.com/js/timer.js uses but it is probably sufficient. */
// try to get serverTimestamp and set offset immediately, if that fails try again when the document is ready.
var offset;
var serverTimestamp = unsafeWindow.serverTimestamp;
if (serverTimestamp)
{
offset = (new Date()).getTime() - serverTimestamp;
}
$(document).ready(function()
{
if (offset)
{
serverTimestamp = unsafeWindow.serverTimestamp;
if (serverTimestamp)
{
offset = (new Date()).getTime() - serverTimestamp;
}
}
var endTime = unsafeWindow.endTime;
if (endTime)
{
endTime = endTime.getTime();
}
var task_start_time;
var timer_holder = document.createElement("DIV");
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 */";
timer_holder.align = "right";
var timer_holder_innerHTML = '
';
timer_holder_innerHTML += '
';
timer_holder_innerHTML += '
';
timer_holder.innerHTML = timer_holder_innerHTML;
document.body.insertBefore(timer_holder, document.body.firstChild);
var theTime = document.getElementById("theTime");
var elapsed_timer = document.getElementById("elapsed_timer");
var remaining_timer = document.getElementById("remaining_timer");
var task_timer = document.getElementById("task_timer");
var observer = new MutationObserver(function (mutations)
{
var now = (new Date()).getTime();
elapsed_timer.innerHTML = theTime.innerHTML;
/* Want task_start_time to be as close as possible to when the page is fully loaded
* and work can begin. */
if (!task_start_time) {task_start_time = now;};
var task_seconds_elapsed = Math.floor((now - task_start_time)/1000);
task_timer.innerHTML = format_time(task_seconds_elapsed);
if (endTime && offset)
{
var seconds_remaining = Math.floor((endTime - (now + offset))/1000);
remaining_timer.innerHTML = format_time(seconds_remaining);
}
else
{
remaining_timer.innerHTML = "error";
}
});
var options = {
subtree: true,
childList: true,
attributes: false
};
observer.observe(theTime, options);
});
function format_time(time_in_seconds)
{
var time_str = "error";
if (time_in_seconds >= 0)
{
// time formatting code modified from http://userscripts.org/scripts/show/169154
var days = Math.floor((time_in_seconds/(60*60*24)));
var hours = Math.floor((time_in_seconds/(60*60)) % 24);
var minutes = Math.floor((time_in_seconds/60) % 60);
var seconds = time_in_seconds % 60;
time_str = (days == 0 ? '' : days + (days > 1 ? ' days ' : ' day '));
if (hours < 10) {hours = "0"+hours;}
if (minutes < 10) {minutes = "0"+minutes;}
if (seconds < 10) {seconds = "0"+seconds;}
time_str += hours + ':' +minutes + ':' + seconds;
}
return time_str;
}