
function refreshAbs()
{
   for( i in popname )
   {
      getElt( "row_"+popname[i] ).style.display = "";
   }
   return true;
}

function elementActive(element, state, forceHide)
{
 df = document.forms["f"];
 
 if( typeof(popname[element]) == "undefined" )
 {
   return;
 }

 if(state)
 {
  setSelectedIndex = 0
  setChecked = false
  setDisable = false
  setVisibility = false
 }
 else
 {
  setSelectedIndex = -1
  setChecked = false
  setDisable = true
  setVisibility = true
 }
 
 if(forceHide)
 {
   setVisibility = true;
 }
 
 elementType = elemtype[element]

 if(elementType == "text")
 {
  df[popname[element]].value = "";
 }
 if(elementType == "select-one" || elementType == "select-multiple")
 {
  df[popname[element]].selectedIndex = setSelectedIndex;
 }
 if(elementType == "radio" || elementType == "checkbox")
 {
  df[popname[element]].disabled = setDisable;
  for( l=0; l < document.forms["f"].elements[popname[element]].length; l++)
  {
   df[popname[element]][l].checked = setChecked;
   df[popname[element]][l].disabled = setDisable;
  }
 }
 else
 {
  df[popname[element]].disabled = setDisable;
 }

 if( setVisibility )
 {
   getElt( "row_"+popname[element] ).style.display = "none";
 }
 else
 {
   getElt( "row_"+popname[element]).style.display = "";
 }

}


function subClassSet(classid,state)
{
  df = document.forms["f"];
  if( typeof(subClass[classid]) != "undefined" ) // no need to check sub classes if non exists
  {
    // check/uncheck sub classes
    multisub = subClass[classid].split("|")
    for( j in multisub )
    {
      elementHandle( multisub[j] ).checked = state;
    }
  }

  // check/uncheck super classes
  for( l in subClass )
  {
    if( l != classid ) // no need to check own sub classes
    {
      multisub = subClass[l].split("|")
      inMultiSub = false;
      for( m in multisub )
      {
        if( multisub[m] == classid )
        {
          inMultiSub = true;
          break;
        }
      }

      // if the un/selected items is a sub class iteself, start checking
      //   the state of the other sub classes of this super class
      if( inMultiSub )
      {
        multiState = true;
        // go through each item in the sub class list and check if they are all set
        for( m in multisub )
        {
          elementArray = elementHandleArray( multisub[m] );
          for( n in elementArray )
          {
            multiState = ( !elementArray[n].checked ) ? false : multiState;
          }
        }
        superClassElement = elementHandle( l );
        if( !superClassElement.checked && multiState )
        {
          superClassElement.click()
        }
        else
        {
          superClassElement.checked = false;
        }
      }
    }
  }
}

function elementHandle( idsValue )
{
  elementList = df[ popname[ ids[ idsValue ] ] ];
  for( elementListCount = 0; elementListCount < elementList.length; elementListCount++ )
  {
    if( elementList[elementListCount].value == idsValue )
    {
      return elementList[elementListCount]
    }
  }
}

function elementHandleArray( idsValue )
{
  elementArray = new Array();
  elementList = df[ popname[ ids[ idsValue ] ] ];
  elementArrayCount = 0;
  for( elementListCount = 0; elementListCount < elementList.length; elementListCount++ )
  {
    if( elementList[elementListCount].value == idsValue )
    {
      elementArray[ elementArrayCount++ ] = elementList[elementListCount];
    }
  }
  return elementArray;
}

var msub = new Array;

function lockType(typeid,level)
{
  for( i in ids )
  {
   if( ids[i] == typeid && typeof(subType[i]) != "undefined" )
   {
    msub[level] = subType[i].split("|")
    for( j in msub[level] )
    {
     tloc[msub[level][j]] = true;
     elementActive(msub[level][j],false, false);
     lockType(msub[level][j],level+1);
    }
   }
  }
}


function setLock(classid)
{
 var h, typeid ;

 if( typeof(subType[classid]) == "undefined" )
 {
  typeid = ids[classid];
  lockType(typeid,0)
 }
 else
 {
  typeid = ids[classid];
  lockType(typeid,0)
  multisub = subType[classid].split("|")
  for( h in multisub )
  {
   tloc[multisub[h]] = false;
   elementActive(multisub[h],true, false);
  }
 }
}

