/*
função de validação

1. adicionar o seguinte tag no head do html:

<script language="JavaScript" type="text/javascript" src="webcontrol/validacao_ultra.js"></script>

2. adicionar o seguinte no tag form: onsubmit="return ValidateThis(this)"

3. adicionar em cada campo __a ser validado__ os seguintes atributos:

displayname="..." : nome do campo, a ser mostrado na caixinha de reclamação

required="true" ou "false"

datatype="..." :  tipo de dados a validar (number,phone,integer,date,email,zip,ip,creditcard,hexcode,text,decimal,url)

*/
function ValidateThis(oForm)
{
  var oTemp
  var i
  
  var textregex        = /./
  var alpharegex       = /^[a-zA-Z]+$/
  var emailregex       = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/
  var phoneregex       = /^\(\d{2}\)\s?\d{7,8}(\sr\d{1,4})?$/
  var zipregex         = /^\d{5}-\d{3}$/
  var ipregex          = /^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$/
  var dateregex        = /^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
  var numberregex      = /^[-+]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?$/
  var integerregex     = /(^-?\d\d*$)/
  var guidregex        = /^[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}$/
  var creditcardregex  = /^((4\d{3})|(5[1-5]\d{2})|(6011))(-| )?\d{4}(-| )?\d{4}(-| )?\d{4}$/
  var datetimeregex    = /20\d{2}(-|\/)((0[1-9])|(1[0-2]))(-|\/)((0[1-9])|([1-2][0-9])|(3[0-1]))(T|\s)(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9])/
  var hexcoderegex     = /^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$/
  var decimalregex     = /^[-+]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?$/
  var urlregex         = /^((http|https|ftp)\:\/\/)?([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4})(\:[0-9]+)?(\/[^\/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_\-]*)*$/;

  
  for (i=0; i<oForm.length; i++)
  {
    oTemp = oForm.elements[i];
    oTemp_DataType = oTemp.getAttribute("datatype");
    oTemp_Required = !(oTemp.getAttribute("required")==0 || oTemp.getAttribute("required")=="false");
    oTemp_DisplayName = oTemp.getAttribute("DisplayName");
    
    //alert(oTemp_DisplayName+':'+oTemp_DataType+':'+oTemp_Required);
    if (oTemp && oTemp_DataType) {
      
      switch (oTemp.type) {
        case 'checkbox':
        case 'radio':
          if (oTemp_Required) {
            //alert(oTemp_DisplayName + " deve ter uma opção selecionada")
            //oTemp.focus();
            alert('script não implementado para tipo Radio');
            return false;
          }
          break;
        default:  //select et al.
          if (oTemp_Required && oTemp.value <= 0) {
            alert(oTemp_DisplayName + " deve ter uma opção selecionada")
            oTemp.focus();
            return false;
          }
          break;
        case 'text':
        case 'textarea':
          switch (oTemp_DataType)
          {
            case "number" :
                if ( numberregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {                         
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um número válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um número válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "phone" :
                if ( phoneregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um telefone válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um telefone válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um telefone válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um telefone válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "integer" :
                if ( integerregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um número inteiro válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número inteiro válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um número inteiro válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número inteiro válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "date" :
                if ( dateregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido uma data válida'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido uma data válida")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido uma data válida'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido uma data válida")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "email" :
                if ( emailregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um e-mail válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um e-mail válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um e-mail válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um e-mail válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "zip" :
                if ( zipregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um CEP válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um CEP válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um CEP válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um CEP válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "ip" :
                if ( ipregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um IP válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um IP válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um IP válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um IP válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "creditcard" :
                if ( creditcardregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um número de cartão de crédito válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número de cartão de crédito válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um número de cartão de crédito válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número de cartão de crédito válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "hexcode" :
                if ( hexcoderegex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um número hexadecimal válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número hexadecimal válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um número hexadecimal válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número hexadecimal válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "text" :
                if ( textregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um texto válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um texto válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um texto válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um texto válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case "decimal" :
                if ( (decimalregex.test(oTemp.value) != false && oTemp.value.substring(oTemp.value.lastIndexOf(".")).toLowerCase() != ".") || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido um número decimal válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número decimal válido")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido um número decimal válido'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido um número decimal válido")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
                
            case "url" :
                if ( urlregex.test(oTemp.value) != false || (!oTemp_Required && oTemp.value == ""))
                {
                     break
                }
                else
                {
                     if (document.all)
                     {
                          if ( eval("document.all.error"+oForm.name) )
                          {
                               eval("document.all.error"+oForm.name+".innerHTML = oTemp_DisplayName + ' não está preenchido uma URL válida'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido uma URL válida")
                          }
                     }
                     else
                     {
                          if ( eval("document.getElementById('error"+oForm.name+"')" ) )
                          {
                               eval("document.getElementById('error"+oForm.name+"').innerHTML = oTemp_DisplayName + ' não está preenchido uma URL válida'")
                          }
                          else
                          {
                               alert(oTemp_DisplayName + " não está preenchido uma URL válida")
                          }     
                     }
                     oTemp.focus();
                     return false;
                }
            case null:
              break;
            default :
              alert('Tipo não reconhecido: '+oTemp_DataType);
          }
        }
    }
  }
  return true
}

//funções usadas pelas outras funções mais embaixo
function sonumeros(str) {
  ernumero = /^\d$/;
  strout = '';
  for (i=0;i<=str.length;i++)
    if (ernumero.test(str.charAt(i)))
      strout += str.charAt(i);
  return strout;
}
function strpad(str,numchars,padchar) {
  if (!padchar) padchar = ' ';
  for (i=str.length; i<=numchars; i++)
    str += padchar;
  return str;
}

//funções de validação as-user-types
function keyup_zip(field) {
  str = sonumeros(field.value);
  strout = '';
  if (str.length>0) {
    strout = str.charAt(0)+str.charAt(1)+str.charAt(2)+str.charAt(3)+str.charAt(4);
    if (str.charAt(5))
      strout += '-'+str.charAt(5)+str.charAt(6)+str.charAt(7);
  }
  field.value = strout;
}
function keyup_phone(field) {
  str = sonumeros(field.value);
  strout = '';
  if (str.length>0) {
    strout = '('+str.charAt(0)+str.charAt(1);
    if (str.charAt(2))
      strout += ')'+str.charAt(2)+str.charAt(3)+str.charAt(4)+str.charAt(5)+str.charAt(6)+str.charAt(7)+str.charAt(8)+str.charAt(9);
    if (str.charAt(10))
      strout += ' r'+str.charAt(10)+str.charAt(11)+str.charAt(12)+str.charAt(13);
  }
  field.value = strout;
}