  

  function validate(formName)
  {
    try {
      var formMain = document.getElementById(formName);
      var elements = formMain.elements;
      var errors = new Array();
      for (var i=0;i<elements.length;i++)
      {
        var element = elements[i];
        //this prevents diferent access from browsers
        element.name = element.getAttribute("name");
        if (validateMandatory(element, errors)){
          validateType(element,errors);
        }
      }
      if (errors.length > 0 ){
        displayErrors(errors);        
        return false;
      }
      return true;
    } catch (err) {
      alert(err.toString());
      throw err;
      return false;
    }
  }
  function validateMandatory(element, errors){
    var mandatory = element.getAttribute("mandatory");
    if (mandatory==null || isEmpty(mandatory) || mandatory=="false"){ return true; }
    //disabled fields must not be validated
    if (element.disabled) return false;
    
    var fieldname = element.getAttribute("fieldname");
    var validateMandatory = mandatory=="true";
    if (!validateMandatory){
      validateMandatory = eval(mandatory);
    }
    if (validateMandatory){
      if (element.tagName.toLowerCase() == "input"){
        if (isEmpty(element.value)){
          errors[errors.length] = new ValidationError(element.name, fieldname + " é obrigatório.");
          return false;
        }
      } else if (element.tagName.toLowerCase() == "select"){
          var index = element.selectedIndex;
          if (index == -1 || element.options[index].value == ""){
            errors[errors.length] = new ValidationError(element.name, fieldname + " é obrigatório.");
            return false;
          }
      }
    }
    return true;
  }
  function validateType(element, errors){
    if (element.tagName.toLowerCase() != "textarea"){
      if (!element.getAttribute("fieldtype") || isEmpty(element.value)){
        return;
      }
    }
    var fieldtype = element.getAttribute("fieldtype");
    var fieldname = element.getAttribute("fieldname");
    switch (fieldtype)
    {
      case "number":
        var re = /^\d*$/;
        if (!re.test(element.value))
          errors[errors.length] = new ValidationError(element.name, fieldname + " deve ser numérico.");
        break;
      case "cep":
        var re = /^\d{5}-\d{3}$/;
        if (!re.test(element.value))
          errors[errors.length] = new ValidationError(element.name, fieldname + " deve estar no formato 99999-999.");
        break;
      case "email":
        var re = /^\w+@\w+(\.\w+)+$/;
        if (!re.test(element.value))
          errors[errors.length] = new ValidationError(element.name, fieldname + " é inválido.");
        break;
      case "cnpj":
        var re = /^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/;
        if (!re.test(element.value))
          errors[errors.length] = new ValidationError(element.name, fieldname + " deve estar no formato 99.999.999/9999-99.");
        break;
      case "cpf":
        var re = /^\d{3}\.\d{3}\.\d{3}-\d{2}$/;
        if (!re.test(element.value))
          errors[errors.length] = new ValidationError(element.name, fieldname + " deve estar no formato 999.999.999-99.");
        break;
      case "money":
        /*/(\d{1,11})|(*/
        var re = /^(\d{1,3})(\.\d{3}){1,3}(,\d{1,2})?$/;
        var re2 = /^\d{1,11}(,\d{1,2})?$/; 
        var re3 = /^[1-9]$/;
        var passed = re.test(element.value);
         //alert("passed 1" + passed);
        if (passed==false) { passed = re2.test(element.value); 
        //alert("passed 2" + passed);   
        }
        if (passed==true) { passed = re3.test(element.value.substring(0,1)); 
        //alert("passed 3 " + element.value.substring(0,1) + " : " + passed); 
        }
        if (!passed){
          errors[errors.length] = new ValidationError(element.name, fieldname + " deve ser um valor monetário válido.");
        }
        break;
      case "textarea":
        var maxlength = parseInt( element.getAttribute("maxlength") );
        if (maxlength > 0 && maxlength <  (" "+element.value).length)
        {
          errors[errors.length] = new ValidationError(element.name, fieldname + " não deve ser maior que " + maxlength + " caracteres.");
        }
        
    }
  }
  function getRadioValue(radioName)
  {
    var elements = document.getElementsByName(radioName);
    for (var i=0;i<elements.length;i++)
    {
      if (elements[i].checked){
        return elements[i].value;
      }
    }
  }
  function ValidationError(name, message){
    this.name = name;
    this.message = message;
  }  
  function displayErrors(errors) 
  {
    window.location = "#errorMessageArea";
    var divArea = document.getElementById("errorMessageArea");
    divArea.innerHTML = "";
    
    for (var i=0;i<errors.length;i++)
    {
      var errorMessage = errors[i];
      var label = document.createElement( "SPAN" );
      var text = document.createTextNode( (i+1) + " - " + errorMessage.message);
      var br = document.createElement("br");
      var isIE = document.all != null;
      label.setAttribute("for", errorMessage.name);
      label.onclick = labelonclick;
      label.style.cursor = "pointer";
      label.style.color = "red";
      label.appendChild(text);
      divArea.appendChild(label);
      divArea.appendChild(br);
    }
    
  }
  function labelonclick(navEvent){
    var isIE = document.all;  
    var event =  isIE ? window.event : navEvent;
    var source = (isIE) ? event.srcElement : event.target;
    document.getElementById(source.getAttribute("for")).focus();
  }
  function isEmpty(value){
    var regExp = /^\s*$/
    return regExp.test(value);
  }
  function isNumber(value){
    var regExp = /^\d+$/
    return regExp.test(value);
  }

