function attachListener(element, event_type, event_handler)
{
	if (element.addEventListener) {
		element.addEventListener(event_type, event_handler, false);
	} else if (element.attachEvent) {
		element.attachEvent('on' + event_type, event_handler);
	}
}

function writeCharsRemainingCounter(form_name, field_name, max_length)
{
	var field = document.forms[form_name][field_name];
	var remaining = max_length - field.value.length;
	
	if (field.value.length > max_length) {
		field.value = field.value.substring(0, max_length);
		remaining = 0;
	}
	
	var on_key = function ()
	{
		charsRemaining_keypress(form_name, field_name, max_length);
	}
	
	document.write(
		'<span class="chars-remaining">' +
			'<span class="chars-remaining-number" id="_chars_remaining_' + form_name + '_' + field_name + '">' +
				remaining +
			'</span>' +
			' character(s) remaining' +
		'</span>'
	);
	
	if (field.maxlength) {
		field.maxlength = max_length;
	}
	
	attachListener(field, 'keydown',  on_key);
	attachListener(field, 'keypress', on_key);
	attachListener(field, 'keyup',    on_key);
	attachListener(field, 'paste',    on_key);
}

function charsRemaining_keypress(form_name, field_name, max_length)
{
	var field = document.forms[form_name][field_name];
	var remaining = max_length - field.value.length;
	
	if (field.value.length > max_length) {
		field.value = field.value.substring(0, max_length);
		remaining = 0;
	}
	
	document.getElementById('_chars_remaining_' + form_name + '_' + field_name).innerHTML = remaining;
}