| @@ -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($("<span>") | |||
| .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($("<div>") | |||
| @@ -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() { | |||