MyFavoriteSoup

By Brandon Last update Apr 5, 2008 — Installed 213 times.
// ==UserScript==
// @name        MyFavoriteSoup
// @namespace   http://www.bitsoup.org
// @version		2.0
// @description Improves on BitSoup's bookmarking system, adding ajax bookmarks on the browse, details, and wish list pages, and download links in the wish list view.
// @include http://*bitsoup.org/browse.php*
// @include http://*bitsoup.org/details.php*
// @include http://bitsoup.org/bookmarks.php*

// @exclude http://*bitsoup.org/details.php*&page=*
// ==/UserScript==

//BitSoup FaveURL: http://bitsoup.org/bookmarks.php?op=add&id=[torrent_id]

//<!------- GREASEKIT COMPATABILITY FUNCTIONS --------->//

if(typeof GM_xmlhttpRequest === "undefined") {
	GM_xmlhttpRequest = function(/* object */ details) {
		details.method = details.method.toUpperCase() || "GET";
		
		if(!details.url) {
			throw("GM_xmlhttpRequest requires an URL.");
			return;
		}
		
		// build XMLHttpRequest object
		var oXhr, aAjaxes = [];
		if(typeof ActiveXObject !== "undefined") {
			var oCls = ActiveXObject;
			aAjaxes[aAjaxes.length] = {cls:oCls, arg:"Microsoft.XMLHTTP"};
			aAjaxes[aAjaxes.length] = {cls:oCls, arg:"Msxml2.XMLHTTP"};
			aAjaxes[aAjaxes.length] = {cls:oCls, arg:"Msxml2.XMLHTTP.3.0"};
		}
		if(typeof XMLHttpRequest !== "undefined")
			 aAjaxes[aAjaxes.length] = {cls:XMLHttpRequest, arg:undefined};
	
		for(var i=aAjaxes.length; i--; )
			try{
				oXhr = new aAjaxes[i].cls(aAjaxes[i].arg);
				if(oXhr) break;
			} catch(e) {}
		
		// run it
		if(oXhr) {
			if("onreadystatechange" in details)
				oXhr.onreadystatechange = function() { details.onreadystatechange(oXhr) };
			if("onload" in details)
				oXhr.onload = function() { details.onload(oXhr) };
			if("onerror" in details)
				oXhr.onerror = function() { details.onerror(oXhr) };
			
			oXhr.open(details.method, details.url, true);
			
			if("headers" in details)
				for(var header in details.headers)
					oXhr.setRequestHeader(header, details.headers[header]);
			
			if("data" in details)
				oXhr.send(details.data);
			else
				oXhr.send();
		} else
			throw ("This Browser is not supported, please upgrade.")
	}
}

if(typeof GM_addStyle === "undefined") {
	function GM_addStyle(/* String */ styles) {
		var oStyle = document.createElement("style");
		oStyle.setAttribute("type", "text\/css");
		oStyle.appendChild(document.createTextNode(styles));
		document.getElementsByTagName("head")[0].appendChild(oStyle);
	}
}

if(typeof GM_log === "undefined") {
	function GM_log(log) {
		if(console)
			console.log(log);
		else
			alert(log);
	}
}

//<!------- END GREASEKIT FUNCTIONS --------->//


//<!------- GLOBAL FUNCTIONS ---------->//

//usage getElementsByClassName(class name, tag name, parent)
function getElementsByClassName(strClass, strTag, objContElm) {
  strTag = strTag || "*";
  objContElm = objContElm || document;    
  var objColl = objContElm.getElementsByTagName(strTag);
  if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
  var arr = new Array();                              
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';   
  var arrClass = strClass.split(delim);    
  for (var i = 0, j = objColl.length; i < j; i++) {                         
    var arrObjClass = objColl[i].className.split(' ');   
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (var k = 0, l = arrObjClass.length; k < l; k++) {
      for (var m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if ((delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]); 
          break comparisonLoop;
        }
      }
    }
  }
  return arr; 
}

function insertAfter(parent, node, referenceNode) {
  parent.insertBefore(node, referenceNode.nextSibling);
}

