// ==UserScript==
// @name           GMail - Pedidos do ML
// @namespace      net.marciowb.gmail.ml.pedidos
// @description    Me ajuda a preencher os pedidos do ML - by Marcio Wesley Borges<marciowb@gmail.com>
// @include        http://mail.google.com/mail/*
// ==/UserScript==

const GMONKEYVER = "1.0";
var gmail = null;
var console = null;

function evaluateXPath(xPath, aNode) {
	if (!aNode) {
	 	aNode=document;
	}
	var res = aNode.ownerDocument.evaluate(xPath, aNode, null, XPathResult.ANY_TYPE, null);
	switch (res.resultType) {
		case XPathResult.STRING_TYPE:
			return res.stringValue;
		case XPathResult.NUMBER_TYPE:
			return res.numberValue;
		case XPathResult.BOOLEAN_TYPE:
			return res.booleanValue;
		default:;
	}
	var foundNodes = new Array();
	var item = res.iterateNext(); 
	while (item) {
		foundNodes.push(item);
		item = res.iterateNext();
	}
	return foundNodes;
}

/**
* Obtém o elemento BODY do e-mail que está sendo composto (criado).
*/
function getComposingMailBody() {
	if (!gmail)
		return null;
	var el = gmail.getActiveViewElement();	
	if (!el)
		return null;
	var aa=evaluateXPath("//iframe[@id!='remote_iframe_0']", el);
	if (!aa || aa.length==0)
		return null;
	var doc = aa[0].contentDocument;
	if (!doc)
		return null;
	var body = doc.body;
	return body;
}

