/**
 *	ListaDeCompras()
 *	Construtor do objeto ListaDeCompras
 */
function ListaDeCompras() {
	this.div = document.getElementById('compra');
	this.preco = {
		aVista: null,
		aPrazo: null
	};
	this.produtos = new Array();
	this.countProdutos = 0;
}

/**
 *	adicionarProduto()
 *	Adiciona um produto na lista
 *
 *	@param		object		prod		Objeto do produto a ser adicionado
 */
ListaDeCompras.prototype.adicionarProduto = function(prod) {
	var lista = this;
	var d = document;
	
	// objeto do contador
	lista.countProdutos = lista.div.getElementsByTagName('span')[0];
	
	// fieldset
	var fieldset = d.createElement('fieldset');
	fieldset.id = 'compra'+lista.countProdutos.innerHTML;
	
	// h3
	var h3 = d.createElement('h3');
	h3.appendChild(d.createTextNode(prod.nome));
	
	// opção
	var pOpcao = d.createElement('p');
	pOpcao.appendChild(d.createTextNode('Opção: '+prod.opcao));
	
	// quantidade
	var label = d.createElement('label');
	label.appendChild(d.createTextNode('Qtd: '));
	
	var input = d.createElement('input');
	input.setAttribute('type', 'text');
	input.setAttribute('name', 'pedidosQtd[]');
	input.setAttribute('value', prod.qtd);
	// evento que altera o preço conforme a quantidade
	addListener(
		input,
		'keyup',
		function() {
			lista.produtos[lista.produtos.indexOf(prod)].qtd = (input.value >= 1) ? parseInt(input.value) : 0;
			lista.atualizarPreco();
		}
	);
	// grava o preço no carrinho
	addListener(
		input,
		'blur',
		function() {
			lista.atualizarProduto(fieldset.id.replace('compra', ''), input.value, prod.opcao);
		}
	);
	label.appendChild(input);
	
	// preço
	var pPrecoUnitario = d.createElement('h4');
	pPrecoUnitario.appendChild(d.createTextNode('Valor unitário: '));
	var pPrecoAVista = d.createElement('p');
	pPrecoAVista.appendChild(d.createTextNode('À vista: R$ '+prod.preco.aVista));
	var pPrecoAPrazo = d.createElement('p');
	pPrecoAPrazo.appendChild(d.createTextNode('28 dias: R$ '+prod.preco.aPrazo));
	
	// link remover
	var a = d.createElement('a');
	a.setAttribute('href', '#');
	a.setAttribute('title', 'Remover Produto');
	a.className = 'remover';
	a.appendChild(d.createTextNode('Remover Produto'));
	
	// 'appendando' os nodes finais
	fieldset.appendChild(h3);
	fieldset.appendChild(pOpcao);
	fieldset.appendChild(label);
	fieldset.appendChild(pPrecoUnitario);
	fieldset.appendChild(pPrecoAVista);
	fieldset.appendChild(pPrecoAPrazo);
	fieldset.appendChild(a);
	
	// adicionando evento
	addListener(
		a,
		'click',
		function() {
			new ajax.ContentLoader('../php/carrinho/removerProduto.php?lista=listaDeCompras&i='+fieldset.id.replace('compra', ''), removerProdutoCompras);
		}
	);
	
	
	// 'appendando' o fieldset completo
	var divAppend = lista.div.getElementsByTagName('div')[0];
	
	
	// se é o primeiro produto, remove a mensagem
	if (!divAppend.getElementsByTagName('fieldset').length)
		removeChildren(divAppend);
	
	divAppend.appendChild(fieldset);
	
	// atualizando o contador do carrinho
	lista.produtos.append(prod);
	lista.atualizarContador(true);
	
	// atualizando o preço da lista
	lista.atualizarPreco();
	
	// ativando o botão de finalizar compra
	c.alterarBotao("compra", true)
}


/**
 *	atualizarProdutos()
 *	Atualiza os produtos do carrinho
 */
