tweetcast/nodejs/client/js/script.js
changeset 314 0f1e6ce19b6d
child 325 7d9c576bfaac
--- /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