function popUp(url, width, height) {
	window.open(url, '', 'width=' + width + ',height=' + height +',scrollbars=YES,status=NO,resizable=YES');
}
// Somente numeros
String.prototype.onlynumber = function(){
	return this.replace(/[^0-9]/g, "")
}
	
function retornaMes(mes) {
	var tmp = Math.floor(mes / 12);
	mes -= tmp*12;
	if (mes == 1) return "Janeiro";
	if (mes == 2) return "Fevereiro";
	if (mes == 3) return "Março";
	if (mes == 4) return "Abril";
	if (mes == 5) return "Maio";
	if (mes == 6) return "Junho";
	if (mes == 7) return "Julho";
	if (mes == 8) return "Agosto";
	if (mes == 9) return "Setembro";
	if (mes == 10) return "Outubro";
	if (mes == 11) return "Novembro";
	if (mes == 12) return "Dezembro";
}

function exibirLoading(idElement, strMessage) {
	var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body;
	
	objDiv = document.getElementById(idElement);
	
	var dsocleft = document.all ? iebody.scrollLeft : pageXOffset;
	var dsoctop = document.all ? iebody.scrollTop : pageYOffset;
	
	var newTop = (document.body.clientHeight - parseInt(objDiv.style.height)) / 2;
	var newLeft = (document.body.clientWidth - parseInt(objDiv.style.width)) / 2;
	
	if (document.all || document.getElementById) {
		// objDiv.style.left = dsocleft + 2 + "px";
		// objDiv.style.top = dsoctop + 2 + "px";
		objDiv.style.left = newLeft + "px";
		objDiv.style.top = newTop + "px";
	}
	
	strContent = "<table width=\"100%\" height=\"100%\"><tr><td align=\"center\" valign=\"middle\" style=\"font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;color:#666666;\">" + strMessage + "</td></tr></table>";
	objDiv.innerHTML = strContent;
	objDiv.style.display = "block";
}

// @deprecated - use hideElement
function ocultarLoading(idElement) {
	objDiv = document.getElementById(idElement);
	objDiv.style.display = 'none';
}

function hideElement(idElement) {
	var element = document.getElementById(idElement);
	element.style.display = 'none';
}

function showElement(idElement) {
	var element = document.getElementById(idElement);
	element.style.display = 'inline';
}

function showHideElement(idElement) {
	var element = document.getElementById(idElement);
	element.style.display = (element.style.display == "none") ? "inline" : "none";
}
	
function trim(value) {
	value = value.replace(/(^\s*)|(\s*$)/g, "");
	
	return value;
}

function isEnter(event) {
	if (event.keyCode == 13) {
		return true;
	} else {
		return false;
	}
}

function clearElement(idElement) {
	var obj = document.getElementById(idElement);
	obj.innerHTML = "";
}

function formataDataFromDb(data) {
	return data.replace(/(\d{4})-(\d{2})-(\d{2})( \d{2}:\d{2}:\d{2}(\.\d{3})?)?/, "$3/$2/$1");
}

function formataTimeFromDb(data) {
	return data.replace(/\d{4}-\d{2}-\d{2} (\d{2}):(\d{2}):\d{2}(\.\d{3})?/, "$1:$2");
}

function formataValorFromDb(valor) {
	valor = new Number(valor);
	valor = valor.toFixed(2).toString();
	return valor.replace(/(\d+)\.(\d+)/, "$1,$2");
}

function MaskData(objeto, evt) {
	return Mask(objeto, evt, '##/##/####');
}

function MaskCEP(objeto, evt) {
  	return Mask(objeto, evt, '##.###-###');
}

function MaskCPF(objeto, evt) {
  	return Mask(objeto, evt, '###.###.###-##');
}

function MaskCNPJ(objeto, evt) {
  	return Mask(objeto, evt, '##.###.###/####-##');
}

function MaskTelefone(objeto, evt) {
  	return Mask(objeto, evt, '(##) ####-####');
}

function MaskSemestre(objeto, evt) {
  	return Mask(objeto, evt, '##');
}

function Mask(objeto, evt, mask) {
	var LetrasU = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	var LetrasL = 'abcdefghijklmnopqrstuvwxyz';
	var Letras  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
	var Numeros = '0123456789';
	var Fixos  = '().-:/ ';
	var Charset = " !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/`abcdefghijklmnopqrstuvwxyz{|}~";
	evt = (evt) ? evt : (window.event) ? window.event : "";
	var value = objeto.value;
	if (evt) {
		var ntecla = (evt.which) ? evt.which : evt.keyCode;
		tecla = Charset.substr(ntecla - 32, 1);
		if (ntecla < 32) return true;
		var tamanho = value.length;
		if (tamanho >= mask.length) return false;
		var pos = mask.substr(tamanho,1);
		while (Fixos.indexOf(pos) != -1) {
			value += pos;
			tamanho = value.length;
			if (tamanho >= mask.length) return false;
			pos = mask.substr(tamanho,1);
		}
		switch (pos) {
			case '#' : if (Numeros.indexOf(tecla) == -1) return false; break;
			case 'A' : if (LetrasU.indexOf(tecla) == -1) return false; break;
			case 'a' : if (LetrasL.indexOf(tecla) == -1) return false; break;
			case 'Z' : if (Letras.indexOf(tecla) == -1) return false; break;
			case '*' : objeto.value = value; return true; break;
			default : return false; break;
		}
	}
	objeto.value = value;
	return true;
}

// VALIDAÇÕES

// ############################################################# //
// ## Biblioteca de funções para forms HTML						  			## //
// ############################################################# //

allowNullToAll = false;

