Mondo Meta

By Michael Devore Last update Jun 15, 2007 — Installed 1,189 times.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// mondo_meta.user.js
//
// Copyright 2005-2007, Michael Devore
// This file is licensed under the terms of the Artistic License.
// See http://www.opensource.org/licenses/artistic-license.php for the license itself.
//
// This is a Greasemonkey script.
// See http://www.greasespot.net/ for more information on Greasemonkey.
//
// ==UserScript==
// @name          Mondo Meta
// @namespace     http://www.devoresoftware.com/gm/mm
// @description	Personalize the Metafilter experience
// @include       http://*.metafilter.com/*
// @include       http://www.devoresoftware.com/*
// ==/UserScript==
//
// Work begun, December 2005
// Version 1.0, released January 2006
// Version 1.1, released January 2006
// Version 1.2, released December 2006
// Version 1.3, released early February 2007
// Version 2.0, released mid-June 2007, pre-release, 2.01 final
//

var mondoMetaVersion = "Version 2.01, Mondo Meta";
var expandedLinksFlag = 0;
var boxUp = 0;
var mondo_meta_control = null;
var mondo_meta_highlight_control = null;
var mondo_meta_delete_control = null;
var mondo_meta_tag_control = null;
var mondo_meta_style_control = null;
var mondo_meta_manage_control = null;
var freeRules = new Array();
var aDeleteInfo = new Array();
var aHighlightInfo = new Array();
var aTagInfo = new Array();
var aStyleInfo = new Array();
var storedRuleCount = 0;
var currentRuleNumber = 0;
var currentRuleType = 0;
var deactivateDeleteFlag = false;
var deactivateHighlightFlag = false;
var deactivateTagFlag = false;
var deactivateStyleFlag = false;
var flagMultiple = 1;
var flagHighlight = flagMultiple << 1;
var flagDelete = flagHighlight << 1;
var flagTag = flagDelete << 1;
var flagStyle = flagTag << 1;
var originalMenuHeight = "50px";
var originalSiblingHeight = "50px";
var expandTextChoice = [ "Expand Links", "Compact Links"];
var deleteFilterText = "Delete-Filter";
var tagText = "Tag";
var highlightText = "Highlight";
var styleText = "Style";
var manageText = "Manage";
//var separatorText = "------------";
var compactText = "compact";
var defaultText = "default";
var expandText = "expand";
var usedRuleHeader = "Used:mm1.0:";
var freeRuleHeader = "Free:mm1.0:";
var deleteHeader = "Delete:";
var highlightHeader = "Highlight:";
var tagHeader = "Tag:";
var styleHeader = "Style:";
var systemHeader = "System:mm1.0:";
var systemStatusText = "System Status";
var optionText = "Option";
var contentText = "Content";
var footerText = "Footer";
var contentFooterText = contentText + "+" + footerText;
var customText = "Custom";
var unchangedText = "Unchanged";
var buttonText = "button";
var spanText = "SPAN";
var removeText = "Remove";
var invisibleText = "Make Invisible";
var fg_bgText = "Foreground = Background";
var mmHighlightAttribText = "mmModifiedHighlight";
var mmDeleteAttribText = "mmModifiedDelete";
var mmTagClassText = "mmTagClass";
var mmStyledPostAttribText = "mmStyledPost";
var whiteText = "white";
var darkBlueText = "darkblue";
var textNodeText = "#text";
var trueText = "true";
var falseText = "false";
var clickText = "click";
var noneText = "none";
var hiddenText = "hidden";
var visibleText = "visible";
var xText = "x";
var moveMouseAreaWidth = 50;
var moveMouseAreaSeconds = 3;
var dropdownPeekABoo = false;

function switchSidebar(onSwitch)
{
	var xpath = "//div[@id='page']/div[@id='ajaxcontentarea']/div[@id='menu']/div[@class='sidebar']";
	var menu_div = document.evaluate(
		xpath,
		document,
		null,
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
		null
	);

	if (menu_div)
	{
		var menu_node = menu_div.snapshotItem(0);
		// try to affect subscription buttons following
		var sibling = null;
		if (menu_node)
		{
			sibling = menu_node.nextSibling;
		}
		if (sibling)
		{
			if (sibling.nodeName === textNodeText)
			{
				sibling = sibling.nextSibling;
			}
			if (sibling && sibling.nodeName != "DIV")
			{
				sibling = null;
			}
		}
		if (menu_node)
		{
			menu_node.style.visibility = onSwitch ? visibleText : hiddenText;
			if (sibling)
			{
				sibling.style.visibility = onSwitch ? visibleText : hiddenText;
			}
			if (onSwitch)
			{
				menu_node.style.height = originalMenuHeight;
				if (sibling)
				{
					sibling.style.height = originalSiblingHeight;
				}
			}
			else
			{
				originalMenuHeight = menu_node.style.height;
				menu_node.style.height = "1px";
				if (sibling)
				{
					originalSiblingHeight = sibling.style.height;
					sibling.style.height = "1px";
				}
			}
		}
	}
}

function isPostFooter(node)
{
	if (!node)
	{
		return 0;
	}
	var currentNode = node;
	while (currentNode)
	{
		if (currentNode.nodeName === spanText && currentNode.getAttribute('class') === 'smallcopy')
		{
			return 1;
		}
		currentNode = currentNode.parentNode;
	}
 	return 0;
}

function escapePattern(toEscape)
{
	var needsEscaping = "\\^.*?$|([{}])";
	var afterEscape = "";
	var pos = 0;
	while (pos < toEscape.length)
	{
		var c = toEscape.charAt(pos++);
		if (needsEscaping.indexOf(c) >= 0)
		{
			afterEscape += "\\" + c;
		}
		else
		{
			afterEscape += c;
		}
	}
	return afterEscape;
}

// get free configuration value slot
function getFreeSlot()
{
	if (freeRules.length)
	{
		var slotID = freeRules.pop();
	}
	else
	{
		var slotID = "Rule" + (++storedRuleCount);
	}
	return slotID;
}

// store information to free configuration value slot
function storeInfoToSlot(infoString)
{
	var gmKey = getFreeSlot();
	var gmValue = usedRuleHeader + infoString;
	GM_setValue(gmKey, gmValue);
	return gmKey;
}

// show a slot as free
function freeSlot(ruleID)
{
	GM_setValue(ruleID, freeRuleHeader);
	freeRules.push(ruleID);
}

function expandLinks()
{
	var xpath = "//div[@class='copy' or @class='comments' or @class='comments best']//a";
	var link_anchors = document.evaluate(
		xpath,
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null
	);

	switchSidebar(expandedLinksFlag);

	for (var i = 0; i < link_anchors.snapshotLength; i++)
	{
 		var candidate = link_anchors.snapshotItem(i);
 		var href_value;
 		if ((href_value = candidate.getAttribute('href')) && !isPostFooter(candidate))
 		{
    		if (!expandedLinksFlag)
    		{
    			var expansion = " [" + href_value + "] ";
				candidate.appendChild(document.createTextNode(expansion));
			}
			else if (candidate.lastChild)
			{
				candidate.removeChild(candidate.lastChild);
			}
 		}
	}

	expandedLinksFlag ^= 1;
}

function saveDeleteItem(deleteInfo)
{
	var infoString = deleteHeader;
	for (var i = 0; i < 9; i++)
	{
		infoString += String(deleteInfo[i]).length + ":" + deleteInfo[i];
	}
	var gmKey = storeInfoToSlot(infoString);
	return gmKey;
}

function saveDelete(event)
{
	event.stopPropagation();
// userDelText, userLocated, userHow, userWhole, userCase, userLinks, userRegExp, userDuration
	mondo_meta_delete_control.style.display = noneText;
	var elem = document.getElementById("mondo_meta_delete_text");
	var userDelText = elem.value;
	elem = document.getElementById("mondo_meta_delete_located");
	var userLocated = elem.value;
	elem = document.getElementById("mondo_meta_delete_how");
	var userHow = elem.value;
	var checkNode = document.getElementById("mondo_meta_delete_wholeword");
	var userWhole = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_delete_matchcase");
	var userCase =  checkNode.checked;
	checkNode = document.getElementById("mondo_meta_delete_matchlinks");
	var userLinks =  checkNode.checked;
	checkNode = document.getElementById("mondo_meta_delete_regexp");
	var userRegExp =  checkNode.checked;
	elem = document.getElementById("mondo_meta_delete_duration");
	var userDuration = elem.value;
	var rightNow = new Date();

	aDeleteInfo.push([
		userDelText,
		userLocated,
		userHow,
		userWhole,
		userCase,
		userLinks,
		userRegExp,
		userDuration,
		rightNow.getTime()]);
	nodeBreaker(flagDelete, aDeleteInfo.length - 1);
	var gmKey = saveDeleteItem(aDeleteInfo[aDeleteInfo.length - 1]);
	aDeleteInfo[aDeleteInfo.length - 1][9] = gmKey;

	boxUp = 0;
}

function cancelDelete(event)
{
	event.stopPropagation();
	boxUp = 0;
	mondo_meta_delete_control.style.display = noneText;
}

function saveTagItem(tagInfo)
{
	var infoString = tagHeader;
	for (var i = 0; i < tagInfo.length; i++)
	{
		infoString += String(tagInfo[i]).length + ":" + tagInfo[i];
	}
	var gmKey = storeInfoToSlot(infoString);
	return gmKey;
}

function saveTag(event)
{
	event.stopPropagation();
// userTagText, userLocated, userTagTags, userWhole, userCase, userRegExp,
	mondo_meta_tag_control.style.display = noneText;
	var elem = document.getElementById("mondo_meta_tag_text");
	var userTagText = elem.value;
	elem = document.getElementById("mondo_meta_tag_located");
	var userLocated = elem.value;
	elem = document.getElementById("mondo_meta_tag_tags");
	var userTagTags = elem.value;
	var checkNode = document.getElementById("mondo_meta_tag_wholeword");
	var userWhole = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_tag_matchcase");
	var userCase =  checkNode.checked;
	checkNode = document.getElementById("mondo_meta_tag_regexp");
	var userRegExp =  checkNode.checked;
	var rightNow = new Date();

	aTagInfo.push([
		userTagText,
		userLocated,
		userTagTags,
		userWhole,
		userCase,
		userRegExp,
		rightNow.getTime()]);
	nodeBreaker(flagTag, aTagInfo.length - 1);
	var gmKey = saveTagItem(aTagInfo[aTagInfo.length - 1]);
	aTagInfo[aTagInfo.length - 1][aTagInfo[aTagInfo.length - 1].length] = gmKey;

	boxUp = 0;
}

function cancelTag(event)
{
	event.stopPropagation();
	boxUp = 0;
	mondo_meta_tag_control.style.display = noneText;
}

