From 4fc411e87f2e077a6e1777a5c43476399f2b7181 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Sat, 17 May 2014 23:34:01 -0400 Subject: [PATCH] Support /shared.php; refactor. --- main.js | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 19 deletions(-) diff --git a/main.js b/main.js index c9f1db1..0ea6cbe 100644 --- a/main.js +++ b/main.js @@ -8,7 +8,7 @@ var should_sort = window.location.href.indexOf("order=4") != -1; /* ------------------------ Miscellaneous functions ------------------------ */ /* Note: complaints about modifying objects we don't own are ignored since - these changes are only executed within the context of a Chrome extension. */ + these changes are only executed within the context of our own extension. */ String.prototype.contains = function(substr) { return this.indexOf(substr) != -1; @@ -22,6 +22,15 @@ String.prototype.cut_before = function(substr) { return this.substr(0, this.indexOf(substr)); }; +function round_score(num) { + num = Math.round(num * 10) / 10; + if (isNaN(num)) + return num; + if (num == Math.round(num)) + num += ".0"; + return num; +} + function get_anime_id_from_href(href) { var anime_id; if (href.contains("/anime/")) @@ -43,16 +52,25 @@ function get_edit_id_from_href(href) { } function get_score_from_element(elem) { - var score = Math.round(elem.val() * 10) / 10; + var score = round_score(elem.val()); if (isNaN(score) || ((score < 1 || score > 10) && score != 0)) { alert("Invalid score: must be a number between 1.0 and 10.0, or 0."); return null; } - if (score == Math.round(score)) - score += ".0" return score; } +function load_score_into_element(data, anime_id, elem) { + var bucket = data[(parseInt(anime_id) % MAX_BUCKETS).toString()]; + if (bucket !== undefined && bucket[anime_id] !== undefined) + elem.text(bucket[anime_id] == 0 ? "-" : bucket[anime_id]); + else { + var current = parseInt(elem.text()); + if (!isNaN(current)) + elem.text(current + ".0"); + } +} + /* --------------------------- Storage functions --------------------------- */ function save_score(anime_id, score) { @@ -229,12 +247,8 @@ function sort_list() { function apply_stats(elem, old_sum, new_sum, nums) { var old_score = elem.text().cut_after("Score: ").cut_before(","); var old_dev = elem.text().cut_after("Dev.: ").cut_before("\n"); - var mean, deviation; - - mean = Math.round(new_sum / nums * 10) / 10 || 0; - if (mean == Math.round(mean)) - mean += ".0"; - deviation = (new_sum - old_sum) / nums + parseFloat(old_dev) || 0; + var mean = round_score(new_sum / nums) || "0.0"; + var deviation = (new_sum - old_sum) / nums + parseFloat(old_dev) || 0; deviation = Math.round(deviation * 100) / 100; elem.text(elem.text() @@ -272,19 +286,11 @@ function hook_list() { retrieve_scores(null, function(data) { $("span[id^='scoreval']").each(function(i, elem) { var anime_id = elem.id.split("scoreval")[1]; - var bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); - var bucket = data[bucket_id]; $(elem).after($("") .css("display", "none").text($(elem).text())); - if (bucket !== undefined && bucket[anime_id] !== undefined) - $(elem).text(bucket[anime_id] == 0 ? "-" : bucket[anime_id]); - else { - var current = parseInt($(elem).text()); - if (!isNaN(current)) - $(elem).text(current + ".0"); - } + load_score_into_element(data, anime_id, $(elem)); $("#scorediv" + anime_id) .after($("
") @@ -413,6 +419,55 @@ function hook_edit(anime_id) { } function hook_shared() { + var our_profile = $("#nav a:first").attr("href"), our_pos; + var profile_links = $("#content h2:first").find("a").slice(1); + var shared_table = $("#content h2:first").next(), unique_table; + var shared_means = shared_table.find("tr:nth-last-child(2)"); + var mean_score, mean_diff; + + if ($(profile_links[0]).attr("href") == our_profile) + our_pos = 1; + else if ($(profile_links[1]).attr("href") == our_profile) + our_pos = 2; + else + return; + + retrieve_scores(null, function(data) { + var score_sum = 0, diff_sum = 0, score_nums = 0, diff_nums = 0; + + shared_table.find("tr").slice(1, -2).each(function(i, row) { + var anime_id = $(row).find("a").attr("href") + .cut_after("/anime/").cut_before("/"); + var our_cell = $($(row).find("td")[our_pos]).find("span"); + var their_cell = $($(row).find("td")[our_pos == 1 ? 2 : 1]); + var diff_cell = $($(row).find("td")[3]); + + load_score_into_element(data, anime_id, our_cell); + if (our_cell.text() != "-") { + score_sum += parseFloat(our_cell.text()); + score_nums++; + } + if (our_cell.text() != "-" && their_cell.text() != "-") { + var diff = Math.abs(our_cell.text() - their_cell.text()); + diff_sum += diff; + diff_cell.text(round_score(diff)); + diff_nums++; + } + }); + + unique_table = $($("#content h2")[our_pos]).next(); + unique_table.find("tr").slice(1, -1).each(function(i, row) { + var anime_id = $(row).find("a").attr("href") + .cut_after("/anime/").cut_before("/"); + var cell = $(row).find("td:nth(1)").find("span"); + load_score_into_element(data, anime_id, cell); + }); + + mean_score = round_score(score_sum / score_nums); + mean_diff = Math.round(diff_sum / diff_nums * 100) / 100; + $(shared_means.find("td")[our_pos]).find("span").text(mean_score); + $(shared_means.find("td")[3]).text(mean_diff); + }); } function hook_addtolist() {