/*********************************************************

			Framework de validação HomeWebbing
				
							última modificação: 05/07/2007
*********************************************************/

/**********************************************************
Função apelidada de coração do framework: Cria um array
dos elementos dos forms e chama função para verificar campo a campo
**********************************************************/
function hw_framework()
{
  var formNodes = document.getElementsByTagName("form");
  for(var i=0; i<formNodes.length; i++)
  {
    formNodes[i].hw_validator = new hw_formValidator(formNodes[i]);
    if(typeof formNodes[i].onsubmit != "function")
    {
      formNodes[i].onsubmit = function()
      {
        return hw_validForm(this);
      }
    }
    else
    {
	  //pega função que existe no onSubmit do Form, e aloca no atributo "hw_oldSubmit"
      formNodes[i].hw_oldSubmit = formNodes[i].onsubmit;
      formNodes[i].onsubmit = function()
      {
		//executa função que já havia no onSubmit, e se der ok, será retornado TRUE
        if(this.hw_oldSubmit())
        {
          return hw_validForm(this);
        }
        return false;
      }
    }
  }
}
/**********************************************************
hw_validForm: apresenta a mensagem de erro caso tenha
**********************************************************/
function hw_validForm(formNode)
{
  var errorMsg = "";
  var formValidator = formNode.hw_validator;
  if(formValidator){
    var focusGiven = false;
    var invalidFields = new Array();
    for(var i=0; i<formValidator.validators.length; i++){
      if(formValidator.validators[i].validate()){
        errorMsg += formValidator.validators[i].message+"\n";
        invalidFields[invalidFields.length] = formValidator.validators[i];
        if(!focusGiven && (formValidator.validators[i].type == "text")){
          formValidator.validators[i].getFocus();
          focusGiven = true;
        }
      }
    }
    if(errorMsg != "")
    {
      var error = new alertError(errorMsg);
    }
  }
  return errorMsg.length==0;
}

/**********************************************************
hw_formValidator: chama as funções apartir dos atributos
**********************************************************/
function hw_formValidator(formNode)
{
  this.validators = new Array();
  var fieldsArray = hw_getTextfieldNodes(formNode);
  for(var i=0;i<fieldsArray.length;i++)
  {
    this.validators[this.validators.length] = hw_textValidator(fieldsArray[i]);
    if(fieldsArray[i].getAttribute("hw-filterInfo"))
    {
      addEvent(fieldsArray[i],"keyup",function(){hw_filterField(this);});
      addEvent(fieldsArray[i],"blur",function(){hw_filterField(this);});
    }
    if(fieldsArray[i].getAttribute("hw-maskFormat"))
    {
      addEvent(fieldsArray[i],"keydown",function(){hw_maskFormat(this);});
      addEvent(fieldsArray[i],"blur",function(){hw_maskFormat(this);});
    }
  }
}

/**********************************************************
hw_getTextfieldNodes: cria um array com os input type=text
**********************************************************/
function hw_getTextfieldNodes(startNode)
{
  var inputsArray = new Array();
  var inputNodes = startNode.getElementsByTagName("input");
  for(var i=0; i<inputNodes.length; i++)
  {
    if(!inputNodes[i].getAttribute("type"))
    {
      inputNodes[i].setAttribute("type","text");
    }
    var fieldType = inputNodes[i].getAttribute("type").toLowerCase();
    if(fieldType == "text")
    {
      inputsArray[inputsArray.length] = inputNodes[i];
    }
  }
  return inputsArray;
}

/**********************************************************
hw_textValidator: ver se é requerido ou passa pelas regras
de validações (ao submeter o formulario)
**********************************************************/
function hw_textValidator(fieldNode)
{
  var obj = new hw_abstractValidator(fieldNode);
  obj.type = "text";
  var required = false;
  if(fieldNode.getAttribute("hw-required")){
    required = fieldNode.getAttribute("hw-required");
  }
  
  obj.getFocus = function(){
    try{
      fieldNode.focus();
      fieldNode.select();
    }
    catch(exception){}
  }
  obj.isEmpty = function(){
    return fieldNode.value == "";
  }
  
  obj.isRequired = function(){
    return required;
  }
  obj.isValid = function(){
    if(obj.isEmpty()){
      if(obj.isRequired()){
        return false;
      }else{
        return true;
      }
    }else{
      for(var rule in hw_globalRules){
        if(fieldNode.getAttribute("hw-" + rule)){
          if(!eval("hw_globalRules." + rule + "(fieldNode)")){
            return false;
          }
        }
      }
    }
    return true;
  }
  return obj;
}

