/* FORMVALIDATOR */
/******************************************************************************************/

function doValidate(form, labels, highlitecolors, nameActions)
{
  labels = new Array();
  labels[0] = "Verplicht";
  labels[1] = "Nummer";
  labels[2] = "Gebruik kommas";
  labels[3] = "Ongeldig"; // email, postcode
  labels[4] = "Datum";
  labels[5] = "Je hebt nog niet alle vereiste velden ingevuld";
  labels[6] = "Postcode";
  labels[7] = "Ongelijk";
  labels[8] = "Geen Banknummer";
  labels[9] = "Tijd";
  labels[10]= "Gebruik geen speciale characters";
  labels[11]= "Minimale lengte niet correct";
  labels[12]= "Maximale lengte niet correct";

  err = new Array();
  err[0] = new Array(); // Required
  err[1] = new Array(); // Numeric
  err[2] = new Array(); // Numeric - Commas
  err[3] = new Array(); // Email
  err[4] = new Array(); // Date
  err[5] = new Array(); // General error
  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
  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;
        if(validate.length>0)
        {
          tmp_name = getGoodName(el.name, nameActions);
          if(el.getAttribute)
          {
            if(el.getAttribute("error")!=="")
              tmp_name = el.getAttribute("error");
          }
        }
        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.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((typeof el.value != "undefined") && el.value == '' || el.value.replace(/ /gi,'').length == 0)
              {
                err_in_el = true;
              }
              else if (el.type.toLowerCase() == "radio")
              {
                radio_el = form.elements[(el.name)];
                err_in_el = true;
                for(var b=0; b < radio_el.length; b++)
                {
                  if(radio_el[b].checked)
                  {
                    err_in_el = false;
                  }
                }
              }
              else if (el.type.toLowerCase() == "checkbox")
              {
                if(!el.checked)
                {
                  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 =  checkNumeric(el.value);
              if(res < 0 || el.value == 0000000000)
              {
                if(res < -1)
                  err[2][err[2].length] = tmp_name;

                err[1][err[1].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)
              {
                //if(res < -1)
                  //err[2][err[2].length] = tmp_name;

                err[10][err[10].length] = tmp_name;
                err_in_el = true;
              }
            }else if(validate[a] == "email")
            {
              if(!checkEmail(el.value))
              {
                err_in_el = true;
                err[3][err[3].length] = tmp_name;
              }
            }else if(validate[a] == "date")
            {
              if(!checkDate(el.value) && el.value!="")
              {
                err_in_el = true;
                err[4][err[4].length] = tmp_name;
              }
            }else if(validate[a] == "time")
            {
              if(!checkTime(el.value) && el.value!="")
              {
                err_in_el = true;
                err[9][err[9].length] = tmp_name;
              }
            }else if(validate[a] == "accountnumber")
            {
              if(!checkAccountNumber(el.value) && el.value!="")
              {
                err_in_el = true;
                err[8][err[8].length] = tmp_name;
              }

            }else if(validate[a] == "nl_postal_code")
            {
              if(!checkNlPostalCode(el.value))
              {
                err_in_el = true;
                //err[6][err[6].length] = tmp_name;
                err[3][err[3].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) {}
            }else if(ar = check_postal_code.exec(validate[a]))
            {
            	if(el.value != "undefined" && el.value != "")
            	{
	              land_id_el = (ar[1].substring(1, ar[1].length-1));

	              try
	              {
	                if(land_id_el = form.elements[land_id_el])
	                {
	                  if(land_id_el.value == '031')
	                  {
											if(!checkNlPostalCode(el.value))
				              {
				                err_in_el = true;
				                //err[6][err[6].length] = tmp_name;
				                err[3][err[3].length] = tmp_name;
				              }
	                  }
	                }
	              }catch(e) {}
							}
            }else if(ar = must_be_equal_to.exec(validate[a]))
            {
              must_equal_el = (ar[1].substring(1, ar[1].length-1));
              try
              {
                if(must_equal_el = form.elements[must_equal_el])
                {
                  if((typeof must_equal_el.value != "undefined") && must_equal_el.value!=el.value)
                  {
                    err_in_el = true;
                    other_el = getGoodName(must_equal_el.name, nameActions);
                    err[7][err[7].length] = tmp_name + " != " + other_el;
                  }
                }
              }catch(e) {}
            }else if(ar = one_must_be_set.exec(validate[a]))
            {
            	this_or_el = (ar[1].substring(1, ar[1].length-1));
            	try
            	{
								if((typeof el.value != "undefined") && el.value=="")
              	{
              		if(this_or_el = form.elements[this_or_el])
              		{
	               		if((typeof this_or_el.value != "undefined") && this_or_el.value=="")
	               		{
	               			err_in_el = true;
	               			err[0][err[0].length] = tmp_name;
	               		}
	               	}
              	}
            	}catch(e) {}
            }
          }
        }
        if(err_in_el)
        {
          try
          {
            if(highlitecolors[0]!="")
              el.style.borderColor = highlitecolors[0];
            if(highlitecolors[1]!="")
              el.style.backgroundColor = highlitecolors[1];
          }catch ( e ) {}
        }else
        {
            if(highlitecolors[2]!="")
              el.style.borderColor = highlitecolors[2];
            if(highlitecolors[3]!="")
              el.style.backgroundColor = highlitecolors[3];
        }
      }
    }
    total_errs = 0;
    for(a=0;a<err.length;a++)
      total_errs += err[a].length;
    if(total_errs>0)
    {
      err_txt = labels[5] + ":\n\n";
      for(a=0;a<err.length;a++)
      {
        if(err[a].length>0)
        {
          err_txt += labels[a] + ":\n" + err[a].join(", ") + "\n\n";
        }
      }
      alert(err_txt);
    }else
      return true;
  }
  return false;
}

