view chrome/content/tinyurl.js @ 0:c14d52a3b2fe

initial import
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 11 Aug 2008 20:34:21 +0900
parents
children bebb38edfc61
line wrap: on
line source


var oLongUrlField 	= null;
var oTabBox		 	= null;
var oSavedTree	 	= null;
var oSavedTreeItems	= null;
var tinyurl_loaded = false;

function tinyurl_overlayInit(){
	try{
		var oContext = document.getElementById("contentAreaContextMenu");
			oContext.setAttribute("onpopupshowing", "tinyurl_contextShowing(event); "+ oContext.getAttribute("onpopupshowing"));
	} catch(err) { alert(err); }
	
	// Update all links with preview title attribute
	if(gBrowser && !tinyurl_loaded){
	
		gBrowser.addEventListener("load", function(){
			var tiny = new TinyUrl();
			var doc = gBrowser.selectedBrowser.contentDocument;
			var anchors = doc.getElementsByTagName("a");
			for(var i = 0; i < anchors.length; i++){
				if(anchors[i].href.indexOf("http://tinyurl.com/") == 0){
					tiny.addPreview(anchors[i]);
				}
			}
		}, true);
		
		tinyurl_loaded = true;
	}
}

/**
* Load TinyUrl dialog
*/
function tinyurl_load(){
	oLongUrlField 	= document.getElementById("longurl-field");
	oTabBox			= document.getElementById("tinyurl-tabs");
	oSavedTree		= document.getElementById("saved-tree");
	oSavedTreeItems	= document.getElementById("saved-items");
	
	// Cancel button
	document.getElementById('tinyurlDialog').getButton('cancel').setAttribute("label", "Close");
	
	// Is RDF Present
	tinyurl_saved_rdfCreate();
	
	// Load Saved Data
	tinyurl_saved_read();
	
	// Preload Field
	if(opener.gBrowser && opener.gBrowser.currentURI){
		oLongUrlField.value = opener.gBrowser.currentURI.spec;
	}
	
	// Goto Save Tab
	if(window.arguments.length > 0 && window.arguments[0] == "saved"){
		oTabBox.selectedTab		= document.getElementById("tinyurl-saved-tab");
		oTabBox.selectedPanel	= document.getElementById("tinyurl-saved-tabpanel");
	}
}

/**
* Create TinyUrl from current page
*/
function tinyurl_createFromCurrent(){
	var tiny = new TinyUrl(gBrowser.currentURI.spec, window._content.document.title);
	window.openDialog('chrome://tinyurl/content/create.xul','TinyUrlCreate','chrome, centerscreen, resizable', tiny);
}

/**
* Creat new Tiny Url from dialog
*/
function tinyurl_createNew(){
	try{
		
		// If not in main tab
		if(oTabBox.selectedTab.id != "tinyurl-create-tab"){
			return;
		}
		
		// Validate
		if(oLongUrlField == null || oLongUrlField.value == ""){
			alert("You have not entered a long url");
			return;
		}
		
		document.getElementById("tinyurl-field").value = "Loading...";
		
		// Title
		var sTitle = "";
		if(opener && oLongUrlField.value == opener.gBrowser.currentURI.spec){
			sTitle = opener.window._content.document.title;
		}
		
		// Get TinyUrl
		var tiny = new TinyUrl(oLongUrlField.value, sTitle);
		
		// Output
		var loaded = {
			done : function(oTiny){
				if(oTiny.tiny != null){
					document.getElementById("tinyurl-field").value = oTiny.tiny;
					document.getElementById("copy-button").disabled = false;
					document.getElementById("save-button").setAttribute("oncommand", "tinyurl_saved_add('"+ oTiny.tiny +"', '"+ oTiny.original +"');");
					document.getElementById("save-button").disabled = false;
					document.getElementById('tinyurlDialogMain').style.cursor = "default";
				}
			},
			
			error : function(oTiny){
				document.getElementById("tinyurl-field").value = "";
				alert("An error occurred.\nIs your internet connection available?");
			}
		}
		
		tiny.shrink(loaded);
		
	}catch(err){ alert("Error 120\nAn unknown error occurred\n"+ err); }
}

/**
* Create TinyUrl from anchor on page
*/
function tinyurl_createFromAnchor(){		
	if(gContextMenu != null && (gContextMenu.getLinkURL || gContextMenu.linkURL)){		
		var url = (gContextMenu.getLinkURL) ? gContextMenu.getLinkURL() : gContextMenu.linkURL
		var tiny = new TinyUrl(url, null);

		window.openDialog('chrome://tinyurl/content/create.xul','TinyUrlCreate','chrome, centerscreen, resizable', tiny);
	}
}

