(function() {
	var charMap = {
		a:"\u0250",b:"q",c:"\u0254",d:"p",e:"\u01DD",f:"\u025F",g:"\u0183",
		h:"\u0265",i:"\u0131",j:"\u027E",k:"\u029E",m:"\u026F",n:"u",
		r:"\u0279",t:"\u0287",v:"\u028C",w:"\u028D",y:"\u028E",1:"\u21C2",
		2:"\u1105",3:"\u1110",4:"\u3123",5:"\u078E",6:"9",7:"\u3125",
		".":"\u02D9",",":"'",'"':"\u201E","´":",","`":",",";":"\u061B",
		"!":"\u00A1","?":"\u00BF","[":"]","(":")","{":"}","<":">",
		_:"\u203E","\r":"\n"
	};
	for (var c in charMap) {
		if (!charMap[charMap[c]]) charMap[charMap[c]] = c;
	}

	String.implement({
		flip: function() {
			return Array.map(this.toLowerCase(), function(c) {
				return charMap[c] || c;
			}).join('');
		}
	});

	Element.implement({
		flipText: function(recurse) {
			for (var c = this.childNodes, i = c.length; i > 0; ) {
				var n = c[--i];
				if (n.nodeType == 3) {
					n.nodeValue = n.nodeValue.flip();
				} else if (n.nodeType == 1 && recurse) {
					Element.flipText(n, recurse);
				}
			}
			return this;
		}
	});
})();