// ==UserScript==
// @name select_all_of_a_group
// @namespace lupin_sanseis_scripts
// @description selects all files of a release group
// @include http://anidb.info/*
// ==/UserScript==
(function() {
// 2D-array containing all the checkbox names corresponding to a group
checkbox_names = new Array();
function initialize() {
var gids = new Array();
// walk through all tbodies (they are created by the browser DOM internally, they don't have to be in source)
for (var i=0; i < document.getElementsByTagName("tbody").length; i++) {
var tbody = document.getElementsByTagName("tbody")[i];
// the group-listing-table contains no inner table, so it's the wrong tbody if a table is found inside
match = tbody.innerHTML.match(/table/i);
if (match) { continue; }
// search for "Group Info"
match = tbody.innerHTML.match(/Group Info:/i);
if (match) {
// found the right table
var regexp = /gid=(\d+)"/;
var tr = tbody.firstChild;
// walk through all rows of the table
while (tr.nextSibling) {
if (tr.nodeType == 1
&& tr.nodeName == 'TR')
{
// create an adittional column to add to the end of the row
var td = document.createElement("td");
if (match = regexp.exec(tr.innerHTML)) {
// found a group-id, so create the subarray for the checkboxnames and the checkbox
var gid = match[1];
gids.push(gid);
checkbox_names[gid] = new Array();
var input = document.createElement('input');
input.setAttribute('type', 'checkbox');
input.setAttribute('id', 'toggle_gid_'+gid);
input.setAttribute('onclick', 'toggle('+gid+')');
td.appendChild(input);
} else
if (tr.innerHTML.match(/Group Info:/i)) {
td.setAttribute('bgcolor', '#b0b0b0');
td.appendChild(document.createTextNode('toggle all'));
}
tr.appendChild(td);
}
tr = tr.nextSibling;
}
}
}
// if checkbox_names still contains no elements, it's no animelisting --> exit function
if (checkbox_names.length == 0) { return; }
// walk through all checkboxes in the page
for (var i=0; i < document.getElementsByTagName("input").length; i++) {
var input = document.getElementsByTagName("input")[i];
if (input.type == 'checkbox'
&& input.name.search(/^madd\.f\.\d+$/) != -1) {
var regexp = /gid=(\d+)/;
// if the checkboxname is like madd.f.xyz, try to find the gid in the same table-row
// and add the checkboxname to the corresponding array
var tr = input.parentNode.parentNode;
if (match = regexp.exec(tr.innerHTML)) {
var gid = match[1];
if (checkbox_names[gid]) {
checkbox_names[gid].push(input.name);
}
}
}
}
// add a title attribute to the created checkboxes
for (var i=0; i < gids.length; i++) {
document.getElementById('toggle_gid_'+gids[i]).setAttribute('title', 'Toggle all files of this anime-group ('+checkbox_names[gids[i]].length+' files)');
document.getElementById('toggle_gid_'+gids[i]).parentNode.appendChild(document.createTextNode('('+checkbox_names[gids[i]].length+')'));
}
// expand the grouplist too when expanding all file-entries (change href of plus icon)
for (var i=0; i < document.getElementsByTagName("a").length; i++) {
var a = document.getElementsByTagName("a")[i];
if (a.href.match(/expandall/)
&& a.innerHTML.match(/all entries/)) {
a.href += '&showallag=1';
break;
}
}
// finally add the function for the checkbox onclick-handler to the document
// has to be done this way, because of scoping of function names
var script = document.createElement('script');
script.type = 'text/javascript';
script.appendChild(document.createTextNode("\
function toggle(_gid) {\
for (var i=0; i < checkbox_names[_gid].length; i++) {\
document.getElementsByName(checkbox_names[_gid][i])[0].checked = document.getElementById('toggle_gid_'+_gid).checked;\
}\
if (document.getElementById('toggle_gid_'+_gid).checked) {\
alert('Selected ' + checkbox_names[_gid].length + ' files. Please check for correctness!');\
} else {\
alert('Removed all checkmarks for this group!');\
}\
}"));
document.getElementsByTagName("head")[0].appendChild(script);
}
window.addEventListener("load", initialize(), false);
})();