function getInfoTable() {
	var main_td = getElementsByClassName('main', 'td')[0];
	var info_table = main_td.getElementsByTagName('table')[0];
	
	var isPMTable = info_table.innerHTML.indexOf("viewmailbox");
	if(isPMTable>=0){
		info_table = main_td.getElementsByTagName('table')[1];
	}
	return info_table;	
}

function ajaxClick(event) {
    GM_xmlhttpRequest({
      method: 'GET',
      url: this.href,
      onload: clickSuccess(this.rel, this.id),
      onerror: clickError
    });
    event.preventDefault();
}

function clickSuccess(rel, id){
	var add = "a";
	var action = id.split("-")[0].toLowerCase().indexOf(add.toLowerCase());

	switch(action)
	{
		case -1:
			// alert(rel + '\nhas been removed from your wishlist');
			var row =id.split("-")[1]			
			bookmarksModule.removeBookmarkRow(row);
			break;
		case 0:
			alert(rel +'\nhas been added to your wish list');
			break;
		default:
			alert("Not Found");
			break;
	}
}

function clickError(){
	alert('Error completing your request. Check your error log for details');
	GM_log("Click error...");
}

function getTorrentID(torrentURL){
	var url_vars = torrentURL.split("?")[1];
	var id = url_vars.match(/id=([^(\&|$)]*)/)[1];
	return id;
}

function getTorrentIDFromLink(strLink){
	var torrentID = strLink.match(/id=([^(\&|$)]*)/)[1];
	return torrentID;
}

//<!-------- END GLOBAL FUNCTIONS ------->//

//<!------- GLOBAL VARIABLES -------->//

//	Create Variables and construct the URL's and containers	//
	
var add_url = 'http://bitsoup.org/bookmarks.php?op=add&id=';
var book_img_data = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0' +
'U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLbZPfa85xFMdf36/nebbGBcLa' +
'MmtM2DybElsjQm5c+PEnoKSQCzfEnZtduLRdSJFc4UK5sEizSLtQNCYXJMXKlMeG7fv5cc5x8X02' +
'w06dzqdPn/M673M6n8TM2H/6WruZ3TaoYPQYhhlgRh5s1lUCwU18GLpxfjVAgfzBMYP15bZVyfjX' +
'CcxmkiCHKabwfeIX085QK7RQtRwAO8ptTcmujiZWNZSxnICa5lU1r758cR11tQW2HTjOXwDMlpTb' +
'm7n//B2VyhSmCoDOqDDD1Pg+OUXmPHOt2gJJoVRg7cZmWuuXIgJmiqohYogqUY3pLHDrzuP5AIaI' +
'8nF8klJaJMsygvNEze8jCygUSyxbWIOazQMAVJQoAecch7a25vJzdZgZ1wffEmqL/JP/R0EQRUIk' +
'SsrNx29wIRLFkKhEEoqlEj7mQ50XEKPiQ8ArWFpDUixCamiiqCpeErz8D0irQyREIWYRF4QsClkQ' +
'XIi4KDgvuKlnfP50iZZ1A5R3j7PvXOeFvxWIElzABcnbEcOLEkWR6ac01r9h84YuVi5dy+DoXYZf' +
'P7nYfbJxcTq3heBzgI/KdBB8EFxUpn48YtP6TiQVOhv2Ikmgu9wDcCKdWRgfhegiLihZEELQXL4T' +
'Kj+/UEwWsX/DKQDO7LnCmhUdALWzMxAxxAsu5J6FiHOK98q3yQqjY8/ofXgYgN4Hh3k/PgKQzc6A' +
'NGVLVweWJIgYUQytxsQdZHhkgJ6O7dx71U8pKfD05RBAX2Jm7DzSd9WMo/nPm7P/GFTP1A5BzQtI' +
'PMAPoH/48tjZ3wRCz4QMKdc8AAAAAElFTkSuQmCC';

