function HumansNotBots(replacement_method) {
    if (document.getElementsByTagName) {
	var htmlbody = document.getElementsByTagName('body')[0];
	if (replacement_method == null || replacement_method == 'innerhtml')   
	    HumansNotBots_innerhtml(htmlbody);
	else if (replacement_method == 'dom')
	    HumansNotBots_dom(htmlbody);
    }
}

/* innerHTML replacement method */
function HumansNotBots_innerhtml(htmlbody) {
    var rep = '<a href="mailto:$1@$2.$3">$1@$2.$3</a>';
    var newInnerHTML = htmlbody.innerHTML.replace(/([a-zA-Z0-9._%+-]+)\sAT\s([a-zA-Z0-9.-]+)\sDOT\s([a-zA-Z]{2,4})/g, rep);
    htmlbody.innerHTML = newInnerHTML;
}

/* Walk the DOM replacement method */
function HumansNotBots_dom(element) {
    if (element) {
	if (element.hasChildNodes()) {
	    var child = element.firstChild;
	    while (child) {
		HumansNotBots_dom(child);
		child = child.nextSibling;
	    }
	}
	else if (element.nodeValue) {
	    var disguisedEmailAddresses = element.nodeValue.match(/[a-zA-Z0-9._%+-]+\sAT\s[a-zA-Z0-9.-]+\sDOT\s[a-zA-Z]{2,4}/g);
	    if (disguisedEmailAddresses !== null) {
		var unprocessedText = element.nodeValue;
		var newParentsChildren = new Array();
		for (var i = 0; i < disguisedEmailAddresses.length; i++) {
		    var disguisedEmailAddress = disguisedEmailAddresses[i];

		    /* textBefore is the text in unprocessedText that comes before the first disguised email address in unprocessedText */ 
		    var textBefore = unprocessedText.substring(0,unprocessedText.search(new RegExp(disguisedEmailAddress)));
		    if (textBefore) {
			newParentsChildren.push(document.createTextNode(textBefore));
		    }
		    
		    var realEmailAddress = disguisedEmailAddress.replace(/([a-zA-Z0-9._%+-]+)\sAT\s([a-zA-Z0-9.-]+)\sDOT\s([a-zA-Z]{2,4})/, '$1@$2.$3');
		    var a = document.createElement('a');
		    a.setAttribute('href', 'mailto:' + realEmailAddress);
		    a.appendChild(document.createTextNode(realEmailAddress));

		    newParentsChildren.push(a);
		    
		    unprocessedText = unprocessedText.substring(textBefore.length + disguisedEmailAddress.length);
		}
		
		if (unprocessedText) {
		    // there is some text after the last disguised email address
		    newParentsChildren.push(document.createTextNode(unprocessedText));
		}

		/* remove all children from parent and recreate parent's children */
		var parent = element.parentNode;
		while (parent.hasChildNodes()) {
		    parent.removeChild(parent.lastChild);
		}
		for (var j = 0; j < newParentsChildren.length; j++) {
		    parent.appendChild(newParentsChildren[j]);
		}
	    }
	}
    }
}

