ENGINE_labels = new Array();
ENGINE_labels[0] = "De volgende velden zijn verplicht";
ENGINE_labels[1] = "De volgende fouten zijn opgetreden tijdens het invullen van het formulier";
ENGINE_labels[2] = "Gebruik in deze velden komma's in plaats van punten";
ENGINE_labels[3] = "Deze velden bevatten geen correct email adres";
ENGINE_labels[4] = "Deze velden bevatten geen correcte datum (DD-MM-YYYY)";
ENGINE_labels[5] = "Gebruik in deze velden alleen nummers";
ENGINE_labels[6] = "Deze velden bevatten geen correcte postcode";
ENGINE_labels[7] = "De volgende velden zijn ongelijk";
ENGINE_labels[8] = "Deze velden bevatten geen correcte bankrekeningnummer";
ENGINE_labels[9] = "Deze velden bevatten geen correcte tijd ";
ENGINE_labels[10] = "Gebruik geen speciale characters";
ENGINE_labels[11] = "Minimale waarde overschreden";
ENGINE_labels[12] = "Maximale waarde overschreden";
function ENGINE_doValidate(form, alertErr)
{
  if(typeof ENGINE_labels == "undefined")
    alert("Please include a labels file or define a labels array yourself");
  err = new Array();
  err[0] = new Array(); // Required
  err[1] = new Array(); // General error
  err[2] = new Array(); // Numeric - Commas
  err[3] = new Array(); // Email
  err[4] = new Array(); // Date
  err[5] = new Array(); // Numeric
  err[6] = new Array(); // Postal code
  err[7] = new Array(); // Not equal
  err[8] = new Array(); // No accountnumber
  err[9] = new Array(); // Time
  err[10]= new Array(); // No special chars
  err[11]= new Array(); // < Min
  err[12]= new Array(); // > Max
  
  lastName = '';
  if(form && form.elements)
  {
    for(i=0;i<form.elements.length;i++)
    {
      el = form.elements[i];
      validate = el.getAttribute("validate");
      if(validate && validate!="")
      {
        try
        {
          validate = ("" + validate).split("-");
        }catch( e )
        {
          return false;
        }
        err_in_el = false;
        error = el.name;
        error_name = el.getAttribute("error") 
        if(error_name && error_name!="")
	        error = error_name;
              
        if(validate.length>0)
          tmp_name = error; 

        if(tmp_name==lastName)
          continue;

        new_validate = new Array();
        reg_exp = new RegExp("ifvalueof\((.)*,(.)*,(.)*\)");
        for( a = 0 ; a < validate.length ; a++)
        {
          ar  = reg_exp.exec(""+validate[a]);
          if(ar)
          {
            ar = (ar[1].substring(1, ar[1].length-1)).split(",");
            if(ar.length==3)
            {
              tmp_el = form.elements[ar[0]];
              if(typeof tmp_el == "object")
              {
                try
                {
                  if(tmp_el.length > 0)
                  {
                    if(tmp_el[0].type && tmp_el[0].type.toLowerCase()=="radio")
                    {
                      for(b = 0; b < tmp_el.length; b++)
                        if(tmp_el[b].checked===true && tmp_el[b].value==ar[1])
                          new_validate[new_validate.length] = ar[2];
                    }else if(tmp_el.tagName && tmp_el.tagName.toLowerCase()=="select")
                    {
                      if(tmp_el[tmp_el.selectedIndex].value==ar[1])
                        new_validate[new_validate.length] = ar[2];
                    }
                  }
                }catch( e ) {}
              }else if(tmp_el && tmp_el.tagName && tmp_el.tagName.toLowerCase()=="input" && tmp_el.type && tmp_el.type.toLowerCase()=="text")
              {
                if(tmp_el.value == ar[1])
                  new_validate[new_validate.length] = ar[2];
              }
            }
          }else
            new_validate[new_validate.length] = validate[a];
        }
        validate = new_validate;
        must_be_equal_to = new RegExp("mustbeequalto\((.)*\)");
        one_must_be_set = new RegExp("onemustbeset\((.)*\)");
        check_postal_code = new RegExp("checkpostalcode\((.)*\)");
        min = new RegExp("min\((.)*\)");
        max = new RegExp("max\((.)*\)");
        for( a = 0 ; a < validate.length ; a++)
        {
          if(!err_in_el)
          {
            if(validate[a] == "required")
            {
              if (el.type.toLowerCase() == "radio")
              {
                radio_el = form.elements[(el.name)];
                err_in_el = true;
                if(radio_el)
                {
                  if(radio_el.length)
                  {
                    for(var b=0; b < radio_el.length; b++)
                    {
                      if(radio_el[b].checked)
                        err_in_el = false;
                    }
                  }else if(radio_el.checked)
                    err_in_el = false;
                }
              }else if (el.type.toLowerCase() == "checkbox")
              {
                ok = false;
                if(typeof form.elements[el.name].length != 'undefined' && form.elements[el.name].length>1)
                {
                  for(var b=0;b<form.elements[el.name].length;b++)
                  {
                    if(form.elements[el.name][b].checked)
                    {
                      ok = true;
                      break;
                    }
                  }
                }else
                  ok = el.checked;
                if(!ok)
                  err_in_el = true;
              }else if (el.tagName.toLowerCase() == "select")
              {
                if(el.selectedIndex==-1 || el[el.selectedIndex].value=='')
                  err_in_el = true;
              }else if((typeof el.value != "undefined") && el.value=="")
              {
                err_in_el = true;
              }
              if(err_in_el)
                err[0][err[0].length] = tmp_name;
            }else if(validate[a] == "numeric")
            {
              el.value = (""+el.value).replace(",",".");
              res =  ENGINE_checkNumeric(el.value);
              if(res < 0)
              {
                if(res < -1)
                  err[2][err[2].length] = tmp_name;

                err[5][err[5].length] = tmp_name;
                err_in_el = true;
              }
            }else if(validate[a] == "nospecialchars")
            {
              res = el.value.search("'");
              res2 = el.value.search('"');
              if(res > 0 || res2 > 0)
              {
                err[10][err[10].length] = tmp_name;
                err_in_el = true;
              }
            }else if(validate[a] == "email")
            {
              if(!ENGINE_checkEmail(el.value))
              {
                err_in_el = true;
                err[3][err[3].length] = tmp_name;
              }
            }else if(validate[a] == "date")
            {
              if(!ENGINE_checkDate(el.value) && el.value!="")
              {
                err_in_el = true;
                err[4][err[4].length] = tmp_name;
              }
            }else if(validate[a] == "time")
            {
              if(!ENGINE_checkTime(el.value) && el.value!="")
              {
                err_in_el = true;
                err[9][err[9].length] = tmp_name;
              }
            }else if(validate[a] == "nl_postal_code")
            {
              if(!ENGINE_checkNlPostalCode(el.value))
              {
                err_in_el = true;
                err[6][err[6].length] = tmp_name;
              }
            }else if(ar = min.exec(validate[a]))
            {
              minValue = (ar[1].substring(1, ar[1].length-1));

            	try
            	{
                	if(el.value.length <minValue)
            		{
            			err_in_el = true;
            			err[11][err[11].length] = tmp_name;
            		}
            	}catch(e) {}
            }else if(ar = max.exec(validate[a]))
            {
              maxValue = (ar[1].substring(1, ar[1].length-1));							
              
            	try
            	{
                if(el.value.length > maxValue)
            		{
            			err_in_el = true;
            			err[12][err[12].length] = tmp_name;
            		}
            	}catch(e) {}
            }
          }
        }
        lastName = tmp_name;
      }
    }

    total_errs = 0;
    for(a=0;a<err.length;a++)
      total_errs += err[a].length;

    if(total_errs>0)
    {
      err_txt = ENGINE_labels[1] + ":\n\n";      
      for(a=0;a<err.length;a++)
      {
        if(err[a].length>0)
        {
          if(typeof err[a][0] != "object")
            err_txt += ENGINE_labels[a] + ":\n" + err[a].join(", ") + "\n\n";
          else
            err_txt += err[a][0][0] + ":\n" + err[a][0][1] + "\n\n";
        }
      }
      if(typeof alertErr == "undefined" || alertErr)
      alert(err_txt);
    }else
      return true;
  }
  return false;
}

