function MessageBoard() {
	var me = this;
	var recaptchaDisplayed = false;

	function setComments(o) {
		$('comments').innerHTML = o.responseText;
		var frm = $('comment-form');
		if (frm.body.value.length != 0) {
		if (!recaptchaDisplayed && typeof(Recaptcha) != 'undefined') {
			Recaptcha.create("6LcP8ggAAAAAABQn2EqO-1Vp0cqnu5B9TIFv-URF",
			"recaptcha_div", {
			theme: "custom"
			});
			document.getElementById('recaptcha_widget').style.display='block';
			recaptchaDisplayed = true;
		}
		}
		setEvents();
	}

	function reportError(o) {
		alert('Sorry.  There was an error: [' + o.status + '] ' + o.statusText);
	}

	function post(url, params) {
		XHR.connect(url.replace(/&xh=0/g, '') + '&xh=1', params || '', {success: setComments, failure: reportError});
		if (recaptchaDisplayed && typeof(Recaptcha) != 'undefined') {
			Recaptcha.destroy();
			recaptchaDisplayed = false;
			document.getElementById('recaptcha_widget').style.display='none';
		}
	}

	function validateMsg(frm, checkAll) {

		if (!recaptchaDisplayed && typeof(Recaptcha) != 'undefined') {
			Recaptcha.create("6LcP8ggAAAAAABQn2EqO-1Vp0cqnu5B9TIFv-URF",
			"recaptcha_div", {
			theme: "custom"
			});
			document.getElementById('recaptcha_widget').style.display='block';
			recaptchaDisplayed = true;
		}

		var err = '';
		var len = +frm.body.value.length;
		var maxlen = +frm.maxlength.value;
		if (len > maxlen) {
			err = 'Input too long, max input length ' + maxlen + ' characters, but you have ' + len;
		} else if (!len && checkAll) {
			err = 'Please provide a valid message to post';
		}
		var p = $('comment-error');
		if (p && !err) {
			p.parentNode.removeChild(p);
		} else if (err) {
			if (!p) {
				p = frm.getElementsByTagName('fieldset')[0].appendChild(document.createElement('p'));
				p.id = 'comment-error';
			}
			p.innerHTML = err;
		}
		return !err;
	}

	this.toggleCommentBox = function(btn) {
		var frm = $('comment-form');
		if (hasClass(btn, 'opener')) {
			delClass(frm.parentNode, 'open');
			btn.parentNode.appendChild(frm);
			addClass(btn.parentNode, 'open');
			frm.body.focus();
		} else {
			var div = frm.parentNode;
			delClass(div, 'open');
			div.parentNode.insertBefore(frm, div.nextSibling);
		}
	}

	function setEvents() {

		for (var textarea = $('comment'), events = ['keyup', 'input', 'paste'], i = events.length; i--;) {
			addEvent(textarea, events[i], function(e) {
				validateMsg((e.srcElement || e.target).form);
			});
		}

		addEvent($('comment-form'), 'submit', function(e) {
			var frm = e.srcElement || e.target;
			if (validateMsg(frm, true)) {
				post(frm.action, serializeForm(frm));
			} else {
				frm.body.focus();
			}
			haltEvent(e);
		});

		addEvent($('permissions-form'), 'submit', function(e) {
			var frm = e.srcElement || e.target;
			var params = serializeForm(frm);
			// TODO: change backend java to use permissions variable!!!
			var perms = {postany: false, postfrends: false, postguests: false, postowner: false};
			if (/[?&]permissions=([^&]+)/.test(params)) perms[RegExp.$1] = true;
			var permissions = [];
			for (var perm in perms) {
				permissions.push(perm + '=' + perms[perm]);
			}
			params += '&' + permissions.join('&');
			post(frm.action, params);
			haltEvent(e);
		});

		addEvent($('change'), 'click', function() {
			addClass($('permissions'), 'open');
		});
		addEvent($('cancel'), 'click', function() {
			delClass($('permissions'), 'open');
		});
	}

	function init() {
		addEvent($('comments'), 'click', function(e) {
			for (var el = e.srcElement || e.target; el; el = el.parentNode) {
				if (el.tagName == 'A') {
					if (hasClass(el, 'delete')) {
						if (confirm('Delete this message?')) {
							post(el.href);
						}
						haltEvent(e);
					} else if (hasClass(el, 'nav')) {
						post(el.href);
						haltEvent(e);
					}
					break;
				} else if (el.tagName == 'BUTTON' && hasClass(el, 'toggle')) {
					me.toggleCommentBox(el);
					break;
				}
			}
		});

		setEvents();
		
	}

	init();
}
