User:Niabot/showallfromcategory.js

Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
var appendError = function(str){
    throw new Error("DEBUG: "+str)
}

function log(str){
    setTimeout("appendError('"+str+"')", 1)
}

function insertAfter(node, content) {
    var parent = node.parentNode;
    var nextSibling = node.nextSibling;
    if (nextSibling != null) {
        parent.insertBefore(content, nextSibling);
    } else {
        parent.appendChild(content);
    }
}

function readDocument(url) {
    var request;
    try {
        if (window.XMLHttpRequest) {
            request = new XMLHttpRequest();
        } else {
            request = new ActiveXObject("MSXML2.XMLHTTP");
        }
    } catch(e) { return null; }
    request.open("GET", url, false);
    request.send();
    text = request.responseText;
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(text, "application/xml");
    return xmlDoc;
}

function getImagesFromPage(doc, imagesList) {
    links = doc.getElementsByTagName("a");
    for (var i=0; i<links.length; i++) {
        var lnk = links[i];
        clas = lnk.getAttribute("class");
        clas2 = lnk.parentNode.parentNode.getAttribute("class");
        if (clas != null && clas.indexOf("image") >= 0 && clas2 != null && clas2.indexOf("thumb") >= 0) {
            var entry = new Array(3);
            var linkURL = "http://commons.wikimedia.org" + lnk.getAttribute("href");
            var thumbURL = "http:" + lnk.firstChild.getAttribute("src");
            var style = lnk.parentNode.getAttribute("style");
            var styleDict = {};
            var attributes = style.split(';');
            for (var j=0; j<attributes.length; j++) {
                var e = attributes[j].split(':');
                styleDict[e[0]] = e[1];
            }
            entry[0] = linkURL;
            entry[1] = thumbURL;
            entry[2] = styleDict;
            imagesList.push(entry);
        }
    }
}

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) != -1;
}

function nextPage(doc) {
    links = doc.getElementsByTagName("a");
    for (var i=0; i<links.length; i++) {
        attr = links[i].getAttribute("href")
        if (attr != null && attr.indexOf("filefrom=") >= 0 && endsWith(attr, "#mw-category-media")) {
            return "http://commons.wikimedia.org"+attr;
        }
    }
    return null;
}

function imagesFromCategory(doc) {
    var currentDoc = doc;
    var imageLinks = new Array();
    getImagesFromPage(doc, imageLinks);
    while (true) {
        var currentURL = nextPage(currentDoc);
        if (currentURL == null) 
            break;
        currentDoc = readDocument(currentURL);
        getImagesFromPage(currentDoc, imageLinks);
    }
    return imageLinks;
}

function getChildCategories(url, maxDepth) {
    var result = new Array();
    var stack = new Array();

    var first = new Object();
    first["url"] = url;
    first["depth"] = 0;
    stack.push(first);

    while (stack.length > 0) {
        var currentStackItem = stack.pop();
        var depth = currentStackItem["depth"];
        var csURL = currentStackItem["url"];
        result.push(csURL);        

        var doc = readDocument(csURL);
        aList = doc.getElementsByTagName("a");
        for (var i=0; i<aList.length; i++) {
            a = aList[i];
            clas = a.getAttribute("class");
            if (clas != null && clas.indexOf("CategoryTreeLabelCategory") >= 0) {
                csURL = "http://commons.wikimedia.org" + a.getAttribute("href");
                var used = false;
                for (var k=0; k<result.length; k++) {
                    if (result[k] == csURL) {
                        used = true;
                        break;
                    }
                }
                if (!used && depth < maxDepth) {
                    var toStack = new Object();
                    toStack["depth"] = depth+1;
                    toStack["url"] = csURL;
                    stack.push(toStack);
                }
            }
        }
    }
    return result;
}

function displayImages(imagesList) {
    container = document.createElement("div");
    for (var i=0; i<imagesList.length; i++) {
        a = document.createElement("a");
        a.setAttribute("href", imagesList[i][0]);
        a.style.display = "inline-block";
        a.style.margin  = "5px";
        a.style.backgroundColor = "#f7f7f7";
        a.style.border = "1px solid #e0e0e0";
        a.style.height = "150px";
        a.style.width = "150px";
        a.style.textAlign = "center";
        img = document.createElement("img");
        img.setAttribute("src", imagesList[i][1]);
        var styleDict = imagesList[i][2]
        img.style.margin = styleDict["margin"];
        a.appendChild(img);
        container.appendChild(a);
    }
    insertAfter(document.getElementById("nyannyan"), container);
}

function listAllImages(button, max_depth) {
    button.style.height = "32px";
    button.style.weidth = "32px";
    button.style.backgroundImage = "url(http://upload.wikimedia.org/wikipedia/commons/f/f6/Kewlers-icon.png)";
    button.style.backgroundRepeat = "no-repeat";
    button.textContent = "Am Arbeiten";
    button.style.paddingLeft = "40px";

    var allImagesList = Array()
    var url = document.URL;
    var urlList = getChildCategories(url, max_depth);
    for (var i=0; i<urlList.length; i++) {
        var csURL = urlList[i];
        var doc = readDocument(csURL);
        var list = imagesFromCategory(doc);
        allImagesList = allImagesList.concat(list);
    }

    /* remove duplicate entries */
    var traversed = Object()
    var imageSet = Array()
    for (var i=0; i<allImagesList.length; i++) {
        var entry = allImagesList[i]
        var key = entry[0]
        if ('key' in traversed) {
        } else {
            imageSet.push(entry)
        }
        traversed[entry[0]] = 1;
    }

    displayImages(imageSet);

    button.style.height = "auto";
    button.style.width = "auto";
    button.style.backgroundImage = "none";
    button.textContent = "Fertig!"
    button.style.paddingLeft = "0px";
}

function enableAddon() {
    var isCategoryPage = document.getElementsByTagName("body")[0].getAttribute("class").indexOf("ns-14") >= 0;
    if (isCategoryPage) {
        var button = document.createElement("a");
        button.textContent = "Alle Bilder anzeigen (2)";
        button.setAttribute("id", "nyannyan");
        button.style.cursor = "pointer";
        button.style.margin = "0px 10px";
        button.onclick = function() { listAllImages(button, 2); };

        var button3 = document.createElement("a");
        button3.textContent = "(3)";
        button3.style.cursor = "pointer";
        button3.style.margin = "0px 10px";
        button3.onclick = function() { 
            button3.style.display = "none";
            button4.style.display = "none";
            button5.style.display = "none";
            listAllImages(button, 3); 
        };

        var button4 = document.createElement("a");
        button4.textContent = "(4)";
        button4.style.cursor = "pointer";
        button4.style.margin = "0px 10px";
        button4.onclick = function() { 
            button3.style.display = "none";
            button4.style.display = "none";
            button5.style.display = "none";
            listAllImages(button, 4); 
        };

        var button5 = document.createElement("a");
        button5.textContent = "(5)";
        button5.style.cursor = "pointer";
        button5.style.margin = "0px 10px";
        button5.onclick = function() { 
            button3.style.display = "none";
            button4.style.display = "none";
            button5.style.display = "none";
            listAllImages(button, 5); 
        };

        var buttonContainer = document.createElement("p");
        buttonContainer.appendChild(button);
        buttonContainer.appendChild(button3);
        buttonContainer.appendChild(button4);
        buttonContainer.appendChild(button5);

        var firstHeader = document.getElementById("firstHeading");
        insertAfter(firstHeader, buttonContainer);
    }
}

$(enableAddon);