var detailsModule = { //Sets the site alteration to the details page//	
	
	insertLinks: function(){ //insert a row in the table under the torrent download link
		var torrent_name = document.getElementsByTagName('h1')[0].innerHTML;
		var target_table = getInfoTable();
		var torrent_id = getTorrentID(window.location.href);
		var fave_url = add_url + torrent_id;
		
		
		var x_row = target_table.insertRow(1);
		var cell_1 = x_row.insertCell(0);
		var cell_2 = x_row.insertCell(1);

		var link = document.createElement('a');
		link.href = fave_url;
		link.rel = torrent_name;
		link.title = 'Add ' + link.rel +' to your wishlist';
		link.id = "a-0";

		var label = document.createElement("b");
		var text = document.createTextNode(" - Add torrent to Wish List");

		label.appendChild(text);
		var bookimg = document.createElement('img');
		bookimg.src = book_img_data;
		bookimg.style.border = 'none';


		link.appendChild(bookimg);
		link.appendChild(label);

		cell_1.innerHTML = '<p align="right"><b>Wish List</b></p>';
		cell_2.appendChild(link);
		link.addEventListener('click', ajaxClick, false);
	},
	
	init: function(){
		GM_log("Details Module Initializing");
		this.insertLinks();
	},
	
	
}

var browseModule = { //Sets the site alteration to the browse page//
	
	replaceBookmarks: function(){
		var main_table = getElementsByClassName('koptekst')[0];
		var rows = main_table.rows.length;
		var current;
		var torrent_name;
		for (var i=1; i < rows; i++) {
			current = main_table.rows[i];
			torrent_name = current.getElementsByTagName('td')[1].getElementsByTagName('b')[0].childNodes[0].data;
			
			var cell = current.getElementsByTagName('td')[2];
			var link = cell.getElementsByTagName('a')[0].href;
			var img = document.createElement('img');
			var newLink = document.createElement('a');
			
			cell.removeChild(cell.childNodes[0]);
			
			img.src = book_img_data;
			img.style.border = 'none';
						
			newLink.href = link;
			newLink.title = "Add " + torrent_name + " to your wishlist";
			newLink.rel = torrent_name;
			newLink.id= "a-" + i;
			newLink.appendChild(img);
			cell.appendChild(newLink);
			newLink.addEventListener('click', ajaxClick, false);
		};
		
	},
	
	init: function(){
		GM_log("Browse Module Initializing");
		this.replaceBookmarks();
	}
}

