Changeset 75

User picture

Author: frojo56

(2009/03/02 15:08) Almost 3 years ago

Removed highlights when looking at single tweet.

Affected files

Updated twitter_fantastico.user.js Download diff

7475
9
// @author    		Carl Furrow
9
// @author    		Carl Furrow
10
// ==/UserScript==
10
// ==/UserScript==
11
11
12
12
//TODO: Eliminate the website from asking for login credentials twice. Unnecessary!
13
//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: 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
//TODO: Create some kind of direct message mechanism on the main page, without refresh (hover-over user image, icon shows up?)
...
...
16
//TODO: Threaded conversations
17
//TODO: Threaded conversations
17
//TODO: Toolbar
18
//TODO: Toolbar
18
19
19
//ADDED: Endless tweets using JSON
20
//FIXED(2.27.09): HTTPS errors (via Karolis)
20
//ADDED: Modify retweet (embedded retweet)
21
//ADDED(2.27.09): TwitPic preview, at Karolis' request (http://userscripts.org/users/26455)
21
//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")
22
//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
23
//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)
24
//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
//FIXED(2.6.09): Clicking modified reply button still adds @reply to main status text area
40
//REMOVED: Removed modified "favorite" button, as twitter seems to have fixed it's functionality
33
//REMOVED: Removed modified "favorite" button, as twitter seems to have fixed it's functionality
41
//FIXED(2.6.09): Delete button no longer working--somehow, twitter overwrote previous code and javascript dialog always opens now (grrr!)
34
//FIXED(2.6.09): Delete button no longer working--somehow, twitter overwrote previous code and javascript dialog always opens now (grrr!)
35
//ADDED: Endless tweets using JSON
36
//ADDED: Modify retweet (embedded retweet)
37
//ADDED: Modify reply (embedded reply)
38
//ADDED: Modify delete (to get it working, sometimes it doesn't work)
39
//ADDED: Modify favorite (to get it working again, sometimes it doesn't work)
40
//ADDED: slide and highlight animations
41
//ADDED: Character counter near textareas
42
//ADDED: Highlight replies to you (yellow?)
43
//ADDED: Highlight own tweets (green)
42
44
43
var j=jQuery.noConflict();
45
var j=jQuery.noConflict();
44
var last_read_tweet_id;
46
var last_read_tweet_id;
...
...
54
var loading=false;
56
var loading=false;
55
var lastPage=false;
57
var lastPage=false;
56
var useJQXHR=true;
58
var useJQXHR=true;
57
var current_script_length = 26574;
59
var current_script_length = 28734;
58
var loaded_tweets = new Array();
60
var loaded_tweets = new Array();
59
61
60
var page_info = {
61
	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
			return true;
73
		return false;
74
	},