/**
* Verifica se um campo possui somente valores alpha.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkAlfa(campo, allowNull, allowSlashes) {

	if ((allowNull) && (campo.value == "")) {
		return true;
	} else if ((!allowNull) && (campo.value == "")) {
		strErro = "Este campo não pode ser vazio.";
		return false;
	}

	if (allowSlashes == null) {
		allowSlashes = false;
	}
	
	if (allowSlashes) {
		erAlfa = /\d+/;
	} else {
		erAlfa = /['"\d]+/;
	}

	if (erAlfa.test(jsform_trim(campo.value))) {
		if (allowSlashes) {
			strErro = "Este campo não aceita números";
		} else {
			strErro = "Este campo não aceita números e os caracteres aspa simples (') e aspa dupla (\")";
		}
		return false;
	}

	return true;
}


/**
* Verifica se um campo possui somente valores alfanuméricos.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkAlfaNum(campo, allowNull, allowSlashes) {
	
	if ((allowNull) && (trim(campo.value) == "")) {
		return true;
	} else if ((!allowNull) && (trim(campo.value) == "")) {
		strErro = "Este campo não pode ser vazio.";
		return false;
	}

	if (allowSlashes == null) {
		allowSlashes = false;
	}
	
	if (!allowSlashes) {
		erAlfaNum = /['"]+/;
		if (erAlfaNum.test(jsform_trim(campo.value))) {
			strErro = "Este campo não aceita os caracteres aspas simples (') e aspas duplas (\").";
			return false;
		}
	}

	return true;
}


/**
* Verifica se um campo possui somente valores alfanuméricos.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkNum(campo, allowNull, maxValue, minValue) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erNum = /^[\d -]+$/;

	if (!erNum.test(campo.value)) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "Este campo só aceita números";
		}
		return false;
	} else if ((maxValue != null) && (parseInt(campo.value) > maxValue)) {
		strErro = "O valor máximo permitido para este campo é " + maxValue;
		return false;
	} else if ((minValue != null) && (parseInt(campo.value) < minValue)) {
		strErro = "O valor mínimo permitido para este campo é " + minValue;
		return false;
	}

	return true;
}


/**
* Verifica se o CEP digitado é válido.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkCEP(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erCEP = /^(\d{8}|\d{5}-\d{3}|\d{2}\.\d{3}-\d{3})$/;

	if (!erCEP.test(campo.value)) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "CEP inválido";
		}
		return false;
	} else {
		var strValue = campo.value.replace(/[^0-9]/g, "");
		campo.value = strValue.substr(0, 5) + "-" + strValue.substr(5, 3);
	}

	return true;
}


/**
* Verifica se o CNPJ digitado é válido.
* Formatos válidos para value: 99.999.999/9999-99 ou 99999999999999.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkCNPJ(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erCNPJ = /^((\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2})|(\d{14}))$/;

	_erro = false;

	if (!erCNPJ.test(campo.value)) {
		_erro = true;
	} else {
		cnpj = campo.value.replace(/[^0-9]/g,"");
		dac1 = 0;
		dac2 = 0;
		dact = "";
		sum  = 0;

		digVerif = cnpj.substring(cnpj.length - 2, cnpj.length);
		cnpj = cnpj.substring(0, cnpj.length-2);

		var i;
		var j;
		for (i = (cnpj.length-1), j = 2; i >= 0; i--, j++) {
			j = (j == 10) ? 2 : j;
			sum += (cnpj.substring(i, i + 1) * j);
		}
		dac1 = ((sum*10) % 11);
		dac1 = (dac1==10) ? 0 : dac1;
		sum = 0;
		for (i = cnpj.length - 1, j = 3; i >= 0; i--, j++) {
			j = (j==10) ? 2 : j;
			sum += (cnpj.substring(i, i + 1) * j);
		}
		sum+= (dac1*2);
		dac2 = ((sum*10) % 11);
		dac2 = (dac2==10) ? 0 : dac2;
		dact = dac1 + "" + dac2;
		if (dact != digVerif) {
			_erro = true;
		}
	}

	if (_erro) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "CNPJ inválido";
		}
		return false;
	} else if (campo.value.length == 14) {
		campo.value = campo.value.substr(0,2) + "." + campo.value.substr(2,3) + "." + campo.value.substr(5,3) + "/" + campo.value.substr(8,4) + "-" + campo.value.substr(12,2);
	}

	return true;
}


/**
* Verifica se o CPF digitado é válido.
* Formatos válidos para value: 999.999.999-99 ou 99999999999.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkCPF(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erCPF = /^((\d{3}\.\d{3}\.\d{3}-\d{2})|(\d{11}))$/;
	erCPFInvalido = /^(0{11})|(1{11})|(2{11})|(3{11})|(4{11})|(5{11})|(6{11})|(7{11})|(8{11})|(9{11})$/;

	_erro = false;

	if (!erCPF.test(campo.value)) {
		_erro = true;
	} else if (erCPFInvalido.test(campo.value)) {
		_erro = true;
	} else {
		cpf = campo.value.replace(/[^0-9]/g,"");
		dv  = cpf.substr(9,2);
		cpf = cpf.substr(0,9);
		d1  = 0;
		for (var i = 0; i < 9; i++)
		  d1 += cpf.charAt(i) * (10 - i);
		if (d1 != 0) {
			d1 = 11 - (d1 % 11);
			if (d1 > 9) {
				d1 = 0;
			}
			if (dv.charAt(0) == d1) {
				d1 *= 2;
				for (i = 0; i < 9; i++)
					d1 += cpf.charAt(i) * (11-i);
				d1 = 11 - (d1 % 11);
				if (d1 > 9) {
					d1 = 0;
				}
				if (dv.charAt(1) != d1) {
					_erro = true;
				}
			} else {
				_erro = true;
			}
		} else {
			_erro = true;
		}
	}

	if (_erro) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "CPF inválido";
		}
		return false;
	} else if (campo.value.length == 11) {
		campo.value = campo.value.substr(0,3) + "." + campo.value.substr(3,3) + "." + campo.value.substr(6,3) + "-" + campo.value.substr(9,2);
	}

	return true;
}
/**
* Verifica se o CPF digitado é válido.
* Formatos válidos para value: 999.999.999-99 ou 99999999999.
* @campo: campo a ser tratado.
**/
function ValidaCPF(campo){
	if (campo.value != '')
	{
		//alert(campo.name);
		num = campo.value.onlynumber();
		//alert(num);
		if(num.length == 11){
			n1=num.substr(0,1)*1; n2=num.substr(1,1)*1; n3=num.substr(2,1)*1; n4=num.substr(3,1)*1;
			n5=num.substr(4,1)*1; n6=num.substr(5,1)*1; n7=num.substr(6,1)*1; n8=num.substr(7,1)*1;
			n9=num.substr(8,1)*1;
			d1= 11 - ((n9*2+n8*3+n7*4+n6*5+n5*6+n4*7+n3*8+n2*9+n1*10)%11);
			if (d1 >= 10) d1 = 0;
			d2= 11 - ((d1*2+n9*3+n8*4+n7*5+n6*6+n5*7+n4*8+n3*9+n2*10+n1*11) % 11);
			if (d2 >= 10) d2 = 0;
			if ((d1+d2) != (num.substr(9,1)*1 + num.substr(10,1)*1)){
				alert('CPF inválido');
				campo.focus();
				return false;
			}
		}
		else {
			if(num.length == 14){
				n1=num.substr(0,1)*1; n2=num.substr(1,1)*1; n3=num.substr(2,1)*1; n4=num.substr(3,1)*1;
				n5=num.substr(4,1)*1; n6=num.substr(5,1)*1; n7=num.substr(6,1)*1; n8=num.substr(7,1)*1;
				n9=num.substr(8,1)*1; n10=num.substr(9,1)*1; n11=num.substr(10,1)*1; n12=num.substr(11,1)*1;
				d1= 11 - ((n12*2+n11*3+n10*4+n9*5+n8*6+n7*7+n6*8+n5*9+n4*2+n3*3+n2*4+n1*5)%11);
				if (d1 >= 10) d1 = 0;
				d2= 11 - ((d1*2+n12*3+n11*4+n10*5+n9*6+n8*7+n7*8+n6*9+n5*2+n4*3+n3*4+n2*5+n1*6) % 11);
				if (d2 >= 10) d2 = 0;
				if ((d1+d2) != (num.substr(12,1)*1 + num.substr(13,1)*1)){
					alert('CNPJ inválido');
					campo.focus();
					return false;
				}
			}
			else{
				alert('Favor informar CPF/CNPJ com número dígitos correto.\nCNPJ: 01.234.567/8901-23 --- CPF: 012.345.678-90');
				campo.focus();
				return false;
			}
		}
		return true;
	}
}

