function fn_ConsisteCNPJ(cgc,formato)
{
//consiste CNPJ. Se válido, retorna o CNPJ. Senão, retorna "*"
// cgc     => cgc a ser verificado
// formato => tipo de formato retornado
//            0 - sem edicao 	1 - editado (99.999.999/9999-99)

//OBS.: utiliza as funções fn_acerta, fn_enquadra, fn_calcula_dv_cgc_cpf e fn_String
	var arg = fn_acerta(cgc);
	if (arg.length == 14)
		{arg = fn_enquadra(arg,14,0,'0',0);}
		
	if (arg.length == 19 && arg.substr(0,1) == "0")
		{arg = arg.slice(1)}
		
	if (arg.length == 18)
	{		
		if (arg.substr(2,1) != '.') return '*'
		if (arg.substr(6,1) != '.') return '*'
		if (arg.substr(10,1) != '/') return '*'
		if (arg.substr(15,1) != '-') return '*'
		arg = fn_enquadra(arg.substr(0,2) + arg.substr(3,3) + arg.substr(7,3) + arg.substr(11,4) + arg.substr(16),14,0,'N',0)
	}
	if (arg.length != 14)
		return '*'
	if (fn_calcula_dv_cgc_cpf(arg.substr(0,12),1) != arg.substr(12))
		return '*'
	if (formato != 1)
		return 'ok'
	//return 	arg.substr(0,2) + '.' + arg.substr(2,3) + '.' + arg.substr(5,3) + '/' + arg.substr(8,4) + '-' + arg.substr(12)
	
}

function fn_ConsisteCPF(cpf,formato)
{
//consiste CPF. Se válido, retorna o CPF. Senão, retorna "*"
// cpf     => cpf a ser verificado
// formato => tipo de formato retornado
//            0 - sem edicao 	1 - editado (999.999.999-99)

//OBS.: utiliza as funções fn_acerta_formato, fn_enquadra, fn_calcula_dv_cgc_cpf, fn_String
	var arg = fn_acerta_formato(cpf);
	if (arg.length == 11)
		{arg = fn_enquadra(arg,11,0,'N',0);
		}		
	if (arg.length == 12)
	{
		if (arg.substr(9,1) == '.' || arg.substr(9,1) == '-' ) 
			{arg = fn_enquadra(arg.substr(0,9) + arg.substr(10),11,0,'0',0);}
		else
		{return '*'}	
	}
	//return arg
	if (arg.length != 11)
		{return '*'}
	if (fn_calcula_dv_cgc_cpf(arg.substr(0,9),0) != arg.substr(9))
		{return '*'}
	if (formato != 1)
		{return arg}
	return 	arg.substr(0,3) + '.' + arg.substr(3,3) + '.' + arg.substr(6,3) + '-' + arg.substr(9,2);
}

function fn_acerta_formato(texto)
{
	var i
	var arg = texto
	var arg_def = arg

	for (i=0;i < arg.length;i++)
	{
		if (arg.substr(i,1) == '.')
		{	
			arg_def = arg.substr(0, i);
			arg_def = arg_def + arg.substr(i+1, arg.length);
			arg = arg_def
		}
		if (arg.substr(i,1) == '-')
		{	
			arg_def = arg.substr(0, i);
			arg_def = arg_def + arg.substr(i+1, arg.length);
			arg = arg_def
		}
	}
	return arg_def
}

function fn_acerta(texto)
{
	var i
	var arg = texto
	for (i=0;i < arg.length;i++)
	{
		if (arg.substr(i,1) != ' ')
			break
	}
	arg = arg.substr(i)
	for (i=arg.length-1;i>-1;i--)
	{
		if (arg.substr(i,1) != ' ')
			break
	}
	arg = arg.substr(0,i+1)
	for (i=0;i < arg.length;i++)
		arg = arg.toUpperCase().replace("'"," ")
	return arg
}

function fn_calcula_dv_cgc_cpf(cgc_cpf,tipo)
// Tipo 0 -> cpf
//      1 -> cgc
{
	var soma1 = 0;
	var soma2 = 0;
	var peso = 2;
	var arg = cgc_cpf;
	var i;
	for (i=arg.length; i>=1; i--)
	{
		soma1 = soma1 + (parseInt(arg.substr(i-1,1)) * peso )
		if (tipo == 0 || peso < 9)
			{peso = peso + 1;}
		else
			{peso = 2;}
		soma2 = soma2 + (parseInt(arg.substr(i-1,1)) * peso )
	}
	soma1 = (soma1 * 10) % 11
	soma1 = soma1.toString()
	soma1 = soma1.substr(soma1.length-1)
	soma2 = ((soma2 + parseInt(soma1) *2) * 10) % 11	
	soma2 = soma2.toString()
	soma2 = soma2.substr(soma2.length-1)
	return soma1 + soma2
}

