function getElementsByClassName(options) {
	// { className, startNode, tagName, onlyFindFirst }
	var options = options.className ? options : {className: options};
	var startNode = options.startNode || document;
	var els = startNode.getElementsByTagName(options.tagName || '*');
	options.className = typeof options.className === 'string' ? options.className : options.className.join('(\\s|$)|(\\s|^)');
	var re = new RegExp('(\\s|^)(' + options.className + ')(\\s|$)');
	if (options.onlyFindFirst === true) {
		for (var i = 0, j = els.length; i < j; i++)
			if (re.test(els[i].className))
				return els[i];
		return false;
	} else {
		var found = [];
		for (var i = 0, j = els.length; i < j; i++)
			if (re.test(els[i].className))
				found.push(els[i]);
		return found;
	}
}


// usage: <form action="..." method="..." onsubmit="return checkForm(this);">

function checkForm(form) {
	var inputs = getElementsByClassName({ className: 'required', startNode: form }),
	    requiredField = false,
	    inputValues = {};
	for (var i = 0, input; (input = inputs[i]) && !requiredField; i++) {
		var tag = input.tagName.toLowerCase(),
		    name = input.getAttribute('name');
		if (name && (tag === 'input' || tag === 'select' || tag === 'textarea')) {
			if (input.getAttribute('type') && input.getAttribute('type').toLowerCase() === 'checkbox')
				inputValues[name] = input.checked;
			  else
				inputValues[name] = input.value;
			if (inputValues[name] === false || input.value === input.defaultValue)
				requiredField = input;
		}
	}
	if (requiredField) {
		requiredField.focus();

		// only show a hint if one isn't already displayed
		if (!getElementsByClassName({ className: 'requiredHint', onlyFindFirst: true })) {
			var div = getElementsByClassName({
				className: 'requiredHintAnchor',
				startNode: requiredField.parentNode,
				onlyFindFirst: true }) || document.createElement('div');
			div.className = 'requiredHintAnchor';
			var a = document.createElement('div');
			a.className = 'requiredHint';
			a.appendChild(document.createTextNode('Please fill in this required field'));
			var b = document.createElement('div');
			a.appendChild(b);
			a.onmouseout = function () { var pn = this.parentNode; pn.parentNode.removeChild(pn); }
			div.appendChild(a);
			requiredField.parentNode.appendChild(div);
		}
		return false;
	}
	return true;
}

