// JavaScript Document

  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 message and split the required field
   var errorID='errormsg';
   var errorClass='error';
   // Changes for named list
   var errorMsg='Please enter or change the following fields: ';
   // End changes for named list
   var errorImg='img/alert.gif';
   var errorAlt='Error  ';
   var errorTitle='This field has an error!';
   var reqfields=document.getElementById('required').value.split(',');
   // Cleanup old mess
   // If there is an old error message 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='';
   }
   // 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 method
   function cf_adderr(o)
   {
    // Create image, and add to colourize 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 error message 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 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;
       }
      }
      if(sb)
      {
       sb.parentNode.insertBefore(em,sb);
      }
     }
     // Added for named list
     var em=document.getElementById(errorID).getElementsByTagName('ul')[0];
     var newli=document.createElement('li');
     for(var i=0;i<of.getElementsByTagName('label').length;i++)
     {
      if(of.getElementsByTagName('label')[i].htmlFor==o.id)
      {
       var txt=of.getElementsByTagName('label')[i].firstChild.nodeValue;
       break;
      }
     }
    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}$/);
   }
  }
 