/**
* Verifica se a Data digitada é válida.
* Formatos válidos para value: dd/mm/aaaa, dd-mm-aaaa, dd.mm.aaaa, ddmmaaaa, dd/mm/aa, dd-mm-aa, dd.mm.aa, ddmmaa.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkData(data) {

	erData = /^((\d{2}\/\d{2}\/\d{4})|(\d{2}-\d{2}-\d{4})|(\d{2}\.\d{2}\.\d{4})|(\d{8}))$/;

	_erro = false;

	if (!erData.test(data)) {
		_erro = true;
	} else {
		data = data.replace(/[^0-9]/g,"");

		dia = data.substr(0,2);
		mes = data.substr(2,2);
		ano = data.substr(4,4);
		if ((dia < 1) || (dia > 31)) {
			_erro = true;
		} else if (((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7) || (mes == 8) || (mes == 10) || (mes == 12)) && (dia > 31)) {
			_erro = true;
		} else if (((mes == 4) || (mes == 6) || (mes == 9) || (mes == 11)) && (dia > 30)) {
			_erro = true;
		} else if ((mes > 12) || (mes < 1)) {
			_erro = true;
		} else if ((mes == 2) && (ano % 4 == 0) && (dia > 29)) {
			_erro = true;
		} else if ((mes == 2) && (ano % 4 != 0) && (dia > 28)) {
			_erro = true;
		}
	}

	if (_erro) {
		strErro = "Data inválida";
		return false;
	}

	return true;
}

/**
* Verifica se a Hora digitada é válida.
* Formatos válidos para value: hh:mm:ss, hh:mm, hh.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkHora(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erHora = /^((\d{2}:\d{2}:\d{2})|(\d{2}:\d{2})|(\d{1})|(\d{2})|(\d{4})|(\d{3}))$/;

	_erro = false;

	if (!erHora.test(campo.value)) {
		_erro = true;
	} else {
		if (campo.value.indexOf(":") != -1) {
			aHora = campo.value.split(":");
			h = aHora[0];
			m = (aHora[1] != null) ? aHora[1] : "00";
			s = (aHora[2] != null) ? aHora[2] : "00";
		} else {
			if (campo.value.length == 1) {
				h = "0" + campo.value;
				m = "00";
				s = "00";
			} else if (campo.value.length == 2) {
				h = campo.value;
				m = "00";
				s = "00";
			} else if (campo.value.length == 3) {
				h = "0" + campo.value.substr(0,1);
				m = campo.value.substr(1,2);
				s = "00";
			} else if (campo.value.length == 4) {
				h = campo.value.substr(0,2);
				m = campo.value.substr(2,2);
				s = "00";
			}
		}


		if ((h > 23) || (m > 59) || (s > 59)) {
			_erro = true;
		}
	}

	if (_erro) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "Hora inválida";
		}
		return false;
	} else {
		campo.value = h + ":" + m + ":" + s;
	}

	return true;
}


/**
* Verifica se o formato do Email digitado é válido.
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkEmail(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erEmail = /^(([a-z0-9._-]+@(([a-z0-9-]{2,26}(\.[a-z0-9-]{2,26})+)|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))))$/;

	if (!erEmail.test(campo.value.toLowerCase())) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "E-mail inválido";
		}
		return false;
	}

	return true;
}


/**
* Verifica se o valor digitado é válido.
* Formatos válidos para o value: 9,99 | 9.99 | 9.999 (sem casas decimais) | 9,9 | 9.9 | 9.999,99 | 9999,99 | 9999.99
* @campo: campo a ser tratado.
* @allowNull: campo pode ser nulo (true/false).
**/
function jsform_checkMoeda(campo, allowNull) {

	if (((allowNull) && (campo.value == "")) || ((allowNullToAll) && (campo.value == ""))) {
		return true;
	}

	erMoeda = /^(((\d{1,3})(\.(\d{3}))*(,\d{1,2})?)|((\d+)((,|\.)\d{1,2})?))$/;

	_erro = false;

	if (!erMoeda.test(campo.value)) {
		_erro = true;
	} else {

		strInteiro = "";
		strCentavos = "";
		strValue = campo.value;

		if (strValue.search(/,/) != -1) {
			aValue = strValue.split(",");
			strInteiro = aValue[0];
			strCentavos = aValue[1];
		} else if ((strValue.charAt(strValue.length - 2) == ".") || (strValue.charAt(strValue.length - 3) == ".")) {
			aValue = strValue.split(".");
			strInteiro = aValue[0];
			strCentavos = aValue[1];
		} else {
			strInteiro = strValue;
		}
		strInteiro = strInteiro.replace(/\./g, "");

		if (strCentavos.length == 0) {
			strCentavos = "00";
		} else if (strCentavos.length == 1) {
			strCentavos += "0";
		}

		// Elimina zeros a esquerda.
		while ((strInteiro.charAt(0) == 0) && (strInteiro.length > 0)) {
			strInteiro = strInteiro.substr(1, strInteiro.length - 1);
		}

		if (strInteiro.length == 0) {
			strInteiro += "0";
		}

		valorAux = "";
		count = 0;
		for (var i = strInteiro.length - 1; i >= 0; i--) {
			if (count == 3) {
				valorAux = "." + valorAux;
				count = 0;
			}
			valorAux = strInteiro.charAt(i) + valorAux;
			count++;
		}
		strInteiro = valorAux;
	}

	if (_erro) {
		if (campo.value == "") {
			strErro = "Este campo não pode ser vazio.";
		} else {
			strErro = "Formato de moeda inválido";
		}
		return false;
	} else {
		campo.value = strInteiro + "," + strCentavos;
	}

	return true;
}

