tweetcast/nodejs/client/js/script.js
changeset 339 6a073c4a8578
parent 336 d60efd677b50
child 340 a99a04556e3b
--- a/tweetcast/nodejs/client/js/script.js	Wed Oct 26 18:29:46 2011 +0200
+++ b/tweetcast/nodejs/client/js/script.js	Thu Oct 27 17:57:53 2011 +0200
@@ -4,12 +4,18 @@
     tweetData = {
         "tweetcount" : 0,
         "position" : 0,
+        "feedMode" : true,
         "followLast" : true,
         "zoomLevel" : 3,
         "timeLevel" : 2,
         "tweets" : [],
         "posIndex" : [],
-        "tlChanged" : true
+        "tlChanged" : true,
+        "tlLevelChanged" : true,
+        "blockUpdate" : false,
+        "waitUpdate" : true,
+        "htmlBuffer" : '',
+        "wheelDelta" : 0
     },
     displaySplitting = [
         {
@@ -20,17 +26,28 @@
             positions : [ 1, 3, 5, 7, 13, 33, 53 ],
             classNames : [ 'full', 'half', 'half fade', 'quarter', 'quarter fade', 'icons', 'icons fade' ]
         }
-    ],
-    blockUpdate = false,
-    waitUpdate = true,
-    wheeldelta = 0;
+    ];
 
 function placeHolder(className) {
     return '<li class="placeholder ' + className + '"></li>';
 }
 
+function clicTweet(tweetPos) {
+    if (tweetPos != tweetData.position) {
+        tweetData.position = tweetPos;
+        tweetData.followLast = (tweetData.position == tweetData.tweetcount);
+        return false;
+    } else {
+        console.log("getting linkedTweets");
+        socket.emit('linkedTweets',{"tweetpos":tweetPos});
+    }
+}
+
 function tweetToHtml(tweet, className) {
-	html = '<li class="tweet ' + className + '" id="tweet_' + tweet.pos + '"';
+    if (!tweet) {
+        return placeHolder(className);
+    }
+	html = '<li class="tweet ' + className + '" id="tweet_' + tweet.pos + '" onclick="return clicTweet(' + tweet.pos + ')"';
 	if (tweetData.followLast && tweet.pos == tweetData.position) {
 	    html += ' style="display: none"';
 	}
@@ -112,9 +129,10 @@
         drawTweetList();
         //drawDisplay();
     }
