function Validation_(){
// Mensagens de alerta.
var invalidNumber = "Número inválido!";
var invalidDate = "Data inválida!";
var invalidEmail = "E-mail inválido!";
var invalidPhone = "Telefone inválido!";
var invalidCEP = "CEP inválido!";
getCaretPosition = function(elem) {
var iCaretPos = 0;
var fCaretPos = 0;
if (document.selection) { 
elem.focus();
var oSel = document.selection.createRange();
fCaretPos = oSel.text.length;
oSel.moveStart ('character', -elem.value.length);
iCaretPos = oSel.text.length;
}
else if (elem.selectionStart || elem.selectionStart == '0'){
iCaretPos = elem.selectionStart;
fCaretPos = elem.selectionEnd;
}
alert(iCaretPos);
alert(fCaretPos);
if (iCaretPos > fCaretPos) {
return [fCaretPos, iCaretPos];
}
return [iCaretPos, fCaretPos];
}
lastCaretPosition = function(elem){
var pos = elem.value.length;
if(elem.setSelectionRange){
elem.focus();
elem.setSelectionRange(pos,pos);
}
else if (elem.createTextRange){
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
getCaretPosition = function(elem) {
var iCaretPos = 0;
if (document.selection) { 
elem.focus();
var oSel = document.selection.createRange();
iCaretPos = oSel.text.length;
oSel.moveStart ('character', -elem.value.length);
fCaretPos = oSel.text.length;
iCaretPos = fCaretPos - iCaretPos;
}
else if (elem.selectionStart || elem.selectionStart == '0'){
iCaretPos = elem.selectionStart;
fCaretPos = elem.selectionEnd;
}
if (iCaretPos < fCaretPos)
return [iCaretPos,fCaretPos];
return [fCaretPos,iCaretPos];
}
getText = function(elem, event){
var invalid = [8,9,13,20,21,27,33,34,35,36,37,38,39,40,45,46];
var key = event.keyCode ? event.keyCode : event.which;
if (invalid.length != (invalid.without(key)).length || event.ctrlKey || event.altKey) {
return elem.value;
}
var selPos = getCaretPosition(elem);
return elem.value.substring(0,selPos[0]) + String.fromCharCode(key) + elem.value.substring(selPos[1]);
}
cancelEvent = function(event){
if (event.keyCode)
event.returnValue=false;
else{
event.stopPropagation();
event.preventDefault();
}
}
reMatch = function(re, text){
return (re.test(text));
}
matchFill = function(elem, event, re){
var text = getText(elem, event);
if (reMatch(re, text) || event.ctrlKey || event.altKey)
return true;
cancelEvent(event);
return false;
}
matchIs = function(elem, re, message){
var text = elem.value;
if (reMatch(re, text))
return true;
alert(message);
lastCaretPosition(elem);
return false;
}
this.fillNumber = function(elem, event, max, digitos){
var re = new RegExp("^((\\d*)([\\.]\\d{0,"+digitos +"})?|[\\.]\\d{0,"+digitos+"})$");
var text = getText(elem, event);
var number = parseFloat(text.replace(",","."));
if (number <= max) {
if (matchFill(elem, event, re))
return true;
}
cancelEvent(event);
return false;
}
this.fillInteger = function(elem, event){
var re = new RegExp("^(\\d*)$");
elem.value = elem.value.replace(/\D/g,"");
return matchFill(elem, event, re);
}
// TODO: Marlon - Rever isso!
this.fillWithZeros = function(elem){
indice = elem.value.index(".");
tamanho = elem.value.lenght;
if (indice == -1)
elem.value += ".00";
else if (indice == tamanho)
elem.value += "00";
else if (indice == tamanho - 1)
elem.value += "0";
}
this.isNumber = function(elem){
var re = new RegExp("^(((\\d+|\\d{1,3}(\\d{3})+)(\\.\\d*)?|\\.\\d+))?$");
return matchIs(elem, re, invalidNumber);
}
this.fillEmail = function(elem, event){
var re = new RegExp("^(([A-Za-z0-9_\\.\\+\\-]{0,128})|([A-Za-z0-9_\\.\\+\\-]{0,128}(@)[A-Za-z0-9_\\.\\+\\-]{0,128}))$");
if (!matchFill(elem, event, re)){
cancelEvent(event);		
return false;
}
re = new RegExp("^([A-Za-z0-9]+[_\\.\\+\\-]?)+([A-Za-z0-9]+@)?((\\w+\\-?)|(\\w+\\.))*(\\w{1,63}\\.?)?[a-zA-Z]{0,6}$");
return matchFill(elem, event, re);
}
this.isEmail = function(elem){
var re = new RegExp("^(([A-Za-z0-9]+[_\\.\\+\\-]+)*[A-Za-z0-9]+@((\\w+\\-+)|(\\w+\\.))*\\w{1,63}\\.[a-zA-Z]{2,6})?$");
elem.value = elem.value.toLowerCase();
return matchIs(elem, re, invalidEmail);
}
this.fillDate = function(elem, event){
if ((event.keyCode ? event.keyCode : event.which) != 8){
if (elem.value.length == 2 || elem.value.length == 5)
elem.value += "/";
}
var re = new RegExp("^(((0[1-9]|[12][0-9]|3[01]|[0123])([/]?)|((0[1-9]|[12][0-9]|3[01])([/]?)(0[1-9]|1[0-2]|[01]))([/]?)|((0[1-9]|[12][0-9]|3[01])([/]?)(0[1-9]|1[0-2])([/]?)([0-9]{0,3})))|(((0[1-9]|[12][0-9]|3[01])([/]?)(0[13578]|10|12)([/]?)(\\d{4}))|(([0][1-9]|[12][0-9]|30)([/]?)(0[469]|11)([/]?)(\\d{4}))|((0[1-9]|1[0-9]|2[0-8])([/]?)(02)([/]?)(\\d{4}))|((29)(\\.|-|\/)(02)([/])([02468][048]00))|((29)([/]?)(02)([/]?)([13579][26]00))|((29)([/]?)(02)([/]?)([0-9][0-9][0][48]))|((29)([/]?)(02)([/]?)([0-9][0-9][2468][048]))|((29)([/]?)(02)([/]?)([0-9][0-9][13579][26]))))$");
return matchFill(elem, event, re);
}
this.isDate = function(elem){
var re = new RegExp("^(((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\\d{4}))|(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\\d{4}))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\\d{4}))|((29)(\\.|-|\/)(02)([/])([02468][048]00))|((29)([/])(02)([/])([13579][26]00))|((29)([/])(02)([/])([0-9][0-9][0][48]))|((29)([/])(02)([/])([0-9][0-9][2468][048]))|((29)([/])(02)([/])([0-9][0-9][13579][26])))?$");
return matchIs(elem, re, invalidDate);
}
this.fillPhone = function(elem, event){
if ((event.keyCode ? event.keyCode : event.which) != 8){
if (elem.value.length == 0)
elem.value = "(";
if (elem.value.length >= 0 && elem.value.substring(0,1)=="("){
if (elem.value.length == 3)
elem.value += ") ";
if (elem.value.length == 9 && elem.value.substring(8,9)!="-")
elem.value += "-";
}
else if (elem.value.length == 4 && elem.value.substring(3,4)!="-")
elem.value += "-";			
}
var re = new RegExp("^((\\d{0,4})|(\\d{3,4})(\\-)(\\d{0,4})|((\\(\\d{0,2}(\\) )?))?|((\\(\\d{2}(\\) )?(\\d{0,4})(\\-)?))|((\\(\\d{2}(\\) )?(\\d{3,4})(\\-)\\d{1,4})))$");
return matchFill(elem, event, re);
}
this.isPhone = function(elem){
var re = new RegExp("^(((\\(\\d{2}\\))( ))?\\d{3,4}(-)\\d{4})?$");
return matchIs(elem, re, invalidPhone);
}
this.fillCEP = function(elem, event){
var re = new RegExp("^((\\d{0,2})|(\\d{2}\\d{0,3})|(\\d{2}\\d{3}\\d{0,3}))$"); //
return matchFill(elem, event, re);
}
this.isCEP = function(elem){
var re = new RegExp("^((\\d{2})(\\d{3})(\\d{3}))?$");
return matchIs(elem, re, invalidCEP);
}
function digitCPF(cpf){
for (var sum = 0, i = 0; i < cpf.length; i++)
sum += parseInt(cpf.charAt(i)) * (cpf.length - i + 1)
return "" + (11 - sum % 11);
}
function concatCPF(cpf){
if (cpf.length > 10) return cpf;
var digit = digitCPF(cpf);
return cpf + ((digit > 9) ? "0" : digit.charAt(0));
}
this.getValidCPF = function(cpf){
if (cpf.length>8){
cpf = cpf.substr(0,9);
while ((cpf = concatCPF(cpf)).length <= 10);
}
return cpf;
};
this.maxSize = function(elem, event, max){
var text = getText(elem, event);
if (text.length <= max){
return true;
}
cancelEvent(event);
return false; 
}  
}
var validation = new Validation_();
applyValidation = function(elem) {
elem =$(elem)||$$(elem)[0]||elem||$$("body")[0];
elem.select('.inteiro').each(function(elem){elem.observe('keypress',function(event){return validation.fillInteger(this,event);});});
elem.select('.numeros').each(function(elem){elem.observe('keypress',function(event){return validation.fillInteger(this,event);});});
elem.select('.real').each(function(elem){elem.observe('keypress',function(event){return validation.fillNumber(this,event,10000000,4);});});
//elem.select('.monetario').each(function(elem){elem.observe('keypress',function(event){return validation.fillNumber(this,event,10000000,2);});});
elem.select('.porcentagem').each(function(elem){elem.observe('keypress',function(event){return validation.fillNumber(this,event,100,2);});});
elem.select('.data').each(function(elem){elem.observe('keypress',function(event){return validation.fillDate(this,event);});});
elem.select('.cep').each(function(elem){elem.observe('keypress',function(event){return validation.fillCEP(this,event);});});
elem.select('.fone').each(function(elem){elem.observe('keypress',function(event){return validation.fillPhone(this,event);});});
elem.select('.email').each(function(elem){elem.observe('keypress',function(event){return validation.fillEmail(this,event);});});
elem.select('.dia').each(function(elem){elem.observe('keypress',function(event){return validation.fillNumber(this,event,30,0);});});
//Mascara para valores monetarios
elem.select('.monetario').each(function(elem){elem.observe('blur',
function(){
var numSize = this.value.replace(/\D/g,"").length;
this.value = "000".substr(numSize) + this.value.replace(/\D/g,"");
this.value = this.value.replace(/\D/g,"").replace(/(\d+)(\d{2})$/,"$1.$2");
this.value = parseFloat(this.value).toFixed(2);
});});
elem.select('.monetario').each(function(elem){elem.observe('keyup',
function(){
this.value = this.value.replace(/\D/g,"").replace(/(\d*)(\d{2})$/,"$1.$2");
});});
elem.select('.monetario').each(function(elem){elem.observe('focus',
function(){
if (!isNaN(parseFloat(this.value)))
this.value = parseFloat(this.value).toFixed(2);
});});
//Mascara para valores monetarios
elem.select('.monetario4d').each(function(elem){elem.observe('blur',
function(){
var numSize = this.value.replace(/\D/g,"").length;
this.value = "00000".substr(numSize) + this.value.replace(/\D/g,"");
this.value = this.value.replace(/\D/g,"").replace(/(\d+)(\d{4})$/,"$1.$2");
this.value = parseFloat(this.value).toFixed(4);
});});
elem.select('.monetario4d').each(function(elem){elem.observe('keyup',
function(){
this.value = this.value.replace(/\D/g,"").replace(/(\d*)(\d{4})$/,"$1.$2");
});});
elem.select('.monetario4d').each(function(elem){elem.observe('focus',
function(){
if (!isNaN(parseFloat(this.value)))
this.value = parseFloat(this.value).toFixed(4);
});});
}
Event.observe(window, 'load', function() {
applyValidation();
});
//
//