/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.validate.br"]){
dojo._hasResource["dojox.validate.br"]=true;
dojo.provide("dojox.validate.br");
dojo.require("dojox.validate._base");
dojox.validate.br.isValidCnpj=function(_1){
if(!dojo.isString(_1)){
if(!_1){
return false;
}
_1=_1+"";
while(_1.length<14){
_1="0"+_1;
}
}
var _2={format:["##.###.###/####-##","########/####-##","############-##","##############"]};
if(dojox.validate.isNumberFormat(_1,_2)){
_1=_1.replace("/","").replace(/\./g,"").replace("-","");
var _3=[];
var dv=[];
var i,j,_4;
for(i=0;i<10;i++){
_4="";
for(j=0;j<_1.length;j++){
_4+=""+i;
}
if(_1===_4){
return false;
}
}
for(i=0;i<12;i++){
_3.push(parseInt(_1.charAt(i),10));
}
for(i=12;i<14;i++){
dv.push(parseInt(_1.charAt(i),10));
}
var _5=[9,8,7,6,5,4,3,2,9,8,7,6].reverse();
var _6=0;
for(i=0;i<_3.length;i++){
_6+=_3[i]*_5[i];
}
var _7=_6%11;
if(_7==dv[0]){
_6=0;
_5=[9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
_3.push(_7);
for(i=0;i<_3.length;i++){
_6+=_3[i]*_5[i];
}
var _8=_6%11;
if(_8===dv[1]){
return true;
}
}
}
return false;
};
dojox.validate.br.computeCnpjDv=function(_9){
if(!dojo.isString(_9)){
if(!_9){
return "";
}
_9=_9+"";
while(_9.length<12){
_9="0"+_9;
}
}
var _a={format:["##.###.###/####","########/####","############"]};
if(dojox.validate.isNumberFormat(_9,_a)){
_9=_9.replace("/","").replace(/\./g,"");
var _b=[];
var i,j,_c;
for(i=0;i<10;i++){
_c="";
for(j=0;j<_9.length;j++){
_c+=""+i;
}
if(_9===_c){
return "";
}
}
for(i=0;i<_9.length;i++){
_b.push(parseInt(_9.charAt(i),10));
}
var _d=[9,8,7,6,5,4,3,2,9,8,7,6].reverse();
var _e=0;
for(i=0;i<_b.length;i++){
_e+=_b[i]*_d[i];
}
var _f=_e%11;
_e=0;
_d=[9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
_b.push(_f);
for(i=0;i<_b.length;i++){
_e+=_b[i]*_d[i];
}
var dv1=_e%11;
return (""+_f)+dv1;
}
return "";
};
dojox.validate.br.isValidCpf=function(_10){
if(!dojo.isString(_10)){
if(!_10){
return false;
}
_10=_10+"";
while(_10.length<11){
_10="0"+_10;
}
}
var _11={format:["###.###.###-##","#########-##","###########"]};
if(dojox.validate.isNumberFormat(_10,_11)){
_10=_10.replace("-","").replace(/\./g,"");
var cpf=[];
var dv=[];
var i,j,tmp;
for(i=0;i<10;i++){
tmp="";
for(j=0;j<_10.length;j++){
tmp+=""+i;
}
if(_10===tmp){
return false;
}
}
for(i=0;i<9;i++){
cpf.push(parseInt(_10.charAt(i),10));
}
for(i=9;i<12;i++){
dv.push(parseInt(_10.charAt(i),10));
}
var _12=[9,8,7,6,5,4,3,2,1].reverse();
var sum=0;
for(i=0;i<cpf.length;i++){
sum+=cpf[i]*_12[i];
}
var dv0=sum%11;
if(dv0==dv[0]){
sum=0;
_12=[9,8,7,6,5,4,3,2,1,0].reverse();
cpf.push(dv0);
for(i=0;i<cpf.length;i++){
sum+=cpf[i]*_12[i];
}
var dv1=sum%11;
if(dv1===dv[1]){
return true;
}
}
}
return false;
};
dojox.validate.br.computeCpfDv=function(_13){
if(!dojo.isString(_13)){
if(!_13){
return "";
}
_13=_13+"";
while(_13.length<9){
_13="0"+_13;
}
}
var _14={format:["###.###.###","#########"]};
if(dojox.validate.isNumberFormat(_13,_14)){
_13=_13.replace(/\./g,"");
var cpf=[];
for(i=0;i<10;i++){
tmp="";
for(j=0;j<_13.length;j++){
tmp+=""+i;
}
if(_13===tmp){
return "";
}
}
for(i=0;i<_13.length;i++){
cpf.push(parseInt(_13.charAt(i),10));
}
var _15=[9,8,7,6,5,4,3,2,1].reverse();
var sum=0;
for(i=0;i<cpf.length;i++){
sum+=cpf[i]*_15[i];
}
var dv0=sum%11;
sum=0;
_15=[9,8,7,6,5,4,3,2,1,0].reverse();
cpf.push(dv0);
for(i=0;i<cpf.length;i++){
sum+=cpf[i]*_15[i];
}
var dv1=sum%11;
return (""+dv0)+dv1;
}
return "";
};
}
