function Numerico(e){
	var tecla;
	tecla  = e.keyCode;
	if (tecla == 0) //é mozilla
		tecla = e.charCode; // é para o Mozilla
	if (tecla < 30 || (tecla > 47 && tecla < 58)) 
		return;
	e.returnValue = false;				
	try{
		e.preventDefault();  // é para o Mozilla
		}
	catch(e){}							
}

/**************************************************************************************************
Função    : function FormataData()
Descrição : Formata data no formato "dd/mm/aaaa"
**************************************************************************************************/
function FormataData(Campo){
    if (Campo.value.length == 2){
        Campo.value += '/';
    }
    if (Campo.value.length == 5){    
        Campo.value +=  '/';
    }
    return true; 
}

/**************************************************************************************************
Função    : function FormatarValor()
Descrição : Formatação de campo Valor (com ponto e vírgula automáticos)
**************************************************************************************************/
function FormatarValor(Campo){
	if (Campo == '')
		Campo = '0';
	if (Campo.substr(0,1) == ',' || Campo.substr(0,1) == '.')
		Campo = '0,' + Campo.substr(1);
	var i;
	i=0;
	while(i<Campo.length){
		if(Campo.substr(i,1) == '.'){
			Campo = Campo.substr(0,i) + Campo.substr(i+1);
		}
		else
			i++;
	}
	if (Campo.indexOf(',') == -1)
		Campo= Campo + "," + "00"; 
	else 
	{
		var decimal = Campo.substr(Campo.indexOf(',') + 1, Campo.length);
		if (decimal.length == 0) 
			Campo = Campo + "00"; 
   		else if (decimal.length == 1)
   			Campo = Campo + "0"; 
   		else if (decimal.length >= 2)
   		{
			i=0;
			while(i<decimal.length)
			{
				if(decimal.substr(i,1) == '.' || decimal.substr(i,1) == ',')
				{
					decimal = decimal.substr(0,i) + decimal.substr(i+1);
				}
				else
					i++;
			}
			if(decimal.length==0)
				Campo = Campo.substr(0,Campo.indexOf(',')+1) + "00";
			else if(decimal.length==1)
				Campo = Campo.substr(0,Campo.indexOf(',')+1) + decimal + "0";
			else if(decimal.length>=2)
				Campo = Campo.substr(0,Campo.indexOf(',')+1) + decimal.substr(0,2);
		}
	}
	var cont = 0;
	var inteira = Campo.substr(0,Campo.length-3);
	for (i = inteira.length; i >= 0; i--) 
	{
		cont = cont + 1;
		if ((cont == 3) && (i > 1) && (inteira.substr(i-2,1) != '.')) 
		{
			inteira = inteira.substr(0,i-1) + '.' + inteira.substr(i-1,inteira.length);
			cont = 0;
		}	
	}
	Campo = inteira + Campo.substr(Campo.length-3);
	return Campo;
}

/**************************************************************************************************
Função    : function DesformatarValor()
Descrição : Desformata o campo de Valor
**************************************************************************************************/
function DesformatarValor(obj){
   var bTiraZeros = false;
   //Verifica se os últimos valores são zeros
   if (obj.value.substr(obj.value.length - 3, 3) == ',00') bTiraZeros = true;
   //Desformata o campo
   while (obj.value.indexOf(',') != -1) obj.value = obj.value.replace(',','');
   while (obj.value.indexOf('.') != -1) obj.value = obj.value.replace('.','');
   //Retira os zeros do final se necessário
   if (bTiraZeros) obj.value = obj.value.substr(0, obj.value.length - 2);
}

/**************************************************************************************************
Função    : function DigitarValorMoeda()
Descrição : Permite digitar somente numeros, virgula e ponto
**************************************************************************************************/
function DigitarValorMoeda(e){
	var tecla;
	tecla  = e.keyCode;
	if (tecla == 0) //é mozilla
		tecla = e.charCode; // é para o Mozilla
	if (tecla < 30 || (tecla > 47 && tecla < 58) || tecla == 44 || tecla == 46) 
		return;
	e.returnValue = false;
	try {
		e.preventDefault();  // é para o Mozilla
	}
	catch(e){}							
}

