function MM_findObj(n, d)
{ //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_validateForm()
{ //v4.0
  var i, j = 1, p, q, nm, test, num, min, max, errors = '', args = MM_validateForm.arguments;
  for (i = 0; i < (args.length - 2); i += 3)
    {
    test = args[i + 2];
    obj = MM_findObj(args[i]);
    nm = (args[i + 1] != '') ? args[i + 1] : args[i];
    if (obj)
      {
      if ((obj.type == 'select-one') || (obj.type == 'select-multiple'))
        val = obj.options[obj.selectedIndex].value;
      else
        val = obj.value;
      if (val != '')
        {
        if (test.indexOf('isEmail') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*[ ]*$", "gi");
            if (!reg.test(val)) 
              errors += j++ + ') \'' + nm + '\' deve ser um endereço de e-mail válido.\n';
            }
          }
        else if (test.indexOf('isListaDeEmails') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*)[ ]*([\;]" + 
                                     "[ ]*([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*)" +
                                     "[ ]*)*[ ]*[\;]?[ ]*$", "gi");
            if (!reg.test(val)) 
              errors += j++ + ') \'' + nm + '\' deve ser um endereço de e-mail válido (ou uma lista de endereços ' +
                            'separados por \';\').\n';
            }
          }
        else if (test.indexOf('isTelefoneSemDDD') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{3,4})[ ]*-?[ ]*([0-9]{4})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser um nº de telefone válido, sem o DDD [ex: 3252-2237].\n';
            else
              obj.value = RegExp.$1 + '-' + RegExp.$2;
            }
          }
        else if (test.indexOf('isTelefoneComDDD') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*[\(]?[ ]*0?([0-9A-Za-z]{2})?([0-9]{2})[ ]*[\)]?[ ]*([0-9]{3,4})[ ]*-?[ ]*" + 
						                         "([0-9]{4})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser um nº de telefone válido, com o DDD [ex: (19)3252-2237].\n';
            else
              obj.value = '(' + RegExp.$2 + ')' + RegExp.$3 + '-' + RegExp.$4;
            }
          }
        else if (test.indexOf('isDataDDMMAAAA') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{1,2})[ ]*[/-]?[ ]*([0-9]{1,2})[ ]*[/-]?[ ]*([0-9]{4})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser uma data válida no formato DD/MM/AAAA [ex: 31/01/2001].\n';
            else if ((!(RegExp.$1 >= 1 && RegExp.$1 <= 31)) || (!(RegExp.$2 >= 1 && RegExp.$2 <= 12)))
              errors += j++ + ') \'' + nm + '\' deve ser uma data válida no formato DD/MM/AAAA [ex: 31/01/2001].\n';
            else
              obj.value = ((Number(RegExp.$1) < 10) ? '0' : '') + Number(RegExp.$1) + '/' + 
                              ((Number(RegExp.$2) < 10) ? '0' : '') +  Number(RegExp.$2) + '/' + RegExp.$3;
            }
          }
        else if (test.indexOf('isDataMMDDAAAA') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{1,2})[ ]*[/-]?[ ]*([0-9]{1,2})[ ]*[/-]?[ ]*([0-9]{4})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser uma data válida no formato MM/DD/AAAA [ex: 01/31/2001].\n';
            else if ((!(RegExp.$1 >= 1 && RegExp.$1 <= 12)) || (!(RegExp.$2 >= 1 && RegExp.$2 <= 31)))
              errors += j++ + ') \'' + nm + '\' deve ser uma data válida no formato MM/DD/AAAA [ex: 01/31/2001].\n';
            else
              obj.value = ((Number(RegExp.$1) < 10) ? '0' : '') + Number(RegExp.$1) + '/' + 
                              ((Number(RegExp.$2) < 10) ? '0' : '') +  Number(RegExp.$2) + '/' + RegExp.$3;
            }
          }
        else if (test.indexOf('isURL') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*(http://)?([a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*)[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser uma URL válida [ex: http://www.uol.com.br].\n';
            else
              obj.value = 'http://' + RegExp.$2;
            }
          }
        else if (test.indexOf('isCEP') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{5})*-?([0-9]{3})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser um n° de CEP válido [ex: 13095-020].\n';
            else
              obj.value = RegExp.$1 + '-' + RegExp.$2;
            }
          }
        else if (test.indexOf('isCPF') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{1,3})[\.]?([0-9]{3})[\.]?([0-9]{3})-?([0-9]{2})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser um n° de CPF válido [ex: 65.294.393-91].\n';
            else
              obj.value = RegExp.$1 + '.' + RegExp.$2 + '.' + RegExp.$3 + '-' + RegExp.$4;
            }
          }
        else if (test.indexOf('isCNPJ') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{2})[\.]?([0-9]{3})[\.]?([0-9]{3})/?([0-9]{4})-?([0-9]{2})[ ]*$", "gi");
            if (!reg.test(val))
              errors += j++ + ') \'' + nm + '\' deve ser um n° de CNPJ válido [ex: 26.895.574/0001-00].\n';
            else
              obj.value = RegExp.$1 + '.' + RegExp.$2 + '.' + RegExp.$3 + '/' + RegExp.$4 + '-' + RegExp.$5;
            }
          }
        else if (test.indexOf('is_CPF_CNPJ') != -1)
          {
          if (window.RegExp)
            {
            var reg = new RegExp("^[ ]*([0-9]{2})[\.]?([0-9]{3})[\.]?([0-9]{3})/?([0-9]{4})-?([0-9]{2})[ ]*$", "gi");
            if (!reg.test(val))
              {
              var reg2 = new RegExp("^[ ]*([0-9]{1,3})[\.]?([0-9]{3})[\.]?([0-9]{3})-?([0-9]{2})[ ]*$", "gi");
              if (!reg2.test(val))
                errors += j++ + ') \'' + nm + '\' deve ser um n° de CPF ou CNPJ válido.\n';
              else
                obj.value = RegExp.$1 + '.' + RegExp.$2 + '.' + RegExp.$3 + '-' + RegExp.$4;
              }
            else
              obj.value = RegExp.$1 + '.' + RegExp.$2 + '.' + RegExp.$3 + '/' + RegExp.$4 + '-' + RegExp.$5;           
            }
          }
        else if (test != 'R')
          {
          val = String(val).replace(',', '.');
          if (isNaN(val)) 
            errors += j++ + ') \'' + nm + '\' deve ser um número.\n';
          if (test.indexOf('inRange') != -1)
            {
            p = test.indexOf(':');
            min = Number(test.substring(8, p));
            max = Number(test.substring(p + 1));
            val = Number(val);
            if (val < min || max < val) 
              errors += j++ + ') \'' + nm + '\' deve ser um número entre ' + min + ' e ' + max + '.\n';
            }
          }
        }
      else if (test.charAt(0) == 'R')
        errors += j++ + ') \'' + nm + '\' é um campo requerido.\n';
      }
    }
  if (errors) 
    alert('Os seguintes erros foram observados no preenchimento do formulário:\n\n' + errors);
  document.MM_returnValue = (errors == '');
}

