Delicious Collect

By Burn Uploaded Jun 17, 2009
/*
  @author: Burn
  @url: http://userscripts.org/users/42427
  @update: http://userscripts.org/jetpacks/64.js
  @title: Delicious Collect
  @description: Post to Delicious all your open tabs
  @include : *
  @license: GPL - http://www.gnu.org/licenses/gpl.html
  @version: 0.1.5

*/

function DeliciousCollect() {}
function DeliciousAPI() {}

const DBG = 0; // set to 1 to enable log messages in Firebug Console
const Icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kGEBYKHj73T1MAAAUPSURBVEjH3ZZZbJRVHMXP/ZZZOu1MZ1ra0oVpS9tEgi0UqMESoVgxQhM2IwQFpEQNIW4scXsRIygaiQ3VmLhgggQ1FANohLaBhhKWWqBQoJTCtLN1ZtrOPt83y7dcHwwEAiTVRB+8b/fe3PPL/+Gcc4H/1Tqxa5vu0Jb1jYc2rS/6J+9Pf9+U8/OGFRvvPmPu3oxe7G6J2m5+K3rdPQcal9X+HfGwy252tLUOix5388GNz7feB/jppedWRj2+hVkGI7Xk55qFuLj32PubLeMRd18+zx96Y3078QfZ3LyJNBnyP3X4tbWv3AH4e7u4oH/0ZZVjQEGIsbiYaLNNJULEP388gOPNHy+JibFphDDUlJtHzBWTEfb7Vv6xZ7eOAYDj33yeJRGlXDKlYSgaRFAQocnJwVg0tHo8gFgsvCKp5ZmQhhB/Mg4m0wJZy1f0d3WaOAAI8OlaQaczmrOyEXY5MeSwIz0nB0qutey2SEtHIpunqWq/yNTzVHFdcWPfR+vUANGYqag3TNebjIgHA3D7vCjIy4XAsRnRUJDnAKBq2RphxD4wYkzjjF7HIBSwmFLzBCKR+C182ISWE4kGnkMl5fTnpGCSu+pCkySrOz7Zj81iJP51R2sLSQXccFzvhcc7DH1ShqFsajjbkp/iACAZjyNFtCitnI2iR2YBhAAUflYjiPvaxGwVamVdjX5nhoYo278Lz4kJMkLhhMHvl7746nCqtba05JS1tn5S7VKWDYVC4Dketwb6OYYwDAMAkVA47nLYA/6xEbTt3w3b1QsAYYyCICzWQa5OQn8uQ0MUALCPytQ2FMGwJ0RttjHWOxLcKEvS4rgoSAO93eg5fhDJhAC3fTDsdg79NUHDsuXJbe++FfUMD1MxKZNRnxcTisL86ZMdPF86qb7r6Baurq5uTjIZp2lie93c6tlQFZ6oMoVGR2pHfR5jmiENCSEE/6gX0UgEPq8vVlxaInMAQAhRmnd92uvzep5UiBZutweTKiJgWdajxtyu7p7+Jnt/FyRJQk3NGWx4fQEF0omsUBxpH7nSd61vVqYli3XZHYiKEjxuNyQ55Xp21erYHaOpKj0pigKMRj3GvIOQFBVSSnL02Jl9BlOJEI/HIcsylWUFAEhKVnFzKILcbP5Ls8VsN2VaoNPzKLBaIcRi0On1fYQQ9Q7g1c1bf/d6PBj1jdKxsTH0XjwPlSq2PR88Fpz3zNo3i6cuigIsUeQEZEXBoCOienzJHZd6hd4Rn+9635XL6Gxvw+mTHXA5HVAVteueqCCEJGQVvcFIjPBEwrDXjpSsXiOEqDu3zjvy64HmU+9s//GssWDR2V+O3jibkUY7587O/+29TVWyLMvOoSEbtDotzFkTaCAQwIpVL3QAAHe3I4uLrTsvnBn4wel00fKaGpJmsHQDAMcSL4CFD3OyCuamw2kDJwbpWCxOJlot14tKSoP3penS5VMONDbOctTPLSUvruGFdWtL+sYTFVXTyi/NnFmYkhWRFBaaMb26as/tu3smMBstauZMnaesJH2STiOooDwdD6ChYXpAiZ9PWDMnaMqrHpVuODM/e2Af8IYZkkoKzmkN+aBMnodhJ8bGA2BJpswyWvr4fC3yCgzXFjy9WHkgAAAIm7+X009TOc56VWOYERgXQDPZBq5MpEwhKEwtD200ANAa6roZvmwJq6nYMd42YzUkyvDWo6yuMs7yxcf+lT6nlPKpROfb//lH4k/9QmroaUv5/wAAAABJRU5ErkJggg==";

