//Na verdade testo por NS6+/Mozilla+
var ns6 = (document.getElementById)&&!(document.all);
var estaEnviando = false;

function Evento(target) {
	this.target = target;
}
//Captura o evento de onclick, passando o evento e o input através de event, this
function CancelaEvento(evt) {
	//returnValue = false (IE) é o equivalante ao preventDefault do DOM
	//cancela o POST
	if(ns6)
		evt.preventDefault();
	else
		evt.returnValue = false;
}

function MontaLinkFoco(erroDesc) {
	var elemento = erroDesc.elemento;
	if(elemento) {
		var nomeCompleto = "document.getElementsByName(" + '"' + elemento.name + '"' + ").item(" +
			erroDesc.indexErro + ")";
		return("<a href='javascript:" + nomeCompleto + ".focus();'>" + erroDesc.ErroMessage + "</a>");
	}
	else
		return erroDesc.ErroMessage;
}

function Voltar() {
	window.history.back();
}

function Redirecionar(url) {
	window.location = url;
}

function Cadastra(evt, funcValidacao, flgNaoHabilitar, mensagemConfirmacao) {
	AcaoCadastro(evt, "cadastrar", funcValidacao, flgNaoHabilitar, mensagemConfirmacao)
}
function Altera(evt, funcValidacao, flgNaoHabilitar) {
	AcaoCadastro(evt, "alterar", funcValidacao, flgNaoHabilitar)
}

function AcaoSimples(evt, funcao, url) {
	var Target = (evt.target)?(evt.target):evt.srcElement, //IE e NS/MZ
		frmRef = Target.form;
	
	if(funcao) frmRef.funcao.value = funcao;

	// DIV do preLoader
	if (typeof(window['_IniciaPreLoader']) != "undefined") IniciaPreLoader();

	if ( url )
	{
		frmRef.action = url;
		CancelaEvento(evt);
		frmRef.submit();
	}
}

function Exporta(evt)
{
	var Target = (evt.target)?(evt.target):evt.srcElement, //IE e NS/MZ
		frmRef = Target.form;
		funcao = frmRef.funcao.value;
	
	var formName = Target.form.name;
	
	var fnAcerto = new Function("document.forms['" + formName + "'].funcao.value='" + funcao + "';");

	window.setTimeout( fnAcerto, 500, "javascript"); 
	AcaoCadastro(evt, "exportar");
}

function AcaoWait(evt, botao,acao)
{
    var envio = AcaoCadastro(evt, acao);

    if(envio == true)
    {
        window.setTimeout('SomeBotaoWait("' + botao + '");', 1);
    }
}

function SomeBotaoWait(botao)
{
    var btnRef = document.getElementById(botao);

    var imgWait = document.createElement('img');   
    imgWait.src = 'imagens/wait.gif';
    imgWait.title = 'Aguarde...';

    btnRef.disabled = true;
    btnRef.style.visibility = 'hidden';
    btnRef.parentNode.insertBefore(imgWait, btnRef); 
}

function AcaoCadastro(evt, funcao, funcValidacao, flgNaoHabilitar, mensagemConfirmacao) {
//srcElement(IE) funciona como o target do DOM
//ownerDocument(IE) faz parte do DOM	

	var Target = (evt.target)?(evt.target):evt.srcElement,
		frmCadastro = Target.form,
		doc = (frmCadastro.ownerDocument)?frmCadastro.ownerDocument:frmCadastro.document,
		sErro = '';
	var divErro = doc.getElementById("divErro");

	var aErroDesc = ValidaForm(frmCadastro);
	if((!aErroDesc)&&(funcValidacao)) aErroDesc=funcValidacao(frmCadastro);
	if(aErroDesc) {
		var msgErro = "";
		for (var i=0; i<aErroDesc.length; i++) {
			sErro += MontaLinkFoco(aErroDesc[i]) +"<br/>";
			msgErro += aErroDesc[i].ErroMessage + "\n";
		}
		//Faço isso porque é mais fácil e o NS6/Mozilla aceitam, 
		//mas de qualquer forma é pura preguiça ;)
		if(divErro) 
		{
			divErro.innerHTML = sErro;
			divErro.scrollIntoView(true);
		}
		else
			alert(msgErro);
		
		CancelaEvento(evt);
		estaEnviando = false;
		return;
	}
	if(divErro && divErro.innerHTML!='')
		divErro.innerHTML='';

	if(estaEnviando) {
		CancelaEvento(evt);
		return;
	}
	if(mensagemConfirmacao)
		if(!confirm(mensagemConfirmacao)) {
		CancelaEvento(evt);
		return -1;
	}
	estaEnviando = true;
	frmCadastro.elements["funcao"].value = funcao;
	PreparaEnvio(frmCadastro, flgNaoHabilitar);
	estaEnviando = false;
	
	// DIV do preLoader
	if (typeof(window['_IniciaPreLoader']) != "undefined") IniciaPreLoader();
	
	return true;
}