/** 
* Esta função é para ser chamada por dadosCompra().<br>
* @param _gmail É fornecido automaticamente pela função gmonkey.load que chama esta.
*/
function _dadosCompra(_gmail) {
	console = unsafeWindow.console;
	gmail = _gmail;
	
	var bodyElem = getComposingMailBody();
	if (bodyElem==null) {
		window.alert("Antes, é necessário que dê um reply no e-mail com os dados da compra do Mercado Livre");
		return;
	}
	
	
	//Tenta obter o "quoted" mail que está sendo respondido
	var aQuoted=evaluateXPath("//div[@class='gmail_quote']", bodyElem);
	if (!aQuoted || aQuoted.length==0) {
		window.alert("Não se deve apagar o quoted mail ainda.");
		return;
	}
	var quotedMailBody = aQuoted[0].innerHTML;
		
	//Obtém o código do anúncio e nome do produto
	var rgx = /;id=(\d*)[^>]*>([^<]*)/
	var m = rgx.exec(quotedMailBody);
	if (!m || m.length<3) {
		window.alert("Isto só funciona para os e-mails de compra do Mercado Livre.");
		return;
	}
	var codAnuncio = m[1];
	var nomeAnuncio = m[2];
	
	//Obtém o nome do comprador
	rgx = /Nome:\s*<b\b[^>]*>(.*)<\/b>/
	m = rgx.exec(quotedMailBody);
	var nomeComprador = m[1];
	
	//Obtém o código, apelido e pontuação do comprador
	rgx = /Apelido:.*id=(\d*)".*[^>]>(.*) \((\d*)\)/
	m = rgx.exec(quotedMailBody);
	var codComprador = m[1];
	var apelidoComprador = m[2];
	var pontuacaoComprador = m[3];
	
	//Obtém a quantidade de produtos comprados
	rgx = /Quantidade:\s*(\d*)/
	m = rgx.exec(quotedMailBody);
	var quantidade = m[1];
	
	//Obtém o preço pelo qual o cliente comprou o produto
	rgx = /Preço:\s*([^<]*)/
	m = rgx.exec(quotedMailBody);
	var descPreco = m[1].replace("R$","").replace("unit.","");
	
	//Obtém o e-mail do comprador
	rgx = /E-mail:[^>]*>([^<]*)/i
	m = rgx.exec(quotedMailBody);
	var emailComprador = m[1];
	
	//Obtém o telefone do comprador
	rgx = /Telefone:\s*([^<]*)/
	m = rgx.exec(quotedMailBody);
	var telefoneComprador = m[1];
	
	//Obtém a cidade do comprador
	rgx = /Cidade:\s*([^<]*)/
	m = rgx.exec(quotedMailBody);
	var cidadeComprador = m[1];
	
	//Obtém o estado do comprador
	rgx = /Estado:\s*([^<]*)/
	m = rgx.exec(quotedMailBody);
	var estadoComprador = m[1];
	
	//Obtém o país do comprador
	rgx = /País:\s*([^<]*)/
	m = rgx.exec(quotedMailBody);
	var paisComprador = m[1];

	//////////////////////////////////////	
	var VLR_MIN = 4; //Valor mínimo da compra. Isto é realizado por segurança nossa e o objetivo é evitar que um erro qualquer nos cause prejuízo.
	var TIP_FRETE = "Frete por SEDEX";
	var VLR_FRETE = "23.00";
	
	var vlrTotal = (Number(descPreco) * Number(quantidade)) + Number(VLR_FRETE);
	if (vlrTotal<VLR_MIN) {
		window.alert("Erro: o valor total da compra está sendo computado como: " + vlrTotal);
		return;
	}
	
	var TEMPLATE = '<div>Oi,<br> <br> &nbsp;&nbsp; Td blz?<br><br></div><span style="color: rgb(0, 102, 0);">&nbsp;&nbsp; É o seguinte, informa aí:<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Nome: @NOME_COMPRADOR</span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">Endereço:</span></span><br style="font-family: courier new,monospace;"><span style="color: rgb(0, 102, 0);"><span style="font-family: courier new,monospace;">Bairro: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">Cidade/Estado: @CIDADE_COMPRADOR-@ESTADO_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">CEP: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">APELIDO: @APELIDO_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">CPF: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">TEL: @TELEFONE_COMPRADOR </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">E-MAIL: @EMAIL_COMPRADOR </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">FORMA DE PAGAMENTO: </span><br><br>E se tu tivé uma companhia, diz, também:<br><span style="font-family: courier new,monospace;">Nome da Empresa: </span><br style="font-family: courier new,monospace;"> <span style="font-family: courier new,monospace;">CNPJ: </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Inscrição Estadual: </span><br></span><br><b style="color: rgb(0, 102, 0);">Importante: </b><span style="color: rgb(0, 102, 0);"><br> Nessa, você tá levando:<pre> <br><table border="1" cellspacing="0" cols="3" style="font-family: courier new,monospace;font-size:9pt" rules="groups" width="100%" frame="void"><tbody> <tr> <td width="35" align="right"><b>Qnt.</b></td> <td  align="right" width="94"><b>Valor</b></td> <td align="left"><b>Descrição</b></td> </tr> <tr> <td width="35" align="right">@QNT_PRODUTO</td> <td align="right" >@VALOR_PRODUTO</td> <td>@NOME_PRODUTO</td> </tr> <tr> <td width="35" align="right">@QNT_FRETE</td> <td align="right" >@VALOR_FRETE</td> <td>@TIPO_FRETE</td> </tr> <tr> <td bgcolor="#e6e6e6" align="right" height="16"><b>@QNT_TOTAL</b></td> <td bgcolor="#e6e6e6" align="right" ><b>@VALOR_TOTAL</b></td> <td bgcolor="#e6e6e6"><font size="2"><b>Total</b></font></td> </tr> </tbody> </table><font face="monospace"><br></font></pre> &nbsp;&nbsp; É isso, aí.<br>Valeu brother,<br> Ful. de Talz';
	var emailBody = TEMPLATE
		.replace("@NOME_PRODUTO", (nomeAnuncio+" #"+codAnuncio))
		.replace("@VALOR_PRODUTO", descPreco)
		.replace("@QNT_PRODUTO", quantidade)
		.replace("@QNT_FRETE", "1")
		.replace("@VALOR_FRETE", VLR_FRETE)
		.replace("@TIPO_FRETE", TIP_FRETE)
		.replace("@QNT_TOTAL", (Number(quantidade)+1))
		.replace("@VALOR_TOTAL", vlrTotal)
		.replace("@EMAIL_COMPRADOR", emailComprador)
		.replace("@TELEFONE_COMPRADOR", telefoneComprador)
		.replace("@APELIDO_COMPRADOR", apelidoComprador)
		.replace("@CIDADE_COMPRADOR", cidadeComprador)
		.replace("@ESTADO_COMPRADOR", estadoComprador)
		.replace("@NOME_COMPRADOR", nomeComprador);
		
	bodyElem.innerHTML = emailBody;
	
	//Tenta obter o campo de listagens dos e-mails dos destinatários
	var el = gmail.getActiveViewElement();
	var aTos=evaluateXPath('//textarea[@name="to"]', el);
	if (!aTos || aTos.length<1) {
		window.alert("Erro: não foi possível determinar onde está o campo relativo aos emails do destinatário. Isso pode ocorrer no caso do GMail mudar sua estrutura DHTML.");
		return;
	}
	var to = aTos[0];
	to.value = nomeComprador + "<" + emailComprador + ">";
	
	console.log("Viva Java! Viva a Liberdade! Reviva a SUN!");
}

function dadosCompra() {
	unsafeWindow.gmonkey.load(GMONKEYVER, _dadosCompra);
}

GM_registerMenuCommand('Preencher Dados de Compra', dadosCompra); 