function fn_enquadra(txt,int,dec,tipo,aceitaneg)
/*	Fn_Enquadra - Consistência de Campos Numéricos
  
	Argumentos	txt : dado a ser enquadrado
				int : Qtd de inteiros
				dec : Qtd de decimais
				tipo: 'N' = Numerico, 'E' = Editado,  '0' = Zerado			
				aceitaneg: 0 - não aceita, 1- aceita					
																		*/
{
	int = parseInt(int);
	dec = parseInt(dec);
	var arg = fn_acerta(txt);
	tipo = fn_acerta(tipo);
	var i;
	var z;
	var x;
	var pp = new Array(10);
	var pv = new Array(10);
	var sinal;
	var argint;
	var argdec;

	if (arg == '')
	{	
		if (tipo == 'N')
			{return '0';}
		if (tipo == '0')
			{return fn_String('0',int+dec);}
		if (dec > 0)
			{return '0,' + fn_String('0',dec);}
		return '0';
	}
	x = ',.0123456789';
	pp[0] = 0
	pv[0] = 0
	sinal = ''
	if (arg.substr(0,1) == '-')
	{
		sinal = '-';
		arg = arg.substr(1);
		if (arg.indexOf('-') != -1)
			{return '*';}
	}
	if (arg.substr(arg.length-1,1) == '-')
	{
		sinal = '-';
		arg = arg.substr(0,arg.length-1);
		if (arg.indexOf('-') != -1)
			{return '*';}
	}
	if (aceitaneg == 0 && sinal == '-') return '*';
	for (i=0;i < arg.length;i++)
	{
		if (x.indexOf(arg.substr(i,1)) == -1)
			{return '*';}
		if (arg.substr(i,1) == '.')
		{
		    pp[0]++
		    pp[pp[0]] = i
		}    
		if (arg.substr(i,1) == ',')
		{
			pv[0]++
		    pv[pv[0]] = i
		}    
	}
	if (pp[0] > 1)
	{
		for (i=1;i < pp[0];i++)
		{	
			x = i + 1;
			if (pp[x] - pp[i] != 4)
				{return '*';}
		}
	}
	if (pv[0] > 1)
	{
		for (i=1;i < pv[0];i++)
		{
			x = i + 1;
			if (pv[x] - pv[i] != 4)
				{return '*';}
		}
	}
	if (pp[0] > 1 && pv[0] > 1)
		{return '*';}
	if (pp[0] > 0 && pv[0] > 0 && pp[1] < pv[1] && pv[1] - pp[pp[0]] != 4)
		{return '*';}
	if (pp[0] > 0 && pv[0] > 0 && pp[1] > pv[1] && pp[1] - pv[pv[0]] != 4)
		{return '*';}
    if (pp[0] > 1 && pv[0] == 0 && arg.length - pp[pp[0]] != 4)		
		{return '*';}
    if (pv[0] > 1 && pp[0] == 0 && arg.length - pv[pv[0]] != 4)		
		{return '*';}
	if (arg.substr(arg.length-1,1) == '.' || arg.substr(arg.length-1,1) == ',')
		{return '*';}
	if (arg.substr(0,1) == '.' && pp[0] > 1)
			{return '*';}		 
	if (arg.substr(0,1) == ',' && pv[0] > 1)
			{return '*';}		 
	if (arg.substr(0,1) == '.' || arg.substr(0,1) == ',')
		arg = '0' + arg;
	if (isNaN(pp[1]) == true )
		pp[1] = 999;	
	if (isNaN(pv[1]) == true )
		pv[1] = 999;
	if (pp[1] < pv[1] && pv[0] > 0)
	{
		for (i=0;i < pp[0];i++)
		{	
			arg = arg.replace('.','');	
		}	
	}
	if (pv[1] < pp[1] && pp[0] > 0)
	{
		for (i=0;i < pv[0];i++)
		{
			arg = arg.replace(',','');
		}	
	}
	arg = arg.replace(',','@');
	arg = arg.replace('.','@');
	x = arg.indexOf('@');
	if (x == -1)
	{
		argint = arg;
		argdec = '';
	}
	else
	{	
		argint = arg.substr(0,x);
		argdec = arg.substr(x+1);
	}
	if (argint.length > int)
		{return '*';} 
	if (argdec.length > dec)
		{return '*';}
	if (argdec.length < dec)
		{argdec = argdec + fn_String('0',(dec - argdec.length));}
	if (tipo == 'N' && dec > 0)
		{return sinal + argint + '.' + argdec}
	if (tipo == 'N' && dec == 0)
		{return sinal + argint;} 
	if (tipo == '0')
		{return sinal + 	fn_String('0',(int - argint.length)) + argint + argdec;} 
	x = ''
	z = 0
	for (i = argint.length-1;i > -1;i--)
	{
		x = argint.substr(i,1) + x;
		z++
		if (z % 3 == 0)
			x = '.' + x; 
	}
	if (x.substr(0,1) == '.')
		x = x.substr(1);	
	if (dec > 0)
		{return sinal + x + ',' + argdec;} 
	return sinal + x;
}