function RedirecionaPostPopUp(evt, descfuncao, url, targetWindow, features ){
	var Target = (evt.target)?(evt.target):evt.srcElement,
		frmCadastro = Target.form,
		urlOriginal = frmCadastro.action,
		targetOriginal = frmCadastro.target;
		
		frmCadastro.elements["funcao"].value = descfuncao;

		frmCadastro.target = targetWindow;
		win = window.open('', targetWindow, features);

	if ( url ) frmCadastro.action = url;
	var memoria = PreparaEnvio(frmCadastro, false);

	frmCadastro.submit();
	frmCadastro.action = urlOriginal;
	frmCadastro.target = targetOriginal;
	
	for(var j=0; j < memoria.length; j++)
		memoria[j].disabled = true;
}

//Captura o evento onclick, passando a função seguinte
function CancelarEnvio(evt, descfuncao, url){
	var Target = (evt.target)?(evt.target):evt.srcElement,
		frmCadastro = Target.form;
	
	frmCadastro.elements["funcao"].value = descfuncao;

	if ( url )
	{
		document.location = url;
		CancelaEvento(evt);
	}		
}

function PreparaEnvio(form, flgNaoHabilitar ) {
	var memoria = Array(),
		jmem = 0;
	//Aqui faz os ajustes para o envio
	for(var i=0; i<form.elements.length; i++) {
		var elem = form.elements[i], 
			tipo = elem.getAttribute('tipo');
		if(elem.tagName=='INPUT' && elem.type=='checkbox' &&
			 (tipo == 'g' || tipo == 'ng')) {
			if(elem.checked) 
				elem.value = 1;
			else {
				elem.value = 0;
				elem.checked = true;
			}
		}
		if(!flgNaoHabilitar)
		{
			if(elem.disabled)
				memoria[jmem++] = elem;
			elem.disabled = false;
		}	
		if(elem.style.visibility == "hidden") //Se estiver invisível, deixa desabilitado
		{
			elem.disabled = true;
		}
	}
	return memoria;
}


//Retorna valor pra janela opener quando em popup 
//function RetornaValorPopup(evt,val) {
//	var Target = (evt.currentTarget)?(evt.currentTarget):evt.srcElement;
//	var	openerObjName= Target.form.openerObj.value.split(",");
function RetornaValorPopup(campo,val) {
	var	openerObjName= campo.split(",");
	var	obj = window.opener.document.getElementsByName(openerObjName[0])[openerObjName[1]];

	if (obj.tagName == "SELECT")
	{
		obj.selectedIndex=0;
		obj=obj.options[0];
	}
	obj.value = val;
	obj.form.funcao.value = "refresh,"+obj.form.funcao.value;
	obj.form.submit();
//	CancelaEvento(evt);
	window.close();
}

// Essas funções fazem a parte de inserir e remover linhas nas tabelas dinâmicas
// Para isso é necessário que as tabelas estejam construídas com THEAD e TBODY, sendo que as
// dinâmicas se encontram no TBODY. Além disso a tabela deve conter um campo chamado tabOrigin
// que representa a tabela original, onde serão buscadas as linhas a serem inseridas nesta tabela.
// tabOrigin: tabela cujas linhas serão inseridas no TBODY da tabela do objeto 'evt' (parâmetros das funções)
function Inserir(evt) {
// o objeto faz referência a uma imagem. É passado através de (event), assim o "pai" da imagem é um TD
// o pai do pai um TR o pai deste TR é TBODY, o pai do TBODY é uma tabela, que é a informação que precisamos
// Obs.: É importante observar que os moldes de linhas a serem inseridos devem ser posicionados fora do form,
// para que não sejam eventualmente postados.
	CancelaEvento(evt);

	var Target = (evt.currentTarget)?(evt.currentTarget):evt.srcElement,  //IE e NS/MZ
		tabela = Target;

	while(tabela != null && tabela.tagName != 'TABLE'){
		tabela = tabela.parentNode;
	}
	
	var listaTbody = tabela.getElementsByTagName('TBODY'),
		tbodyLista = null;
	
	for(var i=0; i<listaTbody.length; i++)
		if(listaTbody[i].getAttribute("lista")) {
			tbodyLista = listaTbody[i];
			break;
		}
	
	// Não foi usado insertRow, pois gerava problemas na primeira linha que era inserida no mozilla
	// o comentário a seguir é o que deveria ser usado se funcionasse no Mozilla
	// A vantagem de fazer o append completo no tbody no final é que primeiro se apronta a linha, e 
	// depois de completa ela é inserida no final. De outra forma ela seria montada "on the run".
	// Idem para o insertCell.
	var linhas = document.getElementById(tabela.getAttribute("tabOrigin")).rows;
	for(var j=0; j < linhas.length; j++) {
		var tr = document.createElement('TR'); //tbodyLista.insertRow(tbodyLista.rows.length); 
		for(var k=0; k < linhas[j].attributes.length; k++) {
			var attrib = linhas[j].attributes[k];
			tr.setAttribute(attrib.nodeName, attrib.nodeValue);
		}
		tr.style.cssText = linhas[j].style.cssText;

		var td;
		with(linhas.item(j)) {
			for (var i=0; i < cells.length; i++) {
				td = document.createElement(cells.item(i).tagName);
				td.innerHTML = cells.item(i).innerHTML;
				
				for(var k=0; k < cells.item(i).attributes.length; k++) {
					var attrib = cells.item(i).attributes[k];
					td.setAttribute(attrib.nodeName, attrib.nodeValue);
				}
				td.style.cssText = cells.item(i).style.cssText;
				tr.appendChild(td);
			}
			tbodyLista.appendChild(tr);
		}
	}
}


