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

//割り込み処理
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() + ")();";


//ダブルクリックイベント追加
document
	.querySelector('body')
	.setAttribute('ondblclick','javascript:urt_addUserRTLink();');

//スクリプトノード追加
exportToSite(
	urt_getUserRT, 
	urt_getEntryContent, 
	urt_addUserRTLink, 
	urt_setRT,
	globalScript
);

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 headNode = document.querySelector('head');
	var scriptNode = document.createElement('script');
	scriptNode.setAttribute('type','text/javascript');
	//ちゃんとテキストノード作って追加しないとWindows版のChromeで動かない
	var textNode = document.createTextNode();
	textNode.nodeValue = '//<![CDATA[\n' + content + '\n//]]>';
	scriptNode.appendChild(textNode);
	headNode.appendChild(scriptNode);
}

function addStyleNode(content){
	var headNode = document.querySelector('head');
	var scriptNode = document.createElement('style');
	scriptNode.setAttribute('type','text/css');
	//ちゃんとテキストノード作って追加しないとWindows版のChromeで動かない
	var textNode = document.createTextNode();
	textNode.nodeValue = content;
	scriptNode.appendChild(textNode);
	//scriptNode.innerText = content;
	headNode.appendChild(scriptNode);
}

//RTリンクを追加する処理
function urt_addUserRTLink(){
	var timeline = document.querySelectorAll('#timeline > li');
	for(var i=0;i<timeline.length;i++){
		var item = timeline[i];
		var statusId = item.id;
		var rtId = statusId + 'RT';
		if(document.querySelector('#'+rtId)==null){
			var actionsHtmlNode = item.querySelector('.actions-hover');
			var actionsHtml = actionsHtmlNode.innerHTML;
			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.innerHTML = actionsHtml;
		}
	}
}

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

//ユーザRTの生成
function urt_getUserRT(statusId){
	var screenName = document
		.querySelector('#'+statusId)
		.querySelector('.tweet-url.screen-name');
	if(screenName==null){
		screenName = document.querySelector('div.screen-name');
	}
	screenName = screenName.innerHTML;
	
	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 = '';
	var contents = document
		.querySelector('#'+statusId)
		.querySelector('.entry-content').childNodes;
	for(var i=0;i<contents.length;i++){
		var node = contents[i];
		//TextNode
		if(node.nodeType==3){
			entryContent += node.nodeValue;
		//ElementNode
		}else if(node.nodeType==1){
			if(node.firstChild.nodeType==3){
				entryContent += node.firstChild.nodeValue;
			}
		}
	}
	return entryContent;
}


