//Verifica se a string recebida e uma data valida
function validaData(str) {
    str = trim(str) 

    //Data nao preenchida
    if(str == "")
        return 1

    //Data em formato invalido (o formato correto e dd/mm/aaaa)
    stt = str.split("/")
    if((stt.length != 3) || (stt[0].length != 2) || (stt[1].length != 2) || (stt[2].length != 4))
        return 2

    //Verificacao da quantidade de meses ser maior q doze
    m = parseInt(stt[1])
    if(m > 12) 
        return 3

    //Verificando os dias dos meses e a quantidade de dias q cada mes tem pra ver se ta ok
    qtD = 0
    if((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12)) {
        qtD = 31
    } else if(m == 2) {
        qtD = ((parseInt(stt[2]) % 4) != 0 ? 28 : 29)
    } else {
        qtD = 30
    } 
    if(parseInt(stt[0]) > qtD) 
        return 4   //O numero de dias e maior do que aquele que o mes especificado possui

    //Verificacao de que o dia nao seja zero
    if(parseInt(stt[0]) == 0)
        return 5

    //Verificacao de que o mes nao seja zero
    if(parseInt(stt[1]) == 0)
        return 6
    return 0
}

//Retira espacos em branco da string (antes e depois)
function trim(st) {
    st = st.replace(/^\s*(\w|\W)/,"$1") 
    st = st.replace(/(\w|\W)\s*$/,"$1") 
    /*Se a string estiver totalmente preenchida com espacos as operacoes acima 
     deixam a string como ' ' e nao ''. Isto e corrigido a seguir.
    */
    if(st == " ")  
        st = ""
    return st
}

//So deixa q sejam pressionadas as teclas numericas e '/'
function soData(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 47 || charCode > 57)) {
        status = "Este campo aceita apenas datas."
        return false
    }
    status = ""
    return true
}

//So deixa que sejam pressionadas as teclas numericas
function soNumero(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
      status = "Este campo aceita apenas números."
      return false
    }
    status = ""
    return true
}

/*
Valida um campo de texto (Ve se esta vazio e retira os espacos anteriores e 
finais ao texto do campo

OBS. RECEBE o OBJETO e nao a string do campo...
*/
function validaTxt(campo) {
  campo.value = trim(campo.value)
  if (campo.value == "") {
     campo.focus()
     return false
  }
  return true
}

//So deixa que sejam pressionadas as teclas numericas e a tecla '.'
function soDouble(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57) && (charCode != 46)) {
      status = "Este campo aceita apenas números."
      return false
    }
    status = ""
    return true
}

/*
Valida um campo de texto para ver se contem um valor do tipo double
A entrada deve ser um campo de texto com apenas numeros e pontos ou vazio

OBS. RECEBE o OBJETO e nao a string do campo...

retorna 0 se estiver tudo ok
retorna 1 se o campo nao estiver preenchido
retorna 2 se o campo contem um numero com mais de um ponto
*/
function validaDouble(campo) {
  campo.value = trim(campo.value)
  if (campo.value == "") {
     campo.focus()
     return 1
  }
  if(campo.value.indexOf('.') != campo.value.lastIndexOf('.')) {
    campo.focus()
    return 2
  }
  return 0
}

//valTxt(ObjetoASerValidado, nomeDoCampo)
function valTxt(obj, nmField) {
  if(!validaTxt(obj)) {
    alert("Preencha o campo \'" + nmField + "\'.")
    return false
  }
  return true
}

//Recebe o objeto e o título dele para o usuário
function valDat(obj, nmField) {
  switch(validaData(obj.value)) {
    case 1:
      alert("Voce nao preencheu o campo \'" + nmField + "\'.")
      obj.focus()
      return false
    case 2:
      alert("A data presente no campo \'" + nmField + "\' deve estar no formado \'dd/mm/aaaa\'.")
      obj.focus()
      return false
    case 3:
      alert("A data presente no campo \'" + nmField + "\' possui um numero de meses maior do que o existente no ano.")
      obj.focus()
      return false
    case 4:
      alert("A data presente no campo \'" + nmField + "\' possui um numero de dias invalido.")
      obj.focus()
      return false
    case 5:
      alert("Nao existe o dia indicado pela data presente no campo \'" + nmField + "\'.")
      obj.focus()
      return false
    case 6:
      alert("Nao existe o mês especificado na data presente no campo \'" + nmField + "\'.")
      obj.focus()
      return false
  }
  return true
}

//REcebe o objeto do campo e o nome dele (pro usuário)
function valDbl(obj, nmField) {
  if(validaDouble(obj) != 0) {
    obj.focus()
    alert("O campo \'" + nmField + "\' contém um número inválido ou está vazio.")
    return false
  }
  return true
}

//Recebe o objeto de um combo e verifica se a opcao selecionada nao e a primeira
//Geralmente a primeira e do tipo : Escolha...
function valCbo(cbo, nmField) {
  if(cbo.selectedIndex == 0) {
    alert("Escolha uma opçao do campo \'" + nmField + "\'.")
    cbo.focus()
    return false
  }
  return true
}

//REcebe um objeto Radio e verifica se um elemento foi selecionado
function valRadio(radio, nmRadio) {
  for ( i = 0; i < radio.length; i++) {
    if (radio[i].checked) {
      return true
    }
  }
  alert( "Você não selecionou um elemento do campo"  + nmRadio)
  radio[0].focus()
  return false
}


//Recebe o objeto de uma TextArea e verifica se existe algum texto presente nele
function valTA(ta, nmField) {
  ta.value = trim(ta.value)
  if(ta.value == "") {
    alert("Voce nao preencheu o campo \'" + nmField + "\'.")
    ta.focus()
    return false
  }
  return true
}

/*
  Recebe duas datas em strings no formato 'dd/mm/aaaa' e retorna falso se a 
  segunda data for menor que a primeira

  Weslei A. de T. Marinho 21/11/2003 19:38
*/
function isMajorDate(dtStart, dtEnd) {
  ds = dtStart.split("/")
  de = dtEnd.split("/")
  if (parseInt(de[2]) < parseInt(ds[2])) { //ano da final menor -> final menor
    return false
  } else if (parseInt(de[2]) == parseInt(ds[2])) { // anos iguais
    //anos iguais e mes da final menor que inicial -> final menor
    if (parseInt(de[1]) < parseInt(ds[1])) { 
      return false
    } else if (parseInt(de[1]) == parseInt(ds[1])) { //anos iguais e meses iguais
      //anos e meses iguais, mas dia da final menor que inicial -> final menor
      if (parseInt(de[0]) < parseInt(ds[0])) {
        return false
      }
    }
  }
  return true // a primeira e maior que a segunda
}

/*
  Esta funçao utiliza a funçao isMajorDate para verificar se uma data presente 
  em um objeto de texto de um formulário html é maior que outra presente no 
  segundo objeto recebido. Os outros dois parametros são os nomes dos campos 
  ser efetuada um alerta ao usuário em caso de data menor.

  Weslei A. de T. Marinho 21/11/2003 20:02
*/
function valMajorDate(dtStartObj, dtEndObj, nmDtStartField, nmDtEndField) {
  if (!isMajorDate(dtStartObj.value, dtEndObj.value)) {
    str = "A data presente no campo '" + nmDtStartField + "' deve ser menor\n"
    str += "ou igual à presente no campo '" + nmDtEndField + "'."
    dtStartObj.focus()
    alert(str)
    return false
  }
  return true
}