//Send text to tinyurl_copyText()
function tinyurl_copy(){
	try{
		var oField = document.getElementById("tinyurl-field");
		
		if(oField == null || oField.value == ""){
			return;
		}
		
		//Copy
	  	tinyurl_copyText(oField.value);
		
	}catch(err){ alert("Error 140\nCouldn't copy to clipboard"); }
}

// Comand from key stroke
function tinyurl_copy_command(){
	if(oTabBox.selectedTab.id == "tinyurl-create-tab"){
		tinyurl_copy();
	}
	else if(oTabBox.selectedTab.id == "tinyurl-saved-tab"){
		tinyurl_saved_copy();
	}
}

//Copies str to clipboard
function tinyurl_copyText(str){
	try{
		//Copy
		var oClipboard 	= Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
	  		oClipboard.copyString(str);
			
	}catch(err){ throw err }
}

// Context Showing
function tinyurl_contextShowing(event){
	try{
		if(document.popupNode.nodeName.toUpperCase() == "A"){
			document.getElementById("tinyurl-context-link-menu").setAttribute("collapsed", false);
		}
		else {
			document.getElementById("tinyurl-context-link-menu").setAttribute("collapsed", true);
		}
	} catch(e) {}
}

//Opens http://tinyurl.com
function tinyurl_gotoTinyUrl(){
	opener.focus();
	self.focus();
	
	if(opener.gBrowser.addTab)
		opener.gBrowser.selectedTab = opener.gBrowser.addTab("http://tinyurl.com");
	else
		window.open("http://tinyurl.com");
}



/**
* @constructor
*/
function TinyUrl(url, title){
	
	/**
	* Original url
	* @type string
	*/
	this.original = url;
	
	/**
	* Shunken url
	* @type string
	*/
	this.tiny = null;
	
	/**
	* Title of the page from the original url.
	* Used for when the user selects to save the tiny url.
	* @type string
	*/
	this.title = title;
	
	/**
	* @type XMLHttpRequest
	*/
	this.request = null;
	
	
	/**
	* Make the long url tiny
	*/
	this.shrink = function(callback){
		
		// No need to shrink
		if(this.tiny != null){
			return;
		}
		
		// Abort current request
		if(this.request != null){
			this.request.abort();
		}
		
		// Encode URL (can't use encodeURIComponent, because TinyUrl.com will choke)
		var url = this.original;
       	url = url.replace(/\+/g, "%2B");       	
		url = url.replace(/\?/g, '%3F');
		url = url.replace(/&/g, '%26');
		url = url.replace(/=/g, '%3D');
		
		// Setup Request
		this.request	= new XMLHttpRequest();
		this.request.open("GET", "http://tinyurl.com/api-create.php?url="+ url, true);
		this.request.setRequestHeader("User-Agent", navigator.userAgent);
		this.request.setRequestHeader("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1");
		this.request.setRequestHeader("Accept-Language", navigator.language);
		this.request.setRequestHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
		this.request.setRequestHeader("Referer", "http://tinyurl.com/");
		this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		
		var obj = this;
		
		// Handle request
		this.request.onload = {
			handleEvent : function(e){
				
				// If already aborted
				if(obj.request == null){
					return;
				}
				
				//Parse Response
				obj.tiny = null;
				var url = obj.request.responseText;
				if(url.length < 200){ // must have returned more than the URL if more than 200
					obj.tiny = url;
				}
				
				// Notify callback function
				if(obj.tiny == null){
					callback.error(obj);
				}
				else{
					callback.done(obj);
				}
			}
		};
		
		// Handle Error
		this.request.onerror = {
			handleEvent : function(e){
				callback.error(obj);
			}
		}
       	
       	// Start Request
       	this.request.send("");
	}
	
	/**
	* Abort TinyUrl shrink request
	*/
	this.abort = function(){
		try{
			this.request.abort();
		}catch(e){  }
	}
	
	/**
	* Add a the full URL to an link with a TinyURL
	* @param {Anchor} anchor The anchor tag with a TinyURL
	*/
	this.addPreview = function(anchor){
		
		// Find where it redirects to
		try{
		
			// Setup request objects
			var io = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
			var uri = Components.classes["@mozilla.org/network/standard-url;1"].createInstance(Components.interfaces.nsIURI);
			uri.spec = anchor.href;
			var request = io.newChannelFromURI(uri).QueryInterface(Components.interfaces.nsIHttpChannel);
			
			request.redirectionLimit = 0;
			request.requestMethod = "HEAD";
			
			// Start request and find redirect location
			request.asyncOpen({
				onStartRequest : function(request, context){ },
				onStopRequest : function(request, context, statusCode){ 
					var location = request.getResponseHeader("Location");
					anchor.setAttribute("title", location);
				},
				onDataAvailable : function(request, context, inputStream, offset, count){} 
			}, null);
			
		} catch(e){
			e = e;
		}
		

	}
}