| @@ -1,149 +1,180 @@ | |||||
| /* Patched MAL functions. */ | |||||
| /* Constants */ | |||||
| function patched_anime_checkScoreEnter(e, id) { | |||||
| if ((window.event ? window.event.keyCode : e.which) == 13) | |||||
| patched_anime_updateScore(id); | |||||
| else | |||||
| return true; | |||||
| } | |||||
| var MAX_BUCKETS = 256; | |||||
| var LOADING_IMG = '<img src="http://cdn.myanimelist.net/images/xmlhttp-loader.gif" align="center">'; | |||||
| function patched_anime_updateScore(entry_id) { | |||||
| var new_score_percent = document.getElementById("scoretext" + entry_id).value; | |||||
| var new_score = Math.round(new_score_percent / 10.); | |||||
| var payload = {}; | |||||
| /* Storage functions */ | |||||
| $.post("/includes/ajax.inc.php?t=63", {id: entry_id, score: new_score}, function(data) { | |||||
| document.getElementById("scoreval" + entry_id).innerHTML = new_score_percent; | |||||
| document.getElementById("scoretext" + entry_id).value = ""; | |||||
| document.getElementById("scorediv" + entry_id).style.display = "none"; | |||||
| }); | |||||
| function get_scores(anime_id, callback) { | |||||
| var bucket_id = null; | |||||
| if (anime_id !== null) | |||||
| bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); | |||||
| payload[entry_id] = new_score_percent; | |||||
| chrome.storage.local.set(payload); | |||||
| chrome.storage.sync.get(bucket_id, function(data) { | |||||
| if (anime_id !== null) { | |||||
| var bucket = data[bucket_id]; | |||||
| if (bucket !== undefined && bucket[anime_id] !== undefined) | |||||
| callback(bucket[anime_id]); | |||||
| else | |||||
| callback(null); | |||||
| } | |||||
| else | |||||
| callback(data); | |||||
| }); | |||||
| } | } | ||||
| function patched_myinfo_addtolist(anime_id) { | |||||
| var nscore_percent = document.getElementById("myinfo_score").value; | |||||
| var nstatus = document.getElementById("myinfo_status").value; | |||||
| var nepsseen = document.getElementById("myinfo_watchedeps").value; | |||||
| var nscore = Math.round(nscore_percent / 10.); | |||||
| var payload = {}; | |||||
| document.getElementById("myinfoDisplay").innerHTML = '<img src="http://cdn.myanimelist.net/images/xmlhttp-loader.gif" align="center">'; | |||||
| $.post("/includes/ajax.inc.php?t=61", {aid:anime_id,score:nscore,status:nstatus,epsseen:nepsseen}, function(data) { | |||||
| document.getElementById("myinfoDisplay").innerHTML = ''; | |||||
| document.getElementById("addtolist").innerHTML = data; | |||||
| }); | |||||
| function set_score(anime_id, score) { | |||||
| var bucket_id = (parseInt(anime_id) % MAX_BUCKETS).toString(); | |||||
| payload[anime_id] = nscore_percent; | |||||
| chrome.storage.local.set(payload); | |||||
| 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 patched_myinfo_updateInfo(entry_id) { | |||||
| var nscore_percent = document.getElementById("myinfo_score").value; | |||||
| var nstatus = document.getElementById("myinfo_status").value; | |||||
| var nepsseen = document.getElementById("myinfo_watchedeps").value; | |||||
| var naid = document.getElementById("myinfo_anime_id").value; | |||||
| var curstats = document.getElementById("myinfo_curstatus").value; | |||||
| var nscore = Math.round(nscore_percent / 10.); | |||||
| var payload = {}; | |||||
| document.getElementById("myinfoDisplay").innerHTML = '<img src="http://cdn.myanimelist.net/images/xmlhttp-loader.gif" align="center">'; | |||||
| $.post("/includes/ajax.inc.php?t=62", {aid:naid,alistid:entry_id,score:nscore,status:nstatus,epsseen:nepsseen,astatus:curstats}, function(data) { | |||||
| document.getElementById("myinfoDisplay").innerHTML = data; | |||||
| /* Event patches */ | |||||
| function update_list_score(anime_id) { | |||||
| var new_score_100 = $("#scoretext" + anime_id).val(); | |||||
| var new_score_10 = Math.round(new_score_100 / 10.); | |||||
| var payload = {id: anime_id, score: new_score_10}; | |||||
| $("#scorebutton" + anime_id).prop("disabled", true); | |||||
| $.post("/includes/ajax.inc.php?t=63", payload, function(data) { | |||||
| $("#scoreval" + anime_id).text(new_score_100); | |||||
| $("#scoretext" + anime_id).val(""); | |||||
| $("#scorediv" + anime_id).css("display", "none"); | |||||
| $("#scorebutton" + anime_id).prop("disabled", false); | |||||
| }); | }); | ||||
| set_score(anime_id, new_score_100); | |||||
| } | |||||
| payload[entry_id] = nscore_percent; | |||||
| chrome.storage.local.set(payload); | |||||
| function update_anime_score(anime_id, is_new) { | |||||
| var new_score_100 = $("#myinfo_score").val(); | |||||
| var new_score_10 = Math.round(new_score_100 / 10.); | |||||
| var t_id, payload = {score: new_score_10}; | |||||
| payload["status"] = $("#myinfo_status").val(); | |||||
| payload["epsseen"] = $("#myinfo_watchedeps").val(); | |||||
| if (is_new) { | |||||
| payload["aid"] = anime_id; | |||||
| t_id = "61"; | |||||
| } | |||||
| else { | |||||
| payload["alistid"] = anime_id; | |||||
| payload["aid"] = $("#myinfo_anime_id").val(); | |||||
| payload["astatus"] = $("#myinfo_curstatus").val(); | |||||
| t_id = "62"; | |||||
| } | |||||
| $("#myinfoDisplay").html(LOADING_IMG); | |||||
| $.post("/includes/ajax.inc.php?t=" + t_id, payload, function(data) { | |||||
| if (is_new) { | |||||
| document.getElementById("myinfoDisplay").innerHTML = ""; | |||||
| document.getElementById("addtolist").innerHTML = data; | |||||
| } | |||||
| else | |||||
| document.getElementById("myinfoDisplay").innerHTML = data; | |||||
| }); | |||||
| set_score(anime_id, new_score_100); | |||||
| } | } | ||||
| /* Extension hooks. */ | |||||
| function hook_animelist() { | |||||
| // chrome.storage.local.clear(); | |||||
| chrome.storage.local.get(null, function(data) { | |||||
| $("span[id^='scoreval']").each(function(i, el) { | |||||
| var aid = el.id.split("scoreval")[1]; | |||||
| var old_div = $("#scorediv" + aid); | |||||
| old_div.attr("id", "delete-me"); | |||||
| var new_div = $('<div id="scorediv' + aid + '" style="display: none;"><input type="text" id="scoretext' + aid + '" size="2"><input type="button" value="Go"></div>'); | |||||
| new_div.insertAfter(old_div); | |||||
| old_div.remove(); | |||||
| var input = $("#scoretext" + aid); | |||||
| var button = input.next(); | |||||
| input.keydown(function(tid) { | |||||
| return function(e) { | |||||
| return patched_anime_checkScoreEnter(e, tid); | |||||
| } | |||||
| }(aid)); | |||||
| button.click(function(tid) { | |||||
| return function() { | |||||
| return patched_anime_updateScore(tid); | |||||
| } | |||||
| }(aid)); | |||||
| if (aid in data) { | |||||
| $(el).text(data[aid]); | |||||
| } | |||||
| /* Extension hooks */ | |||||
| function hook_list() { | |||||
| get_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]; | |||||
| if (bucket !== undefined && bucket[anime_id] !== undefined) | |||||
| $(elem).text(bucket[anime_id]); | |||||
| else { | else { | ||||
| var cur = parseInt($(el).text()); | |||||
| if (!isNaN(cur)) | |||||
| $(el).text(cur * 10); | |||||
| var current = parseInt($(elem).text()); | |||||
| if (!isNaN(current)) | |||||
| $(elem).text(current * 10); | |||||
| } | } | ||||
| $("#scorediv" + anime_id) | |||||
| .after($("<div>") | |||||
| .attr("id", "scorediv" + anime_id) | |||||
| .css("display", "none") | |||||
| .append($('<input>') | |||||
| .attr("type", "text") | |||||
| .attr("id", "scoretext" + anime_id) | |||||
| .attr("size", "2") | |||||
| .keydown(function(a_id) { | |||||
| return function(ev) { | |||||
| if ((window.event ? window.event.keyCode : ev.which) == 13) | |||||
| update_list_score(a_id); | |||||
| else | |||||
| return true; | |||||
| } | |||||
| }(anime_id))) | |||||
| .append($("<input>") | |||||
| .attr("type", "button") | |||||
| .attr("id", "scorebutton" + anime_id) | |||||
| .attr("value", "Go") | |||||
| .click(function(a_id) { | |||||
| return function() { return update_list_score(a_id); } | |||||
| }(anime_id)))) | |||||
| .remove(); | |||||
| }); | }); | ||||
| }); | }); | ||||
| } | } | ||||
| function hook_anime(aid) { | |||||
| chrome.storage.local.get(aid, function(data) { | |||||
| function hook_anime(anime_id) { | |||||
| get_scores(anime_id, function(score) { | |||||
| var old_input = $("#myinfo_score"); | var old_input = $("#myinfo_score"); | ||||
| var old_add = $("input[name='myinfo_submit'][value='Add']"); | |||||
| var old_update = $("input[name='myinfo_submit'][value='Update']"); | |||||
| var score; | |||||
| if (old_add.length == 0 && aid in data) { | |||||
| score = data[aid]; | |||||
| } | |||||
| else { | |||||
| var old_button = $("input[name='myinfo_submit']"); | |||||
| var is_new = old_button.attr("value") == "Add"; | |||||
| if (!is_new && score === null) { | |||||
| var old_score = parseInt(old_input.val()); | var old_score = parseInt(old_input.val()); | ||||
| if (old_score == 0) | |||||
| score = ""; | |||||
| else | |||||
| score = old_score * 10; | |||||
| } | |||||
| old_input.attr("id", "delete-me"); | |||||
| var new_input = $('<input type="text" id="myinfo_score" name="myinfo_score" class="inputtext" size="3" value="' + score + '"><span> / 100</span>'); | |||||
| new_input.insertAfter(old_input); | |||||
| old_input.remove(); | |||||
| if (old_add.length > 0) { | |||||
| var new_add = $('<input type="button" name="myinfo_submit" value="Add" class="inputButton">'); | |||||
| new_add.insertAfter(old_add); | |||||
| old_add.remove(); | |||||
| new_add.click(function(tid) { | |||||
| return function() { | |||||
| return patched_myinfo_addtolist(tid); | |||||
| } | |||||
| }(aid)); | |||||
| } else { | |||||
| var new_update = $('<input type="button" name="myinfo_submit" value="Update" class="inputButton">'); | |||||
| new_update.insertAfter(old_update); | |||||
| old_update.remove(); | |||||
| new_update.click(function(tid) { | |||||
| return function() { | |||||
| return patched_myinfo_updateInfo(tid); | |||||
| } | |||||
| }(aid)); | |||||
| score = old_score == 0 ? "" : old_score * 10; | |||||
| } | } | ||||
| old_input.after($("<span> / 100</span>")) | |||||
| .after($("<input>") | |||||
| .attr("type", "text") | |||||
| .attr("id", "myinfo_score") | |||||
| .attr("name", "myinfo_score") | |||||
| .attr("class", "inputtext") | |||||
| .attr("value", (score === null) ? "" : score) | |||||
| .attr("size", "3")) | |||||
| .remove(); | |||||
| old_button.after($("<input>") | |||||
| .attr("type", "button") | |||||
| .attr("name", "myinfo_submit") | |||||
| .attr("value", old_button.attr("value")) | |||||
| .attr("class", "inputButton") | |||||
| .click(function(a_id, is_new) { | |||||
| return function() { return update_anime_score(a_id, is_new); } | |||||
| }(anime_id, is_new))) | |||||
| .remove(); | |||||
| }); | }); | ||||
| } | } | ||||
| /* Miscellaneous functions */ | |||||
| function get_anime_id_from_href(href) { | |||||
| var anime_id = href.substr(href.indexOf("/anime/") + "/anime/".length); | |||||
| if (anime_id.indexOf("/") != -1) | |||||
| anime_id = anime_id.substr(0, anime_id.indexOf("/")); | |||||
| return anime_id; | |||||
| } | |||||
| /* Main extension hook */ | |||||
| $(document).ready(function() { | $(document).ready(function() { | ||||
| if (window.location.href.indexOf("/animelist/") != -1) { | |||||
| hook_animelist(); | |||||
| } else if (window.location.href.indexOf("/anime/") != -1) { | |||||
| var aid = window.location.href.substr(window.location.href.indexOf("/anime/") + "/anime/".length); | |||||
| if (aid.indexOf("/") != -1) | |||||
| aid = aid.substr(0, aid.indexOf("/")); | |||||
| hook_anime(aid); | |||||
| } | |||||
| var href = window.location.href; | |||||
| if (href.indexOf("/animelist/") != -1) | |||||
| hook_list(); | |||||
| else if (href.indexOf("/anime/") != -1) | |||||
| hook_anime(get_anime_id_from_href(href)); | |||||
| }); | }); | ||||