(function EmailNinja() {
	var doc = window.document, revealed = false;

	function reveal_emails() {
		if (revealed) return;
		revealed = true;

		var address, attr, i, j, link, outer, ninja, ninjas, span, spans;

		if (document.getElementsByClassName) {
			ninjas = document.getElementsByClassName("email-ninja");
		} else {
			ninjas = [];
			spans = document.getElementsByTagName("span");
			i = spans.length;

			while (i--) {
				if (spans[i].className === "email-ninja") ninjas.push(spans[i]);
			}
		}

		i = ninjas.length;

		while (i--) {
			ninja = ninjas[i];
			span = ninja.parentNode;
			outer = span.parentNode;

			if (span.tagName.toLowerCase() !== "span") continue;

			link = document.createElement("a");
			j = span.attributes.length;

			// I know this isn't ideal in some versions of IE, but it's all we've got
			while (j--) {
				attr = span.attributes[j];
				link.setAttribute(attr.name, attr.value);
			}

			address = (ninja.innerText || ninja.textContent).toLowerCase(); // textContent is corrupted by text-transform?
			address = address.replace(/ \(dot\) /g, ".").replace(/ \(at\) /g, "@").replace(/ \(plus\) /g, "%2B");
			address += ninja.getAttribute("query") || "";

			link.setAttribute("href", "mailto:" + address);
			link.appendChild(span.firstChild.firstChild);

			outer.insertBefore(link, span);
			outer.removeChild(span);
		}
	}

	// try frameworks first; they're likely to cover more cases
	if (typeof jQuery !== "undefined") {
		jQuery(doc).ready(reveal_emails);
	} else if (typeof dojo !== "undefined" && dojo.addOnLoad) {
		dojo.addOnLoad(reveal_emails);
	} else if (typeof Ext !== "undefined" && Ext.onReady) {
		Ext.onReady(reveal_emails);
	} else if (document.observe) { // Prototype
		document.observe("dom:loaded", reveal_emails);
	} else if (doc.addEvent) { // MooTools
		doc.addEvent("domready", reveal_emails);
	} else if (doc.addEventListener) { // Firefox / Safari / Opera / Chrome fallback
		doc.addEventListener("DOMContentLoaded", reveal_emails, false);
	} else { // IE and ancient fallbacks
		function ie() {
			try {
				doc.doScroll("left");
				reveal_emails();
			} catch (ex) {
				window.setTimeout(ie, 50);
			}
		}

		ie();

		var old_onload = window.onload;

		window.onload = function ancient() {
			reveal_emails();
			if (old_onload) old_onload();
		}
	}
})();
