Changeset 77
Author: frojo56
(2009/03/02 15:20) Almost 3 years ago
Encapsulated all code in twitter_fantastico anonymous function
Author: frojo56
(2009/03/02 15:20) Almost 3 years ago
Encapsulated all code in twitter_fantastico anonymous function
twitter_fantastico = function(){var current_username = (j.trim(j("p#me_name").html())).length != 0 ? j.trim(j("p#me_name").html()) : j("#navigation #profile_link").attr("href").replace(/https?:\/\/(?:www\.)?twitter\.com\/([\w\d]+)$/,"$1");var j=jQuery.noConflict();if (typeof GM_xmlhttpRequest == "function")var last_read_tweet_id;var tweets_on_page;var current_username = (j.trim(j("p#me_name").html())).length != 0 ? j.trim(j("p#me_name").html()) : j("#navigation #profile_link").attr("href").replace(/https?:\/\/(?:www\.)?twitter\.com\/([\w\d]+)$/,"$1");var debug=true;var onNonProcessingPage = false;var onTwitterFriendFeed = false;var onTwitterIndividualTweet = false;var onTwitterUsersProfile = false;var onOwnProfilePage = false;var pageNumber=1;var loading=false;var lastPage=false;var useJQXHR=true;var current_script_length = 28734;var loaded_tweets = new Array();if (typeof GM_xmlhttpRequest == "function"){var xhr = GM_xmlhttpRequest;}else{var xhr = function(params){{var req = new XMLHttpRequest();var xhr = GM_xmlhttpRequest;}else{var xhr = function(params){var req = new XMLHttpRequest();req.onreadystatechange = function() {req.onreadystatechange = function() {if (req.readyState == 4) {if (req.readyState == 4) {if (req.status >= 200 && req.status < 400)if (params.onload)params.onload(req);else if (params.onerror)params.onerror(req);}}if (params.headers)for (name in params.headers);req.setRequestHeader(name, params.headers[name]);req.open(params.method, params.url, true);req.send(params.data);}}j(document).ready(function(){j(document).ready(function(){//Don't try to get data when user is on twitter's homepage, and not logged in yet.log("Document ready. Determining what page the user is on.");log("Document ready. Determining what page the user is on.");log("Current Username: " + current_username);log("Current Username: " + current_username);determine_what_page_user_is_on();j('head').append("<style type='text/css'>"+page_css()+"</style>");j('head').append("<style type='text/css'>"+page_css()+"</style>");//add_bottom_actionbar();log("Loading page data");log("Loading page data");//load_page(false,useJQXHR);load_page(useJQXHR,false);modify_tweets(loaded_tweets[pageNumber-1],false)log("Attaching scroll event handler");log("Attaching scroll event handler");//apply scroll event handlerj(window).scroll(function(e){j(window).scroll(function(e){//window.pageYOffset//window.innerHeight//log("Y: "+window.pageYOffset+" WindowHeight: "+window.innerHeight);//log("Y: "+window.pageYOffset+" WindowHeight: "+window.innerHeight);lastTweetTop = j("#timeline .status:last").offset().top;lastTweetTop = j("#timeline .status:last").offset().top;currentScrollPosition = window.pageYOffset + window.innerHeight;//log("Loading: "+loading+" LastPage: "+lastPage+" currentScrollPosition >= lastTweetTop - 20:" + (currentScrollPosition >= lastTweetTop - 20));//log("Loading: "+loading+" LastPage: "+lastPage+" currentScrollPosition >= lastTweetTop - 20:" + (currentScrollPosition >= lastTweetTop - 20));if( !loading && !lastPage && currentScrollPosition >= lastTweetTop - window.innerHeight/3){{pageNumber++;log("Grabbing more tweets from page "+pageNumber);log("Grabbing more tweets from page "+pageNumber);load_page(useJQXHR,false);modify_tweets(loaded_tweets[pageNumber-1],true);}});j("table.get-started-steps").hide();//Add counters to each text boxadd_counter_to_textareas();add_update_notification();j("table.get-started-steps").hide();//Add counters to each text boxadd_counter_to_textareas();add_update_notification();});function load_page(useJqueryAjax,is_async){loading=true;reHttp = /https?/;protocol = /https?/.exec(location.href)[0];if(!onNonProcessingPage && onTwitterFriendFeed){{log("On friend feed");loading=true;log("Page Number: " + pageNumber);reHttp = /https?/;friends_timeline_url = protocol+"://twitter.com/statuses/friends_timeline.json";protocol = /https?/.exec(location.href)[0];if(useJqueryAjax)if(!onNonProcessingPage && onTwitterFriendFeed){{log("Loading json page data");log("On friend feed");log("Page Number: " + pageNumber);friends_timeline_url = protocol+"://twitter.com/statuses/friends_timeline.json";if(useJqueryAjax){log("Loading json page data via jquery");j.ajax({url:friends_timeline_url,type: "GET",data: {page:pageNumber},dataType: "json",async:is_async,beforeSend:function(xmlhr){//xmlhr.setRequestHeader("Cookie",getCookieSession());},success:function(data){if(data == null || data.length == 0){log("Data is null from "+friends_timeline_url+", or data.length was 0.");lastPage=true;pageNumber--;return;}loaded_tweets[pageNumber-1] = data;log('Successfully loaded ' + data.length + ' tweets.' )//modify_tweets(tweets_on_page,appendTweets);loading=false;},error:function(xmlhttp,errortype,errorobj){log('Error loading tweets on page load.')}});}else{log("Loading json page data via xhr");xhr({url:friends_timeline_url+"?page="+pageNumber,method:"GET",onload:function(req){newTweets = eval(req.responseText);if(newTweets == null || newTweets.length == 0 ){log("Data is null from "+friends_timeline_url+", or data.length was 0.");lastPage=true;pageNumber--;return;}log('Successfully loaded ' + newTweets.length + ' tweets.' );tweets_on_page = newTweets;loaded_tweets[pageNumber-1] = data;//modify_tweets(tweets_on_page,appendTweets);loading=false;}});}}else if(!onNonProcessingPage && onTwitterIndividualTweet){statusid = reUrlSplitUp[3];log("On indidivual page("+statusid+")");log("Page Number: " + pageNumber);j.ajax({j.ajax({url:friends_timeline_url,url:protocol+"://twitter.com/statuses/show/"+statusid+".json",type:"GET",data:{id:statusid},dataType:"json",async:false,success:function(data){//add to array, don't just apply single tweetloaded_tweets[pageNumber-1] = new Array();loaded_tweets[pageNumber-1].push(data);//loaded_tweets[pageNumber-1] = data;log("Loaded "+loaded_tweets[pageNumber-1].length+" tweet(s)");loading=false;}});}else if(onTwitterUsersProfile){log("On user's profile");log("Page number: "+pageNumber);j.ajax({url:protocol+"://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",data: {page:pageNumber},data: {page:pageNumber},beforeSend:function(xmlhr){//xmlhr.setRequestHeader("Cookie",getCookieSession());},success:function(data){success:function(data){{{else}function modify_tweets(tweets,appendTweets){log("Modifying " + tweets.length + " tweet(s)");if(tweets != null){{xhr({for(i=0;i<tweets.length;i++)url:friends_timeline_url+"?page="+pageNumber,{method:"GET",jq_tweet = j("#timeline #status_"+tweets[i].id);onload:function(req){if(jq_tweet.length == 0)newTweets = eval(req.responseText);jq_tweet = j("#permalink");if(newTweets == null || newTweets.length == 0 )if(appendTweets){new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");add_retweet_button(new_jq_tweet,tweets[i]);modify_reply_button(new_jq_tweet,tweets[i]);if(tweets[i].user.screen_name == current_username){{lastPage=true;new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");pageNumber--;modify_delete_button(new_jq_tweet,tweets[i]);return;log('Successfully loaded ' + newTweets.length + ' tweets.' );find_reply_to_me_in_tweet_and_set_to_me_class(new_jq_tweet);tweets_on_page = newTweets;if(j("#timeline").length>0)loaded_tweets[pageNumber-1] = data;new_jq_tweet.appendTo("#timeline");//modify_tweets(tweets_on_page,appendTweets);elseloading=false;new_jq_tweet.appendTo("#wrapper");add_twitpic_preview(new_jq_tweet,tweets[i]);});else}{}//oldEntryContent = j("#timeline #status_"+tweets[i].id+" .status-body .entry-content").html();else if(!onNonProcessingPage && onTwitterIndividualTweet)oldEntryContent = jq_tweet.find(".status-body .entry-content").html();{newEntryContent = link_up_status_text(oldEntryContent,false,false,true);statusid = reUrlSplitUp[3];//j("#timeline #status_"+tweets[i].id+" .status-body .entry-content").html(newEntryContent);log("On indidivual page("+statusid+")");jq_tweet.find(".status-body .entry-content").html(newEntryContent);log("Page Number: " + pageNumber);modify_reply_button(jq_tweet,tweets[i]);j.ajax({add_retweet_button(jq_tweet,tweets[i]);url:protocol+"://twitter.com/statuses/show/"+statusid+".json",modify_delete_button(jq_tweet,tweets[i]);type:"GET",add_twitpic_preview(jq_tweet,tweets[i]);data:{id:statusid},find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet);dataType:"json",async:false,success:function(data){//add to array, don't just apply single tweetloaded_tweets[pageNumber-1] = new Array();loaded_tweets[pageNumber-1].push(data);//loaded_tweets[pageNumber-1] = data;log("Loaded "+loaded_tweets[pageNumber-1].length+" tweet(s)");loading=false;}});}else if(onTwitterUsersProfile){log("On user's profile");log("Page number: "+pageNumber);j.ajax({url:protocol+"://twitter.com/statuses/user_timeline/"+reUrlSplitUp[1]+".json",type: "GET",data: {page:pageNumber},dataType: "json",async:is_async,success:function(data){if(data == null || data.length == 0){lastPage=true;pageNumber--;return;loaded_tweets[pageNumber-1] = data;log('Successfully loaded ' + data.length + ' tweets.' )//modify_tweets(tweets_on_page,appendTweets);loading=false;},error:function(xmlhttp,errortype,errorobj){log('Error loading tweets on page load.')});//log("Done modifying tweets.");}function modify_tweets(tweets,appendTweets)function add_retweet_button(tweet,json_tweet){log("Modifying " + tweets.length + " tweet(s)");if(tweets != null){{for(i=0;i<tweets.length;i++)if(json_tweet.user.screen_name != current_username){{jq_tweet = j("#timeline #status_"+tweets[i].id);tweet.find("a.retweet-link").remove();if(jq_tweet.length == 0)//log("Adding retweet button for "+ json_tweet.id);jq_tweet = j("#permalink");//log("Adding retweet button for " + json_tweet.id);if(appendTweets)if(tweet.find(".actions div").length==0){jq_retweet_link = j("<a class='retweet-link' href='#retweet'>RT</a>").appendTo(tweet.find(".actions"));new_jq_tweet = convert_json_tweet_to_html_tweet(tweets[i]);//.appendTo("#timeline");add_retweet_button(new_jq_tweet,tweets[i]);modify_reply_button(new_jq_tweet,tweets[i]);if(tweets[i].user.screen_name == current_username){new_jq_tweet.find("span.actions div").append("<a class='delete' title='delete this update' href='#delete'></a>");modify_delete_button(new_jq_tweet,tweets[i]);}find_reply_to_me_in_tweet_and_set_to_me_class(new_jq_tweet);if(j("#timeline").length>0)new_jq_tweet.appendTo("#timeline");elsenew_jq_tweet.appendTo("#wrapper");add_twitpic_preview(new_jq_tweet,tweets[i]);}{jq_retweet_link = j("<a class='retweet-link' href='#retweet'>RT</a>").appendTo(tweet.find(".actions div"));//oldEntryContent = j("#timeline #status_"+tweets[i].id+" .status-body .entry-content").html();oldEntryContent = jq_tweet.find(".status-body .entry-content").html();jq_retweet_link.data('json_tweet',json_tweet);newEntryContent = link_up_status_text(oldEntryContent,false,false,true);jq_retweet_link.click(function(){//j("#timeline #status_"+tweets[i].id+" .status-body .entry-content").html(newEntryContent);show_embedded_retweet(j(this).data('json_tweet'));jq_tweet.find(".status-body .entry-content").html(newEntryContent);return false;modify_reply_button(jq_tweet,tweets[i]);});add_retweet_button(jq_tweet,tweets[i]);//log("Done adding retweet");modify_delete_button(jq_tweet,tweets[i]);add_twitpic_preview(jq_tweet,tweets[i]);find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet);}//log("Done modifying tweets.");function show_embedded_retweet(json_tweet)}{if(j("li#status_"+json_tweet.id).length>0)jq_tweet = j("li#status_"+json_tweet.id);elsejq_tweet = j("#permalink");function add_retweet_button(tweet,json_tweet)if( jq_tweet.find(".status-body .embedded-retweet").length==0){{if(json_tweet.user.screen_name != current_username)jq_embedded_retweet = j("<div id='retweet_"+json_tweet.id+ "' class='embedded-retweet'><span class='counter'>140</span><br/><textarea class='retweet-text'></textarea><br/><a class='retweet-submit' href='#'>Retweet this</a><a class='retweet-cancel' href='#'>Cancel</a></div>");jq_embedded_retweet.appendTo(jq_tweet.find(".status-body")).effect('scale',{from:{height:0},percent:100,direction:'vertical',scale:'box'},300);jq_textarea = jq_embedded_retweet.find("textarea.retweet-text");//jq_textarea.focus(function(){// counter_span = j(this).parent().find("span.counter");// counter_span.html(140-parseInt(j(this).val().length));//});counter_span = jq_textarea.parent().find("span.counter");counter_span.html(140-parseInt(jq_textarea.val().length));jq_textarea.val("RT @" + json_tweet.user.screen_name + " " + json_tweet.text);jq_retweet_link = jq_embedded_retweet.find("a.retweet-submit");jq_retweet_link.data('json_tweet',json_tweet);jq_retweet_link.data('jq_textarea',jq_textarea);jq_cancel_retweet_link = jq_embedded_retweet.find("a.retweet-cancel");jq_cancel_retweet_link.data('json_tweet',json_tweet);jq_cancel_retweet_link.data('jq_textarea',jq_textarea);jq_retweet_link.click(function(){jtweet = j(this).data('json_tweet');jq_ta = j(this).data('jq_textarea');j.ajax({url:'http://twitter.com/statuses/update.json',type: 'POST',dataType: 'json',data:{status:jq_ta.val(),in_reply_to_status_id:jtweet.id},success:function(data){jq_ta.parent().remove();convert_json_tweet_to_html_tweet(data).prependTo("#timeline").show("highlight",{},1000);}});return false;});jq_cancel_retweet_link.click(function(){jtweet = j(this).data('json_tweet');jq_ta = j(this).data('jq_textarea');jq_ta.parent().effect('scale',{percent:0,direction:'vertical',scale:'box'},300,function(){j(this).remove();});//jq_ta.parent().remove();return false;});}}function modify_reply_button(tweet,json_tweet){{tweet.find("a.retweet-link").remove();//log("Modifying reply button for " + json_tweet.id);//log("Adding retweet button for "+ json_tweet.id);tweet.find(".actions .repl").remove();//log("Adding retweet button for " + json_tweet.id);tweet.find(".actions .reply").remove();if(tweet.find(".actions div").length==0)tweet.find(".actions .reply2").remove();jq_retweet_link = j("<a class='retweet-link' href='#retweet'>RT</a>").appendTo(tweet.find(".actions"));if(tweet.find(".actions div").length>0)jq_reply_link = j("<a class='reply2' href='#reply'></a>").appendTo(tweet.find(".actions div"));jq_retweet_link = j("<a class='retweet-link' href='#retweet'>RT</a>").appendTo(tweet.find(".actions div"));jq_reply_link = j("<a class='reply2' href='#reply'></a>").appendTo(tweet.find(".actions"));jq_reply_link.css({"height":"16px","background-image":"url(http://static.twitter.com/images/icon_reply.gif)"});jq_retweet_link.data('json_tweet',json_tweet);jq_reply_link.data('json_tweet',json_tweet);jq_retweet_link.click(function(){if(json_tweet.user.screen_name == current_username)show_embedded_retweet(j(this).data('json_tweet'));{log("Removing reply button, as this is the current user's tweet.");tweet.find(".reply").remove();tweet.find(".repl").remove();tweet.find(".reply2").remove();//log("Adding reply click-event for: "+jq_reply_link.parent().parent().parent().attr("id"));jq_reply_link.click(function(){show_embedded_reply(j(this).data('json_tweet'));//log("Done adding retweet");//log("Done modifying reply");function show_embedded_reply(json_tweet)}function show_embedded_retweet(json_tweet){if(j("li#status_"+json_tweet.id).length>0)jq_tweet = j("li#status_"+json_tweet.id);elsejq_tweet = j("#permalink");if( jq_tweet.find(".status-body .embedded-retweet").length==0){{jq_embedded_retweet = j("<div id='retweet_"+json_tweet.id+ "' class='embedded-retweet'><span class='counter'>140</span><br/><textarea class='retweet-text'></textarea><br/><a class='retweet-submit' href='#'>Retweet this</a><a class='retweet-cancel' href='#'>Cancel</a></div>");if(j("#status_"+json_tweet.id).length>0)jq_tweet = j("#status_"+json_tweet.id);elsejq_tweet = j("#permalink");if(jq_tweet.find(".status-body .embedded-reply").length==0){jq_embedded_reply = j("<div id='reply_"+json_tweet.id+"' class='embedded-reply'><span class='counter'>140</span><br/><textarea class='reply-text'>@"+json_tweet.user.screen_name+"</textarea><br/><a class='reply-submit' href='#'>Reply</a><a class='reply-cancel' href='#'>Cancel</a></div>");jq_embedded_reply.appendTo(jq_tweet.find(".status-body")).effect('scale',{from:{height:0},percent:100,scale:'box',direction:'vertical'},300);jq_textarea = jq_embedded_reply.find("textarea.reply-text");//jq_textarea.focus(function(){// counter_span = j(this).parent().find("span.counter");// counter_span.html(140-parseInt(j(this).val().length));//});//jq_textarea.focus();counter_span = jq_textarea.parent().find("span.counter");counter_span.html(140-parseInt(jq_textarea.val().length));jq_reply_link = jq_embedded_reply.find("a.reply-submit");jq_reply_link.data('json_tweet',json_tweet);jq_reply_link.data('jq_textarea',jq_textarea);jq_embedded_retweet.appendTo(jq_tweet.find(".status-body")).effect('scale',{from:{height:0},percent:100,direction:'vertical',scale:'box'},300);jq_reply_cancel_link = jq_embedded_reply.find("a.reply-cancel");jq_textarea = jq_embedded_retweet.find("textarea.retweet-text");jq_reply_cancel_link.data('json_tweet',json_tweet);//jq_textarea.focus(function(){jq_reply_cancel_link.data('jq_textarea',jq_textarea);// counter_span = j(this).parent().find("span.counter");// counter_span.html(140-parseInt(j(this).val().length));jq_reply_link.click(function(){//});jtweet = j(this).data('json_tweet');counter_span = jq_textarea.parent().find("span.counter");jq_ta = j(this).data('jq_textarea');counter_span.html(140-parseInt(jq_textarea.val().length));log("Replying to @"+jtweet.user.screen_name+"("+jtweet.id+") with: "+jtweet.text)j.ajax({jq_textarea.val("RT @" + json_tweet.user.screen_name + " " + json_tweet.text);url:'http://twitter.com/statuses/update.json',jq_retweet_link = jq_embedded_retweet.find("a.retweet-submit");type:'POST',jq_retweet_link.data('json_tweet',json_tweet);dataType:'json',jq_retweet_link.data('jq_textarea',jq_textarea);data:{status:jq_ta.val(),in_reply_to_status_id:jtweet.id},jq_cancel_retweet_link = jq_embedded_retweet.find("a.retweet-cancel");success:function(data){jq_cancel_retweet_link.data('json_tweet',json_tweet);jq_ta.parent().remove();jq_cancel_retweet_link.data('jq_textarea',jq_textarea);convert_json_tweet_to_html_tweet(data).prependTo("ol#timeline").show("highlight",{},1000);}jq_retweet_link.click(function(){});jtweet = j(this).data('json_tweet');return false;jq_ta = j(this).data('jq_textarea');j.ajax({url:'http://twitter.com/statuses/update.json',type: 'POST',dataType: 'json',data:{status:jq_ta.val(),in_reply_to_status_id:jtweet.id},success:function(data){jq_ta.parent().remove();convert_json_tweet_to_html_tweet(data).prependTo("#timeline").show("highlight",{},1000);}return false;});jq_reply_cancel_link.click(function(){jtweet = j(this).data('json_tweet');jq_cancel_retweet_link.click(function(){jq_ta = j(this).data('jq_textarea');jtweet = j(this).data('json_tweet');jq_ta.parent().effect('scale',{percent:0,direction:'vertical',scale:'box'},300,function(){j(this).remove();});jq_ta = j(this).data('jq_textarea');//jq_ta.parent().remove();jq_ta.parent().effect('scale',{percent:0,direction:'vertical',scale:'box'},300,function(){j(this).remove();});return false;});//jq_ta.parent().remove();}return false;});function add_twitpic_preview(tweet,json_tweet)}function modify_reply_button(tweet,json_tweet){//log("Modifying reply button for " + json_tweet.id);tweet.find(".actions .repl").remove();tweet.find(".actions .reply").remove();tweet.find(".actions .reply2").remove();if(tweet.find(".actions div").length>0)jq_reply_link = j("<a class='reply2' href='#reply'></a>").appendTo(tweet.find(".actions div"));elsejq_reply_link = j("<a class='reply2' href='#reply'></a>").appendTo(tweet.find(".actions"));jq_reply_link.css({"height":"16px","background-image":"url(http://static.twitter.com/images/icon_reply.gif)"});jq_reply_link.data('json_tweet',json_tweet);if(json_tweet.user.screen_name == current_username){{log("Removing reply button, as this is the current user's tweet.");tweet.find("a[href^='http://twitpic.com']").each(function(){tweet.find(".reply").remove();href = j(this).attr('href');tweet.find(".repl").remove();html = "<div class='twitpic-preview'><a href='"+href+"'><img src='"+href+"-thumb'/></a></div>";tweet.find(".reply2").remove();j(this).parent().append(html);return false;})//log("Adding reply click-event for: "+jq_reply_link.parent().parent().parent().attr("id"));jq_reply_link.click(function(){show_embedded_reply(j(this).data('json_tweet'));return false;});//log("Done modifying reply");}function show_embedded_reply(json_tweet){if(j("#status_"+json_tweet.id).length>0)jq_tweet = j("#status_"+json_tweet.id);elsejq_tweet = j("#permalink");if(jq_tweet.find(".status-body .embedded-reply").length==0){jq_embedded_reply = j("<div id='reply_"+json_tweet.id+"' class='embedded-reply'><span class='counter'>140</span><br/><textarea class='reply-text'>@"+json_tweet.user.screen_name+"</textarea><br/><a class='reply-submit' href='#'>Reply</a><a class='reply-cancel' href='#'>Cancel</a></div>");jq_embedded_reply.appendTo(jq_tweet.find(".status-body")).effect('scale',{from:{height:0},percent:100,scale:'box',direction:'vertical'},300);jq_textarea = jq_embedded_reply.find("textarea.reply-text");//jq_textarea.focus(function(){// counter_span = j(this).parent().find("span.counter");// counter_span.html(140-parseInt(j(this).val().length));//});//jq_textarea.focus();counter_span = jq_textarea.parent().find("span.counter");counter_span.html(140-parseInt(jq_textarea.val().length));jq_reply_link = jq_embedded_reply.find("a.reply-submit");jq_reply_link.data('json_tweet',json_tweet);jq_reply_link.data('jq_textarea',jq_textarea);jq_reply_cancel_link = jq_embedded_reply.find("a.reply-cancel");jq_reply_cancel_link.data('json_tweet',json_tweet);jq_reply_cancel_link.data('jq_textarea',jq_textarea);jq_reply_link.click(function(){jtweet = j(this).data('json_tweet');jq_ta = j(this).data('jq_textarea');log("Replying to @"+jtweet.user.screen_name+"("+jtweet.id+") with: "+jtweet.text)j.ajax({url:'http://twitter.com/statuses/update.json',type:'POST',dataType:'json',data:{status:jq_ta.val(),in_reply_to_status_id:jtweet.id},success:function(data){jq_ta.parent().remove();convert_json_tweet_to_html_tweet(data).prependTo("ol#timeline").show("highlight",{},1000);}});return false;});jq_reply_cancel_link.click(function(){jtweet = j(this).data('json_tweet');jq_ta = j(this).data('jq_textarea');jq_ta.parent().effect('scale',{percent:0,direction:'vertical',scale:'box'},300,function(){j(this).remove();});//jq_ta.parent().remove();return false;});}}function add_twitpic_preview(tweet,json_tweet){tweet.find("a[href^='http://twitpic.com']").each(function(){href = j(this).attr('href');html = "<div class='twitpic-preview'><a href='"+href+"'><img src='"+href+"-thumb'/></a></div>";j(this).parent().append(html);})}function modify_delete_button(tweet,json_tweet){if(current_username == json_tweet.user.screen_name){{//log("current_username==json_tweet.user.screen_name: "+current_username+" == "+json_tweet.user.screen_name);if(current_username == json_tweet.user.screen_name)//http://twitter.com/statuses/destroy/id.json{//What's going on here://log("current_username==json_tweet.user.screen_name: "+current_username+" == "+json_tweet.user.screen_name);//I'm finding and removing Twitter's existing delete button, so as to create a new delete button that does not//http://twitter.com/statuses/destroy/id.json//use a javascript prompt. Multiple attemps to just "unbind" Twitter's delete button failed. So I had to resort//What's going on here://to hack-ish methods (see below). It works for now.//I'm finding and removing Twitter's existing delete button, so as to create a new delete button that does nottweet.find("a.del").remove();//use a javascript prompt. Multiple attemps to just "unbind" Twitter's delete button failed. So I had to resorttweet.find("a.delete").remove();//to hack-ish methods (see below). It works for now.newDeleteExists = tweet.find("a.delete").length>0;tweet.find("a.del").remove();jq_delete_css = {"height":"16px", "background-image":"url(http://static.twitter.com/images/icon_trash.gif)"};tweet.find("a.delete").remove();jq_delete = j("<a href='#delete' class='delete'></a>").appendTo(tweet.find(".actions div"));newDeleteExists = tweet.find("a.delete").length>0;jq_delete.css(jq_delete_css);jq_delete_css = {"height":"16px", "background-image":"url(http://static.twitter.com/images/icon_trash.gif)"};jq_delete.attr('href','#delete');jq_delete = j("<a href='#delete' class='delete'></a>").appendTo(tweet.find(".actions div"));jq_delete.data('json_tweet',json_tweet);jq_delete.css(jq_delete_css);jq_delete.click(function(){jq_delete.attr('href','#delete');j.ajax({jq_delete.data('json_tweet',json_tweet);url:"http://twitter.com/statuses/destroy/"+j(this).data('json_tweet').id+".json",jq_delete.click(function(){type: "DELETE",j.ajax({dataType: "json",url:"http://twitter.com/statuses/destroy/"+j(this).data('json_tweet').id+".json",data:{id:j(this).data('json_tweet').id},type: "DELETE",dataType: "json",data:{id:j(this).data('json_tweet').id},});tweet.effect('highlight',{color:'#f00'},800,function(){j(this).remove();})return false;tweet.effect('highlight',{color:'#f00'},800,function(){j(this).remove();})}return false;}});function convert_json_tweet_to_html_tweet(json_tweet)}}function convert_json_tweet_to_html_tweet(json_tweet){jq_tweet_li = j("a.repl").eq(0).parent().parent().parent().clone();if(jq_tweet_li.length == 0)jq_tweet_li = j("a.reply").eq(0).parent().parent().parent().clone();if(jq_tweet_li.length == 0)jq_tweet_li = j("a.reply2").eq(0).parent().parent().parent().clone();jq_tweet_li.children(".actions a.reply").attr("class","repl");jq_tweet_li.children(".actions a.reply2").attr("class","repl");jq_tweet_li.children(".actions .retweet-link").remove();jq_tweet_li.find("a:contains('in reply to')").remove();//log("Using "+jq_tweet_li.attr("id")+" as a template for copy.");jq_tweet_li.attr("id","status_"+json_tweet.id);jq_tweet_li.attr("class","hentry status u-"+json_tweet.user.screen_name+(current_username==json_tweet.user.screen_name?" mine":""));jq_tweet_li.find("span.author a.url").attr("href","http://twitter.com/"+json_tweet.user.screen_name);jq_tweet_li.find("span.author a.url img.photo").attr("src",json_tweet.user.profile_image_url);jq_tweet_li.find("span.author a.url img.photo").attr("alt",json_tweet.user.name);jq_tweet_li.find("span.status-body strong:first a").html(json_tweet.user.screen_name);jq_tweet_li.find("span.status-body strong:first a").attr('title',json_tweet.user.name);jq_tweet_li.find("span.status-body strong:first a").attr("href","http://twitter.com/"+json_tweet.user.screen_name);jq_tweet_li.find("span.status-body span.entry-content").html(link_up_status_text(json_tweet.text,true,true,true));jq_tweet_li.find("span.status-body span.entry-meta a.entry-date").attr("href","http://twitter.com/"+json_tweet.user.screen_name+"/status/"+json_tweet.id);jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").attr("title",format_time(json_tweet.created_at) + " ago");jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").html( format_time(json_tweet.created_at) + " ago");//jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").timeago();jq_tweet_li.find("span.status-body span.entry-meta a.entry-date + span").html("from " + json_tweet.source + " ");jq_tweet_li.find("span.actions div a[id^=status_star]").unbind();jq_tweet_li.find("span.actions div a[id^=status_star]").attr("id","status_star_"+json_tweet.id);jq_tweet_li.find("span.actions div a[id^=status_star]").attr("class",(json_tweet.favorited?"fav":"non-fav"));jq_tweet_li.find("span.actions div a[id^=status_star]").attr("title",(json_tweet.favorited?"favorite this update":"un-favorite this tweet"));//log("Adding retweet button, via convert_json method.");jq_tweet_li.find("span.actions div a.retweet-link").unbind();jq_tweet_li.find("div.embedded-reply").remove();jq_tweet_li.find("div.embedded-retweet").remove();if(json_tweet.in_reply_to_status_id != null){{jq_tweet_li.find("span.entry-meta").append(" <a href='http://twitter.com/"+json_tweet.in_reply_to_screen_name+"/status/"+json_tweet.in_reply_to_status_id+"'>in reply to "+json_tweet.in_reply_to_screen_name+"</a>")jq_tweet_li = j("a.repl").eq(0).parent().parent().parent().clone();if(jq_tweet_li.length == 0)jq_tweet_li = j("a.reply").eq(0).parent().parent().parent().clone();if(jq_tweet_li.length == 0)jq_tweet_li = j("a.reply2").eq(0).parent().parent().parent().clone();jq_tweet_li.children(".actions a.reply").attr("class","repl");jq_tweet_li.children(".actions a.reply2").attr("class","repl");jq_tweet_li.children(".actions .retweet-link").remove();jq_tweet_li.find("a:contains('in reply to')").remove();//log("Using "+jq_tweet_li.attr("id")+" as a template for copy.");jq_tweet_li.attr("id","status_"+json_tweet.id);jq_tweet_li.attr("class","hentry status u-"+json_tweet.user.screen_name+(current_username==json_tweet.user.screen_name?" mine":""));jq_tweet_li.find("span.author a.url").attr("href","http://twitter.com/"+json_tweet.user.screen_name);jq_tweet_li.find("span.author a.url img.photo").attr("src",json_tweet.user.profile_image_url);jq_tweet_li.find("span.author a.url img.photo").attr("alt",json_tweet.user.name);jq_tweet_li.find("span.status-body strong:first a").html(json_tweet.user.screen_name);jq_tweet_li.find("span.status-body strong:first a").attr('title',json_tweet.user.name);jq_tweet_li.find("span.status-body strong:first a").attr("href","http://twitter.com/"+json_tweet.user.screen_name);jq_tweet_li.find("span.status-body span.entry-content").html(link_up_status_text(json_tweet.text,true,true,true));jq_tweet_li.find("span.status-body span.entry-meta a.entry-date").attr("href","http://twitter.com/"+json_tweet.user.screen_name+"/status/"+json_tweet.id);jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").attr("title",format_time(json_tweet.created_at) + " ago");jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").html( format_time(json_tweet.created_at) + " ago");//jq_tweet_li.find("span.status-body span.entry-meta a.entry-date span.published").timeago();jq_tweet_li.find("span.status-body span.entry-meta a.entry-date + span").html("from " + json_tweet.source + " ");jq_tweet_li.find("span.actions div a[id^=status_star]").unbind();jq_tweet_li.find("span.actions div a[id^=status_star]").attr("id","status_star_"+json_tweet.id);jq_tweet_li.find("span.actions div a[id^=status_star]").attr("class",(json_tweet.favorited?"fav":"non-fav"));jq_tweet_li.find("span.actions div a[id^=status_star]").attr("title",(json_tweet.favorited?"favorite this update":"un-favorite this tweet"));//log("Adding retweet button, via convert_json method.");jq_tweet_li.find("span.actions div a.retweet-link").unbind();jq_tweet_li.find("div.embedded-reply").remove();jq_tweet_li.find("div.embedded-retweet").remove();if(json_tweet.in_reply_to_status_id != null){jq_tweet_li.find("span.entry-meta").append(" <a href='http://twitter.com/"+json_tweet.in_reply_to_screen_name+"/status/"+json_tweet.in_reply_to_status_id+"'>in reply to "+json_tweet.in_reply_to_screen_name+"</a>")}//find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet_li);return jq_tweet_li;//find_reply_to_me_in_tweet_and_set_to_me_class(jq_tweet_li);function determine_what_page_user_is_on()return jq_tweet_li;}function determine_what_page_user_is_on(){reUrlSplitUp=/https?:\/\/(?:www\.)?twitter.com\/([\w\d]+)(?:\/(statuses)\/(\d+))?(?:\?page=(\d+))?/.exec(location.href);// 1: directory right after twitter.com (ie: home or carl_furrow, etc)// 2: the word "statuses" if in the url (what did I want to use this for?)// 3: the status id// 4: Page numberif(reUrlSplitUp == null)onNonProcessingPage=true;else{{if(reUrlSplitUp[1]=="blocks" || reUrlSplitUp[1] == "account" || reUrlSplitUp[1] == "followers" || reUrlSplitUp[1] == "friends")reUrlSplitUp=/https?:\/\/(?:www\.)?twitter.com\/([\w\d]+)(?:\/(statuses)\/(\d+))?(?:\?page=(\d+))?/.exec(location.href);{// 1: directory right after twitter.com (ie: home or carl_furrow, etc)// 2: the word "statuses" if in the url (what did I want to use this for?)// 3: the status id// 4: Page numberif(reUrlSplitUp == null)return;else}log("reUrlSplitUp[1]: "+reUrlSplitUp[1]+" reUrlSplitUp[2]: "+reUrlSplitUp[2]+" reUrlSplitUp[3]: "+reUrlSplitUp[3]+" reUrlSplitUp[4]: "+reUrlSplitUp[4]);if(reUrlSplitUp[1] != null && reUrlSplitUp[1] == "home")onTwitterFriendFeed=true;else if(reUrlSplitUp[1] != null && reUrlSplitUp[1] != "home"){{if(reUrlSplitUp[3] != null)if(reUrlSplitUp[1]=="blocks" || reUrlSplitUp[1] == "account" || reUrlSplitUp[1] == "followers" || reUrlSplitUp[1] == "friends")onTwitterIndividualTweet=true;else{{onTwitterUsersProfile=true;onNonProcessingPage=true;top_profile_link_name = /https?:\/\/twitter.com\/([\w\d]+)/.exec(j.trim(j("#navigation .top-nav #profile_link").attr("href")))[1];return;user_name = j.trim(j("#content .wrapper h2.thumb").text());log('(determine page)user_name:'+ user_name);log('(determine page)top_profile_link username: '+top_profile_link_name)if(top_profile_link_name == user_name)onOwnProfilePage=true;log("reUrlSplitUp[1]: "+reUrlSplitUp[1]+" reUrlSplitUp[2]: "+reUrlSplitUp[2]+" reUrlSplitUp[3]: "+reUrlSplitUp[3]+" reUrlSplitUp[4]: "+reUrlSplitUp[4]);{{top_profile_link_name = /https?:\/\/twitter.com\/([\w\d]+)/.exec(j.trim(j("#navigation .top-nav #profile_link").attr("href")))[1];user_name = j.trim(j("#content .wrapper h2.thumb").text());log('(determine page)user_name:'+ user_name);log('(determine page)top_profile_link username: '+top_profile_link_name)log("onNonProcessingPage: "+onNonProcessingPage+" onTwitterFriendFeed: "+onTwitterFriendFeed+" onTwitterIndividualTweets:"+onTwitterIndividualTweet+" onTwitterUsersProfile: "+onTwitterUsersProfile);{j("textarea.reply-text").live("keyup",function(e){counter_span = j(this).parent().find("span.counter");j("textarea.retweet-text").live("keyup",function(e){counter_span = j(this).parent().find("span.counter");{//log("Linking: "+text);{if(reUrlSplitUp[4] != null && reUrlSplitUp[4].length > 0)return newtext;pageNumber = reUrlSplitUp[4];}}//helluva function name--bad practice on my part :)log("onNonProcessingPage: "+onNonProcessingPage+" onTwitterFriendFeed: "+onTwitterFriendFeed+" onTwitterIndividualTweets:"+onTwitterIndividualTweet+" onTwitterUsersProfile: "+onTwitterUsersProfile);function find_reply_to_me_in_tweet_and_set_to_me_class(jqTweet)}function add_counter_to_textareas(){j("textarea.reply-text").live("keyup",function(e){counter_span = j(this).parent().find("span.counter");counter_span.html(140-parseInt(j(this).val().length));})j("textarea.retweet-text").live("keyup",function(e){counter_span = j(this).parent().find("span.counter");counter_span.html(140-parseInt(j(this).val().length));});}function link_up_status_text(statustext, linkUrls, linkReplies, linkHashes){//log("Linking: "+text);newtext = statustext;if(newtext != null){{if(linkUrls)text = jqTweet.find(".status-body .entry-content").html();newtext = newtext.replace(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/gi,"<a href='$&'>$&</a>"); //from http://regexlib.com/REDetails.aspx?regexp_id=96if(text != null)if(linkReplies)if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)newtext = newtext.replace(/@([^\s<]+)[\.,\?!]?/gi,"@<a href='http://twitter.com/$1'>$1</a>");jqTweet.attr("class",jqTweet.attr("class")+" to_me");if(linkHashes)newtext = newtext.replace(/#([^\s<]+)[\.,\?!]?/gi,"#<a href='http://hashtags.org/tag/$1'>$1</a>");return newtext;function add_bottom_actionbar()}{//helluva function name--bad practice on my part :)log('Adding bottom actionbar');function find_reply_to_me_in_tweet_and_set_to_me_class(jqTweet)html="<div class='bottom-actionbar'></div>";{j("body").append(html);text = jqTweet.find(".status-body .entry-content").html();log('Actionbar appended');if(text != null)}if(text.indexOf(current_username) != -1 && jqTweet.attr("class").indexOf("to_me") == -1)function add_update_notification()jqTweet.attr("class",jqTweet.attr("class")+" to_me");{}//http://userscripts.org/scripts/source/41387.user.jsfunction add_bottom_actionbar()xhr({{method:"HEAD",log('Adding bottom actionbar');url:"http://userscripts.org/scripts/source/41387.user.js",html="<div class='bottom-actionbar'></div>";headers: { 'Accept-Encoding': '' }, //Thanks Mislavj("body").append(html);onload:function(response){log('Actionbar appended');//log("Response from userscripts.org: "+response.responseHeaders);}scriptLength = response.responseHeaders.match(/Content-Length: (\d+)/)[1];function add_update_notification()log("Got script, length: "+scriptLength);{if(current_script_length != scriptLength)//http://userscripts.org/scripts/source/41387.user.js{xhr({//show update linkmethod:"HEAD",j("<div><a href='http://userscripts.org/scripts/show/41387'>*Update to Twitter Fantastico is available*</a></div>").prependTo("td#content .wrapper");url:"http://userscripts.org/scripts/source/41387.user.js",}headers: { 'Accept-Encoding': '' }, //Thanks Mislavonload:function(response){//log("Response from userscripts.org: "+response.responseHeaders);scriptLength = response.responseHeaders.match(/Content-Length: (\d+)/)[1];log("Got script, length: "+scriptLength);if(current_script_length != scriptLength){//show update linkj("<div><a href='http://userscripts.org/scripts/show/41387'>*Update to Twitter Fantastico is available*</a></div>").prependTo("td#content .wrapper");{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;}";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;}";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; }";{});else}{function page_css()if(!onOwnProfilePage){return css+=mine_css + to_me_css;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{}";elsemine_css = "ol.statuses li.mine:hover{background-color:#99CC99;} .mine{background-color:#CCFFCC;}li.mine .meta, li.mine .meta a{color:#666;}";return css;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;}";}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 += bottom_actionbar_css;function format_time(t)if(onTwitterIndividualTweet){{return css;log("Time: "+t);return relativeTime(new Date(t));elsefunction getCookieSession(){{if(!onOwnProfilePage)r = /_twitter_sess=([^\s;]+)/;return css+=mine_css + to_me_css;return r.exec(document.cookie.toString())[0];elsereturn css;}// stolen from twitter.com (hope you guys don't mind)function format_time(t)function relativeTime(date, relativeTo) {{if (!relativeTo) relativeTo = new Date();log("Time: "+t);var delta = (relativeTo.getTime() - date.getTime()) / 1000return relativeTime(new Date(t));if (delta < 5) return 'less than 5 seconds'}else if (delta < 10) return 'less than 10 seconds'function getCookieSession()else if (delta < 20) return 'less than 20 seconds'{else if (delta < 60) return 'less than a minute'r = /_twitter_sess=([^\s;]+)/;else if (delta < 120) return 'about a minute'return r.exec(document.cookie.toString())[0];else if (delta < (60*60)) return Math.round(delta / 60) + ' minutes'}else if (delta < (120*60)) return 'about an hour'// stolen from twitter.com (hope you guys don't mind)else if (delta < (24*60*60)) return 'about ' + Math.round(delta / 3600) + ' hours'function relativeTime(date, relativeTo) {else if (delta < (48*60*60)) return '1 day'if (!relativeTo) relativeTo = new Date();else return Math.round(delta / 86400) + ' days'var delta = (relativeTo.getTime() - date.getTime()) / 1000}if (delta < 5) return 'less than 5 seconds'function log(msg)else if (delta < 10) return 'less than 10 seconds'{else if (delta < 20) return 'less than 20 seconds'if(debug)else if (delta < 60) return 'less than a minute'GM_log(msg);else if (delta < 120) return 'about a minute'}else if (delta < (60*60)) return Math.round(delta / 60) + ' minutes'}();else if (delta < (120*60)) return 'about an hour'else if (delta < (24*60*60)) return 'about ' + Math.round(delta / 3600) + ' hours'else if (delta < (48*60*60)) return '1 day'else return Math.round(delta / 86400) + ' days'}function log(msg){if(debug)GM_log(msg);}