function hideAll()
{
  for( h in popname )
  {
    getElt( "row_"+popname[h] ).style.display = "none";
  }
}


function startLocks()
{
  var countryOtherSelected = false;
  for( var i = 0; i < document.forms["f"].countryId.length; i++ )
  {
    if( document.forms["f"].countryId.options[i].value == -1
        &&
        document.forms["f"].countryId.options[i].selected
      )
    {
      countryOtherSelected = true
      break;
    }
  }
  if( typeof(document.forms["f"].countryOther) != "undefined" && !countryOtherSelected )
  {
    document.forms["f"].countryOther.disabled = true;
  }
  for( h in tloc )
  {
   if( typeof( prepop[h] ) == "undefined" )
   {
     elementActive(h,false, false);
   }
  }
}

function checkForm()
{

  var err = new Array;
  var i = 0;
  with (document.forms["f"])
  {
    if( typeof(fullName) != "undefined" && !fullName.value )
    {
      err[ i++ ] = "Full Name";
    }
    if( typeof(firstName) != "undefined" && !firstName.value )
    {
      err[ i++ ] = "First Name";
    }
    if( typeof(lastName) != "undefined" && !lastName.value )
    {
      err[ i++ ] = "Last Name";
    }
    if( password.value.length < 4 || password.value.length > 8 )
    {
      err[ i++ ] = "password must be between 4 and 8 characters";
    }
    if( password.value != password2.value )
    {
      err[ i++ ] = "passwords do not match";
    }
    if (!jobTitle.value )
    {
      err[ i++ ] = "Job Title";
    }
    if (!company.value )
    {
      err[ i++ ] = "Company";
    }
    if (!address1.value )
    {
      err[ i++ ] = "Address";
    }
    if (!city.value )
    {
      err[ i++ ] = "City";
    }
    
    if (countryId.selectedIndex < 1 && ( typeof(document.forms["f"].countryOther) == "undefined" || !countryOther.value ) )
    {
      err[ i++ ] = "Country";
    }
    if (countryId.options[countryId.selectedIndex].value == '-1' && ( typeof(document.forms["f"].countryOther) != "undefined" && !countryOther.value ) )
    {
      err[ i++ ] = "other country";
    }
    if (!postcode.value )
    {
      err[ i++ ] = "Postcode";
    }
    if (!phone.value )
    {
      err[ i++ ] = "Phone";
    }
    if (!email.value )
    {
      err[ i++ ] = "Email";
    }
    else if( !isEmailValid(email) )
    {
      return false;
    }
    
    for( var j in popname )
    {
      errextopts = false
      
      if( typeof(document.forms["f"].elements[popname[j]]) != "undefined"  &&
          !(document.forms["f"].elements[popname[j]].disabled) &&
          customValidation.indexOf( ","+String(j)+"," ) == -1 &&
          nonMandatory.indexOf( ","+String(j)+"," ) == -1
        )
      {
        if( elemtype[j] == "text" ||  elemtype[j] == "textarea" )
        {
          if( !document.forms["f"].elements[popname[j]].value ) {errextopts = true}
        }
        if( elemtype[j] == "select-one" || elemtype[j] == "select-multiple" )
        {
          if( document.forms["f"].elements[popname[j]].selectedIndex < 1 ) {errextopts = true}
        }
        if( (elemtype[j] == "radio" || elemtype[j] == "checkbox") && !tloc[j] )
        {
          chk = false;
          for( var k = 0; k < document.forms["f"].elements[popname[j]].length; k++)
          {
            if( document.forms["f"].elements[popname[j]][k].checked )
            {
              chk = true;
              break;
            }
          }
          if( !chk )
          {
            errextopts = true;
          }
        }
        
        if(errextopts)
        {
          err[ i++ ] = unescape(poplabel[j]);
        }
      }
    }
    
    if( typeof(document.forms["f"].terms) != "undefined" )
    {
      var accepted = false;
      for( var j = 0; j < document.forms["f"].terms.length; j++ )
      {
        if( document.forms["f"].terms[j].checked && document.forms["f"].terms[j].value == "t" )
        {
          var accepted = true;
          break;
        }
      }
      if( !accepted )
      {     
        err[ i++ ] = "";
      }
    }
    
  }

  if( err.length > 0 )
  {
    alert("Please correctly complete all required fields:\n - " + err.join("\n - ") );
    return false;
  }
  else
  {
    return true;
  }
}