
// Blip.fm Comments Hack
// version 0.2 BETA!
// 2008-09-11
// Copyright (c) 2008, Lius Fontenelle Carneiro
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey 0.3 or later: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Blip.fm Comments Hack", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          Blip.fm Comments Hack 0.2
// @namespace     http://hypercast.info/
// @description   Script that add Comments functionality to Blip.fm by Lius
// @include       http://blip.fm/home*
// ==/UserScript==


/*
 * Bloco de codigo para carregar uma funcao do escopo do greasemonkey na pagina real
 */
function embedFunction(s) {  
  document.body.appendChild(document.createElement('script')).innerHTML =  s.toString().replace(/([\s\S]*?return;){2}([\s\S]*)}/,'$2');
} 

// definicao e implementacao das funcoes a serem carregadas (nao pode ser funcoes GM_*)
function toggle_element(obj) {
	var el = document.getElementById(obj);
	el.style.display = (el.style.display != 'none' ? 'none' : '' );
}

function show_all_comments() {
	var elements = document.evaluate("//div[@class='blip_comments']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

	for (var i = 0; i < elements.snapshotLength; i++) {
	    elements.snapshotItem(i).style.display = '';
	}
}

// carregamento propriamente dito
embedFunction(toggle_element);
document.body.appendChild(document.createElement('script')).innerHTML = "toggle_element();";  
embedFunction(show_all_comments);
document.body.appendChild(document.createElement('script')).innerHTML = "show_all_comments();"; 



/*
 * Inicio dos procedimentos da aplicacao
 */

// encontra o elemento que tem o login
var usernameElement = document.evaluate(
    "//a[@class='primary']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

// se nao encontrar, encerra a execucao do script
//if(usernameElement.snapshotLength == 0)	return;

// se encontrar, extrai somente o username para ser utilizado pelo resto do programa
var login = usernameElement.snapshotItem(0).innerHTML;


// adiciona a div que ira guardar os comentarios de cada blip
var dataDivs = document.evaluate(
			"//div[@class='tweem end']//div[@class='date']",
			document,
			null,
			XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
			null);

for (var i = 0; i < dataDivs.snapshotLength; i++) {
    dataDivs.snapshotItem(i).innerHTML += '<div class="comment"></div>';
}



// incluindo o link para mostrar todos os comentarios (tornar a div comment com style="display: true")
var menu_superior = document.evaluate("//div[@id='supermenu']/ul", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
menu_superior.snapshotItem(0).innerHTML += '<li><a href="javascript:func()" onclick="show_all_comments();">Mostrar comentários</a></li>';




// incluindo o iframe que servira de suporta para o retorno do form.submit nao causar reload geral
document.getElementById('attribution').innerHTML += '<iframe name="ifme" style="display: none;"></iframe>';


// cadastra no servidor, se ja nao estiver
GM_xmlhttpRequest({
    method: 'GET',
    url: 'http://blipfm.hypercast.info/users/check?login=' + login,
    headers: {
        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
        'Accept': 'application/xml,text/xml,text/html,text/json',
//		'Content-type': 'application/x-www-form-urlencoded',
    },
    onload: function(responseDetails) {
		var barraSuperior = document.getElementById('identity');
		if(responseDetails.responseText == 'ok'){
			barraSuperior.innerHTML += " Cadastrado";
		}
		if(responseDetails.responseText == 'existe'){
			barraSuperior.innerHTML += " Conectado";
		}
    }
});


// varredura sobre todos os blips
var allDivs, thisDiv;
allDivs = document.evaluate(
    "//div[@class='tweem end']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
	
for (var i = 0; i < allDivs.snapshotLength; i++) {
    thisDiv = allDivs.snapshotItem(i);
    // checando navegacao por todos os elementos corretos
	// alert(thisDiv.id);

	// descobrindo o login de cada pessoa que blipou e que esta na sua lista
	var blip_author_div = document.evaluate(
		"//div[@id='" + thisDiv.id + "']//div[@class='body']//a",
		document,
		null,
	    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	    null);

	var blip_author_login = blip_author_div.snapshotItem(0).innerHTML;

	// DEBUG Mostrar nome do autor de cada blip para checar se foi extraido corretamente
	//thisDiv.innerHTML += blip_author_login;
	
	var url = 'http://blipfm.hypercast.info/blips/check?login=' + blip_author_login + '&code=' + thisDiv.id + '&music=' + document.getElementById(thisDiv.id + 'headline').innerHTML;

	// DEBUG Mostrar a URL que esta sendo requisitada
	//thisDiv.innerHTML += url;

	GM_xmlhttpRequest({
		method: 'GET',
	    url: url,
	    headers: {
	        'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
	        'Accept': 'application/xml,text/xml,text/html,text/json'
		},
	    onload: function(responseDetails) {
			eval("hs = " + responseDetails.responseText);
			var allDataDivs = document.evaluate(
				"//div[@id='" + hs['blip_id'] + "']//div[@class='date']//div[@class='comment']",
				document,
				null,
				XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
				null);

			allDataDivs.snapshotItem(0).innerHTML = 
				'<a href="javascript:func()" onclick="toggle_element(\'comments' + hs['blip_id'] + '\');">COMENTARIOS (' + hs['comments'] +')</a><br/>' +
				'<div id="comments' + hs['blip_id'] + '" class="blip_comments" style="display: none;"></div>' +
				'<div>' + 
					'<a href="javascript:func()" onclick="toggle_element(\'form' + hs['blip_id'] + '\');">Escrever comentario</a>' +				
				'</div>';

			if(hs['comments'] > 0){
				document.getElementById('comments' + hs['blip_id']).innerHTML = hs['texts'];
			}

				

			// colocando o form do lado de fora do quadro branco do blip, mas ainda dentro da sua div
			document.getElementById(hs['blip_id']).innerHTML += 
				'<div id="form' + hs['blip_id'] + '" style="display: none; float: right;">' +
					'<form target="ifme" method="POST" action="http://blipfm.hypercast.info/comments/save.json">' +
						'<textarea name="text" id="text' + hs['blip_id'] + '" rows="2" cols="74"></textarea><br/>' + 
						'<input type="hidden" name="login" value="' + login + '"/>' +
						'<input type="hidden" name="blip_author_login" value="'+ hs['blip_author_login'] +'"/>' +
						'<input type="hidden" name="code" value="' + hs['blip_id'] + '" />' + 
						'<input type="hidden" name="music" value="' + hs['music'] + '" />' + 
						'<input type="submit" onclick="' + 
							'document.getElementById(\'form' + hs['blip_id'] + '\').submit;' + 
//							'document.getElementById(\'text' + hs['blip_id'] + '\').value = \'\';' +
							'toggle_element(\'form' + hs['blip_id'] + '\');' +
							'" />' +
					'</form>' +
				'</div>';
		}
	});
}
