function valida_float(campo,event,deniedKeys) {
	var BACKSPACE= 8;
	var HTAB = 9;
	var VTAB = 11;
	var XTAB = 0;
	var PONTO = 46;
	var MENOS = 45;
	var C = 99;
	var V = 118;
	var X = 120;
	
	//limpa a string da data
	var mydata = campo.value;
	
	var key;
	var tecla;
	
	//captures the digit
	if(navigator.appName.indexOf("Netscape")!= -1)
		tecla= event.which;
	else
		tecla= event.keyCode;
	key = String.fromCharCode(tecla);
	
	//tests deniedKeys
	var dk = deniedKeys.split(';');
	for (var i = 0 ; i < dk.length; i++) {
		if (tecla == dk[i]) {
			return false;
		}
	}
	
	//Se ja tiver PONTO, nao deixa
	if (mydata.indexOf(String.fromCharCode(PONTO)) != -1 && tecla ==  PONTO) {
		return false;
	}
	
	//Se ja tiver MENOS, nao deixa
	var tempNumber = clearNonNumbersAndTrimZeros(mydata, true);
	if (tempNumber.length > 0 && tecla == MENOS) {
		return false;
	}
	
	//tests allowed keys
	if ( tecla == BACKSPACE || tecla == HTAB || tecla == VTAB ||
		(event.ctrlKey && tecla ==  C) || (event.ctrlKey && tecla ==  V) || (event.ctrlKey && tecla ==  X) ||
	     tecla == XTAB || tecla ==  PONTO || tecla ==  MENOS ) {
		return true;
	}
	return ( isNum(key) );
}

function isNum( caractere ){ 
	var strValidos = '0123456789'; 
	if ( strValidos.indexOf( caractere ) == -1 ) return false; 
	return true; 
}

function isSpecialChar( caractere ){ 
	var strValidos = '_hHmsdMy';
	if ( strValidos.indexOf( caractere ) == -1 ) return false; 
	return true; 
}

function clearNonNumbers(text) {
	var retorno = '';
	if (text != null) {
		for (var i = 0; i < text.length; i++) {
	        if ( isNum(""+text.charAt(i)) ) {
	        	retorno += text.charAt(i);
	        }
	    }
	}
	return retorno;
}

function clearNonNumbersAndTrimZeros(text, removeZeros) {
	text = clearNonNumbers(text);
	for (var i = 0; i < text.length ; i++) {
        if ( text.charAt(i) != '0' ) {
			text = text.substring(i);
			break;
		}else if (i == text.length - 1 && removeZeros){
			text = "";
			break;
		}
    }
    return text;
}

function getRealMaskLength(mask) {
	var retorno = 0;
	for (var i = 0; i < mask.length; i++) {
		if ( isSpecialChar(mask.charAt(i)) ) {
            retorno++;
        }
    }
    return retorno;
}

function getBestFitMask(masks, text) {
    var masksVector = masks.split('&');
    if (masksVector != null && masksVector.length > 1) {
    	var retorno = "";
    	//Acumula mascaras com tamanho maior que o texto atual
    	var mascarasPlausiveis = Array();
    	for (var i = 0; i < masksVector.length; i++) {
		    var maskLength = getRealMaskLength(masksVector[i]);
			if (text.length <= maskLength) {
		    	mascarasPlausiveis.push(masksVector[i]);
		    }
	    }
	    if (mascarasPlausiveis.length > 0) {
		    //Se existem mascaras maiores, usa a que tem menor diferenca
		    var retorno = null;
		    for (var i = 0; i < mascarasPlausiveis.length; i++) {
				var maskLength = getRealMaskLength(mascarasPlausiveis[i]);
			    var retornoLength = retorno != null ? getRealMaskLength(retorno) : 0;
				if (retorno == null || maskLength < retornoLength) {
			    	retorno = mascarasPlausiveis[i];
			    }
		    }
		    return retorno;
		}else{
			//Se nao existem mascaras plausiveis, usa a que tem maior tamanho
		    var retorno = null;
		    for (var i = 0; i < masksVector.length; i++) {
				var maskLength = getRealMaskLength(masksVector[i]);
			    var retornoLength = retorno != null ? getRealMaskLength(retorno) : 0;
				if (maskLength > retornoLength) {
			    	retorno = masksVector[i];
			    }
		    }
		    return retorno;
		}
	    
		return masksVector[0];
    }
    return masks;
}

