document.observe('dom:loaded', function() {
	// Place anchor links after page loads if you don't want them to be indexed with the anchor
	$$('a[anchor]').each(function(a){a.writeAttribute('href', a.readAttribute('href')+"#"+a.readAttribute('anchor'))});
	
	// Stripe tables
	$$('table.format > tbody > tr:nth-child(odd)').invoke('addClassName', 'odd');
	$$('table.format > tbody > tr:nth-child(even)').invoke('addClassName', 'even');
	
	// Textarea max lengths
	$$('textarea[maxlength]').invoke('observe', 'keyup', function(ev) { trim_length(ev.element()) })
	$$('textarea[maxlength]').invoke('observe', 'blur', function(ev) { trim_length(ev.element()) })
	
	// Form validation
	$$('form').invoke('observe', 'submit', function(ev) { validateForm(ev) });
	$$('form input, form textarea, form select').invoke('observe', 'blur', function(ev) { validateFormElement(ev.element(), true) });
});

/**
 *	Validate a form element
 *	@param		form element
 *	@param		display_error		If true, highlight the field and point out the error
 *	@return		true if element valid, false otherwise
 */
function validateFormElement(el, display_error) {
	if(el.readAttribute('validation_regex') == null || el.readAttribute('disabled') == 'disabled') {
		// Field hasn't got any validation specified
		return true;
	}
	regex = new RegExp(el.readAttribute('validation_regex'));
	if(regex.test($F(el))) {
		// Regex passed
		el.removeClassName('validation_error');
		el.writeAttribute('title', '');
		return true;
	}
	// Field contains invalid content
	if(display_error) {
		// Show an error for the element
		el.addClassName('validation_error');
		el.writeAttribute('title', el.readAttribute('validation_error_msg'));
	}
	return false;
}

/**
 *	Validate a form
 */
function validateForm(ev) {
	form = ev.element();
	elements = form.getElements();
	elements_len = elements.length;
	errors = false;
	for(var i = 0; i < elements_len; i++) {
		if(!validateFormElement(elements[i], true)) {
			errors = true;
		}
	}
	if(errors) {
		alert('Please correct all field errors before submitting\n\nHover your mouse over a red form element to see what\'s wrong.');
		ev.stop();
		return false;
	}
	return true;
}