User:Tentacle Monster/nostalgia.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* Utility functions. */

function addEvent(object, type, func)
{
	object.addEventListener(type, func, false);
}

function addLoadEvent(func) 
{
	addEvent(window, "load", func);
}

/* Data. */

function createToolbar() {
	var toolbarLinks = new Array();
	toolbarLinks["WatchList"] = "/wiki/Special:Watchlist";
	toolbarLinks["MyPage"] = "/wiki/User:Philip_Nilsson";
	toolbarLinks["RecentChanges"] = "/wiki/Special:Recentchanges";
	var languageLinks = new Array();
	var categoryLinks = new Array();

	var top = document.getElementById('topbar');
	var footer = document.getElementById('footer');

	var container = document.createElement('div');
	var languageLinkCount = 0;

	var links = top.getElementsByTagName('a');
	for (key in links) {
		var link = links[key];
		var hrefStr = new String(link.href);
		var linkText = link.innerHTML;

		if (link.title == "Special:Userlogout") {
			toolbarLinks["LogOut"] = link.href;
		} else if (linkText == "Edit this page" || hrefStr.match(/=edit$/)) {
			toolbarLinks["EditPage"] = link.href;
		} else if (hrefStr.match(/=history$/)) {
			toolbarLinks["PageHistory"] = link.href;
		} else if (link.className == 'external') {
			languageLinkCount++;
			languageLinks[link.title] = [link.href, link.innerHTML];
		} else if (hrefStr.match(/\/wiki\/Category:/)) {
			categoryLinks[link.innerHTML] = link.href;
		}
	}
	links = footer.getElementsByTagName('a');
	for (key in links) {
		var link = links[key];
		var hrefStr = new String(link.href);
		var linkText = link.innerHTML;
		
		if (link.title == "Special:Whatlinkshere") {
			toolbarLinks["WhatLinksHere"] = link.href;
		} else if (link.title == "Special:Movepage") {
			toolbarLinks["MovePage"] = link.href;
		} else if (link.title == "Special:Contributions") {
			toolbarLinks["UserContribs"] = link.href;
		} else if (hrefStr.match(/=watch$/)) {
			toolbarLinks["WatchPage"] = link.href;
		} else if (hrefStr.match(/=unwatch$/)) {
			toolbarLinks["UnwatchPage"] = link.href;
		} else if (linkText == "Discuss this page" /*hrefStr.match(/\/wiki\/Talk:/)*/) {
			toolbarLinks["DiscussPage"] = link.href;
		// main:, User:, Wikipedia:
		} else if (linkText == "View article" || linkText == "View user page" || linkText == "View project page") {
			toolbarLinks["ViewArticle"] = link.href;
		}/* else if (linkText == "Discuss this page" && hrefStr.match(/\/wiki\/User_talk:/)) {
			toolbarLinks["UserTalk"] = link.href;
		}*/
	}

	var strongs = top.getElementsByTagName('strong');
	for (key in strongs) {
		if (strongs[key].parentNode == top) {
			// Hardcoded :p
			toolbarLinks["NewMessage!"] = "/wiki/User_talk:Philip_Nilsson";
		}
	}

	// Links.
	var list = document.createElement('ul');
	for (key in toolbarLinks) {
		var listItem = document.createElement('li');
		var link = document.createElement('a');
		link.setAttribute("href", toolbarLinks[key]);
		link.appendChild(document.createTextNode(key));
		listItem.appendChild(link);
		list.appendChild(listItem);
	}

	var dl = document.createElement('dl');
	// Categories.
	var dt = document.createElement('dt');
	dt.appendChild(document.createTextNode("Categories:"));
	dl.appendChild(dt);
	for (key in categoryLinks) {
		var listItem = document.createElement('dd');
		var link = document.createElement('a');
		link.href = categoryLinks[key];
		link.appendChild(document.createTextNode(key));
		listItem.appendChild(link);
		dl.appendChild(listItem);
	}

	// Languages.
	var dt2 = document.createElement('dt');
	dt2.appendChild(document.createTextNode("Languages:"));
	dl.appendChild(dt2);
	dl.id = 'languageLinks';
	if (languageLinkCount > 5) {
		dt2.addEventListener('click',
			function () {
				var temp = document.getElementById('languageLinks').getElementsByTagName('dd');
				for (key in temp) {
					var ent = temp.item(key);
					if (ent.className == 'languageLink') {
						if (ent.style.display == 'none') {
							ent.style.display = 'block';
						} else {
							ent.style.display = 'none';
						}
					}
				}
			}, false);
	}
	for (key in languageLinks) {
		var listItem = document.createElement('dd');
		var link = document.createElement('a');
		link.href = languageLinks[key][0];
		link.title = languageLinks[key][1];
		link.appendChild(document.createTextNode(key));
		listItem.appendChild(link);
		listItem.className = "languageLink";
		if (languageLinkCount > 5) {
			listItem.style.display = "none";
		}
		dl.appendChild(listItem);
	}

	container.appendChild(list);
	container.appendChild(dl);
	container.appendChild(document.createElement('hr'));
	return container;
}

/* Page functions. */
function setupmenu() {
	var content = document.getElementById("content");
	var article = document.getElementById("article");

	content.insertBefore(document.getElementsByTagName('h1')[0], article);
	content.insertBefore(document.getElementById('specialpages'), article);
	content.insertBefore(createToolbar(), article);
}

// FIXME: Does not work.
function dropdown() {
  var select = document.getElementById('specialpages').childNodes.item(0);
  addEvent(select, "change",
    function () {
      document.getElementById('specialpages').submit();
    }
  );
}

addLoadEvent(setupmenu);
addLoadEvent(dropdown);