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'
/* changes for named list */
	var errorMsg='Por favor, corrija los siguentes errores:';
/* end changes for named list */
	var errorImg='/img/alert.gif';
	var errorAlt='Error';
	var errorTitle='Este campo tiene un error!';
	//var reqfields=document.getElementById('required').value.split(',');

// Cleanup old mess
	// if there is an old errormessage field, delete it
	if(document.getElementById(errorID))
	{
		var em=document.getElementById(errorID);
		em.parentNode.removeChild(em);
	}
	var reqfields = of.getElementsByTagName("*");
	// remove old images and classes from the required fields
	for(var i=0;i<reqfields.length;i++)
	{
		var f=reqfields[i];
		if(!f.getAttribute("required")){continue;}
		if(f.previousSibling && /img/i.test(f.previousSibling.nodeName))
		{
			f.parentNode.removeChild(f.previousSibling);
		}
		if(!f.getAttribute("originalClassName")){
		  f.setAttribute("originalClassName",f.className);
		}
		f.className=f.getAttribute("originalClassName");
	}
// loop over required fields
	for(var i=0;i<reqfields.length;i++)
	{
		var f=reqfields[i];
		
	  if(f.getAttribute("required")){
// check if required field is there
// 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.options[f.selectedIndex].value == ""){cf_adderr(f)}
  			break;
  		}
  		i=i+2;
	  }
	}
	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);
/* added for named list */
			var newul=document.createElement('ul');		
			em.appendChild(newul);
/* end added for named list */
			// find the errors placeholder
			var sb=document.getElementById('errors_placeholder');
			if(sb)
			{
				sb.parentNode.insertBefore(em,sb);
			}	
		} 
/* added for named list */
		var em=document.getElementById(errorID).getElementsByTagName('ul')[0];
		var newli=document.createElement('li');
    var txt = o.getAttribute("required");
		newli.appendChild(document.createTextNode(txt));
		em.appendChild(newli);
/* end added for named list */
	}
	function cf_isEmailAddr(str) 
	{
	    return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	}
}