function _removeAllBut(validChars, value) {
  var output=new Array();
  for(var i=0; i<value.length; i++) {
    var c=value.charAt(i);
    if(validChars.indexOf(c)!=-1) {
      output.push(c);
    }
  }
  return output.join("");
}

/*
 * required="true"
 *
 */
function _required(form, element, value) {
  if(value && element.value.length==0) {
    return false;
  }
  return true;
}

/*
 * content="numeric"
 *
 * may be used in conjunction of decimalSeparator and groupingSeparator
 *
 * digits
 * numeric
 * alphabetic
 * alphanumeric
 */
var _contentTypes=new Array();
_contentTypes["digits"]=_validateDigits;
_contentTypes["numeric"]=_validateNumeric;
_contentTypes["alphabetic"]=_validateAlphabetic;
_contentTypes["alphanumeric"]=_validateAlphanumeric;
_contentTypes["email"]=_validateEmail;
_contentTypes["cpf"]=_validateCPF;
_contentTypes["cnpj"]=_validateCNPJ;

function _contentType(form, element, value) {
  return _contentTypes[value](element.value, element);
}

/*
 * returns true is value contains only digits
 *
 */
function _validateDigits(value, element) {
  var re=/^\d*$/
  return re.test(value);
}

/*
 * returns true if value is a number
 */
function _validateNumeric(value, element) {
  var groupingSeparator=element.getAttribute("groupingSeparator");
  var decimalSeparator=element.getAttribute("decimalSeparator");
  var precision=element.getAttribute("precision");
  if(groupingSeparator==null) {
    groupingSeparator=".";
  }
  if(decimalSeparator==null) {
     decimalSeparator=",";
  }
  if(precision==null) {
    precision=2; 
  }
  var r=new Array("^","(\\d+|","(\\d{1,3}(\\", groupingSeparator, "\\d{3})*))(\\",decimalSeparator,"\\d{",precision,"})$");
  var regex=new RegExp(r.join(""));
  return regex.test(value);
}

/*
 * returns true if value contains only letters
 */
function _validateAlphabetic(value) {
  var re=/^[a-zA-Z]*$/;
  return re.test(value);
}

/*
 * returns true if value contains only letters and digits
 */
function _validateAlphanumeric(value) {
  var re=/^[\w\d]*$/;
  return re.test(value);
}

/*
 * returns true if value contains a valid email address
 */
function _validateEmail(value) {
  var re=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|biz|info|name|aero|biz|info|jobs|museum)$/i;
  return re.test(value);
}

/*
 * returns true if value contains a valid CPF number
 */
function _validateCPF(cpf, element) {
  var re=/^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$/;
  if(!re.test(cpf)) {
    return false;
  } else {
    cpf=_removeAllBut("0123456789", cpf); 
  }
  var numeros, digitos, soma, i, resultado, digitos_iguais;
  digitos_iguais = 1;
  if (cpf.length < 11) {
    return false;
  }
  for (i = 0; i < cpf.length - 1; i++) {
    if (cpf.charAt(i) != cpf.charAt(i + 1)) {
      digitos_iguais = 0;
      break;
    }
  }
  if (!digitos_iguais) {
    numeros = cpf.substring(0,9);
    digitos = cpf.substring(9);
    soma = 0;
    for (i = 10; i > 1; i--) {
      soma += numeros.charAt(10 - i) * i;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(0)) {
        return false;
    }
    numeros = cpf.substring(0,10);
    soma = 0;
    for (i = 11; i > 1; i--) {
      soma += numeros.charAt(11 - i) * i;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(1)) {
      return false;
    }  
    return true;
  } else {
    return false;
  }
}

/*
 * returns true if value contains a valid CNPJ address
 */
function _validateCNPJ(cnpj, element) {
  var re=/^\d{2,3}\.?\d{3}\.?\d{3}\/?\d{4}\-?\d{2}$/;
  if(!re.test(cnpj)) {
    return false;
  } else {
    cnpj=_removeAllBut("0123456789", cnpj);
  }
  var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
  digitos_iguais = 1;
  if (cnpj.length < 14) {
    return false;
  }
  for (i = 0; i < cnpj.length - 1; i++) {
    if (cnpj.charAt(i) != cnpj.charAt(i + 1)) {
      digitos_iguais = 0;
      break;
    }
  }
  if (!digitos_iguais) {
    tamanho = cnpj.length - 2
    numeros = cnpj.substring(0,tamanho);
    digitos = cnpj.substring(tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--) {
      soma += numeros.charAt(tamanho - i) * pos--;
      if (pos < 2) {
        pos = 9;
      }
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(0)) {
      return false;
    }
    tamanho = tamanho + 1;
    numeros = cnpj.substring(0,tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--) {
      soma += numeros.charAt(tamanho - i) * pos--;
      if (pos < 2) {
        pos = 9;
      }
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(1)) {
      return false;
    }  
    return true;
  } else {
    return false;
  }
}