function saveStyleItem(styleInfo)
{
	var infoString = styleHeader;
	for (var i = 0; i < styleInfo.length; i++)
	{
		infoString += String(styleInfo[i]).length + ":" + styleInfo[i];
	}
	var gmKey = storeInfoToSlot(infoString);
	return gmKey;
}

function saveStyle(event)
{
	event.stopPropagation();
// userStyleText, userLocated, userStyleStyles, userWhole, userCase, userRegExp,
	mondo_meta_style_control.style.display = noneText;
	var elem = document.getElementById("mondo_meta_style_text");
	var userStyleText = elem.value;
	elem = document.getElementById("mondo_meta_style_located");
	var userLocated = elem.value;
	elem = document.getElementById("mondo_meta_style_styles");
	var userStyleStyles = elem.value;
	var checkNode = document.getElementById("mondo_meta_style_wholeword");
	var userWhole = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_style_matchcase");
	var userCase =  checkNode.checked;
	checkNode = document.getElementById("mondo_meta_style_regexp");
	var userRegExp =  checkNode.checked;
	var rightNow = new Date();

	aStyleInfo.push([
		userStyleText,
		userLocated,
		userStyleStyles,
		userWhole,
		userCase,
		userRegExp,
		false,
		rightNow.getTime()]);
	nodeBreaker(flagStyle, aStyleInfo.length - 1);
	var gmKey = saveStyleItem(aStyleInfo[aStyleInfo.length - 1]);
	aStyleInfo[aStyleInfo.length - 1][aStyleInfo[aStyleInfo.length - 1].length] = gmKey;

	boxUp = 0;
}

function cancelStyle(event)
{
	event.stopPropagation();
	boxUp = 0;
	mondo_meta_style_control.style.display = noneText;
}

function saveHighlightItem(highlightInfo)
{
	var infoString = highlightHeader;
	for (var i = 0; i < 11; i++)
	{
		infoString += String(highlightInfo[i]).length + ":" + highlightInfo[i];
	}
	var gmKey = storeInfoToSlot(infoString);
	return gmKey;
}

function d2h(decNum)
{
	var hexDigits="0123456789ABCDEF";
	var hexNum = hexDigits.substr(decNum & 15, 1);
	decNum >>= 4;
	hexNum = hexDigits.substr(decNum & 15, 1) + hexNum;
	return hexNum;
}