DeliciousCollect.prototype = {

	RE_url: new RegExp('^(http|https)://','i'),

	TabList: new Array(),

	saveBookmarks: function(ARRurls) {
		var Count = 0;
		var Skipped = [];
		for (url in ARRurls) {
			if (this.RE_url.test(ARRurls[url])) {
				var Obj = new DeliciousAPI();
				var URLexists = Obj.GetBM(ARRurls[url]);
				if (!URLexists) {
					var AjaxCall = Obj.AddBM(ARRurls[url], ARRurls[url]);
					if (AjaxCall) {
						Count++;
					}
				} else {
					Skipped.push(ARRurls[url]);
			}
			} else if (DBG) console.log('not an URL: '+ARRurls[url]);
		}
		var strSkipped = (Skipped.length > 0) ? " Skipped: "+Skipped.join(", ") : "";

		this.notify(ARRurls.length+" urls found, "+Count+" added."+ strSkipped);
	},

	getTabs: function() {
		this.TabList = Array(0);
		for (tab in jetpack.tabs) {
			if (jetpack.tabs[tab].url 
				&& this.RE_url.test(jetpack.tabs[tab].url)
				&& jQuery.inArray(jetpack.tabs[tab].url, this.TabList) == -1) {
	 			this.TabList.push(jetpack.tabs[tab].url);
			}
		}
		if (this.TabList.length == 0) {
			return false;
		}
		return this.TabList;
	},
	
	openInTab: function(page) {
		if (this.RE_url.test(page)) {
			jetpack.tabs.open(page);
			return true;
		}
		return false;
	},
	
	openInCurrent: function(page) {
		if (this.RE_url.test(page)) {
			Components.utils.import("resource://jetpack/ubiquity-modules/utils.js");
			Utils.openUrlInBrowser(page);
			return true;
		}
		return false;
	},
	
	notify: function(msg) {
    	jetpack.notifications.show({
		  title: "DeliciousCollect",
		  body: msg,
		  icon: Icon
		});
  	},
}


DeliciousAPI.prototype = {

	baseURL: "https://api.del.icio.us/v1/posts/",

	URLitem: "url=",

	// methods and properties to add new bookmark
	URL_ADD: 'add?',
	ADDdescription: "&description=",
	ADDshared: "&shared=no", // set to yes to share bookmark
	
	AddBM: function(theUrl, descr) {
		this.URLitem += encodeURIComponent(theUrl);
		this.ADDdescription += descr;
		this.URL_ADD = this.baseURL + this.URL_ADD + this.URLitem + this.ADDdescription + this.ADDshared;
		let retVal = false;
		if (DBG) console.log('Sending '+this.URL_ADD);
		$.ajax({
			type: "GET",
			url: this.URL_ADD,
			dataType: "xml",
			async: false,
			success: function(xml) {
				var Reply = $(xml).find("result").attr("code");
				if (/done/.test(Reply)) {
					if (DBG) console.log('OK - '+ Reply);
					retVal = true;
				} else {
					if (DBG) console.log('KO - '+ Reply);
					retVal = false;
				}
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) {
					if (DBG) console.log('KO - error in XHR while using ADD method');
					retVal = false;
			}
		});
		return retVal;
	},

	// methods and properties to get an existing bookmark
	URL_GET: "get?",

	GetBM: function(URL) {
		this.URLitem += encodeURIComponent(URL);
		this.URL_GET = this.baseURL + this.URL_GET + this.URLitem;
		var retVal = false;
		if (DBG) console.log('Checking ' + this.URL_GET);
		$.ajax({
			type: "GET",
			url: this.URL_GET,
			dataType: "xml",
			async: false,
			success: function(xml) {
				var Reply = $(xml).find("post").attr("href");
				if (Reply == URL) {
					if (DBG) console.log('OK - bookmark existing: '+ Reply);
					retVal = true;
				} else {
					if (DBG) console.log('OK - bookmark NOT existing.');
					retVal = false;
				}
			},
			error: function (XMLHttpRequest, textStatus, errorThrown) {
					if (DBG) console.log('KO - error in XHR while using GET method');
					retVal = false;
			}
		});
		return retVal;
		
	}
}


jetpack.statusBar.append({
	html: (<><![CDATA[
			<span style="cursor:pointer">
				<img id="icon" alt="Click to collect open tabs in Delicious" />
			</span>
		  ]]></>).toString(),
	width: 24,
	onReady: function(doc) {
		$("img#icon", doc).attr("src", Icon);
	    $(doc).click(function() {
			NewObj = new DeliciousCollect();
			lista = NewObj.getTabs();
			if (lista) {
				NewObj.saveBookmarks(lista);
			} else NewObj.notify('No open tabs found.');
		});
	}
});