2)
month = month.substr(1);
if (day.length > 2)
day = day.substr(1);
date = '' + d.getFullYear() + '-' + month + '-' + day;
days.push( { date: date,
submitted: -1,
approved : -1,
rejected : -1,
pending : -1,
earnings : -1 } );
}
}
return days;
}
HITStorage.getLatestHITs = function()
{
if (localStorage['HITDB AUTO UPDATE'] === undefined || localStorage['HITDB AUTO UPDATE'] == 'OFF')
return;
if (localStorage['HITDB TIMESTAMP'] !== undefined)
{
if (new Date().getTime() < new Date(parseInt(localStorage['HITDB TIMESTAMP'])).getTime() + 90000)
{
return;
}
}
localStorage['HITDB TIMESTAMP'] = new Date().getTime();
var auto_button = document.getElementById('auto_button');
var page = HITStorage.getHTTPObject();
page.open("GET", 'https://www.mturk.com/mturk/status', false);
page.send(null);
auto_button.textContent += ' +';
var page_html = document.createElement('div');
page_html.innerHTML = page.responseText;
var dateElements = page_html.getElementsByClassName('statusDateColumnValue');
var submittedElements = page_html.getElementsByClassName('statusSubmittedColumnValue');
var approvedElements = page_html.getElementsByClassName('statusApprovedColumnValue');
var rejectedElements = page_html.getElementsByClassName('statusRejectedColumnValue');
var pendingElements = page_html.getElementsByClassName('statusPendingColumnValue');
var earningsElements = page_html.getElementsByClassName('statusEarningsColumnValue');
if (dateElements[0].childNodes[1].textContent.trim() != 'Today')
return;
var url = dateElements[0].childNodes[1].href;
var date = url.substr(53); // keep MMDDYYYY
var submitted = parseInt(submittedElements[0].textContent);
//var approved = parseInt(approvedElements[0].textContent);
//var rejected = parseInt(rejectedElements[0].textContent);
//var pending = parseInt(pendingElements[0].textContent);
//var earnings = parseFloat(earningsElements[0].textContent.slice(1));
var pages_done = null;
if (localStorage['HITDB AUTOUPDATE PAGES'] !== undefined)
{
pages_done = JSON.parse(localStorage['HITDB AUTOUPDATE PAGES']);
}
if (pages_done == null || pages_done.date != date)
pages_done = {date: date};
var new_hits = 0;
var page = 1 + Math.floor(submitted/25);
page = (page<1) ? 1 : page;
var hitData = [];
if (submitted != pages_done.submitted)
{
url = "https://www.mturk.com/mturk/statusdetail?sortType=All&pageNumber=" + page + "&encodedDate=" + date;
HITStorage.process_page(url, date, hitData);
new_hits += submitted - pages_done.submitted;
pages_done.submitted = submitted;
localStorage['HITDB AUTOUPDATE PAGES'] = JSON.stringify(pages_done);
auto_button.textContent += '+';
}
if (page > 1)
{
extra_page = page-1;
while (extra_page >= 1)
{
if (pages_done[extra_page] != true)
{
url = "https://www.mturk.com/mturk/statusdetail?sortType=All&pageNumber=" + extra_page + "&encodedDate=" + date;
if (HITStorage.process_page(url, date, hitData) == 25)
{
pages_done[extra_page] = true;
localStorage['HITDB AUTOUPDATE PAGES'] = JSON.stringify(pages_done);
auto_button.textContent += '+';
}
break;
}
extra_page -= 1;
}
}
HITStorage.indexedDB.addHITs(hitData);
}
// Gets status details for given date (MMDDYYYY)
// Collects all HITs for given date to hitData array
HITStorage.getHITData = function(day_to_fetch, hitData, page, days_to_update)
{
var dataDate = convert_iso_date(day_to_fetch.date);
page = page || 1;
detailed_status_page_link = "https://www.mturk.com/mturk/statusdetail?sortType=All&pageNumber=" + page + "&encodedDate=" + dataDate;
if (HITStorage.process_page(detailed_status_page_link, dataDate, hitData) == 0)
{
if (day_to_fetch.submitted == -1 || hitData.length == day_to_fetch.submitted)
{
setTimeout(function(){ HITStorage.indexedDB.addHITs(hitData, day_to_fetch, days_to_update); }, 1000);
}
else
{
alert("There was an error while fetching HITs for date: " + day_to_fetch.date + ".\n" +
"Script monkeys expected " + day_to_fetch.submitted + " bananas, but got " + hitData.length + "! ?");
HITStorage.update_done();
}
}
else
{
HITStorage.update_status_label('Please wait: script monkeys are fetching status pages (' +
day_to_fetch.date + ', page ' + page + ')', 'red');
setTimeout(function(){ HITStorage.getHITData(day_to_fetch, hitData, page+1, days_to_update); }, 1000);
}
}
HITStorage.formatTime = function(msec)
{
if (isNaN(msec))
return "-";
var seconds = Math.floor(msec / 1000) % 60;
var minutes = Math.floor((msec / 1000) / 60) % 60;
var hours = Math.floor(((msec / 1000) / 60) / 60) % 24;
var days = Math.floor(((msec / 1000) / 60) / 60 / 24);
if (hours > 0)
seconds = "";
else
seconds = "" + seconds + "s";
minutes == 0 ? minutes = "" : minutes = "" + minutes + "m ";
hours == 0 ? hours = "" : hours = "" + hours + "h ";
if (days > 0)
return '' + days + ' day' + ((days>1)? 's' : ' ') + hours;
return hours + minutes + seconds;
}
HITStorage.update_status_label = function(new_status, color)
{
var label = document.getElementById('status_label');
label.innerHTML = new_status;
label.style.color = color || 'black';
}
// validate input field dates
// Accept YYYY-MM-DD
HITStorage.validate_date = function(input)
{
date = input.value;
if (date.match(/^[01]\d\/[0123]\d\/20\d\d$/) != null)
{
var d = date.split('\/');
date = d[2] + '-' + d[0] + '-' + d[1];
input.value = date;
}
if (date.match(/^$|^20\d\d\-[01]\d\-[0123]\d$/) != null)
{
input.style.backgroundColor = 'white';
return true;
}
input.style.backgroundColor = 'pink';
return false;
}
HITStorage.validate_dates = function()
{
from = document.getElementById('from_date');
to = document.getElementById('to_date');
if (HITStorage.validate_date(from) && HITStorage.validate_date(to))
{
if (from.value > to.value && to.value != '')
{
alert('Invalid date!');
return false;
}
return true;
}
alert('Invalid date!');
return false;
}
HITStorage.start_search = function()
{
if (HITStorage.validate_dates() == false)
return;
HITStorage.update_status_label('Using local HIT database', 'green');
var options = {};
options.term = document.getElementById('search_term').value;
options.status = document.getElementById('status_select').value;
options.donut = document.getElementById('donut_select').value;
options.from_date = document.getElementById('from_date').value;
options.to_date = document.getElementById('to_date').value;
options.export_csv = document.getElementById('export_csv').checked;
HITStorage.disable_inputs();
setTimeout(function(){ HITStorage.do_search(options); }, 500);
}
HITStorage.disable_inputs = function()
{
document.getElementById('delete_button').disabled = true;
document.getElementById('search_button').disabled = true;
document.getElementById('update_button').disabled = true;
document.getElementById('overview_button').disabled = true;
document.getElementById('import_button').disabled = true;
document.getElementById('pending_button').disabled = true;
document.getElementById('status_button').disabled = true;
document.getElementById('from_date').disabled = true;
document.getElementById('to_date').disabled = true;
document.getElementById('search_term').disabled = true;
document.getElementById('status_select').disabled = true;
document.getElementById('donut_select').disabled = true;
}
HITStorage.enable_inputs = function()
{
document.getElementById('delete_button').disabled = false;
document.getElementById('search_button').disabled = false;
document.getElementById('update_button').disabled = false;
document.getElementById('overview_button').disabled = false;
document.getElementById('import_button').disabled = false;
document.getElementById('pending_button').disabled = false;
document.getElementById('status_button').disabled = false;
document.getElementById('from_date').disabled = false;
document.getElementById('to_date').disabled = false;
document.getElementById('search_term').disabled = false;
document.getElementById('status_select').disabled = false;
document.getElementById('donut_select').disabled = false;
}
HITStorage.do_search = function(options)
{
HITStorage.indexedDB.getHITs(options);
setTimeout( function() { HITStorage.update_status_label("Search powered by non-amazonian script monkeys"); }, 3000);
HITStorage.enable_inputs();
}
HITStorage.show_results = function(results)
{
resultsWindow = window.open();
resultsWindow.document.write("Status Detail Search Results\n");
resultsWindow.document.write("HITs matching your search:
\n");
resultsWindow.document.write('\n');
resultsWindow.document.write('Date | Requester | HIT Title | Reward | Status | Feedback |
\n');
var odd = true;
var sum = 0;
var sum_rejected = 0;
var sum_approved = 0;
var sum_pending = 0;
var new_day = false;
for (var i=0; i0 && (results[i-1].date != results[i].date))
new_day = true;
else
new_day = false;
resultsWindow.document.write(HITStorage.format_hit_line(results[i], odd, HITStorage.status_color(results[i].status), new_day ));
}
resultsWindow.document.write(' | | | $' + sum.toFixed(2) + ' | | |
\n');
resultsWindow.document.write("
");
resultsWindow.document.write("Found " + results.length + " matching HITs. $" + sum_approved.toFixed(2) + " approved, " +
"$" + sum_rejected.toFixed(2) + " rejected and $" + sum_pending.toFixed(2) + " pending.
");
resultsWindow.document.write("")
resultsWindow.document.close();
}
HITStorage.status_color = function(status)
{
var color = "green";
if (status.match("Pending Approval"))
color = "orange";
else if (status.match("Rejected"))
color = "red";
return color;
}
HITStorage.format_hit_line = function(hit, odd, status_color, new_day)
{
var line = '';
else
line += '">';
line += '' + hit.date + ' | ';
if (hit.requesterLink != null)
line += '' + hit.requesterName + ' | ';
else
line += '' + hit.requesterName + ' | ';
line += '' + hit.title + ' | ';
line += '$' + hit.reward.toFixed(2) + ' | ';
line += '' + hit.status + ' | ';
line += '' + hit.feedback + ' | ';
line += '
\n';
return line;
}
HITStorage.show_pending_overview = function(results)
{
resultsWindow = window.open();
resultsWindow.document.write("Summary of Pending HITs\n");
resultsWindow.document.write("Summary of Pending HITs
\n");
resultsWindow.document.write('\n');
resultsWindow.document.write('requesterId | Requester | | Pending | Rewards | \n');
// 'requesterId,requesterName,pending,reward';
var odd = false;
var sum = 0;
var pending = 0;
for (var i=0; i' + results.length + ' different requesterIds | | | ' + pending + ' | $' + sum.toFixed(2) + ' | \n');
resultsWindow.document.write("
---|
");
resultsWindow.document.write("")
resultsWindow.document.close();
for (var i=0; iDaily HIT stats\n");
if (date)
resultsWindow.document.write("Daily HIT stats
\n");
else
resultsWindow.document.write("Daily HIT stats (' + date + ')
\n");
resultsWindow.document.write('\n');
resultsWindow.document.write('Date | Submitted | Approved | Rejected | Pending | Earnings | \n');
var odd = false;
var sum = 0;
var submitted = 0;
var approved = 0;
var rejected = 0;
var pending = 0;
var new_month = false;
for (var i=results.length-1; i>=0; i--) {
odd = !odd;
sum += results[i].earnings;
submitted += results[i].submitted;
approved += results[i].approved;
rejected += results[i].rejected;
pending += results[i].pending;
if (i' + results.length + ' days | ' + submitted +
' | ' + approved +
' | ' + rejected +
' | ' + pending +
' | $' + sum.toFixed(2) + ' | \n');
resultsWindow.document.write("
---|
");
resultsWindow.document.write("