// Testa os diferentes tipos de browsers.
var browser = null;
if (window.navigator.userAgent.toLowerCase().indexOf("msie") != -1)
{
	browser = 'ie';
}
else if (window.navigator.userAgent.toLowerCase().indexOf("firefox") != -1)
{
	browser = 'firefox';
}
else if (window.navigator.userAgent.toLowerCase().indexOf("chrome") != -1)
{
	browser = 'chrome';
}
else if (window.navigator.userAgent.toLowerCase().indexOf("opera") != -1)
{
	browser = 'opera';
}
else if (window.navigator.userAgent.toLowerCase().indexOf("safari") != -1)
{
	browser = 'safari';
}
else if (window.navigator.userAgent.toLowerCase().indexOf("netscape") != -1)
{
	browser = 'netscape';
}

// Hacks específicos para cada tipo de browser.
switch (browser)
{
	case "ie":
	case "chrome":
	case "opera":
	case "safari":
	case "netscape":
	{
		break;
	}
	case "firefox":
	{
		HTMLElement.prototype.__defineGetter__("innerText", function()
		{
			return(this.textContent);
		});
		HTMLElement.prototype.__defineSetter__("innerText", function(texto)
		{
			this.textContent = texto;
		});
		break;
	}
}

Array.prototype.exists = function(valor)
{
	for (var i = 0; i < this.length; i++)
	{
		if (this[i] == valor)
		{
			return(true);
		}
	}
	return(false);
}

Array.prototype.index = function(valor)
{
	for (var i = 0; i < this.length; i++)
	{
		if (this[i] == valor)
		{
			return(i);
		}
	}
	return(-1);
}

String.prototype.trim = function() {
	var objeto = this;
	objeto = objeto.replace(/^\s*(.*)/, "$1");
	objeto = objeto.replace(/(.*?)\s*$/, "$1");
	return(objeto);
}

String.prototype.repeat = function(n) {
	return(new Array(n + 1).join(this));
}

function adiciona_barra_invertida_aspas(parametro)
{
	parametro = parametro.toString();
	parametro = parametro.replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
	return(parametro);
}

function adiciona_opcao_combobox(objeto, valor, texto, titulo, posicao)
{
	if (posicao == null)
	{
		posicao = objeto.options.length;
	}
	switch (browser)
	{
		case "ie":
		case "chrome":
		case "opera":
		case "safari":
		case "netscape":
		{
			var elemento = document.createElement("OPTION");
			elemento.value = valor;
			elemento.text = texto;
			if (titulo != null)
			{
				elemento.title = titulo;
			}
			objeto.add(elemento, posicao);
			break;
		}
		case "firefox":
		{
			objeto.options[posicao] = new Option(texto, valor);
			if (titulo != null)
			{
				objeto.options[posicao].title = titulo;
			}
			break;
		}
	}
}	

function ajax_http_request()
{
	var http_request;
	try
	{
		http_request = new XMLHttpRequest(); // Mozilla, Safari, ...
	}
	catch (e)
	{
		try
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP"); // IE
		}
		catch (e)
		{
			try
			{
				http_request = new ActiveXObject("Microsoft.XMLHTTP"); // IE
			}
			catch (e)
			{
				http_request = false;
			}
		}
	}
	return(http_request);
}

function altera_estilo_css(objeto, estilo)
{
	objeto.className = estilo;
}

function base64_decode(parametro)
{
	parametro = parametro.toString();
	var caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var retorno = "";
	var caractere1, caractere2, caractere3;
	var encode1, encode2, encode3, encode4;
	var i = 0;
	// Remove todos os caracteres que não são A-Z, a-z, 0-9, +, /, ou =.
	parametro = parametro.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	do
	{
		encode1 = caracteres.indexOf(parametro.charAt(i++));
		encode2 = caracteres.indexOf(parametro.charAt(i++));
		encode3 = caracteres.indexOf(parametro.charAt(i++));
		encode4 = caracteres.indexOf(parametro.charAt(i++));
		caractere1 = (encode1 << 2) | (encode2 >> 4);
		caractere2 = ((encode2 & 15) << 4) | (encode3 >> 2);
		caractere3 = ((encode3 & 3) << 6) | encode4;
		retorno = retorno + String.fromCharCode(caractere1);
		if (encode3 != 64)
		{
			retorno = retorno + String.fromCharCode(caractere2);
		}
		if (encode4 != 64)
		{
			retorno = retorno + String.fromCharCode(caractere3);
		}
	} while (i < parametro.length);
	return(retorno);
}

