/**
 * Submete o form utilizando as informações passadas.
 * Caso o form não seja informado, será assumido o primeiro form do documento.
 * Caso seja especificada uma mensagem, será pedida confirmação antes que o form seja
 * submetido.
 */
function submitForm(url, msg, frm) {
	if (msg) {
		if (!confirm(msg)) return;
	}
	if (!frm) {
		frm = document.forms[0];
	}
	if (url) {
		frm.action = url;
	}
	frm.submit();
}

/**
 * Posta um form com a ação especificada pedindo ou não confirmação
 */
function submitFormCmd(cmd, frm, msg, cmdField) {
	if (msg)
		if (!confirm(msg)) return;

	// se o for não tiver sido especificado, assume o primeiro form do documento
	if (!frm) var frm = document.forms[0];

	// se um nome de campo de ação não tiver sido especificado, utiliza o padrão
	if (!cmdField) var cmdField = frm.command;

	if (cmd) cmdField.value = cmd;

	frm.submit();
}

/**
 * Seta a flag de "checked" de um grupo de acordo com um valor passado
 */
function setChecked(form, fieldName, on) {
	var checks = form.elements[fieldName];
	var i;
	for (i = 0; i < checks.length; i++) {
		checks[i].checked = on;
	}
}

/**
 * Seta a flag "disabled" dos elementos de um grupo de acordo com um valor passado
 */
function setEnabled(formName, groupName, enable) {
	var i;
	var group = document.forms[formName][groupName];
	if (!group) return;
	if (group.length) for (i = 0; i < group.length; i++) group[i].disabled = !enable;
	else group.disabled = !enable;
}

/**
 * Retorna se algum item de um grupo de checkboxes ou radiobuttons de um form está selecionado
 */
function hasCheck(formName, groupName) {
	var i;
	var group = document.forms[formName][groupName];
	if (!group) return false;
	var has = false;
	if (group.length) for (i = 0; (i < group.length) && !has; i++) has = has || group[i].checked;
	else has = group.checked;
	return has;
}

/**
 * Seta o foco para um controle quando o tamanho de um texto alcançar o valor especificado.
 * Esta função é interessante quando utilizada no evento onKeyUp de campos de texto.
 */
function focusOnLength(currentField, nextField, maxLength) {

	// verifica se a tecla pressionada está dentro da faixa permitida
	//var k = window.event.keyCode;
	//if ((k < 33) || (k > 255)) return;

	if (currentField.value.length >= maxLength) {
		nextField.focus();
	}
}

/**
 * Retorna se a tecla do evento é um ENTER.
 */
function isEnterKey(event) {
	var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
	return keyCode == 13;
}

/**
 * Localiza o próximo campo de um form à partir do campo fornecido.
 */
function findNextField(field) {
	var i;
	for (i = 0; i < field.form.elements.length; i++)
		if (field == field.form.elements[i]) break;
	i = (i + 1) % field.form.elements.length;
	return field.form.elements[i];
}

/**
 * Foca o próximo campo do form quando ocorre pressionamento da tecla ENTER.
 * Esta função deve ser utilizada com o evento onkeypress de campos do tipo input.
 */
function focusNextOnEnter(field, event) {
	if (isEnterKey(event)) {
		var nextField = findNextField(field);
		nextField.focus();
		return false;
	} else {
		return true;
	}
}

/**
 * Restringe o tamanho de um campo não permitindo que mais caracteres sejam entrados.
 */
function limitLength(e, field, maxLength) {
	if ((field.value.length < maxLength) ||
		(e.keyCode == 8) ||
		((e.keyCode >= 33) && (e.keyCode <= 40)) ||
		(e.keyCode == 46)) {
		field.value = field.value.substring(0, maxLength);
		return true;
	}
	return false;
}

/**
 * Restringe o tamanho de um valor de um campo ao tamanho informado.
 * Esta função é mais interessante se utilizada no evento onblur de um campo do tipo textarea.
 */
function setLength(field, maxLength) {
	if (field.value.length > maxLength) {
		field.value = field.value.substr(0, maxLength);
	}
}

/**
 * Transfere as opções selecionadas de um select de origem para outro.
 */
function transferOptions(origin, target) {
	if (origin.options.length > 0) {
		var i = 0;
		// percorre a origem localizando os itens selecionados
		while (i < origin.options.length) {
			var option = origin.options[i];
			if (option.selected) {
				var newOption = new Option(option.text, option.value);
				target.options[target.options.length] = newOption;
				origin.options[i] = null;
			} else {
				i++;
			}
		}
	}
}

/**
 * Seleciona todas as opções de um select.
 */
function selectAllOptions(selectObj, selected) {
	var i;
	for (i = 0; i < selectObj.options.length; i++) {
		selectObj.options[i].selected = selected;
	}
}

/**
 * Substitui as opções de um select com as opções fornecidas.
 */
function replaceSelectOptions(selectRef, newOptions) {
	clearSelect(selectRef, 1);
	for (var i = 0; i < newOptions.length - 1; i++) {
		selectRef.options[i] = newOptions[i];
	}
}

/**
 * Apaga uma lista de opções de um select
 */
 function clearSelect(selectObj, beginIndex) {
	 if (!beginIndex) beginIndex = 0;
	 while (selectObj.options.length > beginIndex) selectObj.options[beginIndex] = null;
 }

 /**
  * Retorna o valor do item selecionado de um grupo radiobuttons.
  */
function getSelectedValue(radio) {
	for (var i = 0; i < radio.length; i++) {
		var c = radio[i];
		if (c.checked) {
			return c.value;
		}
	}
	return -1;
}