// Essas funções fazem a parte de inserir e remover linhas nas tabelas dinâmicas
// Para isso é necessário que as tabelas estejam construídas com THEAD e TBODY, sendo que as
// dinâmicas se encontram no TBODY. Além disso a tabela deve conter um campo chamado tabOrigin
// que representa a tabela original, onde serão buscadas as linhas a serem inseridas nesta tabela.
// tabOrigin: tabela cujas linhas serão inseridas no TBODY da tabela do objeto 'evt' (parâmetros das funções)
function InserirEntreLinhas(evt) {
// o objeto faz referência a uma imagem. É passado através de (event), assim o "pai" da imagem é um TD
// o pai do pai um TR o pai deste TR é TBODY, o pai do TBODY é uma tabela, que é a informação que precisamos
// Obs.: É importante observar que os moldes de linhas a serem inseridos devem ser posicionados fora do form,
// para que não sejam eventualmente postados.
	CancelaEvento(evt);

	var Target = (evt.target)?(evt.target):evt.srcElement,  //IE e NS/MZ
		tabela = Target,
		tr1 = Target;
	
	while(tr1!=null && tr1.tagName!='TR')
		tr1 = tr1.parentNode;
	var index = tr1.sectionRowIndex;
		
	while(tabela != null && tabela.tagName != 'TABLE'){
		tabela = tabela.parentNode;
	}
	
	var listaTbody = tabela.getElementsByTagName('TBODY'),
		tbodyLista = null;
	
	for(var i=0; i<listaTbody.length; i++)
		if(listaTbody[i].getAttribute("lista")) {
			tbodyLista = listaTbody[i];
			break;
		}
	
	// Insere uma linha antes da escolhida
	var tr = tbodyLista.insertRow(index);
	var td;
	with(document.getElementById(tabela.getAttribute("tabOrigin")).rows.item(0)) {
		for (var i=0; i < cells.length; i++) {
			td = document.createElement(cells.item(i).tagName);
			td.innerHTML = cells.item(i).innerHTML;
			td.className = cells.item(i).className;
			td.colSpan = cells.item(i).colSpan;
			tr.appendChild(td);
		}
	}
}

function Remover(evt) {
	var Target = (evt.target)?(evt.target):evt.srcElement;  //IE e NS/MZ
	CancelaEvento(evt);

	var tr = Target;
	while(tr!=null && tr.tagName!='TR')
		tr = tr.parentNode;
	var tbody = tr.parentNode, //Obtém o TBODY
		tabela = tbody.parentNode; 
	
	var numLinhas = document.getElementById(tabela.getAttribute("tabOrigin")).rows.length;

	var base = Math.floor(tr.sectionRowIndex / numLinhas);
	for(j=0; j < numLinhas; j++) 
	{
		tbody.deleteRow( (base + 1) * numLinhas - 1 - j );
	}
	if(ns6)
		evt.stopPropagation();
	else
		evt.cancelBubble = false;
}

function TornaReadOnly(frmRef) {
	
	for(var i=0; i < frmRef.elements.length; i++) {
		var el = frmRef.elements[i];
		var tagName = el.tagName.toLowerCase();

		switch(tagName) 
		{
			case "select":
				el.disabled = true;
				break;
			case "textarea":
				el.readOnly = true;
				break;
			
			case "input":
				var tipo = el.type.toLowerCase();
				if(tipo == "checkbox" || tipo == "radio")
					el.disabled = true;
				else
					el.readOnly = true;
				break;
		
		}		
	}
}

function ObtemParam(obj, Param) {
	var saida;
	if(obj.type=='hidden')	{
		saida = obj[Param];
	}
	else {
		var selOpt = obj.options[obj.selectedIndex];
		saida = selOpt.getAttribute(Param);
	}
	return saida;
}