function checkForm(e) {
	var aFormFields = getElementsByTagNames('input select textarea');
	var nFormFields = aFormFields.length;
	var f,i, bError=false, sMsg='';
	var aEmptyFields = new Array();
	var aEmailFields = new Array();
	var aTooLong = new Array();
	
	for(i=0;i<nFormFields;i++) {
		f=aFormFields[i];
		
		if (hasClass(f,'required') && f.value=='') {
			bError = markError(f,!bError);
			aEmptyFields.push(getFormFieldName(f.id));
		}
		else if (hasClass(f,'email') && invalidEmail(f.value) && !f.error) {
			bError = markError(f,!bError);
			aEmailFields.push(getFormFieldName(f.id));
		}
		else if (f.nodeName=='TEXTAREA' && getVagueClass(f,'maxlength') && f.value.length>getVagueClass(f,'maxlength')) {
			bError = markError(f,!bError);
			aTooLong.push(getFormFieldName(f.id));
		}
	}
	
	var nEmptyFields = aEmptyFields.length;
	var nEmailFields = aEmailFields.length;
	var nTooLong = aTooLong.length;
	
	if (nEmptyFields) {
		if(nEmptyFields!=1)
			sMsg += 'You have not completed the following (required) ' + nEmptyFields + ' form fields:  ';
		else
			sMsg += 'You have not completed the following (required) form field:  ';
		
		sMsg += buildList(aEmptyFields,nEmptyFields);
		sMsg = sMsg.substring(0,sMsg.length-2) + '.';
	}
	
	if (nEmailFields) {
		if (sMsg!='') sMsg += '\n\r\n\rAdditionally, ';
		sMsg += buildList(aEmailFields,nEmailFields);
		
		if(nEmailFields!=1)
			sMsg = sMsg.substring(0,sMsg.length-2) + ' do not appear to be valid email addresses.';
		else
			sMsg = sMsg.substring(0,sMsg.length-2) + ' does not appear to be a valid email address.';
	}
	
	if (nTooLong) {
		if (sMsg!='') sMsg += '\n\r\n\rLastly, ';
		sMsg += buildList(aTooLong,nTooLong);
		
		if(nTooLong!=1)
			sMsg = sMsg.substring(0,sMsg.length-2) + ' are longer than the specified maximum lengths.';
		else
			sMsg = sMsg.substring(0,sMsg.length-2) + ' is longer than the specified maximum length.';
	}
	
	if (bError) {
		alert(sMsg);
		if(e && e.preventDefault) e.preventDefault(); //DOM style
		return false; //IE style (do we also need "returnvalue" somewhere?)
	}
};


function buildList(a,n) {
	var i,s='';
	for(i=0;i<n;i++)
		if (i==n-2)s+='\''+a[i]+'\' and ';else s+='\''+a[i]+'\', ';
	return s;
}


function markError(f,bFirstError) {
	if (bFirstError) f.focus(); //if it's the first error then set focus on the field
	addClass(f,'error');
	addEventSimple(f,'change',undoError);
	
	return true;
}


function getFormFieldName(sID) {
	var i, aLabels=document.getElementsByTagName('label'), nLabels=aLabels.length;
	
	for(i=0;i<nLabels;i++) if (aLabels[i].htmlFor==sID) return aLabels[i].innerHTML;
}


function invalidEmail(v) {
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	return !filter.test(v);
}


function initFormCheck() {
	var i, aForms=document.getElementsByTagName('form');
	
	for(i=0;i<aForms.length;i++)
		addEventSimple(aForms[i],'submit',checkForm);
}


addEventSimple(window,'load',initFormCheck);










	
function undoError(e) {
	var evtTarget = getTarget(e);
	removeEventSimple(evtTarget,'change',undoError);
	delClass(evtTarget,'error')
}