function jsform_checkRadioButton(radioName, allowNull) {
	if (allowNull || allowNullToAll) {
		return true;
	}

	aRadio = document.getElementsByName(radioName);
	for (var i = 0; i < aRadio.length; i++) {
    if (aRadio[i].checked) {
      return true;
    }
  }
  strErro = "Selecione pelo menos uma opção.";

	return false;
}


function jsform_checkComboBox(campo, allowNull) {

	if (allowNull || allowNullToAll) {
		return true;
	}

//	if (campo.value == -1) {
	if (campo.selectedIndex == 0) {
	  strErro = "Selecione uma opção.";
		return false;
	}

//	campoDestino = document.getElementById("hid" + campo.name);
//	jsform_mirrorSelect(campo, campoDestino);

	return true;
}


function jsform_checkListBox(campo, allowNull) {

	if ((allowNull || allowNullToAll) && (campo.selectedIndex == -1)) {
		return true;
	}

	if (campo.selectedIndex == -1) {
	  strErro = "Selecione pelo menos uma opção.";
		return false;
	}

	campoDestino = document.getElementById("hid" + campo.name);
	jsform_mirrorSelect(campo, campoDestino);

	return true;
}

/**
* @return boolean
*/
function jsform_checkCheckBox(aChecks, allowNull) {

	if (allowNull || allowNullToAll) {
		return true;
	}

	for (var i = 0; i < aChecks.length; i++) {
		if (aChecks[i].checked) {
			return true;
		}
	}

	strErro = "Selecione pelo menos uma opção.";
	return false;
}

/**
* @return boolean
*/
function jsform_checkFile(field, allowNull) {

	if (allowNull || allowNullToAll) {
		return true;
	}

	if (field.value == "") {
    strErro = "Selecione ou crie um documento.";
    return false;
  }

	return true;
}

/**
* Captura os values das opções selecionadas numa select
* e escreve no value de um textbox separados por ",".
* @src: select contendo as opções.
* @dst: campo que receberá os values selecionados.
**/
function jsform_mirrorSelect(campoOrigem, campoDestino, onlySelected, charSeparator) {
	var strAux = "";
	if (charSeparator == null) {
		charSeparator = ",";
	}
	for (var i = 0; i < campoOrigem.length; i++) {
    if (onlySelected != null) {
      if (onlySelected) {
		    if (campoOrigem.options[i].selected) {
			    if (strAux != "")
				    strAux += charSeparator;
			    strAux += campoOrigem.options[i].value;
		    }
      } else {
		    if (strAux != "")
			    strAux += charSeparator;
		    strAux += campoOrigem.options[i].value;
      }
    } else {
	    if (campoOrigem.options[i].selected) {
		    if (strAux != "")
			    strAux += charSeparator;
		    strAux += campoOrigem.options[i].value;
	    }
    }
	}
	campoDestino.value = strAux;
}