function base64_encode(parametro)
{
	parametro = parametro.toString();
	var caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var retorno = "";
	var caractere1, caractere2, caractere3;
	var encode1, encode2, encode3, encode4;
	var i = 0;
	do
	{
		caractere1 = parametro.charCodeAt(i++);
		caractere2 = parametro.charCodeAt(i++);
		caractere3 = parametro.charCodeAt(i++);
		encode1 = caractere1 >> 2;
		encode2 = ((caractere1 & 3) << 4) | (caractere2 >> 4);
		encode3 = ((caractere2 & 15) << 2) | (caractere3 >> 6);
		encode4 = caractere3 & 63;
		if (isNaN(caractere2))
		{
			encode3 = encode4 = 64;
		}
		else if (isNaN(caractere3))
		{
			encode4 = 64;
		}
		retorno = retorno + caracteres.charAt(encode1) + caracteres.charAt(encode2) + caracteres.charAt(encode3) + caracteres.charAt(encode4);
	}
	while (i < parametro.length);
	return(retorno);
}

function elemento_centraliza(objeto)
{
	objeto.style.position = "absolute";
	objeto.style.top = "50%";
	objeto.style.left = "50%";
	objeto.style.marginTop = (objeto.clientHeight / 2) * -1;
	objeto.style.marginLeft = (objeto.clientWidth / 2) * -1;
}

function elemento_html_carrega_valor(objeto, valor, separador, separador2, opcao)
{
	if (valor.length == 0)
	{
		return;
	}
	if (separador == null)
	{
		separador = ",";
	}
	if (separador2 == null)
	{
		separador2 = ";";
	}
	var tag, tipo, id;
	if (objeto.tagName == null)
	{
		tag = objeto[0].tagName;
		tipo = objeto[0].type;
		id = objeto[0].id;
	}
	else
	{
		tag = objeto.tagName;
		tipo = objeto.type;
	}
	if (tag != null)
	{
		tag = tag.toUpperCase();
	}
	if (tipo != null)
	{
		tipo = tipo.toUpperCase();
	}
	if (((tag == "INPUT") && ((tipo == "TEXT") || (tipo == "PASSWORD"))) || (tag == "TEXTAREA"))
	{
		if (id == null)
		{
			objeto.value = valor;
		}
		else
		{
			var array_valor = valor.split(separador);
			for (var i = 0; i < array_valor.length; i++)
			{
				objeto[i].value = array_valor[i];
			}
		}
	}
	if (tag == "SELECT")
	{
		if (id == null)
		{
			if (!objeto.multiple)
			{
				for (var i = 0; i < objeto.options.length; i++)
				{
					if (objeto.options[i].value == valor)
					{
						objeto.selectedIndex = i;
						objeto.title = objeto.options[i].title;
						break;
					}
				}
			}
			else
			{
				var array_valor = valor.split(separador);
				for (var i = 0; i < array_valor.length; i++)
				{
					out2:
					for (var j = 0; j < objeto.options.length; j++)
					{
						if (objeto.options[j].value == array_valor[i])
						{
							objeto.options[j].selected = true;
							break out2;
						}
					}
				}
			}
		}
		else
		{
			if (!objeto[0].multiple)
			{
				var array_valor = valor.split(separador);
				for (var i = 0; i < array_valor.length; i++)
				{
					out1:
					for (var j = 0; j < objeto[i].options.length; j++)
					{
						if (objeto[i].options[j].value == array_valor[i])
						{
							objeto[i].selectedIndex = j;
							objeto[i].title = objeto[i].options[j].title;
							break out1;
						}
					}
				}
			}
			else
			{
				var array_grupo_valor = valor.split(separador2);
				for (var h = 0; h < array_grupo_valor.length; h++)
				{
					var array_valor = array_grupo_valor[h].split(separador);
					for (var i = 0; i < array_valor.length; i++)
					{
						out3:
						for (var j = 0; j < objeto[h].options.length; j++)
						{
							if (objeto[h].options[j].value == array_valor[i])
							{
								objeto[h].options[j].selected = true;
								break out3;
							}
						}
					}
				}
			}
		}
	}
	if ((tag == "INPUT") && ((tipo == "RADIO") || (tipo == "CHECKBOX")))
	{
		if (id == null)
		{
			if (objeto.value == valor)
			{
				objeto.checked = true;
				if (tipo == "RADIO")
				{
					// Esta linha é necessária, pois no IE, o OPTION dinâmico perde seu valor ao movermos as linhas da tabela para cima ou para baixo.
					objeto.setAttribute("defaultChecked", true);
				}
			}
		}
		else
		{
			var array_valor = valor.split(separador);
			if (opcao == null) // valores diferentes para cada radio button ou checkbox.
			{
				for (var i = 0; i < array_valor.length; i++)
				{
					out4:
					for (var j = 0; j < objeto.length; j++)
					{
						if (objeto[j].value == array_valor[i])
						{
							objeto[j].checked = true;
							if (tipo == "RADIO")
							{
								// Esta linha é necessária, pois no IE, o OPTION dinâmico perde seu valor ao movermos as linhas da tabela para cima ou para baixo.
								objeto[j].setAttribute("defaultChecked", false);
							}
							break out4;
						}
					}
				}
			}
			else // valores iguais para cada radio button ou checkbox.
			{
				for (var i = 0; i < array_valor.length; i++)
				{
					if (objeto[i].value == array_valor[i])
					{
						objeto[i].checked = true;
					}
				}
			}
		}
	}
}