function ENGINE_checkEmail(email)
{
  //regexp = /\w+([\.\-_]{1}\w+)*@(\w+([\.\-_]{1}\w+)*)\.(\w{2,4})/;
  regexp = /\w+([\.\-_\+]{1}\w*)*@(\w+([\.\-_]{1}\w+)*)\.(\w{2,6})/;

  test = ("" + email).match(regexp);
  if(test && typeof test[0] != "undefined") test = test[0];
  return (test==email || ("" + email)=="");
}
function ENGINE_checkDate(date)
{
  val = (""+date).split("-");
  if(val.length==3)
  {
    dat = new Date(val[2], val[1]-1, val[0]);
    newdat = new Date(Date.parse(dat));
    if(newdat==-1 || (newdat.getDate()!=Math.round(val[0]) || newdat.getFullYear()!=Math.round(val[2]) || newdat.getMonth()!=Math.round(val[1]-1)))
      return false;
  }else
    return false;

  return true;
}

function ENGINE_checkTime(time)
{
  val = (""+time).split(":");
  if(val.length==2)
  {
  	if (parseInt(val[0]) < 0 || parseInt(val[0]) >= 24)
      return false;
    if (parseInt(val[1]) < 0 || parseInt(val[1]) >= 60)
    	return false;
  }else
    return false;

  return true;
}

function ENGINE_checkNlPostalCode(code)
{
	tmp_val = code.replace(" ", "");
	first  = -1;
	second = -1;
	third  = -1;
	if(tmp_val.length == 6)
	{
	  first  = tmp_val.substring(0,4);
	  second = tmp_val.substring(4,5);
	  third  = tmp_val.substring(5,6);

		if((ENGINE_checkNumeric(first) == 0) && (ENGINE_checkNumeric(second) == -1) && (ENGINE_checkNumeric(third) == -1))
			return true;
	}

	return false;
}

function ENGINE_cleanPostalCode(code)
{
	var postcode = ENGINE_removeSpaces(code.value);
  var first  = postcode.substring(0,4);
  var second = postcode.substring(4,6);
  if(ENGINE_checkNlPostalCode(postcode))
		code.value = first+' '+second.toUpperCase();
}

function ENGINE_checkNumeric(number)
{
  res = 0;
  if(number != ((number/2)*2))
  {
    res--;
    if((""+number).indexOf(",")!=-1)
      res--;
  }
  return res;
}

function ENGINE_removeSpaces(string)
{
  var tstring = "";
  string = '' + string;
  splitstring = string.split(" ");
  for(i = 0; i < splitstring.length; i++)
  tstring += splitstring[i];
  return tstring;
}

function checkForm(form, doAlert)
{
  result = ENGINE_doValidate(form, doAlert);
  return result;
}