tweetcast/nodejs/client/js/script.js
author Raphael Velt <raph.velt@gmail.com>
Mon, 17 Oct 2011 17:40:58 +0200
changeset 325 7d9c576bfaac
parent 314 0f1e6ce19b6d
child 326 c28048fb63b4
permissions -rw-r--r--
Some changes - added multi-zoom level on client

var socket,
    tweetData = {
        "tweetcount" : 0,
        "position" : -1,
        "zoomLevel" : 3,
        "timeLevel" : 2
    }
    zoomLevels = [
        {
            "description" : "160 tweets per page",
            "className" : "icons",
            "displayCount" : 160
        },
        {
            "description" : "24 tweets per page",
            "className" : "quarter",
            "displayCount" : 24
        },
        {
            "description" : "12 tweets per page",
            "className" : "half",
            "displayCount" : 12
        },
        {
            "description" : "6 tweets per page",
            "className" : "full",
            "displayCount" : 6
        }
    ];

function tweetToHtml(tweet) {
	html = '<li class="tweet ' + zoomLevels[tweetData.zoomLevel].className;
	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">' + new Date(tweet.created_at).toLocaleTimeString() + '</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 getTweets() {
    var to = tweetData.position + 1,
        from = Math.max(0, to - zoomLevels[tweetData.zoomLevel].displayCount);
    socket.emit('getTweets',{ "from": from, "to": to });
}

function setZoom(level) {
    tweetData.zoomLevel = Math.max(0, Math.min( zoomLevels.length - 1 , level ) );
    getTweets();
}

$(document).ready(function() {
    socket = io.connect('http://' + S_IO_HOST + ':' + S_IO_PORT );
    socket.on('tweetSummary', function (data) {
        if (tweetData.position == tweetData.tweetcount - 1) {
            tweetData.position = data.tweetcount - 1;
            getTweets();
        }
        tweetData.tweetcount = data.tweetcount;
    });
    socket.on('tweets', function (data) {
        tweetData.tweetsOnDisplay = data;
        data.reverse();
        html = '';
        for (var i in data) {
            html += tweetToHtml(data[i]);
        }
        $("#tweetlist").html(html);
    });
});