/**********************************************************
hw_abstractValidator: pega o texto hw-message, e coloca o
texto flutuante no input com erro
**********************************************************/
function hw_abstractValidator(fieldNode)
{
  this.message = "";
  this.name = fieldNode.name;
  if(fieldNode.getAttribute("hw-message"))
  {
    this.message = fieldNode.getAttribute("hw-message");
  }
  this.flagInvalid = function()
  {
    fieldNode.setAttribute("title", this.message);
    fieldNode.setAttribute("alt", this.message);
  }
  this.flagValid = function(){
    fieldNode.removeAttribute("title");
    fieldNode.removeAttribute("alt");
  }
  
  this.validate = function(){
    if(fieldNode.disabled){
      this.flagValid();
      return false;
    }
    if(!this.isValid()){
      this.flagInvalid();
      return true;
    }else{
      this.flagValid();
      return false;
    }
  }
}

/**********************************************************
hw_filterField: pegas as filtragens em uso
**********************************************************/
function hw_filterField(fieldNode)
{
  var filtersArray = fieldNode.getAttribute("hw-filterInfo").split(",");
  for(var i=0; i<filtersArray.length; i++)
  {
    var filtObj = hw_globalFilters[filtersArray[i]];
    if(filtObj)
    {
      fieldNode.value = fieldNode.value.replace(filtObj.rex,filtObj.str)
    }
  }
}

/**********************************************************
hw_globalFilters: regras de filtragem
**********************************************************/
var hw_globalFilters = new Object;
hw_globalFilters.alphanumericonly	= hw_filterInfo("[^\\w]", "");
//hw_globalFilters.alphatextonly		= hw_filterInfo("[^\\w\\s]", "");
hw_globalFilters.alphatextonly		= hw_filterInfo("[^a-zA-Zà-ú\\s.]", "");
hw_globalFilters.numbersonly		= hw_filterInfo("[^\\d]", "");
hw_globalFilters.lettersonly 		= hw_filterInfo("[^a-zA-Z]", "");
hw_globalFilters.nospaces			= hw_filterInfo("\\s*", "");
hw_globalFilters.nocommas			= hw_filterInfo(",", "");
hw_globalFilters.nodots				= hw_filterInfo("\\.", "");
//hw_globalFilters.numberspecial		= hw_filterInfo("[^0-9.-/]]", "");
hw_globalFilters.numberspecial		= hw_filterInfo("[^\\d\\.\\-\\/]", "");

//hw_filterInfo("[a-zA-Z\\s]", "");

/**********************************************************
hw_filterInfo: executa a filtragem
**********************************************************/
function hw_filterInfo(rex,replaceStr)
{
  var infoObj = new Object;
  infoObj.rex = new RegExp(rex,"g");
  infoObj.str = replaceStr;
  return infoObj;
}

/**********************************************************
hw_globalRules.validField: executa o validField
**********************************************************/
var hw_globalRules = new Object;
hw_globalRules.validField = function(fieldNode)
{
  var reg = hw_globalValids[fieldNode.getAttribute("hw-validField")];
  if(reg){
    return reg.test(fieldNode.value);
  }
  else{
    return true;
  }
}

/**********************************************************
hw_globalValids: regras de validação
**********************************************************/
var hw_globalValids = new Object;
hw_globalValids.email = new RegExp("^[\\w\\.=-]+@[\\w\\.-]+\\.[\\w\\.-]{2,4}$");
hw_globalValids.cpf = new RegExp("\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2}");
hw_globalValids.cnpj = new RegExp("\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2}");
hw_globalValids.cep = new RegExp("\\d{5}\\-\\d{3}");
hw_globalValids.shortdate = new RegExp("\\d{2}\\/\\d{4}");

/**********************************************************
hw_alertError: mensagem de erro
**********************************************************/
function alertError(errorMsg)
{
  alert(errorMsg);
}

/**********************************************************
hw_maskFormat: executa a formatação da mascara
**********************************************************/
function hw_maskFormat(fieldNode)
{
  var mask = fieldNode.getAttribute("hw-maskFormat");
  var src = fieldNode;
  var i = fieldNode.value.length;
  var endText = mask.substring(0,1);
  var text = mask.substring(i);
  if(text.substring(0,1) != endText)
  {
    src.value += text.substring(0,1);
  }
}

/**********************************************************
Função apelidada de ouvido do framework: Verifica os eventos
ocorridos na pagina visitada para chamar uma determinada função
**********************************************************/
function addEvent(obj, type, fn)
{
  if(obj.addEventListener)
  {
    obj.addEventListener(type, fn, false);
  }
  else if(obj.attachEvent)
  {
    obj["e" + type + fn] = fn;
    obj[type + fn] = function()
    {
      obj["e" + type + fn](window.event);
    }
    obj.attachEvent("on" +type, obj[type+fn]);
  }
}

addEvent(window, "load", hw_framework);


//Função limitadora de caracteres
function Contador(field,MaxLength,cont) {
  obj = document.getElementById(field);
  if (MaxLength !=0) {
	 if (obj.value.length > MaxLength)  {
		obj.value = obj.value.substring(0, MaxLength);
		}
  }
  if(cont.length>0) document.getElementById(cont).innerHTML= (MaxLength - obj.value.length)+" caracteres restantes";
}
