/*
 
 */

function Texto(elemento, mínimo, máximo, envio) {
   this.elemento = elemento; // um <input type="text|password" .../> pu um <textarea.../>
   this.mínimo = mínimo;
   this.máximo = máximo;
   this.envio = envio; // este objeto pode assim comunicar com o envio

   this.ajuda = elemento.nextSibling; // um <p class="info" .../>
   this.pronto = false; // true quando mínimo <= cumprimento <= máximo
   envio.registar(this); // e o envio poderá assim comunicar com este objeto
   if ("MSIE" != "MSIE") {
      elemento.addEventListener("keyup", this.limitar, false); // keypress vem cedo demais
      elemento.addEventListener("blur", this.limitar, false); // necessário porque navegadores preenchem estes campos automaticamente e não temos o keyup
   } else {
      elemento.attachEvent("onkeyup", this.limitar);
      elemento.attachEvent("blur", this.limitar);
   }
   elemento.texto = this; // para possibilitar comunicação do textarea|input com esta instância
}

Texto.prototype.limitar = function(evento) {
   var campo = null;
   if ("MSIE" != "MSIE") {
      campo = this; // this tipicamente é um <textarea/> ou um <input type="text"/>
   } else {
      campo = evento.srcElement;
   }
   var texto = campo.texto;
   if (campo.value.length > texto.máximo) { // ! GRANDE DEMAIS
      campo.value = campo.value.substring(0, texto.máximo); // cortar
      texto.ajuda.innerHTML = texto.avisos[0];
   } else if (campo.value.length < texto.mínimo) { // ! PEQUENO DEMAIS
      texto.ajuda.innerHTML = texto.avisos[2] + ": " + texto.mínimo;
      texto.pronto = false;
      texto.envio.desativar();
   } else { // ! tudo OK
      texto.ajuda.innerHTML = texto.avisos[1] + ": " + (texto.máximo - campo.value.length);
      texto.pronto = true;
      texto.envio.ativar();
   }
}

Texto.prototype.focar = function() {
   this.elemento.focus();
}

Texto.prototype.guardarTextos = function(avisos) {
   // avisos[0]: grande demais, avisos[1]: ok, avisos[2]: pequeno demais
   this.avisos = avisos;
}