function checkEmail(email)
{
  //regexp = /(\w+\-?\.?\w+\-?\w+)+@(\w+\-?\w+)(\.\w+)/;
  //return (("" + email).match(regexp) || ("" + email)=="");

  regexp = /\w+([\.\-_]{1}\w+)*@(\w+([\.\-_]{1}\w+)*)\.(\w{2,4})/;

  test = ("" + email).match(regexp);
  if(test && typeof test[0] != "undefined") test = test[0];
  return (test==email || ("" + email)=="");
}

function 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 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 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((checkNumeric(first) == 0) && (checkNumeric(second) == -1) && (checkNumeric(third) == -1))
			return true;
	}

	return false;
}

function cleanPostalCode(code)
{
	var postcode = removeSpaces(code.value);
  var first  = postcode.substring(0,4);
  var second = postcode.substring(4,6);
  if(checkNlPostalCode(postcode))
		code.value = first+' '+second.toUpperCase();
}

function checkNumeric(number)
{
  res = 0;
  if(number != ((number/2)*2))
  {
    res--;
    if((""+number).indexOf(",")!=-1)
      res--;
  }
  return res;
}

function getGoodName(old, actions)
{
  for(var i=0; i < actions.length; i++)
  {
    if(actions[i][0])
    {
      switch(actions[i][0])
      {
        case "substring":
          if(actions[i][2]=="-1")
            old = (""+old).substring(actions[i][1]);
          else
            old = (""+old).substring(actions[i][1], actions[i][2]);
        break;

        case "replace":
          while(old.indexOf(actions[i][1])!=-1)
            old = (""+old).replace(actions[i][1], actions[i][2]);
        break;

        case "ucfirst":
          old = (old.substring(0, 1)).toUpperCase() + old.substring(1);
        break;
      }
    }
  }
  return old;
}


function checkAccountNumber(number)
{
  /* Maak sommige hoofd-variabelen */
  total = 0;
  count = 9;
  numberlength = 0;

  /* Maak een loop om elk afzonderlijk cijfer uit het hele nummer te halen.
     En vermeenvuldig het met $count (Deze begint bij 9 en loopt af.) */
  for(var i=0;i<number.length;i++)
  {
   number_temp = (""+number).substr(i,1);
   if(!checkNumeric(number_temp))
   {
    total = total + number_temp * count;
   	count--;
    numberlength++;
   }
  }

  /* Is het getal zonder punten en streepjes 9 cijfers lang? */
  if(numberlength != 9)
  	return false;

  /* Kijk of de som ($total) van alle cijfers in het nummer deelbaar is door 11.
     Hier mag ook geen cijfer achter de komma uitkomen! */
  if (total % 11 == 0){ return true; } else { return false; }

}

function removeSpaces(string)
{
  var tstring = "";
  string = '' + string;
  splitstring = string.split(" ");
  for(i = 0; i < splitstring.length; i++)
  tstring += splitstring[i];
  return tstring;
}

function doSubmit(dovalidate, str_replace, formname)
{
  var result = true;
  var nameActions = new Array();

  if(typeof dovalidate =='undefined' || dovalidate)
  {
  	if(typeof str_replace != 'undefined')
  	{
  		nameActions = new Array(new Array("replace", str_replace, ""),
  														new Array("replace", "_", " "),
  														new Array("replace", "[", ""),
  														new Array("replace", "]", ""),
                              new Array("ucfirst")
                             );
  	}
  	else
  	{
   		nameActions = new Array(new Array("substring", "2", "-1"),
  														new Array("replace", "_", " "),
                              new Array("ucfirst")
                             );
  	}

    result = doValidate(document.forms[formname],
                        new Array(),
                        new Array("red",
                        					"white",
                                  "black",
                                  "white"),
                        nameActions
                       )


  }

  return result;
}