/**
* Verifica se o checkbox passado por parâmetro está checkado,
* se estiver, captura seu value e concatena-o no valor do campo passado por parâmetro.
* @src: checkbox a ser verificado.
* @dst: campo que receberá os values checkados.
**/

function jsform_mirrorCheckBox(aChecks, campoDestino) {
	var strAux = "";
	for (var i = 0; i < aChecks.length; i++) {
		if (aChecks[i].checked) {
			if (strAux != "")
				strAux += ",";
			strAux += aChecks[i].value;
		}
	}

	campoDestino.value = strAux;
}


/**
* Troca o estilo do campo validado
* @campo: campo a ser aplicado o estilo.
* @flag: se o estilo é erro(1) ou não(0).
**/
function jsform_setStyle(campo, flag) {
	if (flag == 0) {
		campo.className = "WorksClientCorpo";
	} else {
		campo.className = "WorksClientFormError";
	}
}

/*
function jsform_makeArrayElementsToValidate(p_aPanelToValidate) {
  var aElement = new Array();
  var aElementTemp = new Array();
	var element;
	var objPanel;
	// Regex que filtra os tipos de campos que serão validados.
	// Os tipos de campos contidos na regex não precisam ser validados.

	var erTypesNotChecked = /^(submit|hidden|button|reset)$/;

  for (var n = 0; n < p_aPanelToValidate.length; n++) {
		objPanel = p_aPanelToValidate[n];
		if (!objPanel.isVisible() || (p_aPanelToValidate.length > 1 && (objPanel.getType() == 2 || objPanel.getType() == 4))) {
			continue;
		}
		element = document.getElementById(objPanel.getOwnerTag());

		aElementTemp = element.getElementsByTagName("input");
		for (var i = 0; i < aElementTemp.length; i++) {
			if (!erTypesNotChecked.test(aElementTemp[i].type)) {
		  	aElement[aElement.length] = aElementTemp[i];
      }
    }

	   aElementTemp = element.getElementsByTagName("select");
	   for (var i = 0; i < aElementTemp.length; i++) {
         if (!erTypesNotChecked.test(aElementTemp[i].type)) {
		      aElement[aElement.length] = aElementTemp[i];
         }
	   }

	   aElementTemp = element.getElementsByTagName("textarea");
	   for (var i = 0; i < aElementTemp.length; i++) {
         if (!erTypesNotChecked.test(aElementTemp[i].type)) {
		      aElement[aElement.length] = aElementTemp[i];
         }
	   }
   }

	return aElement;
}
*/

function jsform_arraySearch(element, array) {
	for (var i = 0; i < array.length; i++) {
		if (element == array[i]) {
			return true;
		}
	}

	return false;
}

/*
 * Preenche uma comboBox a partir da escolha feita em outra comboBox.
 * @fieldSource: ComboBox que o usuário selecionou uma opção.
 * @fieldDestination: ComboBox que será preenchida.
 * @aOptions: array com os dados que serão usados para preencher a comboBox.
 * @indexParent: índice da coluna de "aOptions" que faz ligação com o Value das opções de "fieldSource".
 * @indexValue: índice da coluna de "aOptions" que será usado como Value das novas opções de "fieldDestination".
 * @indexText: índice da coluna de "aOptions" que será usado como Text das novas opções de "fieldDestination".
 * @fieldsToClear: comboBoxes a serem limpadas além de "fieldDestination". Devem pertencer ao mesmo form de
     					"fieldSource" e devem ser passadas seu nomes em uma string, separando por vírgula. Ex: 'cmbTeste1,cmbTeste2,...,cmbTesteN'
 */
function jsform_makeComboBox(fieldSource, fieldDestination, aOptions, indexParent, indexValue, indexText, fieldsToClear) {
	var option;

	if (fieldsToClear != null) {
		aFieldsToClear = fieldsToClear.split(",");
		for (var i = 0; i < aFieldsToClear.length; i++) {
			eval("jsform_clearComboBox(" + fieldDestination.form.name + "." + aFieldsToClear[i] + ", -1, \"-- Selecione --\");");
		}
	}

	jsform_clearComboBox(fieldDestination, -1, "-- Selecione --");

	for (i = 0; i < aOptions.length; i++) {
		if (fieldSource != null) {
			if (aOptions[i][indexParent] == fieldSource.value) {
				option = document.createElement("OPTION");
				option.value = aOptions[i][indexValue];
				option.text = aOptions[i][indexText];
				fieldDestination.options.add(option);
			}
		} else {
			option = document.createElement("OPTION");
			option.value = aOptions[i][indexValue];
			option.text = aOptions[i][indexText];
			fieldDestination.options.add(option);
		}
	}
}

/*
 * Preenche uma comboBox a partir da escolha feita em outra comboBox analisando o value da opção selecionada com 1 vetor.
 * @fieldSource: ComboBox que o usuário selecionou uma opção.
 * @fieldDestination: ComboBox que será preenchida.
 * @aParentOptions: array que está associado com as opções de "fieldSource".
 * @aChildOptions: array que está associado com as opções de "fieldDestination".
 * @indexParentToChildLink: índice de "aParentOptions" que está associado "aChildOptions".
 * @indexChildToParentLink: índice de "aChildOptions" que está associado com "aParentOptions".
 * @indexParentValue: índice da coluna de "aParentOptions" que representa o Value das opções de "fieldSource".
 * @indexChildValue: índice da coluna de "aChildOptions" que representa o Value das novas opções de "fieldDestination".
 * @indexChildText: índice da coluna de "aChildOptions" que representa o Text das novas opções de "fieldDestination".
 * @fieldsToClear: comboBoxes a serem limpadas além de "fieldDestination". Devem pertencer ao mesmo form de
     					"fieldSource" e devem ser passadas seu nomes em uma string, separando por vírgula. Ex: 'cmbTeste1,cmbTeste2,...,cmbTesteN'
 */
