/*
@ Esta biblioteca é composta por um conjunto de funções que tratam e manipulam as informações enviadas do browser ao servidor 
@ e vice-versa
@ Copyright (c) 2008 Aline Lima, Aline Magalhães, Andréa Lopes e Frederico Pimentel.

@ Este documento permite cópia, distribuição e/ou modificação garantida sob os termos da Lincença Pública Geral Menor do GNU
@ conforme publicada pela Free Software Foundation; tanto a versão 2.1 da Licença quanto as versões posteriores. 

@ Esta biblioteca é distribuída na expectativa de que seja útil, porém, SEM NENHUMA GARANTIA; nem mesmo a garantia implícita de
@ COMERCIABILIDADE OU ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. 

@ Consulte a Licença Pública Geral Menor do GNU para mais detalhes. 
*/

 

var ajax;
var dadosUsuario;
var valor1 = new Array();
var valor2 = new Array();
var valor3 = new Array();
var valor4 = new Array();

// ----- Cria o objeto e faz a requisição -----
function requisicaoHTTP(tipo,url,assinc){
	if(window.XMLHttpRequest){// Objeto usado no Mozila, Safari...
		ajax = new XMLHttpRequest;
	}
	else if(window.ActiveXObject){// Objeto usado pelo Internet Explorer
		ajax = new ActiveXObject("Msxml2.XMLHTTP");
		if(!ajax){
			ajax = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	//ajax é a variável que vai armanezar o objeto que será utilizado baseado no navegador usado pelo usuário
	if (ajax){
		iniciaRequisicao(tipo,url,assinc); // Iniciou com sucesso
	}else{
		alert("Seu navegador não possui suporte a essa aplicação"); // Mensagem que será exibida caso não seja possível iniciar a requisição
	}
}
// ----- Inicia o objeto criado e envia os dados (se existirem) -----
function iniciaRequisicao(tipo, url, bool){
	ajax.onreadystatechange = trataResposta; //Atribui ao objeto a resposta da função trataResposta
	ajax.open(tipo, url, bool); //Informa os parâmetros do objeto: tipo de envio, url e se a comunicação será assíncrona ou não
	ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");//Recupera as informações do cabeçalho
	ajax.send(dadosUsuario);// Envia os dados processados para o navegador
}
// ----- Inicia requisição com envio de dados -----
function enviaDados(url){
	criaQueryString(); //Chama a função que transformará os dados enviados em ua string
	requisicaoHTTP("POST", url, true); //Chama a função que fará a requisição de dados ao servidor
}
// ----- Cria a string a ser enviada, formato campo1=valor&campo2=valor2... -----
function criaQueryString(){
	dadosUsuario = "";
	var frm = document.forms[0]; //Identifica o formulário
	var numElementos = frm.elements.length;// Informa o número de elementos
	for(var i = 0; i < numElementos; i++){//Monta a querystring
		if(i < numElementos-1){ //Se i for menor que o número de elementos (menos 1)
			dadosUsuario += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&"; //recupera os valores que comporão a url se houver mais elementos a serem incluídos;
		}
		else{
			dadosUsuario += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value); //recupera os valores que comporão a url se houver mais elementos a serem incluídos;
		}
	}
}
// ----- Trata a resposta do servidor -----
function trataResposta(){
	if(ajax.readyState == 4){// Se todas as informações e a conexão foi fechada...
		if(ajax.status == 200){// Se o status da conexão for 200
			trataDados(); // Chama a função trataDAdos
		}
		else{
			alert("Problema na comunicação com o objeto XMLHttpRequest.");
		}
	}
}


var dadosAtuais; //Array que guarda os dados atuais da linha antes de editá-la
var linhaEmEdicao = null; //Guarda o ID da linha a ser editada, incluída ou excluída
var linhasNovas = 0; //Variável auxiliar

//Prepara uma linha para edição
function EditarLinha(idLinha, cod){
	//alert(idLinha);
	//alert(cod);
	if(linhaEmEdicao == null){//Se linhaEmEdicao não for nulo...
		
		//Obtém a linha a ser editada e altera a sua cor
		var linha = document.getElementById(idLinha);//Obtém o id da linha que será editada
		linha.className = 'linhaSelecionada';//Altera a cor da linha que será editada
		var celulas = linha.cells;//Aramazena a célula que será editada
		var codigo = document.getElementById('codigo');
		//salva os dados atuais para o caso de cancelamento
		SalvaDados(idLinha);//Chama a função que salvára os dados atuais da linha antes de editá-la

		linhaEmEdicao = idLinha; //Armazena o id da linha que será editada
		//Cria os campo de texto editáveis
		//celulas[0].innerHTML = '<input type="hidden" name="codigo" value="'+celulas[0].innerHTML+'">';//Armazena o código do produto num campo oculto de formulário
		codigo.setAttribute('value', celulas[0].innerHTML);
		celulas[1].innerHTML = '<input type="text" size="75" id="nome" name="descricao" value="'+celulas[1].innerHTML+'" onKeyUp="pesquisa(this.value)"><div id="pagina"></div>';//Mostrar o campo texto permitindo a edição do nome do produto
		celulas[2].innerHTML = '<input type="text" name="qtd" value="'+celulas[2].innerHTML+'" maxlength="15"><div id="inputs"></div>';//Mostrar o campo texto permitindo a edição do preço do produto
		celulas[3].innerHTML = '<input type="text" name="vlr" value="'+celulas[3].innerHTML+'" maxlength="15"><div id="inputs"></div>';//Monta os links que chamarão as funções para atualizar ou cancelar a edição da linha
		celulas[4].innerHTML = '<a href="#" onclick="GravarEdicao(document.formcp.codigo.value,document.formcp.descricao.value,document.formcp.qtd.value,document.formcp.vlr.value);">Atualizar</a><br/><a href="#" onclick="CancelarEdicao();">Cancelar</a><div id="inputs"></div>';//Insere um espaço na última célula
	}
	else {alert("Você já está digitando um registro.");}
}

function AtualizaValor(){
	var vlr1 = document.getElementById('qtd_total');
	var vlr2 = document.getElementById('qtd_valor');
	
	var total1 = 0;
	var total2 = 0;
	//alert(linhasNovas);
	//var f = linhasNovas-1;
	for(i=0;i<linhasNovas;i++){
		total1 = parseFloat(total1)+parseFloat(valor3[i]);
		total2 = parseFloat(total2)+parseFloat(valor4[i]);
	}
	//document.getElementById('v1').innerHTML = total1;
	//document.getElementById('v2').innerHTML = total2;
	
	vlr1.value = total1;
	vlr2.value = total2;
}

//Exclui uma linha da tabela
function ExcluirLinha(idLinha, cod){
	if(!linhaEmEdicao){
		var linha = document.getElementById(idLinha);//Armazena o id da linha que será excluída
		linha.className = 'linhaSelecionada';// define a classe de estilos que será usada na linha
		if(confirm("Tem certeza que deseja excluir este registro?")){//Pergunta se a linha realmente deve ser excluída
			linha.parentNode.removeChild(linha);// Remove a linha que seria incluída
			//linhasNovas--;//Decrementa o número de linhas
			linhaEmEdicao = null;
			
			//preenche o array com os valores da linha
			valor1[idLinha] = 0;
			valor2[idLinha] = 0;
			valor3[idLinha] = 0;
			valor4[idLinha] = 0;
			AtualizaValor()
			//Aviso(1); // Exibe o aviso: Aguarde...
			//var url = "index2.php?acao=excluir&cod="+cod;//Url que será enviada
			//requisicaoHTTP("GET", url, true);//Função que fará a requisição
		}//else{
			//linha.className = 'linhaSelecionada';//Define a classe de estilo que será usada se a linha não estiver maracada para exclusão
		//}
	}else{
		alert("Você está com um registro aberto. Feche-o antes de prosseguir.");
	}
}

//Cria um novo registro
function NovoRegistro(){
	//Se houver linha sendo editada, cancela edição
	if(linhaEmEdicao!=null){// Se linhas em edição for nulo...
		alert("Você está com um registro aberto. Feche-o antes de prosseguir");
	}
	else
	{
		//Insere uma nova linha na tabela
		proxIndice = document.getElementById('minhaTabela').rows.length-1;//Armazena o índice a linha que será inserida
		var novaLinha = document.getElementById('minhaTabela').insertRow(proxIndice);//Insere uma nova linha na tabela
		novaLinha.className = 'linhaSelecionada';//Define a classe de estilos que será usada na n ova linha
	}
	
	//Define o id da nova linha (que será usado em caso de edição/exclusão
	novoId = linhasNovas;//Armazena o id da linha	
	novaLinha.setAttribute('id', novoId);//Define que o nome do id será o valor da variável novoId
	linhasNovas++; //Incrementa o valor da variável
	linhaEmEdicao = novoId;// Aramazena o valor da variável novoId
	//Insere as células na linha criada
	var novasCelulas = new Array(5); //Cria um array
	for(var i=0; i<10; i++){
		novasCelulas[i] = novaLinha.insertCell(i); //Preenche o array
	}
	
	//Cria os campos dos formulários
	novasCelulas[0].innerHTML = novoId+1;//código do produto
	novasCelulas[1].innerHTML = '<input type="text" size="5" name="parc"><div id="inputs"></div>';
	novasCelulas[2].innerHTML = '<input type="text" size="7" name="dtVencimento" onKeyPress="ValidaCamposNumeros();"><div id="inputs"></div>'; 	
	novasCelulas[3].innerHTML = '<input type="text" size="75" name="vlrParc"><div id="inputs"></div>';
	novasCelulas[4].innerHTML = '<input type="text" size="5" name="desc" onKeyPress="ValidaCamposNumeros();"><div id="inputs"></div>'; 	
	novasCelulas[5].innerHTML = '<input type="text" size="5" name="setorResp" onKeyPress="ValidaCamposNumerosComVirgula();"><div id="inputs"></div>';
	novasCelulas[6].innerHTML = '<input type="text" size="5" name="formaPgto" onKeyPress="ValidaCamposNumeros();"><div id="inputs"></div>'; 	
	novasCelulas[7].innerHTML = '<input type="text" size="5" name="obs" onKeyPress="ValidaCamposNumerosComVirgula();"><div id="inputs"></div>';
	novasCelulas[9].innerHTML = '<a href="#" onclick="Incluir(novoId+1,document.formcp.desc.value,document.formcp.qtd.value,document.formcp.vlr.value);">Adicionar</a><br><a href="#" onclick="CancelarInclusao();">Cancelar</a><div id="inputs"></div>';// Cria o link para cancelar a inserção de dados do formulário
}

function Incluir(c,d,q,v){
	//Aviso(1);//Chama a função aviso
	if(d==''){
		alert('Informe a Descricao do Produto.');
		document.formcp.descricao.focus();
		return false;
	}
	if(q==''){
		alert('Informe a Quantidade.');
		document.formcp.qtd.focus();
		return false;
	}
	if(v==''){
		alert('Informe Valor unitário.');
		document.formcp.vlr.focus();
		return false;
	}	
	
	CancelarInclusao();
	NovoIncluir(c,d,q,v);
	//document.formcp.codigo.value=0;
}

//Cancela a inclusão de uma linha, excluindo-a
function CancelarInclusao(){
	var linha = document.getElementById(linhaEmEdicao);//Armazena o id da linha em edição
	linha.parentNode.removeChild(linha);// Remove a linha que seria incluída
	linhasNovas--;//Decrementa o número de linhas
	linhaEmEdicao = null;	
}

//Cria um novo registro
function NovoIncluir(c,d,q,v){
	//Insere uma nova linha na tabela
	proxIndice = document.getElementById('minhaTabela').rows.length-1;//Armazena o índice a linha que será inserida
	var novaLinha = document.getElementById('minhaTabela').insertRow(proxIndice);//Insere uma nova linha na tabela
	novaLinha.className = 'linhaSelecionada';//Define a classe de estilos que será usada na nova linha
	
	//Define o id da nova linha (que será usado em caso de edição/exclusão
	novoId = linhasNovas;//Armazena o id da linha
	novaLinha.setAttribute('id', novoId);//Define que o nome do id será o valor da variável novoId
	linhasNovas++; //Incrementa o valor da variável
	
	//Insere as células na linha criada
	var novasCelulas = new Array(5); //Cria um array
	for(var i=0; i<5; i++){
		novasCelulas[i] = novaLinha.insertCell(i); //Preenche o array
	}
	
	
	//preenche o array com os valores da linha
	valor1[novoId] = c;
	valor2[novoId] = d;
	valor3[novoId] = q;
	valor4[novoId] = v;
	AtualizaValor()	
	
	//Cria os campos dos formulários
	novasCelulas[0].innerHTML = c;//código do produto
	novasCelulas[1].innerHTML = d;
	novasCelulas[2].innerHTML = q; //insere o campo código
	novasCelulas[3].innerHTML = v; //Monta os links que chamarão as funções para cadastrar e cancelar a inserção de uma nova linha
	novasCelulas[4].innerHTML = '<a href="#" onclick="EditarLinha(\''+novoId+'\',\''+c+'\');">Editar</a><br><a href="#" onclick="ExcluirLinha(\''+novoId+'\',\''+c+'\');">Excluir</a>';
}

//deleta div pagina da busca - adam
function RemoveDivBusca(id,campo1,campo2,nomeDiv){
	//alert(id);
	var ahref = document.getElementById(id);//Armazena o id da linha em edição
	var campo = document.getElementById(campo1);
	var codigo = document.getElementById(campo2);
	//alert(ahref.name);
	campo.value = ahref.name;
	codigo.value = ahref.alt;
	
	//var linha = document.getElementById(nomeDiv);//Armazena o id da linha em edição
	pesquisa('');
	//linha.parentNode.removeChild(linha);// Remove a linha que seria incluída
	//linhasNovas--;//Decrementa o número de linhas
	//linhaEmEdicao = null;
}


//Salva os dados atuais num array
function SalvaDados(idLinha){
	var celulas = document.getElementById(idLinha).cells;//Armazena o id  da célula
	dadosAtuais = new Array(celulas.length);//Armazena num array os dados atuais da linha
	for(var i=0; i<celulas.length; i++){
		dadosAtuais[i] = celulas[i].innerHTML; //Preenche o array
	}
	linhaEmEdicao = null;
}

//Cancela a edição de uma linha
function Cancelar(){
	self.location.href="index.php"; //Direciona a página
}

//Cancela a inclusão de uma linha, excluindo-a
function CancelarEdicao(){
alert(linhaEmEdicao);
	//Obtém a linha a ser editada e altera a sua cor
		var linha = document.getElementById(linhaEmEdicao);//Obtém o id da linha que será editada
		//linha.className = 'linha';//Altera a cor da linha que será editada
		var celulas = linha.cells;//Aramazena a célula que será editada
		//alert(dadosAtuais[0]);
		linhaEmEdicao = null; //Armazena o id da linha que será editada
		//Cria os campo de texto editáveis
		celulas[0].innerHTML = dadosAtuais[0];//Armazena o código do produto num campo oculto de formulário
		celulas[1].innerHTML = dadosAtuais[1];//Mostrar o campo texto permitindo a edição do nome do produto
		celulas[2].innerHTML = dadosAtuais[2];//Mostrar o campo texto permitindo a edição do preço do produto
		celulas[3].innerHTML = dadosAtuais[3];//Monta os links que chamarão as funções para atualizar ou cancelar a edição da linha
		celulas[4].innerHTML = dadosAtuais[4];
}

//Cancela a inclusão de uma linha, excluindo-a
function GravarEdicao(c,d,q,v){
//alert(c);
	//Obtém a linha a ser editada e altera a sua cor
		var linha = document.getElementById(linhaEmEdicao);//Obtém o id da linha que será editada
		//linha.className = 'linha';//Altera a cor da linha que será editada
		var celulas = linha.cells;//Aramazena a célula que será editada
		//alert(dadosAtuais[0]);
		 //Armazena o id da linha que será editada
/*
		alert('linha:'+linhaEmEdicao)
		
		alert(valor1[linhaEmEdicao]);
		alert(valor2[linhaEmEdicao]);
		alert(valor3[linhaEmEdicao]);
		alert(valor4[linhaEmEdicao]);
	*/	
		//preenche o array com os valores da linha
		valor1[linhaEmEdicao] = c;
		valor2[linhaEmEdicao] = d;
		valor3[linhaEmEdicao] = q;
		valor4[linhaEmEdicao] = v;
		AtualizaValor()
		//Cria os campo de texto editáveis
		celulas[0].innerHTML = c;//Armazena o código do produto num campo oculto de formulário
		celulas[1].innerHTML = d;//Mostrar o campo texto permitindo a edição do nome do produto
		celulas[2].innerHTML = q;//Mostrar o campo texto permitindo a edição do preço do produto
		celulas[3].innerHTML = v;//Monta os links que chamarão as funções para atualizar ou cancelar a edição da linha
		celulas[4].innerHTML = '<a href="#" onclick="EditarLinha(\''+linhaEmEdicao+'\',\''+c+'\');">Editar</a><br><a href="#" onclick="ExcluirLinha(\''+linhaEmEdicao+'\',\''+c+'\');">Excluir</a>';
		linhaEmEdicao = null;
}

//Atualiza o conteúdo da linha
function Atualizar(n,p,c){
	Aviso(1); //Exibe o aviso aguarde...
	var dados = ObtemDadosForm(n, p, c);//Chama a função que montará a string com os dados que estarão na url
	var cod = c;//Armazena o código do produto que será atualizado
	var url = "index2.php?acao=atualizar"; //Monta a url
	url += "&cod="+cod+"&"+dados;//Monta a url
	requisicaoHTTP("GET", url, true);//Inicia a requisição
}

//Chamada do programa em PHP que cadastra no banco de dados
function Cadastrar(n, p){
	Aviso(1);//Chama a função aviso
	var dados = ObtemDadosForm(n, p, 0); //Armazena a string com dados que comporão a url
	var url = "index2.php?acao=cadastrar&"+dados;//Url que será enviada
	requisicaoHTTP("GET", url, true);//Inicia a requisição
}

//Coloca os dados do formulário em formato de query string

function ObtemDadosForm(n,p,c){
	parametros = "nome="+n+"&preco="+p;//Define os parâmetros da url que será enviada
	return parametros;//Retorna o valor da variável como resposta da função
}

//Exibe ou oculta a mensagem de espera
function Aviso(exibir){
	var saida = document.getElementById("avisos");//Armazena a chamada da div avisos
	if(exibir){// Se exibir for verdadeio...
		saida.className = "aviso";//Define que a classe a ser usada será avisos
		saida.innerHTML = "Aguarde... Processando!";// Exibe o aviso: Aguarde... Processando!
	}else{
		saida.className = "";//Elimina a classe se exibir for falso
		saida.innerHTML = "";//Não exibe nenhum aviso
	}
}

//Trata a  resposta do servidor, de acordo com a operação realizada
function trataDados(){
	var resposta = ajax.responseText; //armazena a resposta do servidor
	var linha = document.getElementById(linhaEmEdicao);//Aramazena o id da linha em edição
	if(resposta == "atualizou"){//registro foi atualizado
		//volta ao estilo antigo
		linha.className='linha'; //Define o nome da classe que será usada na linha
		var celulas = linha.cells; 
		//coloca novos valores nas celulas
		var meuForm = document.forms.formcp;//Armazena a chamada do formulário
		var nome = meuForm.nome.value; //Armazena o valor do campo nome
		var preco = meuForm.preco.value;//Armazena o valor do campo preço
		celulas[1].innerHTML = nome;//Insere o nome do produto na celula
		celulas[2].innerHTML = preco;//Insere o preço do produto na célula
		celulas[3].innerHTML = dadosAtuais[3];// link para edição
		celulas[4].innerHTML = dadosAtuais[4];// link para exclusão
		linhaEmEdicao = null;
	}else if (resposta == "excluir"){// registro excluído
		linha.parentNode.removeChild(linha);//Remove a linha
		linhaEmEdicao=null;
	}else if(resposta.substring(0,9)=="cadastrou"){// registro foi incluído
		linha.className='linha';//Define a classe que será usada
		var celulas = linha.cells;
		//obtém o código gerado para o produto no banco de dados
		novoCodigo = resposta.substring(10);
		//coloca os novos valores na celula
		var meuForm = document.forms.formcp;
		var nome = meuForm.nome.value;
		var preco = meuForm.preco.value;
		celulas[0].innerHTML = novoCodigo;
		celulas[1].innerHTML = nome;
		celulas[2].innerHTML = preco;
		celulas[3].innerHTML = '<a href="#" onclick="EditarLinha(\''+linhaEmEdicao+'\');">Editar</a>';//Link para editar a linha
		celulas[4].innerHTML = '<a href="#" onclick="ExcluirLinha(\''+linhaEmEdicao+'\');">Excluir</a>';//Link para excluir a linha
		linhaEmEdicao = null;
	}else{//mensagem de erro
		if(resposta == 1){
			alert('Produto atualizado.');
			window.location.reload();
		}
		if(resposta == 2){
			alert('Produto excluído.');
			window.location.reload();
		}
		if(resposta == 3){
			alert('Produto cadastrado.');
			window.location.href="index.php";
		}
		Aviso(0);
	}
}


/*
requisicaoHTTP = tenta  instanciar o objeto XMLHttpRequest e, se conseguir, chama a função que fará a requisição, passando a ela os dados fornecidos pelo usuário.

iniciaRequisição = recebe os dados da função requisiçãoHTTP e processa a requisição, além de definir a função que irá tratar a resposta do servidor.

enviaDados = faz uma requisição definindo antes os dados a serem enviados, que, no caso, são obtidos de um formulário HTML. Caso não haja dados a seresm enviados, podemos chamar diretamente a função requisicaoHTTP.

criaQueryString = coloca os dados do firmulário no formato de uma QueryString, para que o servidor possa identificar os pares nome/valor.

trataResposta = verifica se a requisição foi conluída e inicia o tratamento dos dados. Há diferença desta função para a função trataDados(), que você deverá criar em seu programa para realizar o tratamento desejado sobre os dados retornados pelo servidor.

Possíveis valores do readyState
0(Não Iniciado): O Objeto foi criado mas o método open() não foi chamado ainda. 
1(Carregando): O método open() foi chamado mas a requisição não foi enviada ainda. 
2(Carregado): A requisição foi enviada. 
3(Incompleto): Uma parte da resposta do servidor foi recebida. 
4(Completo): Todos as informações foram recebidas e a conexão foi fechada com sucesso. 
*/
