Author: frojo56
(2009/03/02 15:08) Almost 3 years ago
Removed highlights when looking at single tweet.
9
// @author Carl Furrow
10
// ==/UserScript==
11
12
//TODO: Eliminate the website from asking for login credentials twice. Unnecessary!
13
//TODO: Set focus on textareas when shown via a reply or retweet. (Bug is thrown from some Twitter code, I believe. Focus() causes errors)
14
//TODO: Create some kind of direct message mechanism on the main page, without refresh (hover-over user image, icon shows up?)
15
...
16
//TODO: Threaded conversations
17
//TODO: Toolbar
18
19
//ADDED: Endless tweets using JSON
20
//FIXED(2.27.09): HTTPS errors (via Karolis)
//ADDED: Modify retweet (embedded retweet)
21
//ADDED(2.27.09): TwitPic preview, at Karolis' request (http://userscripts.org/users/26455)
//ADDED: Modify reply (embedded reply)
22
//ADDED: Modify delete (to get it working, sometimes it doesn't work)
23
//ADDED: Modify favorite (to get it working again, sometimes it doesn't work)
24
//ADDED: slide and highlight animations
25
//ADDED: Character counter near textareas
26
//ADDED: Highlight replies to you (yellow?)
27
//ADDED: Highlight own tweets (green)
28
29
//FIXED(2.27.09): Suspend self-highlights when viewing your own page (compare "a.profile_link:href" and ".profile-head a:href")
30
//FIXED(2.24.09): Twitter changed their reply link class to "reply" and that broke my code. Changed to "reply2" for now
31
//FIXED(2.17.09): Make embedded retweet/reply work on non-home pages (single tweet pages, or on profile pages)
39
//FIXED(2.6.09): Clicking modified reply button still adds @reply to main status text area
32
40
//REMOVED: Removed modified "favorite" button, as twitter seems to have fixed it's functionality
33
41
//FIXED(2.6.09): Delete button no longer working--somehow, twitter overwrote previous code and javascript dialog always opens now (grrr!)
34
35
36
37
38
42
43
44
var j=jQuery.noConflict();
45
var last_read_tweet_id;
46
54
var loading=false;
56
55
var lastPage=false;
57
var useJQXHR=true;
58
var current_script_length = 26574;
59
var current_script_length = 28734;
var loaded_tweets = new Array();
60
61
var page_info = {
reUrlSplitUp: function(){
62
splitup=/https?:\/\/(?:www\.)?twitter.com\/([\w\d]+)(?:\/(statuses)\/(\d+))?(?:\?page=(\d+))?/.exec(location.href)
63
return splitup;
64
},
65
onNonProcessingPage:function(){
66
if(this.reUrlSplitUp==null)
67
return true;
68
return false;
69
70
onTwitterFriendFeed:function(){
71
if(this.reUrlSplitUp[1] != null && this.reUrlSplitUp[1] == "home")
72
73
74
75
onTwitterIndividualTweet:function(){
76
if(this.reUrlSplitUp[1] != null && this.reUrlSplitUp[1] != "home")
77
{
78
if(this.reUrlSplitUp[3] != null)
79
80
}
81
82
83
onTwitterUsersProfile:function(){
84
85
86
onOwnProfilePage:function(){},
87
pageNumber:1,
88
loading:false,
89
onLastPage:false
90
};
91
92
if (typeof GM_xmlhttpRequest == "function")
93
94
var xhr = GM_xmlhttpRequest;
125
95
126
determine_what_page_user_is_on();
96
127
j('head').append("<style type='text/css'>"+page_css()+"</style>");
97
98
//add_bottom_actionbar();
128
log("Loading page data");
99
129
//load_page(false,useJQXHR);
100
130
load_page(useJQXHR,false);
101
155
function load_page(useJqueryAjax,is_async)
156
157
loading=true;
reHttp = /https?/;
protocol = /https?/.exec(location.href)[0];
158
if(!onNonProcessingPage && onTwitterFriendFeed)
131
159
132
160
log("On friend feed");
133
161
log("Page Number: " + pageNumber);
134
135
friends_timeline_url = protocol+"://twitter.com/statuses/friends_timeline.json";
162
if(useJqueryAjax)
136
163
137
164
j.ajax({
138
165
url:"http://twitter.com/statuses/friends_timeline.json",
139
url:friends_timeline_url,
166
type: "GET",
140
167
data: {page:pageNumber},
141
168
dataType: "json",
142
190
else
191
192
xhr({
193
url:"http://twitter.com/statuses/friends_timeline.json?page="+pageNumber,
url:friends_timeline_url+"?page="+pageNumber,
194
method:"GET",
195
onload:function(req){
169
196
newTweets = eval(req.responseText);
170
215
log("On indidivual page("+statusid+")");
189
216
217
218
url:"http://twitter.com/statuses/show/"+statusid+".json",
url:protocol+"://twitter.com/statuses/show/"+statusid+".json",
219
type:"GET",
220
data:{id:statusid},
221
dataType:"json",
235
log("On user's profile");
209
236
log("Page number: "+pageNumber);
210
237
211
238
url:"http://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",
212
url:protocol+"://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",
239
213
240
214
241
272
246
273
new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");
247
274
add_retweet_button(new_jq_tweet,tweets[i]);
248
275
modify_reply_button(new_jq_tweet,tweets[i]);
249
276
if(tweets[i].user.screen_name == current_username)
250
277
251
278
new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");
252
283
new_jq_tweet.appendTo("#timeline");
257
284
258
285
new_jq_tweet.appendTo("#wrapper");
259
260
add_twitpic_preview(new_jq_tweet,tweets[i]);
286
261
287
262
288
263
294
modify_reply_button(jq_tweet,tweets[i]);
269
295
add_retweet_button(jq_tweet,tweets[i]);
270
296
modify_delete_button(jq_tweet,tweets[i]);
271
add_twitpic_preview(jq_tweet,tweets[i]);
297
find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet);
298
299
457
});
433
458
434
459
435
436
function add_twitpic_preview(tweet,json_tweet)
437
438
tweet.find("a[href^='http://twitpic.com']").each(function(){
439
href = j(this).attr('href');
440
html = "<div class='twitpic-preview'><a href='"+href+"'><img src='"+href+"-thumb'/></a></div>";
441
j(this).parent().append(html);
442
})
443
460
444
461
function modify_delete_button(tweet,json_tweet)
445
462
446
613
if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)
597
614
jqTweet.attr("class",jqTweet.attr("class")+" to_me");
598
615
599
600
function add_bottom_actionbar()
601
602
log('Adding bottom actionbar');
603
html="<div class='bottom-actionbar'></div>";
604
j("body").append(html);
605
log('Actionbar appended');
606
616
function add_update_notification()
607
617
608
618
//http://userscripts.org/scripts/source/41387.user.js
609
634
625
635
function page_css()
626
636
627
637
css = "div.embedded-retweet textarea, div.embedded-reply textarea{width:95%;font-family:arial;font-size:95%;height:125px;} li.hentry{min-height:60px;} span.counter{ float:right; font-weight:bold; position:relative; right:20px; color:#000;} a.retweet-link{text-indent:0px !important;}";
628
css = "div.embedded-retweet textarea, div.embedded-reply textarea{width:95%;font-family:arial;font-size:95%;height:125px;} li.hentry{min-height:60px;} span.counter{ float:right; font-weight:bold; position:relative; right:20px; color:#000;} a.retweet-link{text-indent:0px !important;} .twitpic-preview{}";
638
mine_css = "ol.statuses li.mine:hover{background-color:#99CC99;} .mine{background-color:#CCFFCC;}li.mine .meta, li.mine .meta a{color:#666;}";
629
639
to_me_css = "ol.statuses li.to_me:hover{background-color:#eecc44;} div.embedded-retweet a, div.embedded-reply a{margin:0 10px 0 0;} .to_me, .to_me .entry-content{background-color:#FFDD99;background: #FFDD99 none repeat scroll 0 0 !important;}li.to_me .meta, li.to_me .meta a{color:#666;}";
630
640
if(!onOwnProfilePage)
631
bottom_actionbar_css = ".bottom-actionbar{ position:fixed; background-color:#333; bottom:0; color:#fff; height:25px; padding:0 20px 0 20px; width:100%; z-index:5; }";
641
css += mine_css;
632
css += bottom_actionbar_css;
642
css += to_me_css;
633
if(onTwitterIndividualTweet)
643
return css;
return css+=mine_css + to_me_css;
644
645
function format_time(t)
646
647
log("Time: "+t);
648
//time: Tue Feb 17 15:20:13 +0000 2009
649
//format: E NNN dd HH:mm:ss
650
//var date = getDateFromFormat(t,"E NNN dd HH:mm:ss");
651
//return date.getMonth()+"/"+date.getDay()+"/"+date.getFullYear()+" - "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
652
return relativeTime(new Date(t));
653
654
function getCookieSession()
//ADDED: Endless tweets using JSON//FIXED(2.27.09): HTTPS errors (via Karolis)//ADDED: Modify retweet (embedded retweet)//ADDED(2.27.09): TwitPic preview, at Karolis' request (http://userscripts.org/users/26455)//ADDED: Modify reply (embedded reply)//ADDED: Modify delete (to get it working, sometimes it doesn't work)//ADDED: Modify favorite (to get it working again, sometimes it doesn't work)//ADDED: slide and highlight animations//ADDED: Character counter near textareas//ADDED: Highlight replies to you (yellow?)//ADDED: Highlight own tweets (green)var current_script_length = 26574;var current_script_length = 28734;var page_info = {reUrlSplitUp: function(){splitup=/https?:\/\/(?:www\.)?twitter.com\/([\w\d]+)(?:\/(statuses)\/(\d+))?(?:\?page=(\d+))?/.exec(location.href)return splitup;},onNonProcessingPage:function(){if(this.reUrlSplitUp==null)return true;return false;},onTwitterFriendFeed:function(){if(this.reUrlSplitUp[1] != null && this.reUrlSplitUp[1] == "home")return true;return false;},onTwitterIndividualTweet:function(){if(this.reUrlSplitUp[1] != null && this.reUrlSplitUp[1] != "home"){if(this.reUrlSplitUp[3] != null)return true;}return false;},onTwitterUsersProfile:function(){},onOwnProfilePage:function(){},pageNumber:1,loading:false,onLastPage:false};{{j('head').append("<style type='text/css'>"+page_css()+"</style>");j('head').append("<style type='text/css'>"+page_css()+"</style>");log("Loading page data");log("Loading page data");{{{{log("On friend feed");log("On friend feed");log("Page Number: " + pageNumber);log("Page Number: " + pageNumber);{{j.ajax({j.ajax({url:"http://twitter.com/statuses/friends_timeline.json",url:friends_timeline_url,data: {page:pageNumber},data: {page:pageNumber},{{xhr({xhr({url:"http://twitter.com/statuses/friends_timeline.json?page="+pageNumber,url:friends_timeline_url+"?page="+pageNumber,onload:function(req){onload:function(req){log("On indidivual page("+statusid+")");log("On indidivual page("+statusid+")");log("Page Number: " + pageNumber);log("Page Number: " + pageNumber);j.ajax({j.ajax({url:"http://twitter.com/statuses/show/"+statusid+".json",url:protocol+"://twitter.com/statuses/show/"+statusid+".json",data:{id:statusid},data:{id:statusid},log("On user's profile");log("On user's profile");log("Page number: "+pageNumber);log("Page number: "+pageNumber);j.ajax({j.ajax({url:"http://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",url:protocol+"://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",data: {page:pageNumber},data: {page:pageNumber},{{new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");modify_reply_button(new_jq_tweet,tweets[i]);{{new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");new_jq_tweet.appendTo("#timeline");new_jq_tweet.appendTo("#timeline");new_jq_tweet.appendTo("#wrapper");new_jq_tweet.appendTo("#wrapper");{{{tweet.find("a[href^='http://twitpic.com']").each(function(){href = j(this).attr('href');{{if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)jqTweet.attr("class",jqTweet.attr("class")+" to_me");jqTweet.attr("class",jqTweet.attr("class")+" to_me");{log('Adding bottom actionbar');j("body").append(html);log('Actionbar appended');{{{{css = "div.embedded-retweet textarea, div.embedded-reply textarea{width:95%;font-family:arial;font-size:95%;height:125px;} li.hentry{min-height:60px;} span.counter{ float:right; font-weight:bold; position:relative; right:20px; color:#000;} a.retweet-link{text-indent:0px !important;}";css = "div.embedded-retweet textarea, div.embedded-reply textarea{width:95%;font-family:arial;font-size:95%;height:125px;} li.hentry{min-height:60px;} span.counter{ float:right; font-weight:bold; position:relative; right:20px; color:#000;} a.retweet-link{text-indent:0px !important;} .twitpic-preview{}";mine_css = "ol.statuses li.mine:hover{background-color:#99CC99;} .mine{background-color:#CCFFCC;}li.mine .meta, li.mine .meta a{color:#666;}";mine_css = "ol.statuses li.mine:hover{background-color:#99CC99;} .mine{background-color:#CCFFCC;}li.mine .meta, li.mine .meta a{color:#666;}";to_me_css = "ol.statuses li.to_me:hover{background-color:#eecc44;} div.embedded-retweet a, div.embedded-reply a{margin:0 10px 0 0;} .to_me, .to_me .entry-content{background-color:#FFDD99;background: #FFDD99 none repeat scroll 0 0 !important;}li.to_me .meta, li.to_me .meta a{color:#666;}";to_me_css = "ol.statuses li.to_me:hover{background-color:#eecc44;} div.embedded-retweet a, div.embedded-reply a{margin:0 10px 0 0;} .to_me, .to_me .entry-content{background-color:#FFDD99;background: #FFDD99 none repeat scroll 0 0 !important;}li.to_me .meta, li.to_me .meta a{color:#666;}";if(!onOwnProfilePage)bottom_actionbar_css = ".bottom-actionbar{ position:fixed; background-color:#333; bottom:0; color:#fff; height:25px; padding:0 20px 0 20px; width:100%; z-index:5; }";css += mine_css;css += bottom_actionbar_css;css += to_me_css;if(onTwitterIndividualTweet)return css;{return css;}else{if(!onOwnProfilePage)return css+=mine_css + to_me_css;elsereturn css;}{{log("Time: "+t);log("Time: "+t);//time: Tue Feb 17 15:20:13 +0000 2009//format: E NNN dd HH:mm:ss//var date = getDateFromFormat(t,"E NNN dd HH:mm:ss");//return date.getMonth()+"/"+date.getDay()+"/"+date.getFullYear()+" - "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();