
function setLabelClass(forVal,newClass) {
	var labels,i,fors;
	// grab all labels, and loop over them
	labels=document.getElementsByTagName('label');
	for(i=0;i<labels.length;i++) {  
		// get the value of the labels for attribute
		fors=labels[i].htmlFor;
		// and check if it contains the value we passed into the function
		//alert(fors);
		if(fors==forVal) {
			// if so, add the class required
			labels[i].className=newClass;
		}
	}
}


function addAsterisk(forVal) {
	var labels,i,fors;
	// grab all labels, and loop over them
	labels=document.getElementsByTagName('label');
	for(i=0;i<labels.length;i++) {  
		// get the value of the labels for attribute
		fors=labels[i].htmlFor;
		// and check if it contains the value we passed into the function
		//alert(fors);
		if(fors==forVal) {
			// if so, add an asterik within the label
			var asteriskSpan=document.createElement('span');
			var asteriskText=document.createTextNode('*');
			asteriskSpan.appendChild(asteriskText);
			//asteriskSpan.className="required"; //don't need this as the CSS will cascade
			labels[i].insertBefore(asteriskSpan,labels[i].firstChild);
			//labels[i].appendChild(asteriskSpan);  //this line would insert the asterisk after the label, not before
		}
	}
}

function noLongerRequired(forVal) {  //will remove the requirement for a certain field
	var labels,i,fors;
	// grab all labels, and loop over them
	labels=document.getElementsByTagName('label');
	for(i=0;i<labels.length;i++) {  
		// get the value of the labels for attribute
		fors=labels[i].htmlFor;
		// and check if it contains the value we passed into the function
		//alert(fors);
		if(fors==forVal) {
			// if so, see if there is a span with an asterik within the label and remove it
			labels[i].removeChild(labels[i].getElementsByTagName('span')[0]);
			//also, if by chance there is an error image, remove that as well
			f = document.getElementById(forVal);
			if(!f){continue;}
			if((f.previousSibling) && (/img/i.test(f.previousSibling.nodeName)))
			{
				f.parentNode.removeChild(f.previousSibling);
			}
		}
	}
}

//this statement checks the value of the hidden field "required"
//and sets the label class for any required fields to 'required' as well
if(document.getElementById && document.createTextNode) {
	window.onload=function(){
		//check to see if there is an element w/ the id 'requiredLabelClass'
		//and set variable labelClass to the value needed
		var l=document.getElementById("requiredLabelClass");
		var labelClass = "";
			if(l) {
				labelClass=l.value;
			} else {
				labelClass="required";
			}
		//now for all required fields as defined in the hidden element 'required'
		//go through and set the class on the label for each one
		var reqfields=document.getElementById('required').value.split(',');
		for(var i=0;i<reqfields.length;i++)
		{
			var f=document.getElementById(reqfields[i]);
			if(!f){continue;}
				setLabelClass(f.id,labelClass);
				addAsterisk(f.id);
		}
	}
}


function cleanupOldMess() {
	
// Define error messages and split the required fields
	var errorID='errormsg';
	var reqfields=document.getElementById('required').value.split(',');
// if there is an old errormessage field, delete it
	if(document.getElementById(errorID))
	{
		var em=document.getElementById(errorID);
		em.parentNode.removeChild(em);
	}
	// remove old images and classes from the required fields
	for(var i=0;i<reqfields.length;i++)
	{
		var f=document.getElementById(reqfields[i]);
		if(!f){continue;}
		if(f.previousSibling && /img/i.test(f.previousSibling.nodeName))
		{
			f.parentNode.removeChild(f.previousSibling);
		}
		f.className='';
	}
}

// the following script taken from
// http://www.onlinetools.org/articles/unobtrusivejavascript/chapter5.html
function checkform(of)
{
// Test if DOM is available and there is an element called required
	if(!document.getElementById || !document.createTextNode){return;}
	if(!document.getElementById('required')){return;}

// Define error messages and split the required fields
	var errorID='errormsg';
	var errorClass='error'
	var errorMsg='Please enter or change the fields marked with a ';
	var errorImg='/images/alert.gif';
	var errorAlt='Error';
	var errorTitle='This field has an error!';
	var reqfields=document.getElementById('required').value.split(',');

// Cleanup old mess
	cleanupOldMess();
// loop over required fields
	for(var i=0;i<reqfields.length;i++)
	{
// check if required field is there
		var f=document.getElementById(reqfields[i]);
		if(!f){continue;}
// test if the required field has an error, 
// according to its type
		switch(f.type.toLowerCase())
		{
			case 'text':
				if(f.value=='' && f.id!='email'){cf_adderr(f)}							
// email is a special field and needs checking
				if(f.id=='email' && !cf_isEmailAddr(f.value)){cf_adderr(f)}							
			break;
			case 'textarea':
				if(f.value==''){cf_adderr(f)}							
			break;
			case 'checkbox':
				if(!f.checked){cf_adderr(f)}							
			break;
			case 'select-one':
				if(!f.selectedIndex && f.selectedIndex==0){cf_adderr(f)}							
			break;
		}
	}
	return !document.getElementById(errorID);

	/* Tool methods */
	function cf_adderr(o)
	{
		// create image, add to and colourise the error fields
		var errorIndicator=document.createElement('img');
		errorIndicator.alt=errorAlt;
		errorIndicator.src=errorImg;
		errorIndicator.title=errorTitle;
		o.className=errorClass;
		o.parentNode.insertBefore(errorIndicator,o);

	// Check if there is no error message
		if(!document.getElementById(errorID))
		{
		// create errormessage and insert before submit button
			var em=document.createElement('div');
			em.id=errorID;
			var newp=document.createElement('p');
			newp.appendChild(document.createTextNode(errorMsg))
			// clone and insert the error image
			newp.appendChild(errorIndicator.cloneNode(true));
			em.appendChild(newp);
			// find the submit button 
			for(var i=0;i<of.getElementsByTagName('input').length;i++)
			{
				if(/submit/i.test(of.getElementsByTagName('input')[i].type))
				{
					var sb=of.getElementsByTagName('input')[i];
					break;
				} else if (/image/i.test(of.getElementsByTagName('input')[i].type))
				{
					var sb=of.getElementsByTagName('input')[i];
					break;
				}
			}
			if(sb)
			{
				sb.parentNode.insertBefore(em,sb);
			}	
		} 
	}
	function cf_isEmailAddr(str) 
	{
		return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}
}