75
	onTwitterIndividualTweet:function(){
76
		if(this.reUrlSplitUp[1] != null && this.reUrlSplitUp[1] != "home")
77
		{
78
			if(this.reUrlSplitUp[3] !=  null)
79
				return true;
80
		}
81
		return false;
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") 
62
if (typeof GM_xmlhttpRequest == "function") 
93
{
63
{
94
  var xhr = GM_xmlhttpRequest;
64
  var xhr = GM_xmlhttpRequest;
...
...
125
95
126
	determine_what_page_user_is_on();
96
	determine_what_page_user_is_on();
127
	j('head').append("<style type='text/css'>"+page_css()+"</style>");
97
	j('head').append("<style type='text/css'>"+page_css()+"</style>");
98
	//add_bottom_actionbar();
128
	log("Loading page data");
99
	log("Loading page data");
129
	//load_page(false,useJQXHR);
100
	//load_page(false,useJQXHR);
130
	load_page(useJQXHR,false);
101
	load_page(useJQXHR,false);
...
...
155
function load_page(useJqueryAjax,is_async)
126
function load_page(useJqueryAjax,is_async)
156
{
127
{
157
	loading=true;
128
	loading=true;
129
	reHttp = /https?/;
130
	protocol = /https?/.exec(location.href)[0];
158
	if(!onNonProcessingPage &&  onTwitterFriendFeed)
131
	if(!onNonProcessingPage &&  onTwitterFriendFeed)
159
	{
132
	{
160
		log("On friend feed");
133
		log("On friend feed");
161
		log("Page Number: " + pageNumber);
134
		log("Page Number: " + pageNumber);
135
		friends_timeline_url = protocol+"://twitter.com/statuses/friends_timeline.json";
162
		if(useJqueryAjax)
136
		if(useJqueryAjax)
163
		{
137
		{
164
			j.ajax({
138
			j.ajax({
165
				url:"http://twitter.com/statuses/friends_timeline.json",
139
				url:friends_timeline_url,
166
				type: "GET",
140
				type: "GET",
167
				data: {page:pageNumber},
141
				data: {page:pageNumber},
168
				dataType: "json",
142
				dataType: "json",
...
...
190
		else
164
		else
191
		{
165
		{
192
			xhr({
166
			xhr({
193
				url:"http://twitter.com/statuses/friends_timeline.json?page="+pageNumber,
167
				url:friends_timeline_url+"?page="+pageNumber,
194
				method:"GET",
168
				method:"GET",
195
				onload:function(req){
169
				onload:function(req){
196
					newTweets = eval(req.responseText);
170
					newTweets = eval(req.responseText);
...
...
215
		log("On indidivual page("+statusid+")");
189
		log("On indidivual page("+statusid+")");
216
		log("Page Number: " + pageNumber);
190
		log("Page Number: " + pageNumber);
217
		j.ajax({
191
		j.ajax({
218
			url:"http://twitter.com/statuses/show/"+statusid+".json",
192
			url:protocol+"://twitter.com/statuses/show/"+statusid+".json",
219
			type:"GET",
193
			type:"GET",
220
			data:{id:statusid},
194
			data:{id:statusid},
221
			dataType:"json",
195
			dataType:"json",
...
...
235
		log("On user's profile");
209
		log("On user's profile");
236
		log("Page number: "+pageNumber);
210
		log("Page number: "+pageNumber);
237
		j.ajax({
211
		j.ajax({
238
			url:"http://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",
212
			url:protocol+"://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",
239
			type: "GET",
213
			type: "GET",
240
			data: {page:pageNumber},
214
			data: {page:pageNumber},
241
			dataType: "json",
215
			dataType: "json",
...
...
272
			{
246
			{
273
				new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");
247
				new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");
274
				add_retweet_button(new_jq_tweet,tweets[i]);
248
				add_retweet_button(new_jq_tweet,tweets[i]);
275
				modify_reply_button(new_jq_tweet,tweets[i]);
249
				modify_reply_button(new_jq_tweet,tweets[i]);				
276
				if(tweets[i].user.screen_name == current_username)
250
				if(tweets[i].user.screen_name == current_username)
277
				{
251
				{
278
					new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");
252
					new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");
...
...
283
					new_jq_tweet.appendTo("#timeline");
257
					new_jq_tweet.appendTo("#timeline");
284
				else
258
				else
285
					new_jq_tweet.appendTo("#wrapper");
259
					new_jq_tweet.appendTo("#wrapper");
260
				add_twitpic_preview(new_jq_tweet,tweets[i]);
286
			}
261
			}
287
			else
262
			else
288
			{
263
			{
...
...
294
				modify_reply_button(jq_tweet,tweets[i]);
269
				modify_reply_button(jq_tweet,tweets[i]);
295
				add_retweet_button(jq_tweet,tweets[i]);
270
				add_retweet_button(jq_tweet,tweets[i]);
296
				modify_delete_button(jq_tweet,tweets[i]);
271
				modify_delete_button(jq_tweet,tweets[i]);
272
				add_twitpic_preview(jq_tweet,tweets[i]);
297
				find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet);
273
				find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet);
298
			}
274
			}
299
			
275
			
...
...
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
function modify_delete_button(tweet,json_tweet)
462
{
446
{
...
...
613
		if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)
597
		if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)
614
			jqTweet.attr("class",jqTweet.attr("class")+" to_me");
598
			jqTweet.attr("class",jqTweet.attr("class")+" to_me");
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
function add_update_notification()
617
{
608
{
618
	//http://userscripts.org/scripts/source/41387.user.js
609
	//http://userscripts.org/scripts/source/41387.user.js
...
...
634
}
625
}
635
function page_css()
626
function page_css()
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
	mine_css = "ol.statuses li.mine:hover{background-color:#99CC99;} .mine{background-color:#CCFFCC;}li.mine .meta, li.mine .meta a{color:#666;}";
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
	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;}";
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;
634
	{
635
		return css;
636
	}
637
	else
638
	{
639
		if(!onOwnProfilePage)
640
			return css+=mine_css + to_me_css;
641
		else
642
			return css;
643
	}
644
}
644
}
645
function format_time(t)
645
function format_time(t)
646
{
646
{
647
	log("Time: "+t);
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));
648
	return relativeTime(new Date(t));
653
}
649
}
654
function getCookieSession()
650
function getCookieSession()