function verifica_mascara (data, masks) {
	if (masks == null) {
		return;
	}

	//data digitada atual
	var mydata = '' + clearNonNumbers(data.value);
	
	//Se for vazio, tasca fora
	if(mydata == null || mydata == "") return "";
	
	//Detecta a melhor mascara
	var mask = getBestFitMask(masks, mydata);
	
	//Retorna o tamanho da mascara escolhida
	var maskLength = getRealMaskLength(mask);
	
	//Se o numero de digitos é igual ao tamanho da mascara, aplica a mascara
	if (maskLength == mydata.length) {
		var retorno = '';
		
		//passa pelas casas da marcara ate a casa digitada
		var j = 0;	
		for (var i = 0; i < mask.length && j < mydata.length ; i++) {
	        if ( isSpecialChar(mask.charAt(i)) ) {
				if(j < mydata.length){
					retorno += mydata.charAt(j);
					j++;
				}
	        }else{
	        	retorno += mask.charAt(i);
	        }
	    }
    
	    data.value = retorno;
	}
//	else
//	{
//		data.value = mydata;
//	}
}

function format_double(data, event, digits, prefix){
	
	var text = data.value;
	var retorno = "";

	//consistencia de digitos
	if (digits == null || digits == "") {
		digits = 0;
	}
	var totalDigits = digits + 1;
	
	//Verifica se é negativo
	var negativo = false;
	if (data.value.indexOf('-') != -1) {
		negativo = true;
	}
	
	//Padroniza pontos e virgulas
	if (text.indexOf(".") != -1 && text.indexOf(",") != -1) {
		text = text.replace(".", "");
		text = text.replace(",", ".");
	}
	if (text.indexOf(",") != -1) {
		text = text.replace(",", ".");
	}

	//limpa a string
	var mydata = clearNonNumbersAndTrimZeros(text, false);
	
	//completa com zeros a esquerda
	for (var i = 0 ; i < totalDigits && mydata.length < totalDigits && mydata.length > 0 ; i++ ) {
		mydata = "0" + mydata;
	}
	
//	alert("Teste de formatação " + mydata);

	var j = 0;
	for(var i = mydata.length - 1; i >= 0 ; i--) {
		if (j == digits && digits > 0) {
			retorno = "," + retorno;
		}else if ( (j - digits >= 3) && ( (j - digits) % 3 == 0) ) {
			retorno = "." + retorno;
		}		
		retorno = mydata.charAt(i) + retorno;

//		alert("Teste de formatação, dentro do loop: I = " + i);
//		alert("Teste de formatação, dentro do loop: J = " + j);
//		alert("Teste de formatação, dentro do loop: digits " + digits);
//		alert("Teste de formatação, dentro do loop: retorno " + retorno);
//		alert("Teste de formatação, dentro do loop: mydata " + mydata);
//		alert("Teste de formatação, dentro do loop: mydata length " + mydata.length);

		j++;
	}

//	alert("Teste de formatação " + retorno);
	
	//Aplica negativo
	if (negativo) {
		retorno = "-" + retorno;
	}
	//Aplica prefixo
	if (prefix != null && prefix != '' && retorno != '' ) {
		retorno = prefix + " " + retorno;
	}
		
	data.value = retorno ;
}

function completeDouble(campo, digits){
	var atual = campo.value != '' ? campo.value : '' ;
	//consistencia de digitos
	if (digits == null || digits == "") {
		digits = 0;
	}
	
	//Padroniza pontos e virgulas
	if (atual.indexOf(".") != -1 && atual.indexOf(",") != -1) {
		atual = atual.replace(".", "");
		atual = atual.replace(",", ".");
	}
	if (atual.indexOf(",") != -1) {
		atual = atual.replace(",", ".");
	}
	
	var index = atual.indexOf(".");
	
	if (index == -1) {
		atual += '.';
		index = atual.indexOf(".");
	}
	
	var numDecimaisAtual = atual.length - index - 1;
	var numDecimaisRestantes = digits - numDecimaisAtual;
	
	for (var i = 0 ; i < numDecimaisRestantes ; i++) {
		atual += '0';
	}
	
	campo.value = atual;
}

function completeYear(campo){
	var pStr = campo.value;
	if (pStr != null && pStr != "" && pStr.length == 8) {
		var ano = pStr.substring(6);
		var anoAtual = new Date().getFullYear().toString().substring(0,2);
		campo.value = pStr.substring(0,6) + anoAtual + ano;
	}
}

var CALENDAR_ddMMyyyy 	= /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/(\d{2}|\d{4})$/;
var CALENDAR_ddMMyy 	= /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{2}$/;
function validaRegExp(campo, regexpName){
	var regexp;
	eval("regexp = " + regexpName);
	var pStr = campo.value;
	if (pStr == null || pStr == "" || !regexp.test(pStr) ) {
		campo.value = '';
	}
}
