Scripts:Animepage:Sourcecode2

From AniDB
Revision as of 17:22, 9 August 2005 by Der Idiot (talk | contribs) (v1 of lupin III)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

// ==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);

})();