function jsform_makeComboBoxByArray(fieldSource, fieldDestination, aParentOptions, aChildOptions, indexParentToChildLink, indexChildToParentLink, indexParentValue, indexChildValue, indexChildText, fieldsToClear) {
	var option;

	if (fieldsToClear != null) {
		aFieldsToClear = fieldsToClear.split(",");
		for (var i = 0; i < aFieldsToClear.length; i++) {
			eval("jsform_clearComboBox(" + fieldDestination.form.name + "." + aFieldsToClear[i] + ", -1, \"-- Selecione --\");");
		}
	}

	jsform_clearComboBox(fieldDestination, -1, "-- Selecione --");

	var valueSelected = fieldSource.value;
	var valueToCompare;

	for (i = 0; i < aParentOptions.length; i++) {
		if (aParentOptions[i][indexParentValue] == valueSelected) {
			valueToCompare = aParentOptions[i][indexParentToChildLink];
			break;
		}
	}


	for (i = 0; i < aChildOptions.length; i++) {
		if (fieldSource != null) {
			if (aChildOptions[i][indexChildToParentLink] == valueToCompare) {
				option = document.createElement("OPTION");
				option.value = aChildOptions[i][indexChildValue];
				option.text = aChildOptions[i][indexChildText];
				fieldDestination.options.add(option);
			}
		} else {
			option = document.createElement("OPTION");
			option.value = aChildOptions[i][indexChildValue];
			option.text = aChildOptions[i][indexChildText];
			fieldDestination.options.add(option);
		}
	}
}

function jsform_clearComboBox(comboBox, firstOptionValue, firstOptionText) {
	comboBox.options.length = 0;
	if (firstOptionValue != null) {
		option = document.createElement("OPTION");
		option.value = firstOptionValue;
		option.text = firstOptionText;
		comboBox.options.add(option);
	}
}

function jsform_reorderComboBoxOption(comboBox, direction) {
  index = comboBox.selectedIndex;

	if ((index == -1) || (index == 0 && direction == "up") || (index == (comboBox.options.length - 1) && direction == "down")) {
		return;
	}

	option = comboBox.options.item(comboBox.selectedIndex);
	comboBox.options.remove(comboBox.selectedIndex);
	if (direction == "up") {
		index--;
	} else {
		index++;
	}

	comboBox.options.add(option, index);
}

function jsform_disableButtons() {
	var element;
	for (var i = 0; i < document.forms.length; i++) {
		for (var j = 0; j < document.forms[i].elements.length; j++) {
			element = document.forms[i].elements[j];
			if (element.tagName.toLowerCase() == "button") {
					element.disabled = true;
			}
		}
	}
}

// ---------------------------------------------

function jsform_addComboOption(sourceField, destinationField) {
	if ((sourceField.type.toLowerCase() == "text") && (!jsform_checkAlfaNum(sourceField, false))) {
			alert(strErro);
			sourceField.select();
			return;
	} else if ((sourceField.type.toLowerCase().search("select") != -1) && ((sourceField.selectedIndex == -1) || (sourceField.value == -1))) {
			alert("Selecione uma opção");
			sourceField.focus();
			return;
	}

	if (jsform_hasOption(sourceField, null, destinationField, null)) {
		alert("Opção já inserida.");
		sourceField.focus();
		return;
	}

	var option = document.createElement("OPTION");

	if (sourceField.type.toLowerCase() == "text") {
    option.value = -1;
    option.text = sourceField.value;
	} else if (sourceField.type.toLowerCase().search("select") != -1) {
    option.value = sourceField.options[sourceField.selectedIndex].value;
    option.text = sourceField.options[sourceField.selectedIndex].text;
	}

	destinationField.options.add(option);

}

function jsform_delComboOption(comboBoxField) {

	if (comboBoxField.selectedIndex == -1) {
		alert("Selecione uma opção para excluir");
	} else {
		comboBoxField.options.remove(comboBoxField.selectedIndex);
	}
	comboBoxField.focus();
}

function jsform_hasOption(sourceField, sourceString, destinationField, searchIn) {
	var text;

	if (searchIn == null) {
		searchIn = "text";
	}

	if (sourceField != null) {
		if (sourceField.type.toLowerCase() == "text") {
			text = sourceField.value;
		} else if (sourceField.type.toLowerCase().search("select") != -1) {
			if (searchIn == "text") {
				text = sourceField.options[sourceField.selectedIndex].text;
			} else {
				text = sourceField.options[sourceField.selectedIndex].value;
			}
		}
	} else {
		text = sourceString;
	}


	for (i = 0; i < destinationField.options.length; i++) {
		if (searchIn == "text") {
			if (destinationField.options[i].text == text) {
			 return true;
			}
		} else {
			if (destinationField.options[i].value == text) {
			 return true;
			}
		}
	}

	return false;
}

function jsform_lTrim(str) {
	str = str.replace(/^([ ]|&nbsp;)*/, "");
	return str;
}

function jsform_rTrim(str) {
	str = str.replace(/([ ]|&nbsp;)*$/, "");
	return str;
}

function jsform_trim(str) {
	str = jsform_lTrim(str);
	str = jsform_rTrim(str);
	return str;
}

