From 4e96775d69b728f965b3a269503517faf56bc7c3 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Tue, 13 May 2014 22:38:43 -0400 Subject: [PATCH] Support edit popup/page; deleting. --- main.js | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++------- manifest.json | 3 +- 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/main.js b/main.js index 46fd3e2..8ea8c96 100644 --- a/main.js +++ b/main.js @@ -12,6 +12,13 @@ function get_anime_id_from_href(href) { return anime_id; } +function get_edit_id_from_href(href) { + var anime_id = href.substr(href.indexOf("id=") + "id=".length); + if (anime_id.indexOf("&") != -1) + anime_id = anime_id.substr(0, anime_id.indexOf("&")); + return anime_id; +} + function get_scores_from_element(elem) { var score_100 = parseInt(elem.val()); var score_10 = Math.round(score_100 / 10.); @@ -24,7 +31,19 @@ function get_scores_from_element(elem) { /* Storage functions */ -function get_scores(anime_id, callback) { +function save_score(anime_id, score) { + var bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); + + chrome.storage.sync.get(bucket_id, function(data) { + var bucket = data[bucket_id]; + if (bucket === undefined) + bucket = data[bucket_id] = {}; + bucket[anime_id] = score; + chrome.storage.sync.set(data); + }); +} + +function retrieve_scores(anime_id, callback) { var bucket_id = null; if (anime_id !== null) bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); @@ -42,19 +61,22 @@ function get_scores(anime_id, callback) { }); } -function set_score(anime_id, score) { +function remove_score(anime_id) { var bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); chrome.storage.sync.get(bucket_id, function(data) { var bucket = data[bucket_id]; - if (bucket === undefined) - bucket = data[bucket_id] = {}; - bucket[anime_id] = score; - chrome.storage.sync.set(data); + if (bucket === undefined || bucket[anime_id] === undefined) + return; + delete bucket[anime_id]; + if ($.isEmptyObject(bucket)) + chrome.storage.sync.remove(bucket_id); + else + chrome.storage.sync.set(data); }); } -/* Event patches */ +/* Event patches/injections */ function update_list_score(anime_id) { var new_scores = get_scores_from_element($("#scoretext" + anime_id)); @@ -71,7 +93,7 @@ function update_list_score(anime_id) { $("#scorediv" + anime_id).css("display", "none"); $("#scorebutton" + anime_id).prop("disabled", false); }); - set_score(anime_id, new_score_100); + save_score(anime_id, new_score_100); } function update_anime_score(anime_id, is_new) { @@ -104,13 +126,29 @@ function update_anime_score(anime_id, is_new) { else document.getElementById("myinfoDisplay").innerHTML = data; }); - set_score(anime_id, new_score_100); + save_score(anime_id, new_score_100); +} + +function submit_edit_form(anime_id, submit_type, submit_button) { + if (submit_type == 2) { + var new_scores = get_scores_from_element($("#score_input")); + if (new_scores === null) + return; + + var new_score_100 = new_scores[0], new_score_10 = new_scores[1]; + $("select[name='score']").val(new_score_10); + save_score(anime_id, new_score_100); + } + else if (submit_type == 3) + remove_score(anime_id); + + submit_button[0].click(); } /* Extension hooks */ function hook_list() { - get_scores(null, function(data) { + 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(); @@ -153,7 +191,7 @@ function hook_list() { } function hook_anime(anime_id) { - get_scores(anime_id, function(score) { + retrieve_scores(anime_id, function(score) { var old_input = $("#myinfo_score"); var old_button = $("input[name='myinfo_submit']"); var is_new = old_button.attr("value") == "Add"; @@ -185,6 +223,47 @@ function hook_anime(anime_id) { }); } +function hook_edit(anime_id) { + retrieve_scores(anime_id, function(score) { + var old_input = $("select[name='score']"); + var old_edit = $("input[type='button'][onclick='checkValidSubmit(2)']"); + var old_delete = $("input[type='button'][onclick='checkValidSubmit(3)']"); + + if (score === null) { + var old_score = parseInt(old_input.val()); + score = old_score == 0 ? "" : old_score * 10; + } + + old_input.after($(" / 100")) + .after($("") + .attr("type", "text") + .attr("id", "score_input") + .attr("class", "inputtext") + .attr("value", score) + .attr("size", "3")) + .hide(); + + old_edit.after($("") + .attr("type", "button") + .attr("class", "inputButton") + .attr("style", old_edit.attr("style")) + .attr("value", old_edit.attr("value")) + .click(function(a_id, button) { + return function() { return submit_edit_form(a_id, 2, old_edit); } + }(anime_id, old_edit))) + .hide(); + + old_delete.after($("") + .attr("type", "button") + .attr("class", "inputButton") + .attr("value", old_delete.attr("value")) + .click(function(a_id, button) { + return function() { return submit_edit_form(a_id, 3, old_delete); } + }(anime_id, old_delete))) + .hide(); + }); +} + /* Main extension hook */ $(document).ready(function() { @@ -193,4 +272,6 @@ $(document).ready(function() { hook_list(); else if (href.indexOf("/anime/") != -1) hook_anime(get_anime_id_from_href(href)); + else if (href.indexOf("/editlist.php") != -1 && href.indexOf("type=anime") != -1) + hook_edit(get_edit_id_from_href(href)); }); diff --git a/manifest.json b/manifest.json index eab00a8..92f5f4e 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,8 @@ "content_scripts": [{ "matches": ["http://myanimelist.net/*"], - "js": ["jquery.min.js", "main.js"] + "js": ["jquery.min.js", "main.js"], + "all_frames": true }], "permissions": ["storage"] }