function elemento_html_foco(objeto)
{
	var tag, tipo, id;
	if (objeto.tagName == null)
	{
		tag = objeto[0].tagName;
		tipo = objeto[0].type;
		id = objeto[0].id;
	}
	else
	{
		tag = objeto.tagName;
		tipo = objeto.type;
	}
	if (tag != null)
	{
		tag = tag.toUpperCase();
	}
	if (tipo != null)
	{
		tipo = tipo.toUpperCase();
	}
	if (id == null)
	{
		objeto.focus();
	}
	else
	{
		objeto[0].focus();
	}
}

function elemento_html_indice(objeto)
{
	if (objeto.tagName == null)
	{
		var id = objeto[0].id;
		var nome = objeto[0].name;
	}
	else
	{
		var id = objeto.id;
		var nome = objeto.name;
	}
	if (nome == null)
	{
		var array_objeto = get_elements_by_id(id);
	}
	else
	{
		var array_objeto = document.getElementsByName(nome);
	}
	for (var i = 0; i < array_objeto.length; i++)
	{
		if (array_objeto[i] == objeto)
		{
			return(i);
		}
	}
	return(null);
}

function elemento_html_onkeydown(objeto, e, alvo)
{
	var e = e || window.event;
	var codigo_tecla = e.keyCode || e.which;
	if (codigo_tecla == 13)
	{
		switch (browser)
		{
			case "ie":
			case "chrome":
			case "opera":
			case "safari":
			case "netscape":
			{
				e.returnValue = false;
				e.cancelBubble = true;
				break;
			}
			case "firefox":
			{
				e.preventDefault();
				e.stopPropagation();
				break;
			}
		}
		if (typeof(alvo) == "function")
		{
			alvo();
		}
		else if (typeof(alvo) == "string")
		{
			eval(alvo);
		}
		else if (typeof(alvo) == "object")
		{
			elemento_html_foco(alvo);
		}
	}
}

function elemento_html_onkeypress(objeto, e, er)
{
	var e = e || window.event;
	var codigo_tecla = e.keyCode || e.which;
	switch (browser)
	{
		case "ie":
		case "chrome":
		case "opera":
		case "safari":
		case "netscape":
		{
			var caractere = String.fromCharCode(codigo_tecla);
			break;
		}
		case "firefox":
		{
			var codigo_caractere = e.charCode;
			if (codigo_caractere == 0)
			{
				return;
			}
			var caractere = String.fromCharCode(codigo_caractere);
			break;
		}
	}
	if (!er.test(caractere))
	{
		switch (browser)
		{
			case "ie":
			case "chrome":
			case "opera":
			case "safari":
			case "netscape":
			{
				e.returnValue = false;
				e.cancelBubble = true;
				break;
			}
			case "firefox":
			{
				e.preventDefault();
				e.stopPropagation();
				break;
			}
		}
	}
}

function elemento_html_seleciona_texto(objeto)
{
}

