Twitter Enhancements: Retweet This *Update*

By cfurrow Last update Jan 13, 2009 — Installed 219 times.

There are 1 previous version of this script.

// ==UserScript==
// @name           	Twitter Enhancements: Retweet This *Update*
// @namespace      	http://twitter.com
// @description   	Append a retweet button to the end of each twitter entry
// @include        	http://twitter.com/*
// @include        	https://twitter.com/*
// @author    		Ziru
// @author    		Carl Furrow
// @require			http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js
// @require			http://simplemodal.googlecode.com/files/jquery.simplemodal-1.2.2.min.js
// ==/UserScript==
//Carl: Added jquery functionality to replace status box without a postback.
//Carl[1.13.2009]: Added a modal dialog (thanks to Eric Martin's SimpleModal plugin) for retweets, instead of using the Twitter status bar.
	//This allows for retweeting from any page on twitter, not just ones with a textbox at the top (ie. Favorites, etc)

const locale = '';
// const locale = 'zh-CN';
$(document).ready(function(){
	$('head').append("<link href='http://oneof.us/iworkwithcomputers/dev/jquery/twitter_enhancement_retweet_this/retweetthis.css' type='text/css' rel='stylesheet'>");
});
// All your GM code must be inside this function
    function letsRetweet(retweetStr) {
			//TODO: Restrict textbox to 140 characters. Can we reuse twitter's code here?
			
			$("<div class='rtContainer'><textarea id='rtTextArea' cols='45' size='400' /><div class='rtLinkRow'><a href='#' class='rtRetweet'>Retweet</a></div></div").modal();
			$("a.modalCloseImg").append(CreateModalCloseButton());
			$("textarea#rtTextArea").val(retweetStr);
			$("a.rtRetweet").click(function(){
				$.ajax({
					type:"POST",
					url: "http://twitter.com/statuses/update.json",
					data: "status="+retweetStr,
					success: function(msg){
							$("div.rtContainer").html("<h2>Retweet Success!</h2>")
						
						}
					});				
			});
    }

var gblRetweetTemplate, gblRetweetButtonTitle;

if (locale == 'zh-CN') {
  	gblRetweetTemplate = '[ËΩ¨] @%a: %c';
	  gblRetweetButtonTitle = '转发';
} 
else {
  gblRetweetTemplate = 'RT @%a: %c';
  gblRetweetButtonTitle = 'Retweet this';
}

function createButton(target, func, title, width, height, src) {
  var img, button;
  img = document.createElement('img');
  img.width = width;
  img.height = height;
  img.src = src;
  button = document.createElement('a');
  button._target = target;
  button.title = title;
  button.href = '#';
  button.addEventListener('click', func, true);
  button.appendChild(img);
  return button;
}