var bookmarksModule = { //Sets the site alteration to the wishlist page//
	
	
	iframe:'',
	
	book_delete_img:
	'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK' +
	'6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJhSURBVDjL' +
	'dZPda85hGMc/v+f5Pc8e2wE2QtiMyZh5K4RSpCkHxJnkSElOxJFy4kDyF3DopR15' +
	'yUst2pRpJw4cSJLETCTb0mxre57f775eHPyevdBcdXfV3X19ru/36rojd+fwuZtt' +
	'7n7PYQRnt+O4A+5kyaePaSAko19e3rm0GiAme3DaobV9Q2M0NDyK+1QRZDDDDX6P' +
	'TlBOHPO4mWpkANjbvmFltG/TShqXteMZAXPLulrWffGCWmpLMXuOnOEvAO4L29ua' +
	'ePr6EyMjk7gZADalwh035/fYJJUkZXZULRDFxZi1G5toWVKPKrgbZo6qo2aIOeVK' +
	'4O793rkAjqrxdWiMYq5ApVIhJCli2b2QJy4UWVRXg7nPAQBMDdFAkiQc3dGSyc/U' +
	'4e7cevGBUCrwT/2MgqCGBkE0R2fve5IgiDoqhhBRKBZJJRvqnAARIw2B1MBzNUSF' +
	'AuQciwwzI9WIVP8LgCCKVIQkKKJGUKvmDL5+4BFrPj5g29AAv4olujviix3dcm1G' +
	'gRohCSRBMzvqpFVIa/9jdiV9tJ48Q01zG+W33bzv67nSc6AwkZttIaQZIBWjHJQ0' +
	'KIkYy991sm7fMUqfe4luH6e2/yGrmhryHvn5eGphUlEkEZJgBDNUnGBKCM788UFK' +
	'S5vh0IUZ75eXkbdo1fQMVB1NNbNghogh4og4Y7UNTL7pou7JWZLyTyaB8bE8mufH' +
	'9AzI5di+cxMeRag6oo5V8+iWE7x71UVj/TzifIHxYWFgMFLHr08Bep51vTqV/bxZ' +
	'+4+Dw3NfwX7byuZvPTSkYPncd8dvHOyWq38AFgvYQWlFsCQAAAAASUVORK5CYII=',
	
	addDownloadLinks: function() {
		//var faveTable = getElementsByClassName('tableb', 'table')[0];
		var faveTable = getElementsByClassName('tableb')[0];
		if(faveTable)
		{
		var count = faveTable.rows.length;
		var dlImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0' +
		'U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABbSURBVCjPY/jPgB8yDCkFB/7v+r/5/+r/' +
		'i/7P+N/3DYuC7V93/d//fydQ0Zz/9eexKFgtsejLiv8b/8/8X/WtUBGrGyZLdH6f8r/sW64cTkdW' +
		'SRS+zpQbgiEJAI4UCqdRg1A6AAAAAElFTkSuQmCC';
		
		for (var i = 1; i < count; i++){
			var torrentCell = faveTable.getElementsByTagName('tr')[i].getElementsByTagName('td')[1];
			var torrentLink = torrentCell.getElementsByTagName('a')[0].href;
			var torrentName = torrentCell.getElementsByTagName('a')[0].getElementsByTagName('b')[0].innerHTML;
			torrentCell.innerHTML = '<a href="http://www.bitsoup.org/download.php/' + getTorrentIDFromLink(torrentLink) +'/' + escape(torrentName) + '.torrent"><img src="' + dlImg +'" alt="download" border="0" title="Download ' + torrentName +'.torrent"></a> - <a href="' + torrentLink + '"><b>' + torrentName + '</b></a>';
		}
	}
	},
	
	replaceDelete: function() {
		var faveTable = getElementsByClassName('tableb')[0];
		var deleteURL; //'http://bitsoup.org/bookmarks.php?id=497988[torrentID]&op=delete'
		if(faveTable)
		{
		var rows = faveTable.rows.length;
		var current;
		var torrent_name;
		for (var i = 1; i < rows; i++){
			current = faveTable.rows[i];
			
			torrent_name = current.getElementsByTagName('td')[1].getElementsByTagName('b')[0].childNodes[0].data;
			
			var cell = current.getElementsByTagName('td')[(current.cells.length-1)];
			var link = cell.getElementsByTagName('a')[0].href;
			var img = document.createElement('img');
			var newLink = document.createElement('a');
			
			cell.removeChild(cell.childNodes[0]);

			img.src = this.book_delete_img;
			img.style.border = 'none';
			
			newLink.href = link;
			newLink.title = 'Remove ' + torrent_name + ' from your wishlist';
			newLink.rel = torrent_name;
			newLink.id = "r-" + i; 
			newLink.target = this.iframe.name;
			newLink.appendChild(img);
			cell.appendChild(newLink);
			newLink.addEventListener('click', ajaxClick, false); 
		}
	}
		
	},
	
	removeBookmarkRow: function(row){
		var faveTable = getElementsByClassName('tableb')[0];
		faveTable.rows[row].style.display = 'none';
	},
	
	init:function(){
		GM_log("Bookmarks Module Initializing");
		this.iframe.id = "dumpster";
		this.iframe.name = "IFRAME";
		this.iframe.style ="width:0px; height:0px; border: 0px; display:none;";
		this.iframe.src= "about:config";
		//insert our download links
		this.addDownloadLinks();
		//replace the delete buttons with spiffy ajax ones
		this.replaceDelete();
		
	},
}
	
//<!--------- FIRE IT UP ------------->//
function start(){
	var isBrowsing = window.location.href.indexOf('/browse.php');
	var isDetails = window.location.href.indexOf('/details.php');
	var isBookmarks = window.location.href.indexOf('/bookmarks.php');
	if (isBrowsing>=0) 
	{
		browseModule.init();
	}else if (isDetails>=0)
	{
		detailsModule.init();
	}else if (isBookmarks>=0)
	{
		bookmarksModule.init();
	};
	
}

start();