Bookmarklet:
Just drag and drop the link in your bookmarks. fah_tracker. fah tracker
The code:
javascript: (function () {
function callback() {
(function ($) {
var jQuery = $; /* check on what page we are */
if (window.location.href.startsWith("https://apps.foldingathome.org/teamstats/")) {
console.log("apps");
} /* Add reset/store button if absent */
if (!$("#update").length) {
var r = $('<input type="button" value="new button" id="update" />');
$("#header").append(r);
re = new RegExp("Team (\\d+) stats");
teamNumber = re.exec($("h2").html())[1];
firstTable=$("table:first").find("td");
score=$(firstTable)[1].innerText;
wu=$(firstTable)[2].innerText;
rank=$(firstTable)[3].innerText;
table = $(".members");
$('#update').on('click', function () {
if (localStorage.getItem("fah_new_table_"+teamNumber)) {
localStorage.setItem("fah_table_"+teamNumber, localStorage.getItem("fah_new_table_"+teamNumber));
localStorage.setItem("fah_date_"+teamNumber, $("h3").html());
localStorage.setItem("fah_score_"+teamNumber, localStorage.getItem("fah_new_score_"+teamNumber));
localStorage.setItem("fah_wus_"+teamNumber, localStorage.getItem("fah_new_wus_"+teamNumber));
localStorage.setItem("fah_rank_"+teamNumber,localStorage.getItem("fah_new_rank_"+teamNumber));
window.location.reload();
} else {
localStorage.setItem("fah_table_"+teamNumber, table.html());
localStorage.setItem("fah_date_"+teamNumber, $("h3").html());
localStorage.setItem("fah_score_"+teamNumber, score);
localStorage.setItem("fah_wus_"+teamNumber, wu);
localStorage.setItem("fah_rank_"+teamNumber, rank);
window.location.reload();
}
});
if (localStorage.getItem("fah_table_"+teamNumber)) {
$("#update").attr("value", "Update ref");
/* store the unmodified data in case the user wants to reset the ref */
localStorage.setItem("fah_new_table_"+teamNumber, table.html());
localStorage.setItem("fah_new_score_"+teamNumber, score);
localStorage.setItem("fah_new_wus_"+teamNumber, wu);
localStorage.setItem("fah_new_rank_"+teamNumber, rank);
var oldTable = $(localStorage.getItem("fah_table_"+teamNumber));
date = $("h3");
date.hide();
r = $('<div id="date_field"/></div>');
r.insertAfter(date);
var parsedDateLog = Date.parse(date.html()); /*var usaTime = parsedDate.toLocaleString("en-US", {timeZone: "America/Los_Angeles"});*/
var usaTime = new Date(parsedDateLog);
parsedDate = Date.parse(localStorage.getItem("fah_date_"+teamNumber));
var refTime = new Date(parsedDate);
r.html('<h2>Log dates</h2><table><tbody><tr><th>Log date</th><td>' + usaTime + "</td></tr><tr><th>ref date</th><td>" + refTime + "</td></tr><tr><th>delta</th><td>" + Math.floor((parsedDateLog - parsedDate) / (1000 * 3600)) + "hrs</td></tr></tbody></table><h2>Team details</h2>");
delta_team_score = score-localStorage.getItem("fah_score_"+teamNumber);
if(delta_team_score) {
$(firstTable[1]).html(" "+score +" <font color=\"green\"><strong>(+"+delta_team_score+")</strong></font>");
}
delta_team_wus = wu-localStorage.getItem("fah_wus_"+teamNumber);
if(delta_team_wus) {
$(firstTable[2]).html(" "+wu +" <font color=\"green\"><strong>(+"+delta_team_wus+")</strong></font>");
}
delta_team_rank = rank-localStorage.getItem("fah_rank_"+teamNumber);
if(delta_team_rank<0) {
$(firstTable[3]).html(" "+rank +" <font color=\"green\"><strong>("+delta_team_rank+")</strong></font>");
} else if(delta_team_rank>0) {
$(firstTable[3]).html(" "+rank +" <font color=\"red\"><strong>(+"+delta_team_rank+")</strong></font>");
}
table.find("tr").each(function () {
var td = $(this).find("td"); /* only process the row that are relevant, not tr for example */
if (td.length !== 0) {
var user_data = $(td).map(function () {
return this.innerHTML;
}); /* Find a similarly named user in the old table */
var old_user_row = oldTable.find("tr:contains(" + user_data[2] + ")");
if (old_user_row.length === 0) {
$(td[3]).html(user_data[3] + " (<font color=\"green\">NEW</font>)");
$(td[0]).html(user_data[0] + " (<font color=\"green\">NEW</font>)");
$(td[1]).html(user_data[1] + " (<font color=\"green\">NEW</font>)");
} else if (old_user_row.length > 1) {
/* similar names, need to dig deeper */ } else {
var old_user_data = $(old_user_row[0]).find("td").map(function () {
return this.innerHTML;
});
var delta_points = (user_data[3] - old_user_data[3]);
var delta_rank = (user_data[0] - old_user_data[0]);
var delta_team_rank = (user_data[1] - old_user_data[1]);
var delta_wus = (user_data[4] - old_user_data[4]);
if (delta_points) {
var cellUpdate = $(td[3]);
cellUpdate.html(user_data[3] + " (<font color=\"green\">+" + delta_points + "</font>)");
}
if (delta_rank) {
cellUpdate = $(td[0]);
if (delta_rank > 0) {
cellUpdate.html(user_data[0] + " (<font color=\"red\">+" + delta_rank + "</font>)");
} else {
cellUpdate.html(user_data[0] + " (<font color=\"green\"> " + delta_rank + "</font>)");
}
}
if (delta_team_rank) {
cellUpdate = $(td[1]);
if (delta_team_rank > 0) {
cellUpdate.html(user_data[1] + " (<font color=\"red\">+" + delta_team_rank + "</font>)");
} else {
cellUpdate.html(user_data[1] + " (<font color=\"green\"> " + delta_team_rank + "</font>)");
}
}
if (delta_wus) {
cellUpdate = $(td[4]);
cellUpdate.html(user_data[4] + " (<font color=\"green\">+" + delta_wus + "</font>)");
}
}
}
});
} else {
$("#update").attr("value", "Store");
}
}
})(jQuery.noConflict(true))
}
var s = document.createElement("script");
s.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js";
if (s.addEventListener) {
s.addEventListener("load", callback, false)
} else if (s.readyState) {
s.onreadystatechange = callback
}
document.body.appendChild(s);
})()