/*
 * minValue="18"
 *
 */
function _minValue(form, element, min) {
  try {
    var a=new Number(element.value);
    var b=new Number(min);
    if(a<b) {
      return false;
    }
    return true;
  } catch(e) {
    return false;
  }
}

/*
 * maxValue="99"
 *
 */
function _maxValue(form, element, max) {
  try {
    var a=new Number(element.value);
    var b=new Number(max);
    if(a>b) {
      return false;
    }
    return true;
  } catch(e) {
    return false;
  }
}

/*
 * regex="$\\w+^"
 *
 */
function _regex(form, element, regex) {
  var re=new RegExp(regex);
  if(!re.test(element.value)) {
    return false;
  }
  return true;
}

/*
 *  dateFormat="mm/dd/yyyy"
 *
 */
function _dateFormat(form, element, format) {
  try {
    var re=/d+|m+|y+|[^mdy]+/gi;
    var results=format.match(re);
    var fmt=new Object();
    var builder=new Array("^");
    for(var i=0;i<results.length;i++) {
      var part=results[i];
      var type=part.charAt(0);
      if(type=="d") {
        fmt.dayPart=i+1;
        builder.push("(\\d{"+part.length+"})");
      } else if(type=="m") {
        fmt.monthPart=i+1;
        builder.push("(\\d{"+part.length+"})");
      } else if(type=="y") {
        fmt.yearPart=i+1;
        builder.push("(\\d{"+part.length+"})");
      } else {
        builder.push("("+part+")");
      }
    }
    builder.push("$");
    re=new RegExp(builder.join(""));
    results=element.value.match(re);
    if(results) {
      var day=0, month=0, year=0;
      if(fmt.dayPart) {
        day=results[fmt.dayPart];
      }
      if(fmt.monthPart) {
        month=results[fmt.monthPart]-1;
      }
      if(fmt.yearPart) {
        year=results[fmt.yearPart];
      }
      var d=new Date(year, month, day);
     
      if(year!=d.getFullYear() || month!=d.getMonth() || day!=d.getDate()) {
        return false;
      }
    } else {
      return false;
    } 
  } catch(e) {
    return false;
  }
  return true;
}

var _keys=new Array("required", "contentType", "minValue", "maxValue", "regex", "dateFormat");
var _validations=new Array();
_validations["required"]=_required;
_validations["contentType"]=_contentType;
_validations["minValue"]=_minValue;
_validations["maxValue"]=_maxValue;
_validations["regex"]=_regex;
_validations["dateFormat"]=_dateFormat;

function _clearFormMessages(form, clearAll) {
  form.messages=new Array();
  var panel=document.getElementById(form.getAttribute("id")+"-messages");
  if(panel) {
    panel.innerHTML="";
    panel.style.visibility="hidden";
  }
  if(clearAll) {
    var elements=form.elements;
    for(var i=0; i<elements.length; i++) {
      var el=elements[i];
      _clearElementMessage(el);
    }
  }
}

function _showFormMessages(form) {
  var messages=form.messages.join("");
  var panel=document.getElementById(form.getAttribute("id")+"-messages");
  if(panel) {
    panel.innerHTML=messages;
    panel.style.visibility="visible";
  }
}

function _clearElementMessage(element) {
  if(element.validate) {
    var id=element.getAttribute("id");
    element.form.messages[element._position]="";
    var panel=document.getElementById(id+"-message");
    if(panel) {
      panel.innerHTML="";
      panel.style.visibility="hidden";
    }
  }
}