function jsform_dateCompare(data1, data2, condition) {

	aData1 = data1.split("/");
	aData2 = data2.split("/");
	data1 = aData1[2] + aData1[1] + aData1[0];
	data2 = aData2[2] + aData2[1] + aData2[0];

	result = false;
	switch (condition) {
		case "=":
			if (data1 == data2) {
				result = true;
			}
			break
		case "<":
			if (data1 < data2) {
				result = true;
			}
			break
		case "<=":
			if (data1 <= data2) {
				result = true;
			}
			break
		case ">":
			if (data1 > data2) {
				result = true;
			}
			break
		case ">=":
			if (data1 >= data2) {
				result = true;
			}
			break
	}

	return result;
}

function jsform_timeCompare(time1, time2, condition) {

	aTime1 = time1.split(":");
	aTime2 = time2.split(":");
	time1 = aTime1[0] + aTime1[1] + aTime1[2];
	time2 = aTime2[0] + aTime2[1] + aTime2[2];

	result = false;
	switch (condition) {
		case "=":
			if (time1 == time2) {
				result = true;
			}
			break
		case "<":
			if (time1 < time2) {
				result = true;
			}
			break
		case "<=":
			if (time1 <= time2) {
				result = true;
			}
			break
		case ">":
			if (time1 > time2) {
				result = true;
			}
			break
		case ">=":
			if (time1 >= time2) {
				result = true;
			}
			break
	}

	return result;
}

function comboOptionToSelect(combo, value) {
	for (i = 0; i < combo.length; i++) {
		if (combo[i].value == value) {
			return i;
		}
	}
}

function keyPressMaskFormat(field, sMask, evtKeyPress) {
	var i, nCount, sValue, fldLen, mskLen, bolMask, sCod, nTecla;
	
	var nTecla = evtKeyPress.keyCode ? evtKeyPress.keyCode : evtKeyPress.which ? evtKeyPress.which : evtKeyPress.charCode;

	if (nTecla == 8) { // backspace
		evtKeyPress.returnValue = true;
		return true;
	}
	
	sValue = field.value;
	//alert(sValue);
	// Limpa todos os caracteres de formatação que
	// já estiverem no campo.
	sValue = sValue.replace(/-/g, "");
	sValue = sValue.replace(/,/g, "" );
	sValue = sValue.replace(/\./g, "" );
	sValue = sValue.replace(/\//g, "" );
	sValue = sValue.replace(/\(/g, "" );
	sValue = sValue.replace(/\)/g, "" );
	sValue = sValue.replace(/ /g, "" );
	fldLen = sValue.length;
	mskLen = sMask.length;
	
	i = 0;
	nCount = 0;
	sCod = "";
	mskLen = fldLen;
	
	while (i <= mskLen) {
		bolMask = ((sMask.charAt(i) == "-") || (sMask.charAt(i) == ".") || (sMask.charAt(i) == "/"));
		bolMask = bolMask || ((sMask.charAt(i) == "(") || (sMask.charAt(i) == ")") || (sMask.charAt(i) == " "));
		bolMask = bolMask || (sMask.charAt(i) == ",");
		
		if (bolMask) {
			sCod += sMask.charAt(i);
			mskLen++; 
		}	else {
			sCod += sValue.charAt(nCount);
			nCount++;
		}
	
		i++;
	}
	
	field.value = sCod;
	
	if (sMask.charAt(i-1) == "9") { // apenas números...
		evtKeyPress.returnValue = ((nTecla > 47) && (nTecla < 58));
		return ((nTecla > 47) && (nTecla < 58)); 
	} // números de 0 a 9
	else { // qualquer caracter...
		evtKeyPress.returnValue = true;
		return true;
	} 
}

/**
 * Tela de pesquisa de funcionarios
 * A página que utilizar essa função deve implementar a função javascript
 * setFuncionario(funcionario)
 * onde o parametro funcionario é um objeto em javascript
 * espelho da classe Funcionario (TO)
 */
function pesquisarFuncionario() {
	var win = window.open("/common/pages/pesquisar_funcionario.php", "pesquisarFuncionario", "width=600px,height=500px,scrollbars=yes,top=50px,left=50px");
	win.focus();
}

/**
 * Tela de pesquisa de estruturas administrativas
 * A página que utilizar essa função deve implementar a função javascript
 * setEstruturaAdministrativa(estruturaAdministrativa)
 * onde o parametro estruturaAdministrativa é um objeto em javascript
 * espelho da classe EstruturaAdministrativa (TO)
 */
function pesquisarEstruturaAdministrativa() {
	var win = window.open("/common/pages/pesquisar_estrutura_administrativa.php", "pesquisarEstruturaAdministrativa", "width=600px,height=500px,scrollbars=yes,top=50px,left=50px");
	win.focus();
}
	
/**
 * Função que cria elementos HTML/DOM
 * Implementada devido à incompatibilidade entre os browsers na hora de criar um elemento INPUT usando document.createElement()
 * No IE, ele não permite setar a propriedade "name" do elemento criado, isso deve ser feito na chamada ao método
 * document.createElement()
 * Já nos outros browsers essa propriedade pode ser setada depois de criado o elemento
 */
function createInputElement(name) {
	if (document.all) {
		// IE
		var element = document.createElement("<input name='" + name + "' />");
	} else {
		// Firefox
		var element = document.createElement("input");
		element.name = name;
	}
	
	return element;
}

// Função para formatar um processo no padrão 000.00.000000-0/000 (Primeiro Grau)
function formataProcessoPG(campo, event) {
	
	if (event != null) {
		
		
		if (window.event) {
			// Internet Explorer
			var keyCode = event.keyCode;
		}	else if (event.which) {
			// Netscape ou Firefox
			var keyCode = event.which;
		}
	
		if (keyCode == 8 || keyCode == null) {
			return true;		
		}
		
		if (!validaTeclaRegex(event, /^\d$/)) {
			return false;
		}
		
		if (campo.value.length == 19) {
			return false;
		}
	
		if (campo.value.length == 3) {
			campo.value += ".";
		} else if (campo.value.length == 6) {
			campo.value += ".";
		} else if (campo.value.length == 13) {
			campo.value += "-";
		} else if (campo.value.length == 15) {
			campo.value += "/";
		}
	} else {
		// função foi invocada por algum script. Geralmente disparada em validações javascript antes de submeter o form
		// TODO implementar
	}
}


// Função para formatar o campo de Processo para o formato 0000.000000-0/0000.00 (Segundo Grau)
function formataProcessoSG(campo, event) {
	
	if (event != null) {
		if (window.event) {
			// Internet Explorer
			var keyCode = event.keyCode;
		}	else if (event.which) {
			// Netscape ou Firefox
			var keyCode = event.which;
		}
	
		if (keyCode == 8 || keyCode == null) {
			return true;		
		}
		
		if (!validaTeclaRegex(event, /^\d$/)) {
			return false;
		}
		
		if (campo.value.length == 21) {
			return false;
		}
	
		if (campo.value.length == 4) {
			campo.value += ".";
		} else if (campo.value.length == 11) {
			campo.value += "-";
		} else if (campo.value.length == 13) {
			campo.value += "/";
		} else if (campo.value.length == 18) {
			campo.value += ".";
		}
	
	} else {
		// função foi invocada por algum script. Geralmente disparada em validações javascript antes de submeter o form
		// TODO implementar
	}
}

function apenasNumeros(e) {
  // Esta função bloqueia a digitação de teclas diferentes das numéricas, da vírgula e do backspace.
  // A função keyCode retorna o número ASCII correspondente da tecla pressionada
  // quando o navegador é o Internet Explorer
  // A função which retorna o número ASCII correspondente da tecla pressionada
  // quando o navegador é o Netscape ou o Firefox
    if (window.event) // Internet Explorer
      var tecla = e.keyCode;
    else if (e.which)  // Netscape ou Firefox
      var tecla = e.which;
  // número zero = 48
  // número nove = 57
  // ponto = 46
  // tecla backspace = 8
  // tecla delete = 127
  if ((tecla < 48 || tecla > 57) && tecla != 8 && tecla != 127 && tecla != 44)
    return false;
  else
    return true;
 }
 
function isDate(DATA) {
	if (DATA == '') return false;
	
	var expReg = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2][0-9]\d{2})$/;
	
	if ((DATA.match(expReg))) return true;
									 
	return false;
	
	/*
	var expReg = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/[1-2][0-9]\d{2})$/;
	var vdt = new Date();
	var vdia = vdt.getDay();
	var vmes = vdt.getMonth();
	var vano = vdt.getYear();
	if ((DATA.value.match(expReg)) && (DATA.value!='')){
		var dia = DATA.value.substring(0,2);
		var mes = DATA.value.substring(3,5);
		var ano = DATA.value.substring(6,10);
		if((mes == 4 && dia > 30) || (mes == 6 && dia > 30) || (mes == 9 && dia > 30) || (mes == 11 && dia > 30)){
			return false;
		} else { //1
			if(ano%4!=0 && mes==2 && dia>28){
				return false;
			} else{ //2
				if(ano%4==0 && mes==2 && dia>29){
					return false;
				} else{ //3
					if (ano > vano) {
						return false;
					}else{ //4
						//alert ("Data correta!");
						return true;
					} //4-else
				} //3-else
			}//2-else
			}//1-else                       
	} else { //5
		return false;
	} //5-else*/
}