ListaDeCompras.prototype.atualizarProduto = function(i, qtd, opcao) {
	var lista = this;
	
	new ajax.ContentLoader('../php/carrinho/gravarPrecos.php?lista=listaDeCompras&i='+i+'&qtd='+qtd+'&opcao='+opcao, lista.atualizarProdutoHandler);
}

/**
 *	atualizarProdutoHandler()
 *	Handler da função atualizarProduto()
 *
 *	@see		atualizarProduto()
 */
ListaDeCompras.prototype.atualizarProdutoHandler = function() {
	var lista = c.listaDeCompras
	var response = this.req.responseText
	if(response) {
		var json = eval("("+response+")")
		
		// verifica se a quantidade solicitada é maior que a do estoque
		if(json.qtd.solicitada > json.qtd.estoque) {
			// altera o valor do input para o máximo em estoque
			var fieldset = document.getElementById("compra"+json.produto.indice)
			if(!fieldset)
				return
			fieldset.getElementsByTagName("input")[0].value = json.qtd.estoque
			
			// atualiza o produto diretamente na lista
			lista.produtos[json.produto.indice].qtd = json.qtd.estoque
			
			// atualiza os preços
			lista.atualizarPreco()
			
			// avisa o usuário
			alert("Quantidade solicitada excede o estoque de "+json.qtd.estoque+" unidades")
		}
	}
}


/**
 *	removerProdutoCompras()
 *	Remove um dado produto da lista de compras
 *
 *	@param		object		obj			Fieldset do produto a ser removido
 *	@param		object		prod		Objeto do produto
 */
function removerProdutoCompras() {
	var lista = c.listaDeCompras;
	
	// índice do produto
	var i = parseInt(this.req.responseText);
	// pegando o fieldset
	var obj = lista.div.getElementsByTagName('fieldset');
	if(!obj)
		return;
	for(var j = 0; j < obj.length; j++) {
		if(obj[j].id == 'compra'+i) {
			// removendo o fieldset
			obj[j].parentNode.removeChild(obj[j]);
		}
	}
	
	
	// atualizando o contador de produtos
	lista.atualizarContador(false);
	
	// atualizando o preço da lista
	lista.produtos[i] = null;
	lista.atualizarPreco();
	
	
	// se não há produtos, mostra a mensagem
	if (lista.countProdutos.innerHTML == 0) {
		//c.mensagem('listaDeCompras')
		lista.div.getElementsByTagName("form")[0].style.display = 'none'
		c.alterarBotao("compra", false)
	}
}



/**
 *	atualizarContador()
 *	Atualiza o contador dos produtos
 *
 *	@param		boolean		aumentar	Aumentar ou diminuir o contador
 */
ListaDeCompras.prototype.atualizarContador = function(aumentar) {
	var lista = this;
	if(aumentar)
		lista.countProdutos.innerHTML = (eval(lista.countProdutos.innerHTML)+1);
	else
		lista.countProdutos.innerHTML = (eval(lista.countProdutos.innerHTML)-1);
}


/**
 *	atualizarPreco()
 *	Atualiza o preço final da lista
 *
 *	@param		object		preco		Objeto JSON com os preços à vista e a prazo
 *	@param		int			qtd			Quantidade de produtos
 *	@param		boolean		aumentar	Aumentar ou diminuir o preço
 */
ListaDeCompras.prototype.atualizarPreco = function() {
	var lista = this;
	
	var prod, precoAVista = 0, precoAPrazo = 0;
	for(var i = 0; i < lista.produtos.length; i++) {
		prod = lista.produtos[i];
		if(prod) {
			precoAVista += prod.preco.aVista * prod.qtd;
			precoAPrazo += prod.preco.aPrazo * prod.qtd;
		}
	}
	
	// botando os valores de volta
	lista.preco.aVista.nodeValue = 'R$ '+precoAVista.toFixed(2);
	lista.preco.aPrazo.nodeValue = 'R$ '+precoAPrazo.toFixed(2);
}