| @@ -8,7 +8,7 @@ var should_sort = window.location.href.indexOf("order=4") != -1; | |||||
| /* ------------------------ Miscellaneous functions ------------------------ */ | /* ------------------------ Miscellaneous functions ------------------------ */ | ||||
| /* Note: complaints about modifying objects we don't own are ignored since | /* 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) { | String.prototype.contains = function(substr) { | ||||
| return this.indexOf(substr) != -1; | return this.indexOf(substr) != -1; | ||||
| @@ -22,6 +22,15 @@ String.prototype.cut_before = function(substr) { | |||||
| return this.substr(0, this.indexOf(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) { | function get_anime_id_from_href(href) { | ||||
| var anime_id; | var anime_id; | ||||
| if (href.contains("/anime/")) | if (href.contains("/anime/")) | ||||
| @@ -43,16 +52,25 @@ function get_edit_id_from_href(href) { | |||||
| } | } | ||||
| function get_score_from_element(elem) { | 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)) { | if (isNaN(score) || ((score < 1 || score > 10) && score != 0)) { | ||||
| alert("Invalid score: must be a number between 1.0 and 10.0, or 0."); | alert("Invalid score: must be a number between 1.0 and 10.0, or 0."); | ||||
| return null; | return null; | ||||
| } | } | ||||
| if (score == Math.round(score)) | |||||
| score += ".0" | |||||
| return score; | 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 --------------------------- */ | /* --------------------------- Storage functions --------------------------- */ | ||||
| function save_score(anime_id, score) { | function save_score(anime_id, score) { | ||||
| @@ -229,12 +247,8 @@ function sort_list() { | |||||
| function apply_stats(elem, old_sum, new_sum, nums) { | function apply_stats(elem, old_sum, new_sum, nums) { | ||||
| var old_score = elem.text().cut_after("Score: ").cut_before(","); | var old_score = elem.text().cut_after("Score: ").cut_before(","); | ||||
| var old_dev = elem.text().cut_after("Dev.: ").cut_before("\n"); | 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; | deviation = Math.round(deviation * 100) / 100; | ||||
| elem.text(elem.text() | elem.text(elem.text() | ||||
| @@ -272,19 +286,11 @@ function hook_list() { | |||||
| retrieve_scores(null, function(data) { | retrieve_scores(null, function(data) { | ||||
| $("span[id^='scoreval']").each(function(i, elem) { | $("span[id^='scoreval']").each(function(i, elem) { | ||||
| var anime_id = elem.id.split("scoreval")[1]; | var anime_id = elem.id.split("scoreval")[1]; | ||||
| var bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); | |||||
| var bucket = data[bucket_id]; | |||||
| $(elem).after($("<span>") | $(elem).after($("<span>") | ||||
| .css("display", "none").text($(elem).text())); | .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) | $("#scorediv" + anime_id) | ||||
| .after($("<div>") | .after($("<div>") | ||||
| @@ -413,6 +419,55 @@ function hook_edit(anime_id) { | |||||
| } | } | ||||
| function hook_shared() { | 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() { | function hook_addtolist() { | ||||