function GetEntryAuthor(entry) {
  var url = document.location.href.replace(/\?.*/g,'');
  var re = /^https?:\/\/twitter.com\/(.*)$/;
  return re.exec(entry.getElementsByClassName('url')[0].href)[1];
}
function GetEntryAuthorAlt(entry)
{
	var url = document.location.href.replace(/\?.*/g,'');
	url = url.replace(/#/g,'');
	var re = /^https?:\/\/twitter.com\/(.*)$/;
	return re.exec(url)[1];
}

function getText(elem) {
  var result = '';
  for (var i = 0; i < elem.childNodes.length; i++) {
    var childElem = elem.childNodes[i];
    if (childElem.nodeType == 3)
      result = result + childElem.nodeValue;
    else if ((childElem.nodeType == 1) && (childElem.tagName.toUpperCase() == 'A'))     // remove the html link tag
      result = result + childElem.firstChild.nodeValue;
  }
  return result.replace(/\n/g,'').replace(/^ *\t* */g, '').replace(/ *\t* *$/g, '');
}

function OnRetweetButtonClicked(event, entry) {
	var entryAuthor;
	try{
		  entryAuthor = GetEntryAuthor(entry);
	}
	catch(e)
	{
		entryAuthor =GetEntryAuthorAlt(entry);
	}

  var entryContent = getText(entry.getElementsByClassName('entry-content')[0]);
  var retweetStr = gblRetweetTemplate.replace(/%a/g, entryAuthor).replace(/%c/g, entryContent);
  var url = document.location.href.replace(/\?.*/g,'');
  var re = /^(https?:\/\/twitter.com\/).*$/;
  var m = re.exec(url);
  letsRetweet(retweetStr);
  event.preventDefault();
}

function CreateModalCloseButton()
{
	return createButton(
		null,
		function(event){},
		null,
		25,
		25,
		'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAdCAYAAABfeMd1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA8xJREFUeNqclktIVFEYx+fO+GjUGqw0S/IRGtTKENtkqJTkooUwC0EQNNpEEiJYoISbKAhcCYogagvBlbRQW/kAIdAkbRGIi3RiNIfJR+qk4zxO/2/4zu3cOw+tA7+5c8/j+5/vfN8592hCCMspSy4o4acXLIHVU40kkQTkglfgm4hd3KAb3PxfESf4KU5XAuBRPA0tznINgCa1Yn193bK0tBR5ZmVlWUpKSiyFhYXmcfPgiaZpn0/yZEKd4vLysqioqKCZRAEhMTc3Z/bqy0nL9Uzt3dXVJex2e0wBic1mEx0dHcLv96tDX8cTyVN7tbW1JTRupr6+3uzR7Vgib2Tr5ORklJHa2lrDe0FBgVhcXDTUDw8PqyIfY4m4ZGt5ebnB4OrqaqS+srJSj8XOzk6kbnBwUO9XVFQkgsGgKmTTRQ4PD/NlrcvlivKis7Mz0kZiJBRLQDI7O/s3rwOBu7oI1B/KhrGxsaiBtDTSsCyxBIj+/n69D+w+Jg0r/YTD4Wy5fF6vNyoD19bWLENDQ4b3pqammBtPHQ+diF0rNo4GxT3Z4HA4ogbSxmtsbNTf4ZnhXS1Ief1/KBQ6og0f2fXIkuJ4MVGDLBOACtVRW6KYuN3ue7oISIc3btmoDp6enjYYbWlp0Y3Qf1UAx40hu0pLSx0yJPRz1uPxvJONo6OjhswiAZm+BBlX3yU9PT26gM/no/PrHLDpIr29vQ/U7GloaDBk10k7vrq62uDF+Pg4ZYbDIAKuzc/PD8hOdBbRUXGaI6Wmpkbs7+/rAltbW19RX2wWSQd54A6WzaV6REcFjvSYxikGtESqBwcHB7vt7e30bSngyVtl4M+AHHCrubn5+cbGxqb5tFtYWBB9fX2iu7s78pyZmYn6ciF2e62trS9hpwxcAWlqdqWA8+A6uA+ejoyMfBL/UFZWVjbr6ureYmwNuAEugtSIff4y0rpl8CWhFDjBC6fT+R4BdB8dHYXiGZ+amvJgY35A/3ZQB+iIv8pLlaR/frHpad2S2b1McJk75vPzUlVVVV5ZWdmF5ORkGw6+EL6YvyYmJlyIxyba3eA7swG2gQ8E6NSSIhoHKIWTgISyWSyH/2fyJMjrMPgNdvl6REI/gAfsgANwTCcLJYh+kWAhGwulcfplcqwyeWPZuQ8NpnNpn41uM3vsAQkEOQuNtxWTUCp7lcHPNK6zsifH7I2PZ+5j4QBPIhz3SqQsXRLHKZVFU/hd4xkGWcjPT7k8IelBwnsXC0kxK3tn4/9SJKwYDTPCLJDocmcWlPtJUy86isGERv4IMACaz3RmXeGcqwAAAABJRU5ErkJggg%3D%3D'
		);
}
function CreateRetweetButton(entry) {
  return createButton(
            null,
            function(event) { OnRetweetButtonClicked(event, entry); },
            gblRetweetButtonTitle,
            13,
            12,
            'data:image/png;base64,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');
}

function addRetweetButtonToEntry(entry) {
  var actions = entry.getElementsByClassName('actions');
  if (!actions)
    actions = entry.getElementsByClassName('status-actions');
  var action = actions[0];
  if (action) {
    var button = CreateRetweetButton(entry);
    action.appendChild(button);
    button.style.display = 'none';
    button.style.margin = '0';
    entry.addEventListener('mouseover', function(evt) {  button.style.display = 'inline'; }, true);
    entry.addEventListener('mouseout', function(evt) { button.style.display = 'none'; }, true);
  }
}

// =================  MAIN ================= 
var entryElems = document.getElementsByClassName('hentry');
if (!entryElems) return;
for (var i = 0; i < entryElems.length; i++)
  addRetweetButtonToEntry(entryElems[i]);