// ==UserScript==
// @name           User "RT" Link Generator for GreaseMonkey
// @description    add "User RT Function" to Official twitter.com
// @author		   @fm021,@smeghead
// @include	http://twitter.com/*
// @include	https://twitter.com/*
// @include	http://twitter.com/
// @include	https://twitter.com/
// ==/UserScript==
// ver 
// 0.1 プロトタイプ
// 0.2 自動更新対応
// 0.3 テキストボックスが無いときはHomeへ遷移する機能追加

// Check if jQuery's loaded
    function GM_wait() {
        if(typeof unsafeWindow.jQuery == 'undefined') { window.setTimeout(GM_wait,100); }
    else { 
		$ = unsafeWindow.jQuery;
		letsJQuery(); }
    }
    GM_wait();
	
	// All your GM code must be inside this function
    function letsJQuery() {
		//割り込み処理
		var globalScript = "(" + (function(){
			// * new tweet
			var __updateTimeAgo = window.updateTimeAgo;
			window.updateTimeAgo = function(){
				urt_addUserRTLink();
				__updateTimeAgo();
			};
			// More
			var __onPageChange = window.onPageChange;
			window.onPageChange = function(){
				__onPageChange();
				urt_addUserRTLink();
			};
		}).toString() + ")();";
		
		//スクリプトノード追加
		exportToSite(
			urt_getUserRT, 
			urt_getEntryContent, 
			urt_addUserRTLink, 
			urt_setRT,
			globalScript
		);

		//RT用のスタイル追加
		addStyleNode("\
#content ol.statuses li.search_result a.urt {\
background-image:url(http://s.twimg.com/a/1268437273/images/icon_reply.gif);\
}\
\
.actions .urt {\
margin-bottom:3px;\
}\
\
.actions .urt {\
background-image:url(http://s.twimg.com/a/1268437273/images/sprite-icons.png);\
background-position:-176px 0;\
cursor:pointer;\
display:block;\
height:16px;\
visibility:hidden;\
width:16px;\
}\
\
.hentry .actions-hover li .urt {\
display:block;\
float:left;\
line-height:16px;\
}\
\
.actions-hover .urt:hover a {\
text-decoration:underline;\
}\
\
body#show .hentry .actions-hover .urt {\
background-image:none;\
}\
ol.statuses li.hentry .urt {\
background-image:none;\
}\
\
.actions-hover .urt-icon {\
background-position:-176px 0;\
height:16px;\
margin-right:2px;\
width:16px;\
}\
.actions-hover .urt-icon {\
cursor:pointer;\
}\
.actions-hover .urt:hover .urt-icon {\
background-position:-192px 0;\
}\
");
		//RT設定
		urt_addUserRTLink();
    }

//スクリプトのサイトスペースへのエクスポート
function exportToSite() {
	var scriptContent = '';
	for (var i = 0; i < arguments.length; i++) {
		scriptContent += arguments[i].toString() + '\n';
	}
	addScriptNode(scriptContent);
}

//スクリプトノードの生成
function addScriptNode(content){
	var scriptNode = document.createElement('script');
	scriptNode.setAttribute('type','text/javascript');
	scriptNode.innerHTML = '//<![CDATA[\n' + content + '\n//]]>';
	$('head').append(scriptNode);
}

function addStyleNode(content){
	var scriptNode = document.createElement('style');
	scriptNode.setAttribute('type','text/css');
	scriptNode.innerHTML = content;
	$('head').append(scriptNode);
}

//RTリンクを追加する処理
function urt_addUserRTLink(){
	$('#timeline > li').each(function(){
		var statusId = $(this).attr('id');
		var rtId = statusId +'RT';
		if($('#'+rtId).size()==0){
			var actionsHtmlNode = $('.actions-hover',$(this));
			var actionsHtml = $(actionsHtmlNode).html();
			actionsHtml += '<li id="'+ rtId +'"><span class="urt"><span class="urt-icon icon"></span><a title="RT" href="javascript:urt_setRT('+ "'"+statusId+"'" +');">RT</a></span></li>';
			$(actionsHtmlNode).html(actionsHtml);
		}
	});
}

//RTをセットする処理
function urt_setRT(statusId){
	var hasStatus = $('#status').length;
	var rtText = urt_getUserRT(statusId);
	if (hasStatus>0) {
		$('#status').val(rtText);
		scroll(0, 0);
		$('#status').focus();
	}else{
		location.href='http://twitter.com/home?status='+encodeURIComponent(rtText);
	}
}

//ユーザRTの生成
function urt_getUserRT(statusId){
	var screenName = $('.tweet-url.screen-name',$('#'+statusId));
	if(screenName.length==0){
		screenName = $('div.screen-name');
	}
	screenName = screenName.html();
	var entryContent = urt_getEntryContent(statusId);
	//RT生成
	var rtText = 'RT @' + screenName + ': ' + entryContent;
	//140字抜きだし
	if(rtText.length>140){
		rtText=rtText.substr(0,140);	
	}
	return rtText;
}

//エントリーのテキストを取得
function urt_getEntryContent(statusId){
	var entryContent = '';
	$('.entry-content',$('#'+statusId)).contents().each(function(){
		//TextNode
		if(this.nodeType==3){
			entryContent += this.nodeValue;
		//ElementNode
		}else if(this.nodeType==1){
			entryContent += $(this).text();
		}
	});
	return entryContent;
}
