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