function _showElementMessage(element) {
  var id=element.getAttribute("id");
  var message=element.getAttribute("message");
  var nm=element.getAttribute("notificationMethod");
  if(nm=="alert") {
    alert(message);
  } else if(nm=="input") {
    var panel=document.getElementById(id+"-message");
    if(panel) {
      var nclass=element.getAttribute("notificationClass");
      var nstyle=element.getAttribute("notificationStyle");
      panel.innerHTML=message;
      panel.style.visibility="visible";
      if(nclass!=null) {
        panel.className=nclass; 
      }
      if(nstyle!=null) {
        panel.style.cssText=nstyle; 
      }
    }
  } else if(nm=="form") {
    element.form.messages[element._position]=message+"<BR>";
  }
}

function _validateForm(e) {
  var form=this;
  _clearFormMessages(form, true);
  var nsc=form.getAttribute("shortCircuit")=="true";
  var elements=form.elements;
  var elen=elements.length;
  var result=true;
  for(var i=0; i<elen; i++) {
     var element=elements[i];
     if(element.validate && !_validateElement(element)) {
       result=false;
       if(nsc) {
         _showFormMessages(form);
         element.focus();
         break;
       }
     }
  }
  if(!result) {
    _showFormMessages(form);
    if(e.preventDefault) {
      e.preventDefault()
    } else {
      e.returnValue=false; 
    }
  }
  return result;
}

function _validateElementEventHandler(e) {
  _validateElement(this);
  _showFormMessages(this.form);
  return true;
}

function _validateElement(element) {
  _clearElementMessage(element);
  var id=element.getAttribute("id");
  if(id!=null) {
    if(element.value=="") {
      var required=element.getAttribute("required");
      if(required=="true") {
        _showElementMessage(element);
        return false;
      } else {
        return true;
      }
    }
    var vlen=_keys.length;
    for(var i=0;i<vlen; i++) {
      var key=_keys[i];
      var value=element.getAttribute(key);
      if(value!=null) {  
        var func=_validations[key];
        if(!func(element.form, element, value)) {
          _showElementMessage(element);
          return false;
        }
      }
    }
  }
  return true;
}

function _init() {
   var forms=document.getElementsByTagName("form");
   var flen=forms.length;
   for(var i=0;i<flen;i++) {
     var form=forms[i];
     var validate= form.getAttribute("validate");
     if(validate=="true") {
       //submit (default), blur, change, focus
       var validationMethod=form.getAttribute("validationMethod");
       
       //alert (default), input, form
       var notificationMethod=form.getAttribute("notificationMethod");
       
       //true or false (default)
       var shortCircuit=form.getAttribute("shortCircuit");
       
       //class
       var notificationClass=form.getAttribute("notificationClass");
       
       //style
       var notificationStyle=form.getAttribute("notificationStyle");
       
       if(!validationMethod) {
         validationMethod="submit";
       }
       if(validationMethod=="submit") {
         _addEvent(form, "submit", _validateForm);
       }
       
       if(notificationMethod==null) {
         notificationMethod="alert";
         form.setAttribute("notificationMethod","alert");
       }
       
       if(shortCircuit==null) {
         shortCircuit="false";
         form.setAttribute("shortCircuit","false");
       }
       
       form.messages=new Array();
       var elen=form.elements.length;
       for(var j=0;j<elen;j++) {
         var element=form.elements[j];
         element._position=j;
         if(element.type=="text" || element.type=="textarea") {
           element.validate=true;
           var inputValidationMethod=element.getAttribute("validationMethod");
           if(inputValidationMethod==null) {
             inputValidationMethod=validationMethod;
           }
           if(inputValidationMethod!="submit") {
             _addEvent(element, inputValidationMethod, _validateElementEventHandler);
           }
           var inputNotificationMethod=element.getAttribute("notificationMethod");
           if(inputNotificationMethod==null) {
             inputNotificationMethod=notificationMethod;
           }
           element.setAttribute("notificationMethod", inputNotificationMethod);
           var inputNotificationClass=element.getAttribute("notificationClass");
           if(inputNotificationClass==null && notificationClass!=null) {
             element.setAttribute("notificationClass", notificationClass);
           }
           var inputNotificationStyle=element.getAttribute("notificationStyle");
           if(inputNotificationStyle==null && notificationStyle!=null) {
             element.setAttribute("notificationStyle", notificationStyle);
           }
         }
       }
     }
   }
}

// The function below was developed by John Resig
// For additional info see:
// http://ejohn.org/projects/flexible-javascript-events
// http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
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", _init);