-    if (tweetData.tlChanged) {
+    if (tweetData.tlChanged || tweetData.tlLevelChanged) {
         socket.emit('updateTimeline', {
-            "level" : tweetData.timeLevel
+            "level" : tweetData.timeLevel,
+            "full" : tweetData.tlLevelChanged
         });
     } else {
         drawTimeLine();
@@ -127,20 +145,20 @@
 }
 
 function delayedUpdate() {
-    blockUpdate = false;
-    if (waitUpdate) {
+    tweetData.blockUpdate = false;
+    if (tweetData.waitUpdate) {
         updateDisplay();
     }
 }
 
 function updateDisplay() {
-    if (blockUpdate) {
-        waitUpdate = true;
+    if (tweetData.blockUpdate) {
+        tweetData.waitUpdate = true;
     } else {
-        waitUpdate = false;
+        tweetData.waitUpdate = false;
         getUpdate();
-        blockUpdate = true;
-        setTimeout(delayedUpdate, 100);
+        tweetData.blockUpdate = true;
+        setTimeout(delayedUpdate, 300);
     }
 }
 
@@ -173,7 +191,10 @@
         }
         html += ( tweetData.posToDisplay[i] != -1 ? tweetToHtml(tweetByPos(tweetData.posToDisplay[i]), className) : placeHolder(className) );
     }
-    $("#tweetlist").html(html);
+    if (tweetData.htmlBuffer != html) {
+        $("#tweetlist").html(html);
+        tweetData.htmlBuffer = html;
+    }
     if (tweetData.followLast) {
         $("#tweet_" + tweetData.position).fadeIn(500);
     }
@@ -184,8 +205,8 @@
     twPaper.clear();
     if (!tweetData.timeline || !tweetData.timeline.length) return;
     
-    var dtfintl = new Date ( tweetData.timeline[ tweetData.timeline.length - 1 ].end ),
-        dtdebtl = new Date ( tweetData.timeline[0].start ),
+    var dtfintl = tweetData.timeline[ tweetData.timeline.length - 1 ].end,
+        dtdebtl = tweetData.timeline[0].start,
         dtfintw = new Date( tweetByPos( tweetData.end ).created_at ),
         dtdebtw = new Date( tweetByPos( tweetData.start ).created_at ),
         scY = 600 / ( dtfintl - dtdebtl );
@@ -264,13 +285,18 @@
     socket.on('tweetSummary', function (data) {
         if (tweetData.tweetcount != data.tweetcount) {
             tweetData.tweetcount = data.tweetcount;
-            tweetData.tlChanged = true;
+            tweetData.tlLevelChanged = true;
             if (tweetData.followLast) {
                 tweetData.position = data.tweetcount;
             }
             updateDisplay();
         }
     });
+    socket.on('tweetPosByDate', function (data) {
+        tweetData.position = data.tweetpos;
+        tweetData.followLast = (tweetData.position == tweetData.tweetcount);
+        updateDisplay();
+    });
     socket.on('tweets', function (data) {
         for (var i in data) {
             if (tweetData.posIndex.indexOf(data[i].pos) == -1) {
@@ -281,43 +307,51 @@
         drawTweetList();
     });
     socket.on('timeline', function (data) {
-        tweetData.timeline = data;
-        drawTimeLine();
-    });
-    socket.on('display', function (data) {
         tweetData.tlChanged = false;
-        for (var i in data.tweets) {
-            if (tweetData.posIndex.indexOf(data.tweets[i].pos) == -1) {
-                tweetData.tweets.push(data.tweets[i]);
-                tweetData.posIndex.push(data.tweets[i].pos);
+        if (data.full) {
+            tweetData.timeline = data.data;
+        } else {
+            if (tweetData.timeline[tweetData.timeline.length - 1].start == data.data[0].start) {
+                tweetData.timeline[tweetData.timeline.length - 1] = data.data[0];
+            } else {
+                tweetData.timeline.push(data.data[0]);
             }
         }
-        if (data.timeline) {
-            tweetData.timeline = data.timeline
+        while (tweetData.length > 50) {
+            tweetData.splice(0,1);
         }
-        tweetData.arcs = data.arcs;
-        drawDisplay();
+        drawTimeLine();
+    });
+    socket.on('linkedTweets', function(data) {
+        console.log(data);
     });
     $("#tweetlist").mousewheel(function(e, d) {
-        wheeldelta += d;
-        if (Math.abs(wheeldelta) >= 1) {
-            tweetData.position = Math.min( tweetData.tweetcount, Math.max(1, parseInt(wheeldelta) + tweetData.position ) );
+        tweetData.wheelDelta += d;
+        if (Math.abs(tweetData.wheelDelta) >= 1) {
+            tweetData.position = Math.min( tweetData.tweetcount, Math.max(1, parseInt(tweetData.wheelDelta) + tweetData.position ) );
             tweetData.followLast = (tweetData.position == tweetData.tweetcount);
             updateDisplay();
-            wheeldelta = 0;
+            tweetData.wheelDelta = 0;
         }
         return false;
     });
     $("#timewindow").mousewheel(function(e, d) {
-        wheeldelta += d;
-        if (Math.abs(wheeldelta) >= 1) {
-            if (wheeldelta > 0) {
+        tweetData.wheelDelta += d;
+        if (Math.abs(tweetData.wheelDelta) >= 1) {
+            if (tweetData.wheelDelta > 0) {
                 setTimeZoom(tweetData.timeLevel + 1);
             } else {
                 setTimeZoom(tweetData.timeLevel - 1);
             }
-            wheeldelta = 0;
+            tweetData.wheelDelta = 0;
         }
         return false;
     });
+    $("#timewindow").click(function(evt) {
+        var offsetY = evt.pageY - $(this).offset().top,
+            dtfintl = tweetData.timeline[ tweetData.timeline.length - 1 ].end,
+            dtdebtl = tweetData.timeline[0].start,
+            clicTime = dtdebtl + (1 - ( offsetY / 600 ) ) * ( dtfintl - dtdebtl );
+        socket.emit('tweetPosByDate',{ date: clicTime });
+    });
 });
\ No newline at end of file