function elemento_html_tamanho(objeto, nome, comparacao, tamanho)
{
	var parametro = objeto.value;
	switch (comparacao)
	{
		case "==":
		{
			if (parametro.length == tamanho)
			{
				alert("O campo '" + nome + "' não pode ter " + tamanho + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
		case "!=":
		case "<>":
		{
			if (parametro.length != tamanho)
			{
				alert("O campo '" + nome + "' deve ter exatamente " + tamanho + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
		case "<":
		{
			if (parametro.length < tamanho)
			{
				alert("O campo '" + nome + "' deve ter no mínimo " + tamanho + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
		case "<=":
		{
			if (parametro.length <= tamanho)
			{
				alert("O campo '" + nome + "' deve ter no mínimo " + (tamanho + 1) + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
		case ">":
		{
			if (parametro.length > tamanho)
			{
				alert("O campo '" + nome + "' deve ter no máximo " + tamanho + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
		case ">=":
		{
			if (parametro.length >= tamanho)
			{
				alert("O campo '" + nome + "' deve ter no máximo " + (tamanho - 1) + " caracteres.");
				elemento_html_foco(objeto);
				return(true);
			}
			break;
		}
	}
	return(false);
}

function elemento_html_vazio(objeto, nome)
{
	var vazio = false;
	var tag, tipo, id;
	if (objeto.tagName == null)
	{
		tag = objeto[0].tagName;
		tipo = objeto[0].type;
		id = objeto[0].id;
	}
	else
	{
		tag = objeto.tagName;
		tipo = objeto.type;
	}
	if (tag != null)
	{
		tag = tag.toUpperCase();
	}
	if (tipo != null)
	{
		tipo = tipo.toUpperCase();
	}
	if (((tag == "INPUT") && ((tipo == "TEXT") || (tipo == "PASSWORD"))) || (tag == "TEXTAREA"))
	{
		if (id == null)
		{
			if (objeto.value.trim() == "")
			{
				vazio = true;
			}
		}
		else
		{
			var marcado = false;
			for (var i = 0; i < objeto.length; i++)
			{
				if (objeto[i].value.trim() != "")
				{
					marcado = true;
					break;
				}
			}
			if (!marcado)
			{
				vazio = true;
			}
		}
	}
	if (tag == "SELECT")
	{
		if (id == null)
		{
			if (!objeto.multiple)
			{
				if (objeto.options[0].value == "")
				{
					if (objeto.selectedIndex <= 0)
					{
						vazio = true;
					}
				}
				else
				{
					if (objeto.selectedIndex < 0)
					{
						vazio = true;
					}
				}
			}
			else
			{
				var marcado = false;
				for (var i = 0; i < objeto.options.length; i++)
				{
					if (objeto.options[i].selected)
					{
						marcado = true;
						break;
					}
				}
				if (!marcado)
				{
					vazio = true;
				}
			}
		}
		else
		{
			if (!objeto[0].multiple)
			{
				var marcado = false;
				for (var i = 0; i < getElementsById(id).length; i++)
				{
					if (objeto[i].options[0].value == "")
					{
						if (objeto[i].selectedIndex > 0)
						{
							marcado = true;
							break;
						}
					}
					else
					{
						if (objeto[i].selectedIndex >= 0)
						{
							marcado = true;
							break;
						}
					}
				}
				if (!marcado)
				{
					vazio = true;
				}
			}
			else
			{
				var marcado = false;
				for (var i = 0; i < getElementsById(id).length; i++)
				{
					for (var j = 0; j < objeto[i].options.length; j++)
					{
						if (objeto[i].options[j].selected)
						{
							marcado = true;
							break;
						}
					}
				}
				if (!marcado)
				{
					vazio = true;
				}
			}
		}
	}
	if ((tag == "INPUT") && ((tipo == "RADIO") || (tipo == "CHECKBOX")))
	{
		if (id == null)
		{
			if (!objeto.checked)
			{
				vazio = true;
			}
		}
		else
		{
			var marcado = false;
			for (var i = 0; i < objeto.length; i++)
			{
				if (objeto[i].checked)
				{
					marcado = true;
					break;
				}
			}
			if (!marcado)
			{
				vazio = true;
			}
		}
	}
	if (vazio)
	{
		if (nome != null)
		{
			elemento_html_foco(objeto);
			alert("O campo '" + nome + "' é obrigatório.");
		}
	}
	return(vazio);
}

function elemento_html_zera_valor(objeto)
{
	var tag, tipo, id;
	if (objeto.tagName == null)
	{
		tag = objeto[0].tagName;
		tipo = objeto[0].type;
		id = objeto[0].id;
	}
	else
	{
		tag = objeto.tagName;
		tipo = objeto.type;
	}
	if (tag != null)
	{
		tag = tag.toUpperCase();
	}
	if (tipo != null)
	{
		tipo = tipo.toUpperCase();
	}
	if (((tag == "INPUT") && ((tipo == "TEXT") || (tipo == "PASSWORD"))) || (tag == "TEXTAREA"))
	{
		if (id == null)
		{
			objeto.value = "";
		}
		else
		{
			for (var i = 0; i < objeto.length; i++)
			{
				objeto[i].value = "";
			}
		}
	}
	if (tag == "SELECT")
	{
		if (id == null)
		{
			if (!objeto.multiple)
			{
				if ((objeto.options.length > 0) && (objeto.options[0].text == "") && (objeto.options[0].value == ""))
				{
					objeto.selectedIndex = 0;
				}
				else
				{
					objeto.selectedIndex = -1;
				}
			}
			else
			{
				for (var i = 0; i < objeto.options.length; i++)
				{
					objeto.options[i].selected = false;
				}
			}
		}
		else
		{
			if (!objeto[0].multiple)
			{
				for (var i = 0; i < getElementsById(id).length; i++)
				{
					if ((objeto[i].options.length > 0) && (objeto[i].options[0].text == "") && (objeto[i].options[0].value == ""))
					{
						objeto[i].selectedIndex = 0;
					}
					else
					{
						objeto[i].selectedIndex = -1;
					}
				}
			}
			else
			{
				for (var i = 0; i < getElementsById(id).length; i++)
				{
					for (var j = 0; j < objeto.options.length; j++)
					{
						objeto[i].options[j].selected = false;
					}
				}
			}
		}
	}
	if ((tag == "INPUT") && ((tipo == "RADIO") || (tipo == "CHECKBOX")))
	{
		if (id == null)
		{
			objeto.checked = false;
			if (tipo == "RADIO")
			{
				// Esta linha é necessária, pois no IE, o OPTION dinâmico perde seu valor ao movermos as linhas da tabela para cima ou para baixo.
				objeto.setAttribute("defaultChecked", false);
			}
		}
		else
		{
			for (var i = 0; i < objeto.length; i++)
			{
				objeto[i].checked = false;
				if (tipo == "RADIO")
				{
					// Esta linha é necessária, pois no IE, o OPTION dinâmico perde seu valor ao movermos as linhas da tabela para cima ou para baixo.
					objeto[i].setAttribute("defaultChecked", false);
				}
			}
		}
	}
}

function formata_nome_arquivo(parametro)
{
	parametro = parametro.toString();
	var er = /[^0-9a-zA-Z_]/g;
	parametro = parametro.replace(er, "_");
	var er = /_{2,}/;
	while (parametro.indexOf("__") != -1)
	{
		parametro = parametro.replace(er, "_");
	}
	parametro = parametro.toLowerCase();
	return(parametro);
}

function formata_nome_pasta(parametro)
{
	parametro = parametro.toString();
	var er = /[^0-9a-zA-Z_]/g;
	parametro = parametro.replace(er, "_");
	var er = /_{2,}/;
	while (parametro.indexOf("__") != -1)
	{
		parametro = parametro.replace(er, "_");
	}
	parametro = parametro.toLowerCase();
	return(parametro);
}

function formulario_onsubmit(objeto, e)
{
	var e = e || window.event;
	switch (browser)
	{
		case "ie":
		case "chrome":
		case "opera":
		case "safari":
		case "netscape":
		{
			e.returnValue = false;
			e.cancelBubble = true;
			break;
		}
		case "firefox":
		{
			e.preventDefault();
			e.stopPropagation();
			break;
		}
	}
}

function get_bounding_client_rect(elemento)
{
	var coordenadas = {
		left: 0,
		top: 0,
		width: elemento.offsetWidth,
		height: elemento.offsetHeight,
		bottom: 0
	};
	while (elemento)
	{
		coordenadas.left += elemento.offsetLeft;
		coordenadas.top += elemento.offsetTop;
		elemento = elemento.offsetParent;
	}
	coordenadas.bottom = coordenadas.top + coordenadas.height;
	return(coordenadas);
}

function get_elements_by_id(parametro)
{
	parametro = parametro.toString();
	// Esta função pode apresentar problemas de performance em páginas complexas, com muitos elementos HTML.
	var tag = document.getElementById(parametro).tagName.toUpperCase();
	if ((tag == "INPUT") || (tag == "SELECT") || (tag == "TEXTAREA"))
	{
		var array_elementos = document.getElementsByName(parametro);
	}
	else
	{
		var elementos = document.getElementsByTagName(tag);
		var array_elementos = new Array();
		for (var i = 0; i < elementos.length; i++)
		{
			if (elementos[i].id == parametro)
			{
				array_elementos.push(elementos[i]);
			}
		}
	}
	return(array_elementos);
}

function html_decode(parametro)
{
	parametro = parametro.toString();
	/* Solução elegante, porém, incompleta.
	var elemento = document.createElement("textarea");
	elemento.innerHTML = parametro.replace(/</g, "&lt;").replace(/>/g, "&gt;");
	parametro = elemento.value;
	elemento = null;
	parametro = parametro.replace(/"/g, "&quot;");
	return(parametro);
	*/

	// Solução por "força bruta".
	var valores = new Array("&amp;", "&nbsp;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&shy;", "&reg;", "&macr;", "&deg;", "&plusmn;", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&raquo;", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&THORN;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&yacute;", "&thorn;", "&yuml;", "&quot;", "&lt;", "&gt;", "");
	var caracteres = new Array("&", " ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "\"", "<", ">", "");
	for (var i = 0; i < valores.length; i++)
	{
		if (valores[i] != "&nbsp;")
		{
			var er = new RegExp(valores[i], "g");
			parametro = parametro.replace(er, caracteres[i]);
		}
	}
	return(parametro);
}

function html_encode(parametro)
{
	parametro = parametro.toString();
	/* Solução elegante, porém, incompleta.
	var elemento = document.createElement("div");
	elemento.innerText = parametro;
	parametro = elemento.innerHTML;
	elemento = null;
	return(parametro);
	*/

	// Solução por "força bruta".
	var caracteres = new Array("&", " ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ", "\"", "<", ">", "");
	var valores = new Array("&amp;", "&nbsp;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&shy;", "&reg;", "&macr;", "&deg;", "&plusmn;", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&raquo;", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&THORN;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&yacute;", "&thorn;", "&yuml;", "&quot;", "&lt;", "&gt;", "");
	for (var i = 0; i < caracteres.length; i++)
	{
		if (caracteres[i] != " ")
		{
			var er = new RegExp(caracteres[i], "g");
			parametro = parametro.replace(er, valores[i]);
		}
	}
	return(parametro);
}

function remove_barra_invertida_aspas(parametro)
{
	parametro = parametro.toString();
	parametro = parametro.replace(/\0/g, '0').replace(/\\([\\'"])/g, '$1');
	return(parametro);
}

function tabela_exclui_linha(elemento)
{
	while ((elemento.parentNode) && (elemento.nodeName.toLowerCase() != "tr"))
	{
		elemento = elemento.parentNode;
	}
	var posicao = elemento.rowIndex; // A tabela possui uma linha de cabeçalho.
	while ((elemento.parentNode) && (elemento.nodeName.toLowerCase() != "table"))
	{
		elemento = elemento.parentNode;
	}
	elemento.deleteRow(posicao);
}

function tabela_move_linha(elemento, deslocamento, linhas_cabecalho, linhas_rodape)
{
	while ((elemento.parentNode) && (elemento.nodeName.toLowerCase() != "tr"))
	{
		elemento = elemento.parentNode;
	}
	var elemento_pai = elemento.parentNode;
	var i = elemento.rowIndex + deslocamento;
	if (i < linhas_cabecalho)
	{
		i += (elemento_pai.rows.length - (linhas_cabecalho + linhas_rodape));
	}
	if (i == (elemento_pai.rows.length - linhas_rodape))
	{
		i = linhas_cabecalho;
	}
	elemento_pai.removeChild(elemento);
	var linha = elemento_pai.insertRow(i);
	elemento_pai.replaceChild(elemento, linha);
}

function url_decode(parametro)
{
	parametro = parametro.toString();
	parametro = parametro.replace(/\+/g, " ");
	parametro = unescape(parametro);
	return(parametro);
}

function url_encode(parametro)
{
	parametro = parametro.toString();
	parametro = escape(parametro);
	parametro = parametro.replace(/\+/g, "%2B");
	return(parametro);
}

function valida_inteiro(parametro)
{
	parametro = parametro.toString();
	var er = /^[0-9]+$/;
	return(er.test(parametro));
}

function valida_nome_arquivo(parametro)
{
	parametro = parametro.toString();
	var er = /^[0-9a-zA-Z_]+$/;
	return(er.test(parametro));
}

function valida_nome_pasta(parametro)
{
	parametro = parametro.toString();
	var er = /^[0-9a-zA-Z_]+$/;
	return(er.test(parametro));
}

function xml_ajax_combobox(url, parametros, metodo, modo, objeto, valor_padrao, funcao)
{
	if ((xml_ajax_combobox.depurar != null) && (xml_ajax_combobox.depurar))
	{
		window.open(url + ((parametros == null) ? "" : "?" + parametros));
	}
	var primeiro_elemento_vazio = false;
	if (objeto.options.length > 0)
	{
		if ((objeto.options[0].text == "") && (objeto.options[0].value == ""))
		{
			primeiro_elemento_vazio = true;
			var primeiro_elemento = objeto.options[0];
		}
		objeto.options.length = 0;
	}
	var elemento = document.createElement("OPTION");
	elemento.value = "Carregando...";
	elemento.text = "Carregando...";
	objeto.options.add(elemento);
	var http_request = ajax_http_request();
	if (http_request)
	{
		metodo = metodo.toUpperCase();
		switch (metodo)
		{
			case "GET":
			{
				http_request.open("GET", url + ((parametros == null) ? "" : "?" + parametros), modo);
				break;
			}
			case "POST":
			{
				http_request.open("POST", url, modo);
				break;
			}
			default:
			{
				return;
			}
		}
		if (modo)
		{
			http_request.onreadystatechange = function()
			{
				if (http_request.readyState == 4)
				{
					if (http_request.status == 200)
					{
						var objeto_xml = http_request.responseXML;
						if (xml_converte_texto(objeto_xml) != "")
						{
							objeto.options.length = 0;
							if (primeiro_elemento_vazio)
							{
								objeto.options.add(primeiro_elemento);
							}
							xml_carrega_elemento_html(objeto_xml, objeto, valor_padrao);
							if (funcao != null)
							{
								if (typeof(funcao) == "function")
								{
									funcao();
								}
								else if (typeof(funcao) == "string")
								{
									eval(funcao);
								}
							}
						}
					}
				}
			}
		}
		if (metodo == "GET")
		{
			http_request.send(null);
		}
		else if (metodo == "POST")
		{
			http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			http_request.setRequestHeader("Content-length", parametros.length);
			http_request.setRequestHeader("Connection", "close");
			http_request.send(parametros);
		}
		if (!modo)
		{
			var objeto_xml = http_request.responseXML;
			if (xml_converte_texto(objeto_xml) != "")
			{
				objeto.options.length = 0;
				if (primeiro_elemento_vazio)
				{
					objeto.options.add(primeiro_elemento);
				}
				xml_carrega_elemento_html(objeto_xml, objeto, valor_padrao);
				if (funcao != null)
				{
					if (typeof(funcao) == "function")
					{
						funcao();
					}
					else if (typeof(funcao) == "string")
					{
						eval(funcao);
					}
				}
			}
		}
	}
}

function xml_ajax_execute(url, parametros, metodo, modo, funcao)
{
	if ((xml_ajax_execute.depurar != null) && (xml_ajax_execute.depurar))
	{
		window.open(url + ((parametros == null) ? "" : "?" + parametros));
	}
	var http_request = ajax_http_request();
	if (http_request)
	{
		metodo = metodo.toUpperCase();
		switch (metodo)
		{
			case "GET":
			{
				http_request.open("GET", url + ((parametros == null) ? "" : "?" + parametros), modo);
				break;
			}
			case "POST":
			{
				http_request.open("POST", url, modo);
				break;
			}
			default:
			{
				return;
			}
		}
		if (modo)
		{
			// O evento "onreadystatechange" só funciona no modo Assíncrono no Firefox.
			http_request.onreadystatechange = function()
			{
				if (http_request.readyState == 4)
				{
					if (http_request.status == 200)
					{
						var objeto_xml = http_request.responseXML;
						var txt = http_request.responseText;
						if (typeof(funcao) == "function")
						{
							funcao(objeto_xml, txt);
						}
						else if (typeof(funcao) == "string")
						{
							eval(funcao);
						}
					}
				}
			}
		}
		if (metodo == "GET")
		{
			http_request.send(null);
		}
		else if (metodo == "POST")
		{
			http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			http_request.setRequestHeader("Content-length", parametros.length);
			http_request.setRequestHeader("Connection", "close");
			http_request.send(parametros);
		}
		if (!modo)
		{
			var objeto_xml = http_request.responseXML;
			var txt = http_request.responseText;
			funcao(objeto_xml, txt);
		}
	}
}

function xml_carrega_elemento_html(objeto_xml, objeto, valor_padrao, separador)
{
	if (xml_converte_texto(objeto_xml) == "")
	{
		return;
	}
	if (separador == null)
	{
		separador = ",";
	}
	var tag, tipo, id;
	if (objeto.tagName == null)
	{
		tag = objeto[0].tagName;
		tipo = objeto[0].type;
		id = objeto[0].id;
	}
	else
	{
		tag = objeto.tagName;
		tipo = objeto.type;
	}
	if (tag != null)
	{
		tag = tag.toUpperCase();
	}
	if (tipo != null)
	{
		tipo = tipo.toUpperCase();
	}
	if (tag == "SELECT")
	{
		var primeiro_elemento_vazio = false;
		if (objeto.options.length > 0)
		{
			if ((objeto.options[0].text == "") && (objeto.options[0].value == ""))
			{
				primeiro_elemento_vazio = true;
				var primeiro_elemento = objeto.options[0];
			}
			objeto.options.length = 0;
		}
		var elemento = document.createElement("OPTION");
		elemento.value = "Carregando...";
		elemento.text = "Carregando...";
		objeto.options.add(elemento);
		var rows = objeto_xml.getElementsByTagName("row");
		objeto.options.length = 0;
		if (primeiro_elemento_vazio)
		{
			objeto.options.add(primeiro_elemento);
		}
		if (id == null)
		{
			for (var i = 0; i < rows.length; i++)
			{
				var elemento = document.createElement("OPTION");
				if (rows[i].attributes.length == 0)
				{
					break;
				}
				else if (rows[i].attributes.length == 1)
				{
					elemento.text = xml_decode(rows[i].getAttribute(rows[i].attributes[0].name));
				}
				else
				{
					elemento.text = xml_decode(rows[i].getAttribute(rows[i].attributes[1].name));
				}
				elemento.value = xml_decode(rows[i].getAttribute(rows[i].attributes[0].name));
				if (rows[i].attributes.length > 2)
				{
					elemento.title = xml_decode(rows[i].getAttribute(rows[i].attributes[2].name));
				}
				else
				{
					elemento.title = "";
				}
				if (rows[i].attributes.length > 3)
				{
					for (var j = 3; j < rows[i].attributes.length; j++)
					{
						elemento.setAttribute("x_" + rows[i].attributes[j].name, xml_decode(rows[i].attributes[j].value));
					}
				}
				objeto.options.add(elemento);
			}
			if (valor_padrao != null)
			{
				elemento_html_carrega_valor(objeto, valor_padrao);
			}
		}
		else
		{
			var array_valor_padrao = valor_padrao.split(separador);
			for (var k = 0; k < get_elements_by_id(id).length; k++)
			{
				for (var i = 0; i < rows.length; i++)
				{
					var elemento = document.createElement("OPTION");

					if (rows[i].attributes.length == 0)
					{
						break;
					}
					else if (rows[i].attributes.length == 1)
					{
						elemento.text = xml_decode(rows[i].getAttribute(rows[i].attributes[0].name));
					}
					else
					{
						elemento.text = xml_decode(rows[i].getAttribute(rows[i].attributes[1].name));
					}
					elemento.value = xml_decode(rows[i].getAttribute(rows[i].attributes[0].name));
					if (rows[i].attributes.length > 2)
					{
						elemento.title = xml_decode(rows[i].getAttribute(rows[i].attributes[2].name));
					}
					if (rows[i].attributes.length > 3)
					{
						for (var j = 3; j < rows[i].attributes.length; j++)
						{
							elemento.setAttribute("x_" + rows[i].attributes[j].name, xml_decode(rows[i].attributes[j].value));
						}
					}
					objeto[k].options.add(elemento);
				}
				if (array_valor_padrao[k] != null)
				{
					elemento_html_carrega_valor(objeto[k], array_valor_padrao[k]);
				}
			}
		}
	}
}

function xml_converte_objeto(xml)
{
	switch (browser)
	{
		case "ie":
		{
			var objeto_xml = new ActiveXObject("Microsoft.XMLDOM");
			objeto_xml.async = "false";
			objeto_xml.loadXML(xml);
			break;
		}
		case "firefox":
		case "chrome":
		case "opera":
		case "safari":
		case "netscape":
		{
			var parser = new DOMParser();
			var objeto_xml = parser.parseFromString(xml, "text/xml");
			break;
		}
	}
	return(objeto_xml);
}

function xml_converte_texto(objeto_xml)
{
	switch (browser)
	{
		case "ie":
		{
			return(objeto_xml.xml);
			break;
		}
		case "firefox":
		case "chrome":
		case "opera":
		case "safari":
		case "netscape":
		{
			return((new XMLSerializer()).serializeToString(objeto_xml));
			break;
		}
	}
}

function xml_decode(parametro)
{
	parametro = parametro.toString();
	parametro = url_decode(parametro);
	return(parametro);
}

function xml_encode(parametro)
{
	parametro = parametro.toString();
	parametro = url_encode(parametro);
	return(parametro);
}
