function validate(form, debug) {

	var msg = '';

	function validateEl(el, recurse) {
		if (typeof recurse=="undefined") {
			recurse=true;
		}
		var valid = el.getAttribute("valid");
		if ( el.valid=="") {
			// Workarround bug mozilla
			return true;
		}

		var label = el.getAttribute("label");

		if (new RegExp("required_or").test(valid) && el.value == "") {
			// Testa a obrigatoriedade de um "ou" outro campo
			var field=valid.slice(valid.indexOf("required_or,")+"required_or,".length, valid.search(/$|\|/));
			if (!recurse) {
				return false;
			}
			if (!validateEl(form[field], false)) {
				form[field].isValidated=true;
				//msg += '<li>' + label + ' <em>or</em> ' + form[field].label + ' must be filled out.';
				msg += term.get("message", "validation_required_or", [label, form[field].label]);
				return false;
			}
		}else if (new RegExp(valid).test("required") && el.value == "") {
			//msg += '<li>' + label + ' cannot be empty.';
			//msg += term.get("message", "validation_required", [el.name]);
			msg += term.get("message", "validation_required", [label]);
			return false;
		}else if (new RegExp(valid).test("select") && el.selectedIndex == 0) {
			//msg += '<li>' + label + ' has to be selected.';
			msg += term.get("message", "validation_select", [label]);
			return false;
		}else if (new RegExp(valid).test("number") && !/[^\D]/.test(el.value) && !isNaN(el.value)) {
			//msg += '<li>' + label + ' must be a number.';
			msg += term.get("message", "validation_number", [label]);
			return false;
		}else if (new RegExp(valid).test("cpf") && !validaCPF(el.value) ){
			msg += term.get("message", "validation_cpf", [label]);
			return false;
		}else if (new RegExp(valid).test("cnpj") && !validaCNPJ(el.value) ){
			msg += term.get("message", "validation_cnpj", [label]);
			return false;
		}else if (new RegExp(valid).test("date") && el.value != "" && !isDate(el.value,"d/M/y") ){
			msg += term.get("message", "validation_date", [label]);
			return false;
		}

		return true;
	}

	for (var i=0;i<form.elements.length;i++) {

		if (form.elements[i].getAttribute("valid") && !form.elements[i].isValidated) {
			/*if (form.elements[i].name=='strNome') {
				alert(form.elements[i].name + '-' + form.elements[i].valid);
			}*/
			//alert(form.elements[i].getAttribute("label"));
			validateEl( form.elements[i] );
		}
	}
	if (debug) {
		alert("validate;msg: "+msg);
	}
	if (msg !="") {
		//html = '<b>Please verify the the following fields:</b><br>';
		html = '<b>'+term.get("message", "verify_fields")+'</b><br>';
		html += '<ul>' + msg + '</ul>';
		document.getElementById("divError").style.display='block';
		document.getElementById("divError").innerHTML=html;
		try {
			document.body.childNodes[0].scrollIntoView(true);
		} catch (e) {
		}
		return false;
	}
	//alert("validate; return false "+msg);
	//return false;
	return true;
}

// Validation of CPF
Validator_validacpf = function(cpf)
{
	
	var soma;
	var resto;
	var i;

	if ( (cpf.length != 11) ||
		(cpf == "00000000000") || (cpf == "11111111111") ||
		(cpf == "22222222222") || (cpf == "33333333333") ||
		(cpf == "44444444444") || (cpf == "55555555555") ||
		(cpf == "66666666666") || (cpf == "77777777777") ||
		(cpf == "88888888888") || (cpf == "99999999999") ) {
		//alert("cpf.length: " + cpf.length + " : " + cpf);
		return false;
	}

	soma = 0;

	for (i = 1; i <= 9; i++) {
		soma += Math.floor(cpf.charAt(i-1)) * (11 - i);
	}

	resto = 11 - (soma - (Math.floor(soma / 11) * 11));

	if ( (resto == 10) || (resto == 11) ) {
		resto = 0;
	}

	if ( resto != Math.floor(cpf.charAt(9)) ) {
		//alert("Math.floor(cpf.charAt(9)): " + Math.floor(cpf.charAt(9)));
		return false;
	}

	soma = 0;

	for (i = 1; i <= 10; i++) {
		soma += cpf.charAt(i - 1) * (12 - i);
	}

	resto = 11 - (soma - (Math.floor(soma / 11) * 11));

	if ( (resto == 10) || (resto == 11) ) {
		resto = 0;
	}

	if (resto != Math.floor(cpf.charAt(10)) ) {
		//alert("resto != Math.floor(cpf.charAt(10): " + Math.floor(cpf.charAt(10)) );
		return false;
	}

	return true;
}

function validaCPF(cpf) {
	// Validação para teste
	if (cpf=="999.999.999-99") return true;

	cpf = cpf.replace(/\D/g,"");
	erro = new String;
	if (cpf.length < 11) erro += "Sao necessarios 11 digitos para verificacao do CPF! \n\n"; 
	var nonNumbers = /\D/;
	if (nonNumbers.test(cpf)) erro += "A verificacao de CPF suporta apenas números! \n\n"; 
	if (cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999"){
		 erro += "Numero de CPF invalido!"
	}
	var a = [];
	var b = new Number;
	var c = 11;
	for (i=0; i<11; i++){
		a[i] = cpf.charAt(i);
		if (i < 9) b += (a[i] * --c);
	}
	if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
	b = 0;
	c = 11;
	for (y=0; y<10; y++) b += (a[y] * c--); 
	if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
	if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10])){
		erro +="Digito verificador com problema!";
	}
	if (erro.length > 0){
		//alert(erro);
		return false;
	}
	return true;
}

 function validaCNPJ(CNPJ) {
	// Validação para teste
	if (CNPJ=="99.999.999/9999-99") return true;
	 erro = new String;
	 if (CNPJ.length < 18) erro += "É necessario preencher corretamente o número do CNPJ! \n\n"; 
	 if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
	 if (erro.length == 0) erro += "É necessário preencher corretamente o número do CNPJ! \n\n";
	 }
	 //substituir os caracteres que não são números
	if(document.layers && parseInt(navigator.appVersion) == 4){
		x = CNPJ.substring(0,2);
		x += CNPJ.substring(3,6);
		x += CNPJ.substring(7,10);
		x += CNPJ.substring(11,15);
		x += CNPJ.substring(16,18);
		CNPJ = x; 
	} else {
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace(".","");
		CNPJ = CNPJ.replace("-","");
		CNPJ = CNPJ.replace("/","");
	}
	var nonNumbers = /\D/;
	if (nonNumbers.test(CNPJ)) erro += "A verificação de CNPJ suporta apenas números! \n\n"; 
	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
	for (i=0; i<12; i++){
		a[i] = CNPJ.charAt(i);
		b += a[i] * c[i+1];
	}
	if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
	b = 0;
	for (y=0; y<13; y++) {
		b += (a[y] * c[y]); 
	}
	if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
	if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
		erro +="Dígito verificador com problema!";
	}
	if (erro.length > 0){
		//alert(erro);
		return false;
	}
	return true;
}


