--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tweetcast/nodejs/client/js/script.js Fri Oct 14 17:35:49 2011 +0200
@@ -0,0 +1,153 @@
+var socket,
+ tweets = [],
+ waitoldtweets = true,
+ tl,
+ tc;
+
+function tweetToHtml(tweet) {
+ html = '<li class="tweet';
+ for (var i in tweet.annotations) {
+ html += ' a_' + tweet.annotations[i]
+ }
+ html += '" id="tweet_' + tweet.id + '">';
+ a_user = '<a href="http://twitter.com/' + tweet.user.screen_name + '" target="_blank" title="' + tweet.user.name + '">';
+ if (tweet.user.profile_image_url) {
+ html += a_user + '<img class="tweet_profile_image" src="' + tweet.user.profile_image_url + '" /></a>';
+ }
+ html += '<h4>' + a_user + '@' + tweet.user.screen_name + '</a></h4><p class="tweet_created_at">' + tweet.created_at + '</p><p>';
+ lastend = 0;
+ txt = '';
+ entities = [];
+ for (var i in tweet.entities.hashtag) {
+ entities.push({
+ "start" : tweet.entities.hashtag[i].indices[0],
+ "end" : tweet.entities.hashtag[i].indices[1],
+ "html" : '<a href="http://twitter.com/search?q=%23' + tweet.entities.hashtag[i].text + '" target="_blank">#' + tweet.entities.hashtag[i].text + '</a>'
+ });
+ }
+ for (var i in tweet.entities.urls) {
+ entities.push({
+ "start" : tweet.entities.urls[i].indices[0],
+ "end" : tweet.entities.urls[i].indices[1],
+ "html" : '<a href="' + tweet.entities.urls[i].expanded_url + '" target="_blank">' + tweet.entities.urls[i].display_url + '</a>'
+ });
+ }
+ for (var i in tweet.entities.user_mentions) {
+ entities.push({
+ "start" : tweet.entities.user_mentions[i].indices[0],
+ "end" : tweet.entities.user_mentions[i].indices[1],
+ "html" : '<a href="http://twitter.com/' + tweet.entities.user_mentions[i].screen_name + '" target="_blank" title="' + tweet.entities.user_mentions[i].name + '">@' + tweet.entities.user_mentions[i].screen_name + '</a>'
+ });
+ }
+ entities.sort(function(a, b) { return a.start - b.start });
+ for (var i in entities) {
+ txt += tweet.text.substring(lastend, entities[i].start) + entities[i].html;
+ lastend = entities[i].end;
+ }
+ txt += tweet.text.substring(lastend);
+ html += txt + '</p></li>';
+ return html;
+}
+
+function discardTweets() {
+ if (tweets.length) {
+ while (tl.height() - (tc.scrollTop() + tc.height()) > 1000) {
+ tl.children().last().detach();
+ tweets.pop();
+ }
+ }
+}
+
+// function scheduleTweets() {
+// var tl = $("#tweetlist"), tc = $("#tweetcontainer");
+// if (tweets.length != tl.children().length) {
+// console.log("Tweet count error");
+// }
+// if (tweets.length) {
+// while (tl.height() - (tc.scrollTop() + tc.height()) > 1000) {
+// tl.children().last().detach();
+// tweets.pop();
+// }
+// if (tl.height() - (tc.scrollTop() + tc.height()) < 120) {
+// getTweets({
+// before_id : tweets[tweets.length - 1].id,
+// limit : 5
+// });
+// }
+// getTweets({
+// after_id : tweets[0].id
+// });
+// } else {
+// getTweets({
+// limit: 15
+// });
+// }
+// }
+//
+// function getTweets(params) {
+// $.getJSON("http://" + document.location.hostname + ":8888/?callback=?", params, function(data, a, b) {
+// if (data.tweets && data.tweets.length) {
+// var tl = $("#tweetlist"), tc = $("#tweetcontainer");
+// html = '';
+// for (var i in data.tweets) {
+// html += tweetToHtml(data.tweets[i]);
+// }
+// if (params.before_id) {
+// tl.append(html);
+// tweets = tweets.concat(data.tweets);
+// } else {
+// var pos = tc.scrollTop(), fixScroll = (pos > 80);
+// pos -= tl.height();
+// tl.prepend(html);
+// tweets = data.tweets.concat(tweets);
+// if (fixScroll) {
+// tc.scrollTop(tl.height() + pos);
+// }
+// }
+// }
+// });
+// }
+
+$(document).ready(function() {
+ tl = $("#tweetlist");
+ tc = $("#tweetcontainer");
+ socket = io.connect('http://' + S_IO_HOST + ':' + S_IO_PORT );
+ socket.on('tweets', function (data) {
+ tweets = data;
+ data.reverse();
+ html = '';
+ for (var i in data) {
+ html += tweetToHtml(data[i]);
+ }
+ $("#tweetlist").html(html);
+ discardTweets();
+ });
+ socket.on('oldtweets', function (data) {
+ tweets = tweets.concat(data);
+ html = '';
+ for (var i = data.length - 1; i >= 0; i--) {
+ html += tweetToHtml(data[i]);
+ }
+ $("#tweetlist").append(html);
+ discardTweets();
+ waitoldtweets = true;
+ });
+ socket.on('newtweet', function (data) {
+ tweets.splice(0,0,data);
+ html = tweetToHtml(data);
+ var scrollpos = tc.scrollTop(),
+ fixScroll = (scrollpos > 80);
+ scrollpos -= tl.height();
+ $("#tweetlist").prepend(html);
+ if (fixScroll) {
+ tc.scrollTop(tl.height() + scrollpos);
+ }
+ discardTweets();
+ });
+ $("#tweetcontainer").scroll(function() {
+ if ( waitoldtweets && tl.height() - (tc.scrollTop() + tc.height()) < 120 ) {
+ socket.emit('tweetsbefore', tweets[tweets.length-1].id );
+ waitoldtweets = false;
+ }
+ });
+});
\ No newline at end of file