function processRGBvalue(rgbString)
{
	var result;
	if (result = rgbString.match(/[ ;.,-]*(\d{1,3})[ ;.,-]+(\d{1,3})[ ;.,-]+(\d{1,3})/))
	{
		// 3 sets of digits, change to #xxxxxx hexadecimal
		var ret = "#";
		ret += d2h(result[1]);
		ret += d2h(result[2]);
		ret += d2h(result[3]);
		return ret;
	}
	else if (result = rgbString.match(/\s*(#([0-9a-fA-F]{6}))/))
	{
		// already #xxxxxx hexadecimal, use it
		return result[1];
	}
	return "";
}

function deleteTransform(
	candidate,
	doAllFlag,
	doValue,
	spanFooterStore,
	boldFooterStore,
	anchorStore,
	textAllNodeStore,
	textContentNodeStore,
	textFooterNodeStore)
{
	if (deactivateDeleteFlag)
	{
		return;
	}
	if (candidate.getAttribute(mmDeleteAttribText))
	{
		// entire message already processed for deleting
		return;
	}

	if (doAllFlag)
	{
		var start = 0;
		var end = aDeleteInfo.length;
	}
	else
	{
		var start = doValue;
		var end = start + 1;
	}

	// peek at the delete conditions to see if we need to check all three types of targets
	// set up only search targets that are needed
	var searchTargetAll = "";
	var searchTargetContent = "";
	var searchTargetFooter = "";
	var useAll, useContent, useFooter;
	for (var loop = start; loop < end; loop++)
	{
		var requestContent = (aDeleteInfo[loop][1].indexOf(contentText) >= 0 ? true: false);
		var requestFooter = (aDeleteInfo[loop][1].indexOf(footerText) >= 0 ? true: false);
		if (requestContent && requestFooter)
		{
			useAll = true;
		}
		else if (requestContent)
		{
			useContent = true;
		}
		else if (requestFooter)
		{
			useFooter = true;
		}
	}
	var textValStore = new Array();
	if (useAll)
	{
		// no destructive popping of array
		for (var aLoop = 0; aLoop < textAllNodeStore.length; aLoop++)
		{
			var aNode = textAllNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetAll = textValStore.join('');
		textValStore.length = 0;
	}
	if (useContent)
	{
		for (var aLoop = 0; aLoop < textContentNodeStore.length; aLoop++)
		{
			var aNode = textContentNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetContent = textValStore.join('');
		textValStore.length = 0;
	}
	if (useFooter)
	{
		for (var aLoop = 0; aLoop < textFooterNodeStore.length; aLoop++)
		{
			var aNode = textFooterNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetFooter = textValStore.join('');
	}
	var hrefValueStore = new Array();
	for (var aLoop = 0; aLoop < anchorStore.length; aLoop++)
	{
		var aNode = anchorStore[aLoop];
		hrefValueStore.push(aNode.getAttribute('href'));
	}
	var hrefText = hrefValueStore.join(" ");

	for (var loop = start; loop < end; loop++)
	{
		// set test conditions
		// userHiText, userLocated, userArea, userFg, userBg, userFrgb, userBrgb,
		//  userWhole, userCase, userRegExp
		if (!aDeleteInfo[loop][0])
		{
			continue;
		}

		if (aDeleteInfo[loop][6] === false)
		{
			requestText = escapePattern(aDeleteInfo[loop][0]);
			if (aDeleteInfo[loop][3] === true)
			{
				// wrap pattern in \b for whole word
				requestText = "\\b" + requestText + "\\b";
			}
		}
		else
		{
			// direct RegExp specified
			requestText = aDeleteInfo[loop][0];
		}
		if (aDeleteInfo[loop][4] === false)
		{
			var requestPattern = new RegExp(requestText, "i");		// ignore case
		}
		else
		{
			var requestPattern = new RegExp(requestText);
		}

		// restrict searches for this rule to appropriate content/footer location
		var restrictSearchTargetAll = "";
		var restrictSearchTargetContent = "";
		var restrictSearchTargetFooter = "";
		if (aDeleteInfo[loop][1] === contentText)
		{
			restrictSearchTargetContent = searchTargetContent;
		}
		else if (aDeleteInfo[loop][1] === footerText)
		{
			restrictSearchTargetFooter = searchTargetFooter;
		}
		else
		{
			restrictSearchTargetAll = searchTargetAll;
		}

		var requestLinks = aDeleteInfo[loop][5];
		if (requestLinks)
		{
			if (restrictSearchTargetAll.length)
			{
				restrictSearchTargetAll = searchTargetAll + " " + hrefText;
			}
			if (restrictSearchTargetContent.length)
			{
				restrictSearchTargetContent = searchTargetContent + " " + hrefText;
			}
		}

		// search as appropriate
		if ((restrictSearchTargetAll.length && requestPattern.test(restrictSearchTargetAll)) ||
			(restrictSearchTargetContent.length && requestPattern.test(restrictSearchTargetContent)) ||
			(restrictSearchTargetFooter.length && requestPattern.test(restrictSearchTargetFooter)))
		{
			// delete filter this post

			var requestHow = aDeleteInfo[loop][2];
			candidate.setAttribute(mmDeleteAttribText, "on");
			switch (requestHow)
			{
				case invisibleText:
					candidate.style.visibility = hiddenText;
					break;
				case fg_bgText:
					var backgroundColor = null;
					if (candidate.style)
					{
						backgroundColor = document.defaultView.getComputedStyle(candidate, null).getPropertyValue("background-color");
					}
					var aNode = candidate;
					while (aNode && (!backgroundColor || backgroundColor === "transparent"))
					{
						aNode = aNode.parentNode;
						if (aNode && aNode.style)
						{
							backgroundColor = document.defaultView.getComputedStyle(aNode, null).getPropertyValue("background-color");
						}
					}
					if (!backgroundColor || backgroundColor === "transparent")
					{
						// hard-code and hope
						var newColor = "#006699";
					}
					else
					{
						var newColor = backgroundColor;
					}
					candidate.style.color = newColor;
					// no destructive popping of anchorStore array
					for (var aLoop = 0; aLoop < anchorStore.length; aLoop++)
					{
						var aNode = anchorStore[aLoop];
						aNode.style.color = newColor;
					}
					for (var aLoop = 0; aLoop < spanFooterStore.length; aLoop++)
					{
						var aNode = spanFooterStore[aLoop];
						aNode.style.color = newColor;
					}
					for (var aLoop = 0; aLoop < boldFooterStore.length; aLoop++)
					{
						var aNode = boldFooterStore[aLoop];
						aNode.style.color = newColor;
					}
					break;
				default:	// remove
					candidate.style.display = noneText;
					var followNode = candidate.nextSibling;
					// remove following BR if present
					while (followNode)
					{
						if (followNode.nodeName === "BR")
						{
							var removeNode = followNode;
							followNode = followNode.nextSibling;
							var parentNode = removeNode.parentNode;
							parentNode.removeChild(removeNode);
						}
						else if (followNode.nodeName != textNodeText)
						{
							break;
						}
						else
						{
							followNode = followNode.nextSibling;
						}
					}
					break;
			}
		}
	}

}

function tagTransform(
	candidate,
	doAllFlag,
	doValue,
	spanFooterStore,
	textAllNodeStore,
	textContentNodeStore,
	textFooterNodeStore)
{
	if (deactivateTagFlag)
	{
		return;
	}
	if (candidate.getAttribute(mmDeleteAttribText))
	{
		return;
	}
	if (doAllFlag)
	{
		var start = 0;
		var end = aTagInfo.length;
	}
	else
	{
		var start = doValue;
		var end = start + 1;
	}

	var tInfo = {
		tagText : 0,
		locatedIn : 1,
		tagTags : 2,
		wholeWord : 3,
		caseSensitive : 4,
		useRegExp : 5
	};
	var searchTargetAll = "";
	var searchTargetContent = "";
	var searchTargetFooter = "";
	var useAll, useContent, useFooter;
	for (var loop = start; loop < end; loop++)
	{
		var requestLocContent = (aTagInfo[loop][tInfo.locatedIn].indexOf(contentText) >= 0 ? true: false);
		var requestLocFooter = (aTagInfo[loop][tInfo.locatedIn].indexOf(footerText) >= 0 ? true: false);
		if (requestLocContent && requestLocFooter)
		{
			useAll = true;
		}
		else if (requestLocContent)
		{
			useContent = true;
		}
		else if (requestLocFooter)
		{
			useFooter = true;
		}
	}
	var textValStore = new Array();
	if (useAll)
	{
		for (var aLoop = 0; aLoop < textAllNodeStore.length; aLoop++)
		{
			var aNode = textAllNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetAll = textValStore.join('');
		textValStore.length = 0;
	}
	if (useContent)
	{
		for (var aLoop = 0; aLoop < textContentNodeStore.length; aLoop++)
		{
			var aNode = textContentNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetContent = textValStore.join('');
		textValStore.length = 0;
	}
	if (useFooter)
	{
		for (var aLoop = 0; aLoop < textFooterNodeStore.length; aLoop++)
		{
			var aNode = textFooterNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetFooter = textValStore.join('');
	}

	for (var loop = start; loop < end; loop++)
	{
		if (!aTagInfo[loop][tInfo.tagText])
		{
			continue;
		}
		var restrictSearchTargetAll = "";
		var restrictSearchTargetContent = "";
		var restrictSearchTargetFooter = "";
		if (aTagInfo[loop][tInfo.locatedIn] === contentText)
		{
			restrictSearchTargetContent = searchTargetContent;
		}
		else if (aTagInfo[loop][tInfo.locatedIn] === footerText)
		{
			restrictSearchTargetFooter = searchTargetFooter;
		}
		else
		{
			restrictSearchTargetAll = searchTargetAll;
		}

		if (aTagInfo[loop][tInfo.useRegExp] == false)
		{
			var requestText = escapePattern(aTagInfo[loop][0]);
			if (aTagInfo[loop][tInfo.wholeWord] == true)
			{
				requestText = "\\b" + requestText + "\\b";
			}
		}
		else
		{
			var requestText = aTagInfo[loop][0];
		}
		if (aTagInfo[loop][tInfo.caseSensitive] == false)
		{
			var requestPattern = new RegExp(requestText, "i");
		}
		else
		{
			var requestPattern = new RegExp(requestText);
		}

		if ((restrictSearchTargetAll.length && requestPattern.test(restrictSearchTargetAll)) ||
			(restrictSearchTargetContent.length && requestPattern.test(restrictSearchTargetContent)) ||
			(restrictSearchTargetFooter.length && requestPattern.test(restrictSearchTargetFooter)))
		{
			// tag this post
			if (textFooterNodeStore.length)
			{
				var leadingNode = textFooterNodeStore[0];
				// look for 'posted by'
				var testNode = spanFooterStore[0];
				while (testNode)
				{
					var childNode = testNode.firstChild;
					var bFound = false;
					while (childNode)
					{
						if (childNode.nodeName === textNodeText && childNode.nodeValue.search('posted by') >= 0)
						{
							leadingNode = childNode;
							bFound = true;
							break;
						}
						childNode = childNode.nextSibling;
					}
					if (bFound)
					{
						break;
					}
					testNode = testNode.nextSibling;
				}

				var newSpanNode = document.createElement(spanText);
				newSpanNode.className = mmTagClassText;
				var backgroundColor = document.defaultView.getComputedStyle(document.body, null).getPropertyValue("background-color");
				if (!backgroundColor || backgroundColor === "transparent")
				{
					var newColor = "#000000";
				}
				else
				{
					var newColor = backgroundColor;
				}
				var foregroundColor = document.defaultView.getComputedStyle(document.body, null).getPropertyValue("color");
				if (!foregroundColor || foregroundColor === "transparent")
				{
					var newBackColor = "#FFFFFF";
				}
				else
				{
					var newBackColor = foregroundColor;
				}
				newSpanNode.style.backgroundColor = newBackColor;
				newSpanNode.style.color = newColor;
				var tNode = document.createTextNode("\u00a0"+aTagInfo[loop][tInfo.tagTags]+"\u00a0");
				newSpanNode.appendChild(tNode);
				leadingNode.parentNode.insertBefore(newSpanNode,leadingNode);
				tNode = document.createTextNode("\u00a0");
				var spacerSpanNode = document.createElement(spanText);
				spacerSpanNode.style.backgroundColor = newColor;
				spacerSpanNode.style.color = newBackColor;
				spacerSpanNode.appendChild(tNode);
				newSpanNode.parentNode.insertBefore(spacerSpanNode,newSpanNode.nextSibling);
			}
		}
	}
}

function highlightTransform(
	candidate,
	doAllFlag,
	doValue,
	spanFooterStore,
	textAllNodeStore,
	textContentNodeStore,
	textFooterNodeStore)
{
	if (deactivateHighlightFlag)
	{
		return;
	}
	if (candidate.getAttribute(mmDeleteAttribText))
	{
		// entire message already processed for deleting
		return;
	}
	if (candidate.getAttribute(mmHighlightAttribText))
	{
		// entire message already processed for highlighting
		return;
	}

	if (doAllFlag)
	{
		var start = 0;
		var end = aHighlightInfo.length;
	}
	else
	{
		var start = doValue;
		var end = start + 1;
	}

	// peek at the highlight conditions to see if we need to check all three types of targets
	// set up only search targets that are needed
	var searchTargetAll = "";
	var searchTargetContent = "";
	var searchTargetFooter = "";
	var useAll, useContent, useFooter;
	for (var loop = start; loop < end; loop++)
	{
		var requestLocContent = (aHighlightInfo[loop][1].indexOf(contentText) >= 0 ? true: false);
		var requestLocFooter = (aHighlightInfo[loop][1].indexOf(footerText) >= 0 ? true: false);
		if (requestLocContent && requestLocFooter)
		{
			useAll = true;
		}
		else if (requestLocContent)
		{
			useContent = true;
		}
		else if (requestLocFooter)
		{
			useFooter = true;
		}
	}
	var textValStore = new Array();
	if (useAll)
	{
		// no destructive popping of array
		for (var aLoop = 0; aLoop < textAllNodeStore.length; aLoop++)
		{
			var aNode = textAllNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetAll = textValStore.join('');
		textValStore.length = 0;
	}
	if (useContent)
	{
		for (var aLoop = 0; aLoop < textContentNodeStore.length; aLoop++)
		{
			var aNode = textContentNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetContent = textValStore.join('');
		textValStore.length = 0;
	}
	if (useFooter)
	{
		for (var aLoop = 0; aLoop < textFooterNodeStore.length; aLoop++)
		{
			var aNode = textFooterNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetFooter = textValStore.join('');
	}

	for (var loop = start; loop < end; loop++)
	{
		// set test conditions
		if (!aHighlightInfo[loop][0])
		{
			continue;
		}

		// restrict searches for this rule to appropriate content/footer location
		var restrictSearchTargetAll = "";
		var restrictSearchTargetContent = "";
		var restrictSearchTargetFooter = "";
		if (aHighlightInfo[loop][1] === contentText)
		{
			restrictSearchTargetContent = searchTargetContent;
		}
		else if (aHighlightInfo[loop][1] === footerText)
		{
			restrictSearchTargetFooter = searchTargetFooter;
		}
		else
		{
			restrictSearchTargetAll = searchTargetAll;
		}

		if (aHighlightInfo[loop][9] == false)
		{
			var requestText = escapePattern(aHighlightInfo[loop][0]);
			if (aHighlightInfo[loop][7] == true)
			{
				// wrap pattern in \b for whole word
				requestText = "\\b" + requestText + "\\b";
			}
		}
		else
		{
			// direct RegExp specified
			var requestText = aHighlightInfo[loop][0];
		}
		if (aHighlightInfo[loop][8] == false)
		{
			var requestPattern = new RegExp(requestText, "i");		// ignore case
		}
		else
		{
			var requestPattern = new RegExp(requestText);
		}

		// search as appropriate
		if ((restrictSearchTargetAll.length && requestPattern.test(restrictSearchTargetAll)) ||
			(restrictSearchTargetContent.length && requestPattern.test(restrictSearchTargetContent)) ||
			(restrictSearchTargetFooter.length && requestPattern.test(restrictSearchTargetFooter)))
		{
			// highlight this post

			var requestHiEntire = (aHighlightInfo[loop][2].indexOf("Entire") >= 0 ? true: false);
			var requestHiFooter = (aHighlightInfo[loop][2].indexOf(footerText) >= 0 ? true: false);
			var requestForeground = null;
			if (aHighlightInfo[loop][3].indexOf(customText) >= 0)
			{
				// get rgb color, if valid
				var result = processRGBvalue(aHighlightInfo[loop][5]);
				if (result.length)
				{
					requestForeground = result;
				}
			}
			else if (aHighlightInfo[loop][3].indexOf(unchangedText) < 0)
			{
				requestForeground = aHighlightInfo[loop][3];
			}
			var requestBackground = null;
			if (aHighlightInfo[loop][4].indexOf(customText) >= 0)
			{
				var result = processRGBvalue(aHighlightInfo[loop][6]);
				if (result.length)
				{
					requestBackground = result;
				}
			}
			else if (aHighlightInfo[loop][4].indexOf(unchangedText) < 0)
			{
				requestBackground = aHighlightInfo[loop][4];
			}

			if (requestHiEntire)
			{
				candidate.setAttribute(mmHighlightAttribText, "on");
				if (requestForeground)
				{
					candidate.style.color = requestForeground;
				}
				if (requestBackground)
				{
					candidate.style.backgroundColor = requestBackground;
				}
			}
			else if (requestHiFooter && spanFooterStore)
			{
				for (var aLoop = 0; aLoop < spanFooterStore.length; aLoop++)
				{
					var aNode = spanFooterStore[aLoop];
					if (aNode.getAttribute(mmHighlightAttribText))
					{
						// message already processed for highlighting
						continue;
					}
					aNode.setAttribute(mmHighlightAttribText, "on");
					if (requestForeground)
					{
						aNode.style.color = requestForeground;
					}
					if (requestBackground)
					{
						aNode.style.backgroundColor = requestBackground;
					}
				}
			}
		}
	}
}

function styleTransform(
	candidate,
	doAllFlag,
	doValue,
	spanFooterStore,
	textAllNodeStore,
	textContentNodeStore,
	textFooterNodeStore)
{
	if (deactivateStyleFlag)
	{
		return;
	}
	if (candidate.getAttribute(mmDeleteAttribText))
	{
		return;
	}
	if (doAllFlag)
	{
		var start = 0;
		var end = aStyleInfo.length;
	}
	else
	{
		var start = doValue;
		var end = start + 1;
	}

	var sInfo = {
		styleText : 0,
		locatedIn : 1,
		styleStyles : 2,
		wholeWord : 3,
		caseSensitive : 4,
		useRegExp : 5,
		styleUsed : 6,
		ruleDate : 7,
		ruleID : 8
	};
	var searchTargetAll = "";
	var searchTargetContent = "";
	var searchTargetFooter = "";
	var useAll, useContent, useFooter;
	for (var loop = start; loop < end; loop++)
	{
		var requestLocContent = (aStyleInfo[loop][sInfo.locatedIn].indexOf(contentText) >= 0 ? true: false);
		var requestLocFooter = (aStyleInfo[loop][sInfo.locatedIn].indexOf(footerText) >= 0 ? true: false);
		if (requestLocContent && requestLocFooter)
		{
			useAll = true;
		}
		else if (requestLocContent)
		{
			useContent = true;
		}
		else if (requestLocFooter)
		{
			useFooter = true;
		}
	}
	var textValStore = new Array();
	if (useAll)
	{
		for (var aLoop = 0; aLoop < textAllNodeStore.length; aLoop++)
		{
			var aNode = textAllNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetAll = textValStore.join('');
		textValStore.length = 0;
	}
	if (useContent)
	{
		for (var aLoop = 0; aLoop < textContentNodeStore.length; aLoop++)
		{
			var aNode = textContentNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetContent = textValStore.join('');
		textValStore.length = 0;
	}
	if (useFooter)
	{
		for (var aLoop = 0; aLoop < textFooterNodeStore.length; aLoop++)
		{
			var aNode = textFooterNodeStore[aLoop];
			if (aNode.nodeValue)
			{
				textValStore.push(aNode.nodeValue);
			}
		}
		searchTargetFooter = textValStore.join('');
	}

	for (var loop = start; loop < end; loop++)
	{
		if (!aStyleInfo[loop][sInfo.styleText])
		{
			continue;
		}
		var restrictSearchTargetAll = "";
		var restrictSearchTargetContent = "";
		var restrictSearchTargetFooter = "";
		if (aStyleInfo[loop][sInfo.locatedIn] === contentText)
		{
			restrictSearchTargetContent = searchTargetContent;
		}
		else if (aStyleInfo[loop][sInfo.locatedIn] === footerText)
		{
			restrictSearchTargetFooter = searchTargetFooter;
		}
		else
		{
			restrictSearchTargetAll = searchTargetAll;
		}

		if (aStyleInfo[loop][sInfo.useRegExp] == false)
		{
			var requestText = escapePattern(aStyleInfo[loop][0]);
			if (aStyleInfo[loop][sInfo.wholeWord] == true)
			{
				requestText = "\\b" + requestText + "\\b";
			}
		}
		else
		{
			var requestText = aStyleInfo[loop][0];
		}
		if (aStyleInfo[loop][sInfo.caseSensitive] == false)
		{
			var requestPattern = new RegExp(requestText, "i");
		}
		else
		{
			var requestPattern = new RegExp(requestText);
		}

		if ((restrictSearchTargetAll.length && requestPattern.test(restrictSearchTargetAll)) ||
			(restrictSearchTargetContent.length && requestPattern.test(restrictSearchTargetContent)) ||
			(restrictSearchTargetFooter.length && requestPattern.test(restrictSearchTargetFooter)))
		{
			// style this post
			if (!aStyleInfo[loop][sInfo.styleUsed])
			{
				// first time style is used, add it
				var userStyle = document.createElement("style");
				userStyle.setAttribute('type', 'text/css');
				var modStyle = aStyleInfo[loop][sInfo.styleStyles];
				modStyle = modStyle.replace(/\b(mmStyledPost)\b/,"$1"+aStyleInfo[loop][sInfo.ruleID]);
				userStyle.innerHTML = modStyle;
				document.getElementsByTagName('head')[0].appendChild(userStyle);
				aStyleInfo[loop][sInfo.styleUsed] = true;
			}
			candidate.setAttribute(mmStyledPostAttribText + aStyleInfo[loop][sInfo.ruleID], "on");
		}
	}
}

function nodeBreaker(flags, singleValue)
{
	var xpath = "//div[@class='copy' or @class='comments' or @class='comments best']";
	var divNodes = document.evaluate(
		xpath,
		document,
		null,
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
		null
	);

	var countTo = divNodes.snapshotLength;
	var spanFooterStore = new Array();
	var boldFooterStore = new Array();
	var anchorStore = new Array();
	var textAllNodeStore = new Array();
	var textFooterNodeStore = new Array();
	var textContentNodeStore = new Array();
	var parentNodeStore = new Array();
	var footerStatusStore = new Array();
	for (var i = 0; i < countTo; i++)
	{
		var candidate = divNodes.snapshotItem(i);
 		if (!candidate)
 		{
	 		break;
 		}
		spanFooterStore.length = 0;
		boldFooterStore.length = 0;
		anchorStore.length = 0;
		textAllNodeStore.length = 0;
		textFooterNodeStore.length = 0;
		textContentNodeStore.length = 0;
		parentNodeStore.length = 0;
		footerStatusStore.length = 0;
		footerStatus = 0;
		currentNode = candidate;
		var looking = true;
		while (looking)
		{
			// track multiple SPAN's since "more inside" is also smallcopy (and therefore a footer for now)
			if (currentNode.nodeName === spanText &&
				currentNode.getAttribute('class') === "smallcopy")
			{
				footerStatus = true;
		 		spanFooterStore.push(currentNode);
		 		// track footer bolds for FG = BG delete filter, since they need explicit color setting
		 		var cNode = currentNode.firstChild;
		 		while (cNode)
		 		{
			 		if (cNode.nodeName === "B")
			 		{
				 		boldFooterStore.push(cNode);
			 		}
			 		cNode = cNode.nextSibling;
		 		}
			}
	 		else if (currentNode.nodeName === "A")
	 		{
 				anchorStore.push(currentNode);
	 		}
			else if (currentNode.nodeName === textNodeText && currentNode.nodeValue)
			{
				textAllNodeStore.push(currentNode);
				if (footerStatus)
				{
					textFooterNodeStore.push(currentNode);
				}
				else
				{
					textContentNodeStore.push(currentNode);
				}
			}
			if (currentNode.childNodes.length)
			{
				// child exists, save state info for this node level
				parentNodeStore.push(currentNode);
				footerStatusStore.push(footerStatus);
				currentNode = currentNode.firstChild;
			}
			else	// next sibling
			{
				while (1)
				{
					if (currentNode == candidate || !currentNode)
					{
						// done
						looking = false;
						break;
					}
					if (currentNode = currentNode.nextSibling)
					{
						// valid node assignment
						break;
					}
					currentNode = parentNodeStore.pop();
					footerStatus = footerStatusStore.pop();
				}
			}
		}
		if (flags & flagMultiple)
		{
			deleteTransform(
				candidate,
				true,
				0,
				spanFooterStore,
				boldFooterStore,
				anchorStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);

			tagTransform(
				candidate,
				true,
				0,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);

			highlightTransform(
				candidate,
				true,
				0,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);

			styleTransform(
				candidate,
				true,
				0,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);

		}
		else if (flags & flagHighlight)
		{
			highlightTransform(
				candidate,
				false,
				singleValue,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);
		}
		else if (flags & flagDelete)
		{
			deleteTransform(
				candidate,
				false,
				singleValue,
				spanFooterStore,
				boldFooterStore,
				anchorStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);
		}
		else if (flags & flagTag)
		{
			tagTransform(
				candidate,
				false,
				singleValue,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);
		}
		else if (flags && flagStyle)
		{
			styleTransform(
				candidate,
				false,
				singleValue,
				spanFooterStore,
				textAllNodeStore,
				textContentNodeStore,
				textFooterNodeStore);
		}
	}
}

function saveHighlight(event)
{
	event.stopPropagation();
	mondo_meta_highlight_control.style.display = noneText;
	var elem = document.getElementById("mondo_meta_highlight_text");
	var userHiText = elem.value;
	elem = document.getElementById("mondo_meta_highlight_located");
	var userLocated = elem.value;
	elem = document.getElementById("mondo_meta_highlight_area");
	var userArea = elem.value;
	elem = document.getElementById("mondo_meta_highlight_fgcolor");
	var userfgColor = elem.value;
	elem = document.getElementById("mondo_meta_highlight_bgcolor");
	var userbgColor = elem.value;
	elem = document.getElementById("mondo_meta_highlight_fgRGB");
	var userfgRGB = elem.value;
	elem = document.getElementById("mondo_meta_highlight_bgRGB");
	var userbgRGB = elem.value;
	var checkNode = document.getElementById("mondo_meta_highlight_wholeword");
	var userWhole = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_highlight_matchcase");
	var userCase =  checkNode.checked;
	checkNode = document.getElementById("mondo_meta_highlight_regexp");
	var userRegExp =  checkNode.checked;
	var rightNow = new Date();

	aHighlightInfo.push([
		userHiText,
		userLocated, userArea,
		userfgColor, userbgColor,
		userfgRGB, userbgRGB,
		userWhole, userCase, userRegExp,
		rightNow.getTime()]);
	nodeBreaker(flagHighlight, aHighlightInfo.length - 1);
	var gmKey = saveHighlightItem(aHighlightInfo[aHighlightInfo.length - 1]);
	aHighlightInfo[aHighlightInfo.length - 1][11] = gmKey;

	boxUp = 0;
}

function cancelHighlight(event)
{
	event.stopPropagation();
	boxUp = 0;
	mondo_meta_highlight_control.style.display = noneText;
}

function changeFgHighlight(event)
{
	event.stopPropagation();
	var sNode = document.getElementById( "mondo_meta_highlight_fgcolor");
	var iNode = document.getElementById( "mondo_meta_highlight_fgRGB");
	if (sNode.value === customText)
	{
		iNode.disabled = false;
		iNode.style.backgroundColor = whiteText;
		iNode.focus();
	}
	else
	{
		iNode.disabled = true;
		iNode.style.backgroundColor = "gray";
	}
}

function changeBgHighlight(event)
{
	event.stopPropagation();
	var sNode = document.getElementById( "mondo_meta_highlight_bgcolor");
	var iNode = document.getElementById( "mondo_meta_highlight_bgRGB");
	if (sNode.value === customText)
	{
		iNode.disabled = false;
		iNode.style.backgroundColor = whiteText;
		iNode.focus();
	}
	else
	{
		iNode.disabled = true;
		iNode.style.backgroundColor = "gray";
	}
}

// whichType == 1 for delete, 2 for tag, 3 for highlight, 4 for style
function showRuleInfo(ruleNumber, whichType)
{
	var rNode = document.getElementById( "mondo_meta_rulehead");
	var tNode = rNode.firstChild;
	if (!ruleNumber)
	{
		tNode.nodeValue = "Saved Rule 0 of 0";
		var aNode = document.getElementById( "mondo_meta_ruletext");
		aNode.style.visibility = hiddenText;
		aNode = document.getElementById( "mondo_meta_mantext");
		aNode.style.visibility = hiddenText;
	}
	else
	{
		switch (whichType)
		{
			case 1:
				var trueRuleNumber = ruleNumber;
				break;
			case 2:
				var trueRuleNumber = aDeleteInfo.length + ruleNumber;
				break;
			case 3:
				var trueRuleNumber = aTagInfo.length + aDeleteInfo.length + ruleNumber;
				break;
			case 4:
				var trueRuleNumber = aHighlightInfo.length + aTagInfo.length + aDeleteInfo.length + ruleNumber;
				break;
		}
		var ruleHead = "Saved Rule " + trueRuleNumber + " of " + (aDeleteInfo.length + aHighlightInfo.length + aTagInfo.length + aStyleInfo.length);
		tNode.nodeValue = ruleHead;
		var aNode = document.getElementById( "mondo_meta_mantext");
		tNode = aNode.firstChild;
		switch (whichType)
		{
			case 1:
				tNode.nodeValue = "Delete Text:";
				break;
			case 2:
				tNode.nodeValue = "Tag Text:";
				break;
			case 3:
				tNode.nodeValue = "Highlight Text:";
				break;
			case 4:
				tNode.nodeValue = "Style Text:";
				break;
		}
		aNode.style.fontWeight = "bold";
		aNode.style.visibility = visibleText;
		aNode = document.getElementById( "mondo_meta_ruletext");
		switch (whichType)
		{
			case 1:
				aNode.value = aDeleteInfo[ruleNumber - 1][0];
				break;
			case 2:
				aNode.value = aTagInfo[ruleNumber - 1][0];
				break;
			case 3:
				aNode.value = aHighlightInfo[ruleNumber - 1][0];
				break;
			case 4:
				aNode.value = aStyleInfo[ruleNumber - 1][0];
				break;
		}
		aNode.style.visibility = visibleText;
	}
	currentRuleNumber = ruleNumber;
	currentRuleType = whichType;
}

// currentRuleType == 1 for delete, 2 for tag, 3 for highlight, 4 for style
function prevManage(event)
{
	event.stopPropagation();
	if (!currentRuleNumber || !currentRuleType)
	{
		return;
	}
	if (currentRuleNumber > 1)
	{
		showRuleInfo(currentRuleNumber - 1, currentRuleType);
		return;
	}

	if (currentRuleType == 1)	// delete
	{
		if (aStyleInfo.length)
		{
			showRuleInfo(aStyleInfo.length, 4);
		}
		else if (aHighlightInfo.length)
		{
			showRuleInfo(aHighlightInfo.length, 3);
		}
		else if (aTagInfo.length)
		{
			showRuleInfo(aTagInfo.length, 2);
		}
		else
		{
			showRuleInfo(aDeleteInfo.length, 1);
		}
	}
	else if (currentRuleType == 2)	// tag
	{
		if (aDeleteInfo.length)
		{
			showRuleInfo(aDeleteInfo.length, 1);
		}
		else if (aStyleInfo.length)
		{
			showRuleInfo(aStyleInfo.length, 4);
		}
		else if (aHighlightInfo.length)
		{
			showRuleInfo(aHighlightInfo.length, 3);
		}
		else
		{
			showRuleInfo(aTagInfo.length, 2);
		}
	}
	else if (currentRuleType == 3)	// highlight
	{
		if (aTagInfo.length)
		{
			showRuleInfo(aTagInfo.length, 2);
		}
		else if (aDeleteInfo.length)
		{
			showRuleInfo(aDeleteInfo.length, 1);
		}
		else if (aStyleInfo.length)
		{
			showRuleInfo(aStyleInfo.length, 4);
		}
		else
		{
			showRuleInfo(aHighlightInfo.length, 3);
		}
	}
	else if (currentRuleType == 4)	// style
	{
		if (aHighlightInfo.length)
		{
			showRuleInfo(aHighlightInfo.length, 3);
		}
		else if (aTagInfo.length)
		{
			showRuleInfo(aTagInfo.length, 2);
		}
		else if (aDeleteInfo.length)
		{
			showRuleInfo(aDeleteInfo.length, 1);
		}
		else
		{
			showRuleInfo(aStyleInfo.length, 4);
		}
	}
}

// currentRuleType == 1 for delete, 2 for tag, 3 for highlight, 4 for style
function nextManage(event)
{
	event.stopPropagation();
	if (!currentRuleNumber || !currentRuleType)
	{
		return;
	}
	if (currentRuleType == 1)	// delete
	{
		if (currentRuleNumber < aDeleteInfo.length)
		{
			showRuleInfo(currentRuleNumber + 1, 1);
		}
		else
		{
			if (aTagInfo.length)
			{
				showRuleInfo(1, 2);
			}
			else if (aHighlightInfo.length)
			{
				showRuleInfo(1, 3);
			}
			else if (aStyleInfo.length)
			{
				showRuleInfo(1, 4);
			}
			else
			{
				showRuleInfo(1, 1);
			}
		}
	}
	else if (currentRuleType == 2)	// tag
	{
		if (currentRuleNumber < aTagInfo.length)
		{
			showRuleInfo(currentRuleNumber + 1, 2);
		}
		else
		{
			if (aHighlightInfo.length)
			{
				showRuleInfo(1, 3);
			}
			else if (aStyleInfo.length)
			{
				showRuleInfo(1, 4);
			}
			else if (aDeleteInfo.length)
			{
				showRuleInfo(1, 1);
			}
			else
			{
				showRuleInfo(1, 2);
			}
		}
	}
	else if (currentRuleType == 3)	// highlight
	{
		if (currentRuleNumber < aHighlightInfo.length)
		{
			showRuleInfo(currentRuleNumber + 1, 3);
		}
		else
		{
			if (aStyleInfo.length)
			{
				showRuleInfo(1, 4);
			}
			else if (aDeleteInfo.length)
			{
				showRuleInfo(1, 1);
			}
			else if (aTagInfo.length)
			{
				showRuleInfo(1, 2);
			}
			else
			{
				showRuleInfo(1, 3);
			}
		}
	}
	else if (currentRuleType == 4)	// style
	{
		if (currentRuleNumber < aStyleInfo.length)
		{
			showRuleInfo(currentRuleNumber + 1, 4);
		}
		else
		{
			if (aDeleteInfo.length)
			{
				showRuleInfo(1, 1);
			}
			else if (aTagInfo.length)
			{
				showRuleInfo(1, 2);
			}
			else if (aHighlightInfo.length)
			{
				showRuleInfo(1, 3);
			}
			else
			{
				showRuleInfo(1, 4);
			}
		}
	}
}

function deleteManage(event)
{
	event.stopPropagation();
	if (!currentRuleNumber || !currentRuleType)
	{
		return;
	}

	if (currentRuleType == 1)
	{
		freeSlot(aDeleteInfo[currentRuleNumber - 1][9]);	// rule ID
		aDeleteInfo.splice(currentRuleNumber - 1, 1);
	}
	else if (currentRuleType == 2)
	{
		freeSlot(aTagInfo[currentRuleNumber - 1][7]);
		aTagInfo.splice(currentRuleNumber - 1, 1);
	}
	else if (currentRuleType == 3)
	{
		freeSlot(aHighlightInfo[currentRuleNumber - 1][11]);
		aHighlightInfo.splice(currentRuleNumber - 1, 1);
	}
	else if (currentRuleType == 4)
	{
		freeSlot(aStyleInfo[currentRuleNumber - 1][8]);
		aStyleInfo.splice(currentRuleNumber - 1, 1);
	}

	if (currentRuleNumber > 1)
	{
		currentRuleNumber--;
	}
	if (!aDeleteInfo.length && !aTagInfo.length && !aHighlightInfo.length && !aStyleInfo.length)
	{
		showRuleInfo(0, 0);
		return;
	}
	while (1)
	{
		if (currentRuleType == 1 && !aDeleteInfo.length)
		{
			currentRuleNumber = 1;
			currentRuleType++;
		}
		else if (currentRuleType == 2 && !aTagInfo.length)
		{
			currentRuleNumber = 1;
			currentRuleType++;
		}
		else if (currentRuleType == 3 && !aHighlightInfo.length)
		{
			currentRuleNumber = 1;
			currentRuleType++;
		}
		else if (currentRuleType == 4 && !aStyleInfo.length)
		{
			currentRuleNumber = 1;
			currentRuleType = 1;
		}
		else
		{
			break;
		}
	}
	showRuleInfo(currentRuleNumber, currentRuleType);
}

function saveManageStatus()
{
	var gmKey = systemStatusText;
	// NB: system values are in order: delete,highlight,tag,style
	var infoString = String(deactivateDeleteFlag).length + ":" + deactivateDeleteFlag;
	infoString += String(deactivateHighlightFlag).length + ":" + deactivateHighlightFlag;
	infoString += String(deactivateTagFlag).length + ":" + deactivateTagFlag;
	infoString += String(deactivateStyleFlag).length + ":" + deactivateStyleFlag;
	var gmValue = systemHeader + infoString;
	GM_setValue(gmKey, gmValue);
}

function closeManage(event)
{
	event.stopPropagation();
	var checkNode = document.getElementById("mondo_meta_manage_deactdel");
	deactivateDeleteFlag = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_manage_deacthi");
	deactivateHighlightFlag = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_manage_deacttag");
	deactivateTagFlag = checkNode.checked;
	checkNode = document.getElementById("mondo_meta_manage_deactsty");
	deactivateStyleFlag = checkNode.checked;
	saveManageStatus();

	boxUp = 0;
	showRuleInfo(0, 0);
	mondo_meta_manage_control.style.display = noneText;
}

function processManage()
{
	mondo_meta_manage_control.style.display = "";
	var checkNode = document.getElementById("mondo_meta_manage_deactdel");
	checkNode.checked = deactivateDeleteFlag;
	checkNode = document.getElementById("mondo_meta_manage_deacthi");
	checkNode.checked = deactivateHighlightFlag;
	checkNode = document.getElementById("mondo_meta_manage_deacttag");
	checkNode.checked = deactivateTagFlag;
	checkNode = document.getElementById("mondo_meta_manage_deactsty");
	checkNode.checked = deactivateStyleFlag;
	if (aDeleteInfo.length)
	{
		showRuleInfo(1, 1);
	}
	else if (aTagInfo.length)
	{
		showRuleInfo(1, 2);
	}
	else if (aHighlightInfo.length)
	{
		showRuleInfo(1, 3);
	}
	else if (aStyleInfo.length)
	{
		showRuleInfo(1, 4);
	}
	else
	{
		showRuleInfo(0, 0);
	}
}

function do_a_mondo(event)
{
	event.stopPropagation();
	var which = event.target.selectedIndex;
	var choice =  event.target.options[which].value;
	if (choice === expandText || choice === compactText)
	{
		expandLinks();
		// don't count on the selection, count on the display status
		if (expandedLinksFlag)
		{
			event.target.options[which].text = expandTextChoice[1];
			event.target.options[which].value = compactText;
		}
		else
		{
			event.target.options[which].text = expandTextChoice[0];
			event.target.options[which].value = expandText;
		}
	}
	else if (choice === deleteFilterText && !boxUp)
	{
		boxUp = 1;
		mondo_meta_delete_control.style.display = "";
		var elem = document.getElementById("mondo_meta_delete_text");
		elem.focus();
	}
	else if  (choice === highlightText && !boxUp)
	{
		boxUp = 1;
		mondo_meta_highlight_control.style.display = "";
		var elem = document.getElementById("mondo_meta_highlight_text");
		elem.focus();
	}
	else if  (choice === tagText && !boxUp)
	{
		boxUp = 1;
		mondo_meta_tag_control.style.display = "";
		var elem = document.getElementById("mondo_meta_tag_text");
		elem.focus();
	}
	else if  (choice === styleText && !boxUp)
	{
		boxUp = 1;
		mondo_meta_style_control.style.display = "";
		var elem = document.getElementById("mondo_meta_style_text");
		elem.focus();
	}
	else if  (choice === manageText & !boxUp)
	{
		boxUp = 1;
		processManage();
	}

	event.target.selectedIndex = 0;
}

function processRule(rule, ruleID)
{
	if (rule.substr(0, 4).toUpperCase() != "USED")
	{
		freeRules.push(ruleID);
	}
	else
	{
		var bBad = false;
		var pos = usedRuleHeader.length;
		if (rule.substr(pos, deleteHeader.length) === deleteHeader)
		{
			pos += deleteHeader.length;
			// DelText, Located, How, Whole, Case, Links, RegExp, Duration, Date
			var storeDelText, storeLocated, storeHow;
			var storeWhole, storeCase, storeLinks, storeRegExp;
			var storeDuration, storeDate;
			for (var j = 0; !bBad && j < 9; j++)
			{
				var len = parseInt(rule.substr(pos));
				if (isNaN(len))
				{
					bBad = true;
					break;
				}
				pos = rule.indexOf(":", pos);
				if (pos == -1)
				{
					bBad = true;
					break;
				}
				pos++;
				var result = rule.substr(pos, len);
				pos += len;
				switch (j)
				{
					case 0:
						storeDelText = result;
						break;
					case 1:
						storeLocated = result;
						break;
					case 2:
						storeHow = result;
						break;
					case 3:
						storeWhole = (result === trueText ? true : false);
						break;
					case 4:
						storeCase = (result === trueText ? true : false);
						break;
					case 5:
						storeLinks = (result === trueText ? true : false);
						break;
					case 6:
						storeRegExp = (result === trueText ? true : false);
						break;
					case 7:
						storeDuration = result;
						break;
					case 8:
						storeDate = result;
						break;
				}
			}
			if (!bBad)
			{
				var rightNow = new Date();
				if (storeDate + parseInt(storeDuration) <= rightNow.getTime())
				{
					freeSlot(ruleID);
				}
				else
				{

					aDeleteInfo.push([
						storeDelText,
						storeLocated,
						storeHow,
						storeWhole,
						storeCase,
						storeLinks,
						storeRegExp,
						storeDuration,
						storeDate,
						ruleID]);
				}
			}
		}

		else if (rule.substr(pos, highlightHeader.length) === highlightHeader)
		{
			pos += highlightHeader.length;
			// HiText, Located, Area,
			// fgColor, userbgColor, userfgRGB, userbgRGB,
			// Whole, Case, RegExp, Date
			var storeHiText, storeLocated, storeArea;
			var storefgColor, storebgColor, storefgRGB, storebgRGB;
			var storeWhole, storeCase, storeRegExp, storeDate
			for (var j = 0; !bBad && j < 11; j++)
			{
				var len = parseInt(rule.substr(pos));
				if (isNaN(len))
				{
					bBad = true;
					break;
				}
				pos = rule.indexOf(":", pos);
				if (pos == -1)
				{
					bBad = true;
					break;
				}
				pos++;
				var result = rule.substr(pos, len);
				pos += len;
				switch (j)
				{
					case 0:
						storeHiText = result;
						break;
					case 1:
						storeLocated = result;
						break;
					case 2:
						storeArea = result;
						break;
					case 3:
						storefgColor = result;
						break;
					case 4:
						storebgColor = result;
						break;
					case 5:
						storefgRGB = result;
						break;
					case 6:
						storebgRGB = result;
						break;
					case 7:
						storeWhole = (result === trueText ? true : false);
						break;
					case 8:
						storeCase = (result === trueText ? true : false);
						break;
					case 9:
						storeRegExp = (result === trueText ? true : false);
						break;
					case 10:
						storeDate = result;
						break;
				}
			}
			if (!bBad)
			{
				aHighlightInfo.push([
					storeHiText,
					storeLocated,
					storeArea,
					storefgColor,
					storebgColor,
					storefgRGB,
					storebgRGB,
					storeWhole,
					storeCase,
					storeRegExp,
					storeDate,
					ruleID]);
			}
		}

		else if (rule.substr(pos, tagHeader.length) === tagHeader)
		{
			// userTagText, userLocated, userTagTags, userWhole, userCase, userRegExp,
			pos += tagHeader.length;
			var storeTagText, storeLocated, storeTagTags;
			var storeWhole, storeCase, storeRegExp, storeDate
			for (var j = 0; !bBad && j < 7; j++)
			{
				var len = parseInt(rule.substr(pos));
				if (isNaN(len))
				{
					bBad = true;
					break;
				}
				pos = rule.indexOf(":", pos);
				if (pos == -1)
				{
					bBad = true;
					break;
				}
				pos++;
				var result = rule.substr(pos, len);
				pos += len;
				switch (j)
				{
					case 0:
						storeTagText = result;
						break;
					case 1:
						storeLocated = result;
						break;
					case 2:
						storeTagTags = result;
						break;
					case 3:
						storeWhole = (result === trueText ? true : false);
						break;
					case 4:
						storeCase = (result === trueText ? true : false);
						break;
					case 5:
						storeRegExp = (result === trueText ? true : false);
						break;
					case 6:
						storeDate = result;
						break;
				}
			}
			if (!bBad)
			{
				aTagInfo.push([
					storeTagText,
					storeLocated,
					storeTagTags,
					storeWhole,
					storeCase,
					storeRegExp,
					storeDate,
					ruleID]);
			}
		}

		else if (rule.substr(pos, styleHeader.length) === styleHeader)
		{
			// userStyleText, userLocated, userStyleStyles, userWhole, userCase, userRegExp,
			pos += styleHeader.length;
			var storeStyleText, storeLocated, storeStyleStyles;
			var storeWhole, storeCase, storeRegExp, storeDate
			for (var j = 0; !bBad && j < 7; j++)
			{
				var len = parseInt(rule.substr(pos));
				if (isNaN(len))
				{
					bBad = true;
					break;
				}
				pos = rule.indexOf(":", pos);
				if (pos == -1)
				{
					bBad = true;
					break;
				}
				pos++;
				var result = rule.substr(pos, len);
				pos += len;
				switch (j)
				{
					case 0:
						storeStyleText = result;
						break;
					case 1:
						storeLocated = result;
						break;
					case 2:
						storeStyleStyles = result;
						break;
					case 3:
						storeWhole = (result === trueText ? true : false);
						break;
					case 4:
						storeCase = (result === trueText ? true : false);
						break;
					case 5:
						storeRegExp = (result === trueText ? true : false);
						break;
					case 6:
						storeDate = result;
						break;
				}
			}
			if (!bBad)
			{
				aStyleInfo.push([
					storeStyleText,
					storeLocated,
					storeStyleStyles,
					storeWhole,
					storeCase,
					storeRegExp,
					false,
					storeDate,
					ruleID]);
			}
		}

		if (bBad)
		{
			// couldn't parse it, kill the rule
			freeSlot(ruleID);
		}
	}
}

function processSystemStatus()
{
	var settingsExist = ((statusValues = GM_getValue(systemStatusText, "x")) != "x");
	if (!settingsExist)
	{
		return;
	}
	// system values are in order: delete,highlight,tag,style
	if (statusValues.substr(0, systemHeader.length) === systemHeader)
	{
		var pos = systemHeader.length;
		for (var j = 0; j < 4; j++)
		{
			var len = parseInt(statusValues.substr(pos));
			if (isNaN(len))
			{
				break;
			}
			pos = statusValues.indexOf(":", pos);
			if (pos == -1)
			{
				break;
			}
			pos++;
			var result = statusValues.substr(pos, len);
			pos += len;
			switch (j)
			{
				case 0:
					deactivateDeleteFlag = (result === trueText ? true : false);
					break;
				case 1:
					deactivateHighlightFlag = (result === trueText ? true : false);
					break;
				case 2:
					deactivateTagFlag = (result === trueText ? true : false);
					break;
				case 3:
					deactivateStyleFlag = (result === trueText ? true : false);
					break;
				default:
			}
		}
	}
}

// load existing filter/highlight info settings and process them
function loadPermanentInfo()
{
	processSystemStatus();
	var count = 0;
	var rule;
	var ruleID;
	freeRules.length = aDeleteInfo.length = aHighlightInfo.length = 0;
	aTagInfo.length = aStyleInfo.length = 0;
	while ((rule = GM_getValue(ruleID = ("Rule"+(++count)), "x")) != "x")
	{
		processRule(rule, ruleID);
		storedRuleCount++;	// increments even on invalid rule
	}
	nodeBreaker(flagMultiple, 0);

	var mmParam = GM_getValue("moveMouseAreaWidth", xText);
	if (mmParam != xText)
	{
		moveMouseAreaWidth = mmParam;
	}
	else
	{
		GM_setValue("moveMouseAreaWidth", moveMouseAreaWidth);
	}
	mmParam = GM_getValue("moveMouseAreaSeconds", xText);
	if (mmParam != xText)
	{
		moveMouseAreaSeconds = mmParam;
	}
	else
	{
		GM_setValue("moveMouseAreaSeconds", moveMouseAreaSeconds);
	}
	mmParam = GM_getValue("dropdownPeekABoo", xText);
	if (mmParam != xText)
	{
		dropdownPeekABoo = (mmParam === trueText ? true : false);
	}
	else
	{
		GM_setValue("dropdownPeekABoo", falseText);
	}
}

function init()
{
	mondo_meta_control = document.getElementById( "mondo_meta_control")
	if (mondo_meta_control)
	{
		return;
	}
	GM_setValue("Version", mondoMetaVersion);
	loadPermanentInfo();

	mondo_meta_control = document.createElement("select");
	mondo_meta_control.style.position = "fixed";
	mondo_meta_control.style.bottom = "5px";
	mondo_meta_control.style.left = "5px";
	mondo_meta_control.style.fontSize = "12px";
	mondo_meta_control.style.color = darkBlueText;
	mondo_meta_control.style.backgroundColor = whiteText;

	var opt_count = 0;
	var optmmo = document.createElement(optionText);
	optmmo.text = "Mondo Meta Options";
	optmmo.value = defaultText;
	optmmo.defaultselected = true;
	optmmo.selected = true;
	optmmo.style.color = darkBlueText;
	optmmo.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optmmo;

	var optel = document.createElement(optionText);
	optel.text = expandTextChoice[0];
	optel.value = expandText;
	optel.style.color = darkBlueText;
	optel.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optel;
/*
	var optsep = document.createElement(optionText);
	optsep.text = separatorText;
	optsep.value = separatorText;
	optsep.style.color = darkBlueText;
	optsep.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optsep;
*/
	var optfd = document.createElement(optionText);
	optfd.text = deleteFilterText;
	optfd.value = deleteFilterText;
	optfd.style.color = darkBlueText;
	optfd.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optfd;

	var opthi = document.createElement(optionText);
	opthi.text = highlightText;
	opthi.value = highlightText;
	opthi.style.color = darkBlueText;
	opthi.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = opthi;

	var optsty = document.createElement(optionText);
	optsty.text = styleText;
	optsty.value = styleText;
	optsty.style.color = darkBlueText;
	optsty.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optsty;

	var opttag = document.createElement(optionText);
	opttag.text = tagText;
	opttag.value = tagText;
	opttag.style.color = darkBlueText;
	opttag.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = opttag;
/*
	var optsep = document.createElement(optionText);
	optsep.text = separatorText;
	optsep.value = separatorText;
	optsep.style.color = darkBlueText;
	optsep.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optsep;
*/
	var optman = document.createElement(optionText);
	optman.text = manageText;
	optman.value = manageText;
	optman.style.color = darkBlueText;
	optman.style.backgroundColor = whiteText;
	mondo_meta_control.options[opt_count++] = optman;

	mondo_meta_control.length = opt_count;
	mondo_meta_control.addEventListener('change', do_a_mondo, false);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_control);

	var addHeader =
		'td.mondo_meta_basicstyle INPUT,td.mondo_meta_basicstyle SELECT,td.mondo_meta_basicstyle DIV,td.mondo_meta_basicstyle SPAN' +
		'{ font: 12px Verdana, Arial, Helvetica, sans-serif; }' +
		'td.mondo_meta_basicstyle INPUT,td.mondo_meta_basicstyle SELECT' +
		'{ background-color: white }' +
		'td.mondo_meta_basicstyle SPAN { color: darkblue }' +
		'.mondo_meta_title { font-weight: bold !important; font-size: 18px !important; padding-bottom: 8px; margin-left: 140px; }' +
		'.mondo_meta_minititle { font-weight: bold !important; font-size: 14px !important; padding-bottom: 8px; margin-left: 20px; }' +
		'.mondo_meta_label { font-weight: bold; text-align: right; float: left; width: 140px; }' +
		'.mondo_meta_userinput { float: left; width: 230px; }' +
		'.mondo_meta_checks { font-weight: bold; float: left;}' +
		'.mondo_meta_rgb { width: 90px; }' +
		'.mondo_meta_duration { width: 40px; }' +
		'.mondo_meta_smallindent, .mondo_meta_mantext { margin-left: 20px; }' +
		'.mondo_meta_manage { width: 320px; float: left; }' +
		'.mondo_meta_mantext { text-align: right; float: left; }' +
		'button.mondo_meta { width: 60px; position: absolute; bottom: 10px; }' +
		'button.mondo_meta2 { width: 70px; position: absolute; bottom: 10px; }';
	var test_style = document.createElement("style");
	test_style.setAttribute('type', 'text/css');
	test_style.innerHTML = addHeader;
	document.getElementsByTagName('head')[0].appendChild(test_style);

	mondo_meta_highlight_control = document.createElement("td");
	mondo_meta_highlight_control.className = "mondo_meta_basicstyle";
	mondo_meta_highlight_control.style.lineHeight = "26px";
	mondo_meta_highlight_control.style.color = darkBlueText;
	mondo_meta_highlight_control.style.position = "fixed";
	mondo_meta_highlight_control.style.bottom = "40px";
	mondo_meta_highlight_control.style.left = "5px";
	mondo_meta_highlight_control.style.backgroundColor = "#FFCFCF";
	mondo_meta_highlight_control.style.borderColor = "black";
	mondo_meta_highlight_control.style.borderWidth = "1px";
	mondo_meta_highlight_control.style.borderStyle = "solid";
	mondo_meta_highlight_control.style.opacity = ".94";
	mondo_meta_highlight_control.style.display = noneText;

	var highlightHtml =
		'<div class="mondo_meta_title">Mondo Meta Highlight</div>' +
		'<div>' +
		'<span class="mondo_meta_label">Highlight text:&nbsp;</span>' +
		'<input id="mondo_meta_highlight_text" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_highlight_wholeword" type="checkbox">Whole word only</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Located in:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_highlight_located"><option>'+contentText+'</option><option>'+footerText+'</option><option>'+contentFooterText+'</option></select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_highlight_matchcase" type="checkbox">Match case</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Area highlighted:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_highlight_area">' +
		'<option>Footer only</option>' +
		'<option>Entire post</option>' +
		'</select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_highlight_regexp" type="checkbox">Regular expression</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Foreground color:&nbsp;</span>' +
		'<span style="float: left">' +
		'<select id="mondo_meta_highlight_fgcolor">' +
		'<option>aqua</option>' +
		'<option>black</option>' +
		'<option selected>blue</option>' +
		'<option>cyan</option>' +
		'<option>gray</option>' +
		'<option>green</option>' +
		'<option>lime</option>' +
		'<option>magenta</option>' +
		'<option>maroon</option>' +
		'<option>navy</option>' +
		'<option>olive</option>' +
		'<option>purple</option>' +
		'<option>red</option>' +
		'<option>teal</option>' +
		'<option>white</option>' +
		'<option>yellow</option>' +
		'<option>Unchanged</option>' +
		'<option>Custom</option>' +
		'</select>' +
		'&nbsp;<b>RGB:</b>' +
		'<input id="mondo_meta_highlight_fgRGB" class="mondo_meta_rgb" disabled type="text" style="background-color: gray;">' +
		'</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Background color:&nbsp;</span>' +
		'<span style="float: left">' +
		'<select id="mondo_meta_highlight_bgcolor">' +
		'<option>aqua</option>' +
		'<option>black</option>' +
		'<option>blue</option>' +
		'<option>cyan</option>' +
		'<option>gray</option>' +
		'<option>green</option>' +
		'<option>lime</option>' +
		'<option>magenta</option>' +
		'<option>maroon</option>' +
		'<option>navy</option>' +
		'<option>olive</option>' +
		'<option>purple</option>' +
		'<option>red</option>' +
		'<option>teal</option>' +
		'<option>white</option>' +
		'<option selected>yellow</option>' +
		'<option>Unchanged</option>' +
		'<option>Custom</option>' +
		'</select>' +
		'&nbsp;<b>RGB:</b>' +
		'<input id="mondo_meta_highlight_bgRGB" class="mondo_meta_rgb" disabled type="text" style="background-color: gray;">' +
		'</span>' +
		'</div><br><br><br>';

	mondo_meta_highlight_control.innerHTML = highlightHtml;
	var saveNode = document.createElement(buttonText);
	saveNode.setAttribute("class", "mondo_meta");
	saveNode.style.marginLeft = "140px";
	saveNode.appendChild(document.createTextNode("Save"));
	var cancelNode = document.createElement(buttonText);
	cancelNode.setAttribute("class", "mondo_meta");
	cancelNode.style.marginLeft = "220px";
	cancelNode.appendChild(document.createTextNode("Cancel"));
	mondo_meta_highlight_control.appendChild(saveNode);
	mondo_meta_highlight_control.appendChild(cancelNode);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_highlight_control);

	var sNode = document.getElementById( "mondo_meta_highlight_fgcolor");
	sNode.addEventListener('change', changeFgHighlight, true);
	sNode = document.getElementById( "mondo_meta_highlight_bgcolor");
	sNode.addEventListener('change', changeBgHighlight, true);
	saveNode.addEventListener(clickText, saveHighlight, true);
	cancelNode.addEventListener(clickText, cancelHighlight, true);

	mondo_meta_delete_control = document.createElement("td");
	mondo_meta_delete_control.className = "mondo_meta_basicstyle";
	mondo_meta_delete_control.style.lineHeight = "26px";
	mondo_meta_delete_control.style.color = darkBlueText;
	mondo_meta_delete_control.style.position = "fixed";
	mondo_meta_delete_control.style.bottom = "40px";
	mondo_meta_delete_control.style.left = "5px";
	mondo_meta_delete_control.style.backgroundColor = "#FFCFCF";
	mondo_meta_delete_control.style.borderColor = "black";
	mondo_meta_delete_control.style.borderWidth = "1px";
	mondo_meta_delete_control.style.borderStyle = "solid";
	mondo_meta_delete_control.style.opacity = ".94";
	mondo_meta_delete_control.style.display = noneText;

	var deleteHtml =
		'<div class="mondo_meta_title">Mondo Meta Delete-Filter</div>' +
		'<div>' +
		'<span class="mondo_meta_label">Delete if text:&nbsp;</span>' +
		'<input id="mondo_meta_delete_text" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_delete_wholeword" type="checkbox">Whole word only</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Located in:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_delete_located"><option>'+contentText+'</option><option>'+footerText+'</option><option>'+contentFooterText+'</option></select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_delete_matchcase" type="checkbox">Match case</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">How:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_delete_how">' +
		'<option>'+removeText+'</option>' +
		'<option>'+invisibleText+'</option>' +
		'<option>'+fg_bgText+'</option>' +
		'</select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_delete_matchlinks" type="checkbox">Match links</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Duration:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<input id="mondo_meta_delete_duration" class="mondo_meta_duration" type="text" value="90">' +
		'&nbsp;<b>day(s)</b>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_delete_regexp" type="checkbox">Regular expression</span>' +
		'</div><br><br><br>';

	mondo_meta_delete_control.innerHTML = deleteHtml;
	var saveNode = document.createElement(buttonText);
	saveNode.setAttribute("class", "mondo_meta");
	saveNode.style.marginLeft = "140px";
	saveNode.appendChild(document.createTextNode("Save"));
	var cancelNode = document.createElement(buttonText);
	cancelNode.setAttribute("class", "mondo_meta");
	cancelNode.style.marginLeft = "220px";
	cancelNode.appendChild(document.createTextNode("Cancel"));
	mondo_meta_delete_control.appendChild(saveNode);
	mondo_meta_delete_control.appendChild(cancelNode);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_delete_control);

	saveNode.addEventListener(clickText, saveDelete, true);
	cancelNode.addEventListener(clickText, cancelDelete, true);

	mondo_meta_tag_control = document.createElement("td");
	mondo_meta_tag_control.className = "mondo_meta_basicstyle";
	mondo_meta_tag_control.style.lineHeight = "26px";
	mondo_meta_tag_control.style.color = darkBlueText;
	mondo_meta_tag_control.style.position = "fixed";
	mondo_meta_tag_control.style.bottom = "40px";
	mondo_meta_tag_control.style.left = "5px";
	mondo_meta_tag_control.style.backgroundColor = "#FFCFCF";
	mondo_meta_tag_control.style.borderColor = "black";
	mondo_meta_tag_control.style.borderWidth = "1px";
	mondo_meta_tag_control.style.borderStyle = "solid";
	mondo_meta_tag_control.style.opacity = ".94";
	mondo_meta_tag_control.style.display = noneText;

	var tagHtml =
		'<div class="mondo_meta_title">Mondo Meta Tag</div>' +
		'<div>' +
		'<span class="mondo_meta_label">Tag text:&nbsp;</span>' +
		'<input id="mondo_meta_tag_text" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_tag_wholeword" type="checkbox">Whole word only</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Located in:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_tag_located"><option>'+contentText+'</option><option>'+footerText+'</option><option>'+contentFooterText+'</option></select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_tag_matchcase" type="checkbox">Match case</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Use Tags:&nbsp;</span>' +
		'<input id="mondo_meta_tag_tags" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_tag_regexp" type="checkbox">Regular expression</span>' +
		'</div><br><br><br>';

	mondo_meta_tag_control.innerHTML = tagHtml;
	var saveNode = document.createElement(buttonText);
	saveNode.setAttribute("class", "mondo_meta");
	saveNode.style.marginLeft = "140px";
	saveNode.appendChild(document.createTextNode("Save"));
	var cancelNode = document.createElement(buttonText);
	cancelNode.setAttribute("class", "mondo_meta");
	cancelNode.style.marginLeft = "220px";
	cancelNode.appendChild(document.createTextNode("Cancel"));
	mondo_meta_tag_control.appendChild(saveNode);
	mondo_meta_tag_control.appendChild(cancelNode);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_tag_control);

	saveNode.addEventListener(clickText, saveTag, true);
	cancelNode.addEventListener(clickText, cancelTag, true);

	mondo_meta_style_control = document.createElement("td");
	mondo_meta_style_control.className = "mondo_meta_basicstyle";
	mondo_meta_style_control.style.lineHeight = "26px";
	mondo_meta_style_control.style.color = darkBlueText;
	mondo_meta_style_control.style.position = "fixed";
	mondo_meta_style_control.style.bottom = "40px";
	mondo_meta_style_control.style.left = "5px";
	mondo_meta_style_control.style.backgroundColor = "#FFCFCF";
	mondo_meta_style_control.style.borderColor = "black";
	mondo_meta_style_control.style.borderWidth = "1px";
	mondo_meta_style_control.style.borderStyle = "solid";
	mondo_meta_style_control.style.opacity = ".94";
	mondo_meta_style_control.style.display = noneText;

	var styleHtml =
		'<div class="mondo_meta_title">Mondo Meta Style</div>' +
		'<div>' +
		'<span class="mondo_meta_label">Style text:&nbsp;</span>' +
		'<input id="mondo_meta_style_text" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_style_wholeword" type="checkbox">Whole word only</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Located in:&nbsp;</span>' +
		'<span class="mondo_meta_userinput">' +
		'<select id="mondo_meta_style_located"><option>'+contentText+'</option><option>'+footerText+'</option><option>'+contentFooterText+'</option></select>' +
		'</span>' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_style_matchcase" type="checkbox">Match case</span>' +
		'</div><br><div>' +
		'<span class="mondo_meta_label">Use Style:&nbsp;</span>' +
		'<input id="mondo_meta_style_styles" class="mondo_meta_userinput" type="text">' +
		'<span class="mondo_meta_checks"><input id="mondo_meta_style_regexp" type="checkbox">Regular expression</span>' +
		'</div><br><br><br>';

	mondo_meta_style_control.innerHTML = styleHtml;
	var saveNode = document.createElement(buttonText);
	saveNode.setAttribute("class", "mondo_meta");
	saveNode.style.marginLeft = "140px";
	saveNode.appendChild(document.createTextNode("Save"));
	var cancelNode = document.createElement(buttonText);
	cancelNode.setAttribute("class", "mondo_meta");
	cancelNode.style.marginLeft = "220px";
	cancelNode.appendChild(document.createTextNode("Cancel"));
	mondo_meta_style_control.appendChild(saveNode);
	mondo_meta_style_control.appendChild(cancelNode);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_style_control);

	saveNode.addEventListener(clickText, saveStyle, true);
	cancelNode.addEventListener(clickText, cancelStyle, true);

	mondo_meta_manage_control = document.createElement("td");
	mondo_meta_manage_control.className = "mondo_meta_basicstyle";
	mondo_meta_manage_control.style.lineHeight = "24px";
	mondo_meta_manage_control.style.color = darkBlueText;
	mondo_meta_manage_control.style.position = "fixed";
	mondo_meta_manage_control.style.bottom = "40px";
	mondo_meta_manage_control.style.left = "5px";
	mondo_meta_manage_control.style.backgroundColor = "#FFCFCF";
	mondo_meta_manage_control.style.borderColor = "black";
	mondo_meta_manage_control.style.borderWidth = "1px";
	mondo_meta_manage_control.style.borderStyle = "solid";
	mondo_meta_manage_control.style.opacity = ".94";
	mondo_meta_manage_control.style.display = noneText;

	var manageHtml =
		'<div class="mondo_meta_title">Manage Mondo Meta</div>' +
		'<div id="mondo_meta_rulehead" class="mondo_meta_minititle">Saved Rule</div>' +
		'<div><span class="mondo_meta_manage">' +
		'&nbsp;</span>' +
		'<input id="mondo_meta_manage_deactdel" type="checkbox">' +
		'<span>Deactivate All Filters</span></div>' +
		'<div><span class="mondo_meta_manage">' +
		'&nbsp;</span>' +
		'<input id="mondo_meta_manage_deacttag" type="checkbox">' +
		'<span>Deactivate All Tags</span></div>' +
		'<div><span class="mondo_meta_manage">' +
		'<span id="mondo_meta_mantext" class="mondo_meta_mantext">Highlight Text:</span></span>' +
		'<input id="mondo_meta_manage_deacthi" type="checkbox">' +
		'<span>Deactivate All Highlights</span></div>' +
		'<div><span class="mondo_meta_manage">' +
		'<input id="mondo_meta_ruletext" class="mondo_meta_userinput mondo_meta_smallindent" type="text"></span>' +
		'<input id="mondo_meta_manage_deactsty" type="checkbox">' +
		'<span>Deactivate All Styles</span></div><br>' +
		'<span class="mondo_meta_smallindent"><b>Web pages must be refreshed to show changes.</b></span><br><br><br>';

	mondo_meta_manage_control.innerHTML = manageHtml;
	var prevNode = document.createElement(buttonText);
	prevNode.setAttribute("class", "mondo_meta2");
	prevNode.style.marginLeft = "20px";
	prevNode.appendChild(document.createTextNode("Previous"));
	mondo_meta_manage_control.appendChild(prevNode);
	var nextNode = document.createElement(buttonText);
	nextNode.setAttribute("class", "mondo_meta2");
	nextNode.style.marginLeft = "100px";
	nextNode.appendChild(document.createTextNode("Next"));
	mondo_meta_manage_control.appendChild(nextNode);
	var deleteNode = document.createElement(buttonText);
	deleteNode.setAttribute("class", "mondo_meta2");
	deleteNode.style.marginLeft = "220px";
	deleteNode.appendChild(document.createTextNode("Delete"));
	mondo_meta_manage_control.appendChild(deleteNode);
	var closeNode = document.createElement(buttonText);
	closeNode.setAttribute("class", "mondo_meta2");
	closeNode.style.marginLeft = "400px";
	closeNode.appendChild(document.createTextNode("Close"));
	mondo_meta_manage_control.appendChild(closeNode);
	document.getElementsByTagName('body')[0].appendChild(mondo_meta_manage_control);
	prevNode.addEventListener(clickText, prevManage, true);
	nextNode.addEventListener(clickText, nextManage, true);
	deleteNode.addEventListener(clickText, deleteManage, true);
	closeNode.addEventListener(clickText, closeManage, true);

	if (dropdownPeekABoo)
	{
		mondo_meta_control.style.display = noneText;
		window.addEventListener("mousemove", handleMouseMove, true);
	}
}

function handleMouseMove(event)
{
	if (event.clientX > moveMouseAreaWidth && event.clientX < document.body.clientWidth - moveMouseAreaWidth)
	{
		return;
	}
	if (handleMouseMove.currentDirection == null)
	{
		if (event.clientX <= moveMouseAreaWidth)
		{
			handleMouseMove.currentDirection = 0;
		}
		else
		{
			handleMouseMove.currentDirection = 1;
		}
		return;
	}
	if (event.clientX <= moveMouseAreaWidth)
	{
		if (!handleMouseMove.currentDirection)
		{
			return;
		}
		else
		{
			handleMouseMove.currentDirection = 0;
		}
	}
	if (event.clientX > document.body.clientWidth - moveMouseAreaWidth)
	{
		if (handleMouseMove.currentDirection)
		{
			return;
		}
		else
		{
			handleMouseMove.currentDirection = 1;
		}
	}
	var rightNow = new Date();
	var lastTime = rightNow.getTime();
	if (handleMouseMove.timeStamp == null)
	{
		handleMouseMove.timeStamp = 0;
	}
	if (handleMouseMove.timeStamp == 0)
	{
		handleMouseMove.timeStamp = lastTime;
	}
	else if (handleMouseMove.timeStamp + moveMouseAreaSeconds * 1000 < lastTime)
	{
		handleMouseMove.timeStamp = lastTime;
		handleMouseMove.moveCount = 0;
	}
	if (handleMouseMove.moveCount == null)
	{
		handleMouseMove.moveCount = 0;
	}
	handleMouseMove.moveCount++;
	if (handleMouseMove.moveCount < 3)
	{
		return;
	}
	handleMouseMove.moveCount = 0;
	handleMouseMove.timeStamp = 0;
	handleMouseMove.currentDirection == null;
	if (mondo_meta_control.style.display == noneText)
	{
		mondo_meta_control.style.display = "";
	}
	else
	{
		mondo_meta_control.style.display = noneText;
	}
}

function main()
{
	if (!GM_setValue)
	{
		return;
	}
	init();
}

//window.addEventListener( "load", main, false );
main();