var commentLivePreview =
{
	livePreviewClass: "livepreview",
	allowedTags: allowedHtmlTags,
	allowedTagsRegExp: null,
	previewElement: null,
	paraRegExp: new RegExp("(.*)\n\n([^#*\n\n].*)", "g"),
	lineBreakRegExp: new RegExp("(.*)\n([^#*\n].*)", "g"),
	updatingPreview: false,

	init: function()
	{
		if (!document.getElementsByTagName) { return; }

		var divs = document.getElementsByTagName("div");
		commentLivePreview.previewElement = commentLivePreview.getPreviewDisplayElement(divs);
		if(!commentLivePreview.previewElement) { return; }

		var textareas = document.getElementsByTagName("textarea");
		var tagNamesRegex = "";

		for(var i = 0; i < commentLivePreview.allowedTags.length; i++)
		{
			tagNamesRegex += commentLivePreview.allowedTags[i] + "|";
		}

		if(tagNamesRegex.length > 0)
		{
			tagNamesRegex = tagNamesRegex.substring(0, tagNamesRegex.length - 1);
		}

		commentLivePreview.allowedTagsRegExp = new RegExp("&lt;(/?(" + tagNamesRegex + ")(\\s+.*?)?)&gt;", "g");
		var textarea;
		for (i = 0; i < textareas.length; i++)
		{
			textarea = textareas[i];
			if (commentLivePreview.getClassName(textarea).indexOf(commentLivePreview.livePreviewClass) >= 0)
			{
				textarea.onkeyup = function()
				{
					if(!commentLivePreview.updatingPreview)
					{
						commentLivePreview.updatingPreview = true;
						window.setTimeout("commentLivePreview.reloadPreview('" + this.id + "')", 20);
					}
					return false;
				};

				commentLivePreview.reloadPreview(textarea.id);
			}
		}
	},
	getPreviewDisplayElement: function(elements)
	{
		var element;

		for (var i = 0; i < elements.length; i++)
		{
			element = elements[i];

			if (commentLivePreview.getClassName(element).indexOf(commentLivePreview.livePreviewClass) >= 0)
			{
				return element;
			}
		}
	},

	getClassName: function(element)
	{
		if(element.getAttribute && element.getAttribute("class"))
		{
			return element.getAttribute("class");
		}
		else if(element.className)
		{
			return element.className;
		}
		return "";
	},

	reloadPreview: function(textareaId)
	{
		var textarea = document.getElementById(textareaId);
		var previewString = textarea.value;

		if (previewString.length > 0)
		{
			previewString = commentLivePreview.htmlUnencode(previewString);
			previewString = previewString.replace(commentLivePreview.paraRegExp, "<p>$1</p><p>$2</p>");
			previewString = previewString.replace(commentLivePreview.lineBreakRegExp, "$1<br />$2");
			previewString = previewString.replace(commentLivePreview.allowedTagsRegExp, "<$1>");
		}
		try
		{
			commentLivePreview.previewElement.innerHTML = previewString;
		}
		catch(e)
		{
			alert("Sorry, but inserting a block element within is not allowed here.");
		}
		commentLivePreview.updatingPreview = false;
	},

	htmlUnencode: function(s)
	{
		return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	},

	addEvent: function(obj, eventTypes, callback)
	{
		var eventType;
		for(var i = 0; i < eventTypes.length; i++)
		{
			eventType = eventTypes[i];

			if (obj.attachEvent)
			{
				obj["e" + eventType + callback] = callback;
				obj[eventType + callback] = function()
				{
					obj["e" + eventType + callback](window.event);
				};
				obj.attachEvent("on" + eventType, obj[eventType + callback]);
			}
			else
			{
				obj.addEventListener(eventType, callback, false);
			}
		}
	}
};


commentLivePreview.addEvent(window, ["load"], commentLivePreview.init);