function isMail(mail){
  var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);

	if(typeof(mail) == "string") {
		if(er.test(mail)) { 
			return true; 
		}
	} else if(typeof(mail) == "object") {
		if(er.test(mail.value)){
			return true;
		}
	}else{
		return false;
	}
}

function validaRegex(value, regex) {
	if (regex.test(value)) {
		return true;
	} else {
		return false;
	}
}

/*
 * Função que valida se a tecla pressionada obedece a expressão regular passada por parâmetro
 * Deve ser usada no evento onkeypress para que funcione em "todos" os browsers
 */
function validaTeclaRegex(event, regex) {

	if (window.event) {
		// Internet Explorer
		var keyCode = event.keyCode;
	}	else if (event.which) {
		// Netscape ou Firefox
		var keyCode = event.which;
	}

	if (keyCode == 8 || keyCode == null) {
		return true;		
	}
	
	if (regex.test(String.fromCharCode(keyCode))) {
		return true;
	} else {
		return false;
	}
}	

/*
 * Função para clonar objetos
 */
function clone(obj) {
	if (obj == null || typeof(obj) != 'object') {
		return obj;
	}
	
	var newObj = new Object();

	for (var key in obj) {
		newObj[key] = clone(obj[key]);
	}

	return newObj;
}

/*
 * Função para selecionar todos ou nenhum checkbox
 * Parâmetros:
 * 		String opcao : informa se é para selecionar ou deselecionar os checkbox. Valores são "all" e "none"
 * 		String parentId (opcional) : Id do componente "pai" dos checkboxes que sofrerão a ação. Informe null, ou não informe, se desejar que todos os checkboxes da página sofram a ação
 */
function checkboxSelectAllNone(opcao, parentId) {

	if (parentId != null) {
		var parent = document.getElementById(parentId);
	} else {
		var parent = document;
	}
	
	var inputs = parent.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; i++) {
		if (inputs[i].type == "checkbox") {
			if (opcao == "all") {
				inputs[i].checked = true;
			} else {
				inputs[i].checked = false;
			}
		}
	}
}
