Polemic Tweet client now uses rv's live system
authorRaphael Velt <raph.velt@gmail.com>
Tue, 13 Dec 2011 19:01:59 +0100
changeset 406 86b62b98fea7
parent 405 6626b728b142
child 407 5ab44abc46df
child 410 bf5cf5a9e737
Polemic Tweet client now uses rv's live system
web/client.php
web/common.php
web/res/css/twcx-img/arrow.png
web/res/css/twcx-img/arrowtop.png
web/res/css/twcx-img/bgd.jpg
web/res/css/twcx-img/bgdeplie.png
web/res/css/twcx-img/bgnoarrow.png
web/res/css/twcx-img/head_logo.gif
web/res/css/twcx-img/menu_underline.gif
web/res/css/twcx-img/placeholder.png
web/res/css/twcx-img/scale.png
web/res/css/twcx-img/searchcancel.png
web/res/css/tweetcast.css
web/res/js-tweetcast/connect-gevent.js
web/res/js-tweetcast/connect-nodejs.js
web/res/js-tweetcast/connect-standalone.js
web/res/js-tweetcast/live-polemic.js
web/res/underscore/underscore-min.js
web/traduction.php
--- a/web/client.php	Mon Dec 12 14:26:20 2011 +0100
+++ b/web/client.php	Tue Dec 13 19:01:59 2011 +0100
@@ -31,12 +31,12 @@
 
 $big_visual_url = URL_ROOT."/$rep/images/big_visuel_rsln_mb.jpg";
 if($translate->_('config__client_visual') != 'config__client_visual' && $translate->_('config__client_visual') != null ) {
-	$big_visual_url = URL_ROOT."$rep/".$translate->_('config__client_visual');
+    $big_visual_url = URL_ROOT."$rep/".$translate->_('config__client_visual');
 }
 
 $head_logo = URL_ROOT."$rep/images/head_logo.gif";
 if($translate->_('config__head_logo') != 'config__head_logo' && $translate->_('config__head_logo') != null ) {
-	$head_logo = URL_ROOT."$rep/".$translate->_('config__head_logo');
+    $head_logo = URL_ROOT."$rep/".$translate->_('config__head_logo');
 }
 
 ?>
@@ -48,374 +48,283 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <title>Live Video and Annotation</title>
-	<meta http-equiv="X-UA-Compatible" content="IE=8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=8" />
 
-    <!-- Framework CSS -->
-    <link rel="stylesheet" href="<?php echo(registry_url('blueprint-screen','css'));?>" type="text/css" media="screen, projection"/>
-    <link rel="stylesheet" href="<?php echo(registry_url('blueprint-print','css'));?>" type="text/css" media="print"/>
-    <!--[if lt IE 8]><link rel="stylesheet" href="<?php echo(registry_url('blueprint-ie','css'));?>" type="text/css" media="screen, projection"><![endif]-->
-	<link rel="stylesheet" href="<?php echo(registry_url('blueprint-plugins-fancy-type','css'));?>" type="text/css" media="screen, projection"/>
-	<link rel="stylesheet" href="<?php echo(registry_url('custom','css'));?>" type="text/css" media="screen, projection"/>
-	<link rel="stylesheet" href="<?php echo(registry_url('fancybox','css'));?>" type="text/css" media="screen">
+    <!-- FONT -->
+    <link href='<?php echo(registry_url('PT-Sans_Narrow','font'))?>' rel='stylesheet' type='text/css'>
+    <link href='<?php echo(registry_url('PT-Sans','font'))?>' rel='stylesheet' type='text/css'>
+    
+    <!-- CSS -->
+    <link rel="stylesheet" href="<?php echo(registry_url('fancybox','css'));?>" type="text/css" media="screen">
+    <link rel="stylesheet" href="<?php echo(registry_url('tweetcast','css'));?>" type="text/css" media="screen, projection"/>
 
-	<!-- JAVASCRIPT -->
-	<script type="text/javascript" src="<?php echo(registry_url('jquery','js'))?>"></script>
-	<script type="text/javascript" src="<?php echo(registry_url('fancybox','js'))?>"></script>
-	<script type="text/javascript" src="<?php echo(registry_url('jquery-tools','js'))?>"></script>
-	<script type="text/javascript" src="<?php echo(registry_url('tw-widget','js'))?>"></script>
-	
-	<!-- FONT -->
-	<link href='<?php echo(registry_url('PT-Sans_Narrow','font'))?>' rel='stylesheet' type='text/css'>
-	<link href='<?php echo(registry_url('PT-Sans','font'))?>' rel='stylesheet' type='text/css'>
-	<link href='<?php echo(registry_url('Geo','font'))?>' rel='stylesheet' type='text/css'>
+    <!-- JAVASCRIPT -->
+    <script type="text/javascript" src="<?php echo(registry_url('jquery','js'))?>"></script>
+    <script type="text/javascript" src="<?php echo(registry_url('jquery-mousewheel','js'))?>"></script>
+    <script type="text/javascript" src="<?php echo(registry_url('underscore','js'))?>"></script>
+    <script type="text/javascript" src="<?php echo(registry_url('raphael','js'))?>"></script>
+    <script type="text/javascript" src="<?php echo(registry_url('fancybox','js'))?>"></script>
+    
+    <script type="text/javascript" src="<?php echo(registry_url('twcx-standalone','js'))?>"></script>
+    <script type="text/javascript" src="<?php echo(registry_url('twcx-main','js'))?>"></script>
+    <script type="text/javascript" src="config.js"></script>
 
-	<script type="text/javascript">
-	$(document).ready(function() {
+    <script type="text/javascript">
+    l10n = { "rechercher" : "<?php echo $translate->_('Rechercher'); ?>" }
+    $(document).ready(function() {
+        
+        $("#accordeon li.acctitre").click(function() {
+            $("#accordeon li.acctexte").slideUp();
+            $(this).next().dequeue().slideDown();
+        })
 
-			doTimer();
-			//$("txt").hide();
-			$(".loginbutton").click(function() {
-				document.location.href="<?php echo(URL_ROOT.$rep); ?>/client.php?CONNECT=true";
-			});
-			$("#IDENTIFIER").click(function() {
-				document.location.href="<?php echo(URL_ROOT.$rep); ?>/client.php?CONNECT=true";
-			});
-			
-			$("#messageSuccess").hide();
-			$("#messageFailed").hide();
+            //$("txt").hide();
+            $(".loginbutton").click(function() {
+                document.location.href="<?php echo(URL_ROOT.$rep); ?>/client.php?CONNECT=true";
+            });
+            $("#IDENTIFIER").click(function() {
+                document.location.href="<?php echo(URL_ROOT.$rep); ?>/client.php?CONNECT=true";
+            });
 
 
-			function add_grammar(value) {
-				$('#status').val($('#status').val()+value+" ");
-				$('#status').change();
-			}
-			
-			// BUTTONS
-			$("#positive").click(function(){
-				add_grammar("++");
-			});
-			$("#negative").click(function(){
-				add_grammar("--");
-			});
-			$("#reference").click(function(){
-				add_grammar("==");
-			});
-			$("#question").click(function(){
-				add_grammar("??");
-			});
-			
-			// SEND TWEETS
-			$("#sendTweet").click(function(){
-				var MyStatus = $('#status').val();
-				$.post('tweet_ajax.php', {status:MyStatus}
-				,function(data) {
-				
-					if(data=="true"){
-						$("#messageSuccess").show('fast');
-						$("#messageSuccess").delay(800).hide('slow');
-						$('#status').val("<?php echo($config['hashtag']); ?>");
-						$('#status').change();
-					}else{
-						$("#error").text(data);
-						$("#messageFailed").show('fast');
-						$("#messageFailed").delay(800).hide('slow');
-					}
-					
-				});
-				
-			});
+            function add_grammar(value) {
+                $('#status').val($('#status').val()+value+" ");
+                $('#status').change();
+            }
+            
+            // BUTTONS
+            $(".tweetButton").click(function() {
+                add_grammar($(this).text());
+            })
+            
+            // SEND TWEETS
+            $("#sendTweet").click(function(){
+                var MyStatus = $('#status').val();
+                $.post('tweet_ajax.php', {status:MyStatus}
+                ,function(data) {
+                
+                    if(data=="true"){
+                        $("#messageSuccess").show('fast');
+                        $("#messageSuccess").delay(800).hide('slow');
+                        $('#status').val("<?php echo($config['hashtag']); ?>");
+                        $('#status').change();
+                    }else{
+                        $("#error").text(data);
+                        $("#messageFailed").show('fast');
+                        $("#messageFailed").delay(800).hide('slow');
+                    }
+                    
+                });
+                
+            });
 
-			$("#status").bind("change keyup paste blur focus",function() {
-				newval = 140-$("#status").val().length;
-				$('#tweetCounter').val(newval);
-				if(newval < 0) {
-					$('#tweetCounter').addClass("tweetCounterNegative");
-				}
-				else {
-					$('#tweetCounter').removeClass("tweetCounterNegative");
-				}
-			});
-			
-			$(".timeFrame").tooltip();
-			/*
-			*   Lightbox button
-			*/
-			
-			$("#Program").fancybox({
-				'width'				: '75%',
-				'height'			: '75%',
-				'autoScale'			: false,
-				'transitionIn'		: 'none',
-				'transitionOut'		: 'none',
-				'type'				: 'iframe'
-			});
-			
-			$("#ACCES").click(function() {
-				$.fancybox.close();
-			});
-			
-			// Buttons
-			
+            $("#status").bind("change keyup paste blur focus",function() {
+                newval = 140-$("#status").val().length;
+                $('#tweetCounter').val(newval);
+                if(newval < 0) {
+                    $('#tweetCounter').addClass("tweetCounterNegative");
+                }
+                else {
+                    $('#tweetCounter').removeClass("tweetCounterNegative");
+                }
+            });
+            
+            
+            $("#Program").fancybox({
+                'width'             : '75%',
+                'height'            : '75%',
+                'autoScale'         : false,
+                'transitionIn'      : 'none',
+                'transitionOut'     : 'none',
+                'type'              : 'iframe'
+            });
+            
 
         });
 
-		//<!-- LIMIT TEXTAREA:
-		function imposemax(Object) {
-            return (Object.value.length <= 140);
-		};
+        //<!-- LIMIT TEXTAREA:
+        function imposemax(obj) {
+            obj.value = obj.value.substr(0,140);
+        };
         // End -->
-		
-		//<!-- TIMER
-	    var c=0;
-        var t;
-		var timer_is_on=0;
-
-		function timedCount()
-		{
-			document.getElementById('txt').value=c;
-			c = c+1;
-			t = window.setTimeout("timedCount()",1000);
-			$(".twtr-ft").hide();
-			$(".twtr-hd").hide();
-			//twtr-tweet
-			$(".twtr-tweet").each(colorTweetings);
-		
-		}
 
-		function colorTweetings (){
-				var tweettemp = $(this).html();
-				if (tweettemp.search(/\x3F\x3F/)!=-1){
-					 $(this).css({'background-color': '#bfdbec','color':"#000"});
-				}
-				if (tweettemp.search(/\x2B\x2B/)!=-1){
-					 $(this).css({'background-color': '#c5e7cd','color':"#fff"});
-				}
-				if (tweettemp.search(/\x2D\x2D/)!=-1){
-					 $(this).css({'background-color': '#f6ced0','color':"#fff"});
-				}
-				if (tweettemp.search(/\x3D\x3D/)!=-1){
-					 $(this).css({'background-color': '#ecedc1','color':"#000"});
-				}
-		};
-			
-
-		
-		function doTimer()
-		{
-		if (!timer_is_on)
-		  {
-		  timer_is_on=1;
-		  timedCount();
-		  }
-		}
-
-		function stopCount()
-		{
-			clearTimeout(t);
-			timer_is_on=0;
-		}
-		//
-		//-->
-	</script>
-	
-	<script type="text/javascript">
-	
-	  var _gaq = _gaq || [];
-	  _gaq.push(['_setAccount', 'UA-23581291-1']);
-	  _gaq.push(['_trackPageview']);
-	  _gaq.push(['_setAllowAnchor', true]);
-	
-	  (function() {
-	    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-	    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-	    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-	  })();
-	
-	</script>
-	
+    </script>
+    
+    <script type="text/javascript">
+    
+      var _gaq = _gaq || [];
+      _gaq.push(['_setAccount', 'UA-23581291-1']);
+      _gaq.push(['_trackPageview']);
+      _gaq.push(['_setAllowAnchor', true]);
+    
+      (function() {
+        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+      })();
+    
+    </script>
+    
   </head>
   <body>
-	<div id="sendUsFeedBack"><a href="<?php echo($C_feedback_form_url); ?>" target="_blank"><img src="<?php echo(URL_ROOT); ?>images/sendusfeedback.png"></a></div>
-    <div class="container">
-      <img src="<?php echo($head_logo); ?>" class="Producteur logo">
-      <div id="minilogo" style="height:5px;top:5px;"></div>
-	  <ul class="menu">
-	  <li class="menuUnderline"><a href="<?php echo(URL_ROOT); ?>" class="menuLink">
-	  	<?php print $translate->_("Accueil"); ?> </a></li>
-	  <li class="menuUnderline" ><a href="<?php echo($translate->_('config__link')); ?>" class="menuLink" target="_blank" id='Program'>
-	  	<?php print $translate->_("Programme"); ?></a></li>
-	  <li ><a href="../about.php" class="menuLink" >
-	  	<?php print $translate->_("A propos"); ?></a></li>
-
-	  </ul>
-	  
-	  	  <ul class="menu" >
-	  <li class="menuUnderline"><a href="<?php URL_ROOT ?>client.php?lang=ja_JP" class="menuLink" >
-	       <img src='<?php echo(URL_ROOT); ?>images/flag_jp.gif'<?php if($actual!="ja_JP"){echo("style='opacity: .5;'"); } ?> />
-	        <?php print $translate->_("Japonais"); ?></a></li>
-	  <li class="menuUnderline"><a href="<?php URL_ROOT ?>client.php?lang=fr" class="menuLink">
-	       <img src='<?php echo(URL_ROOT); ?>images/flag_fr.gif' <?php if($actual!="fr"){echo("style='opacity: .5;'"); } ?> />
-	       <?php print $translate->_("Français"); ?></a></li>
-	  <li ><a href="<?php URL_ROOT ?>client.php?lang=en" class="menuLink">
-	       <img src='<?php echo(URL_ROOT); ?>images/flag_en.gif' <?php if($actual!="en"){echo("style='opacity: .5;'"); } ?> />
-	       <?php print $translate->_("Anglais"); ?></a></li>
-	  </ul>
-
-	  
-	  <div class="videoLive">
-	  <?php if ($config['islive']):?>
-	  <div class="videoLivePlayer">
-			<object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="500" height="375">
-				<param name="movie" value="<?php echo(URL_ROOT); ?>res/mediaplayer/player.swf" />
-				<param name="allowfullscreen" value="true" />
-				<param name="allowscriptaccess" value="always" />
-				<param name="wmode" value="transparent" />
-				<param name="flashvars" value="autostart=true&live=true&image=<?php echo($big_visual_url); ?>&provider=rtmp&streamer=rtmp://media.iri.centrepompidou.fr/ddc_player/&file=livestream&controlbar=none&autostart=true" />
-				<embed
-					type="application/x-shockwave-flash"
-					id="player2"
-					name="player2"
-					src="<?php echo(URL_ROOT); ?>res/mediaplayer/player.swf"
-					width="500"
-					height="375"
-					allowscriptaccess="always"
-					allowfullscreen="true"
-					wmode="transparent"
-					flashvars="autostart=true&live=true&provider=rtmp&streamer=rtmp://media.iri.centrepompidou.fr/ddc_player/&file=livestream&image=<?php echo($big_visual_url); ?>&controlbar=none&autostart=true"
-					
-				/>
-			</object>
-			
-		</div>
-		<?php elseif(isset($config['islive_embed']) && count($config['islive_embed'])>0):?>
-		<div class="videoLivePlayer">
-		    <?php echo($config['islive_embed']); ?>
-		</div>
-	  	<?php else: ?>
-		<div class="videoLivePlayer">
-			<img src="<?php echo($big_visual_url); ?>" width="500"  height="375" />
-		</div>
-		<?php endif; ?>
-		
-	  </div>
-
-	<div class="videoLiveProgram">
-		
-		<div class="arrowContainer">
-			<div class="arrow"> </div>
-		</div>
-		<div class="videoLiveProgramTitle">
-			<b><?php echo($translate->_('config__title')); ?></b></div>
-		<div class="videoLiveProgramDescription">
-			<br><?php echo($translate->_('config__description')); ?></div>
-		
-		
-	</div>
-	  
-	  <div class="tweetWriter">
-		<h3 class="tweetWriterTitle"><?php print $translate->_("ClientTitle1 :"); ?></h3>
-		<form  action="tweet.php" method="post" id="statusform" >
-		<?php if (!isset($_SESSION['TWITTER_ACCESS_TOKEN'])){
-				echo("<div class='loginbutton' ><a href='".URL_ROOT."$rep/client.php?CONNECT=true' class='loginlink'>
-				".$translate->_("Vous n'êtes pas connecté.")."</a></div>");
-			  }else{
-				echo("<textarea name='status' id='status' rows='3' cols='50' onkeypress='return imposemax(this);'>$config[hashtag]</textarea>");
-			  }
-		?>
-
+    <div id="sendUsFeedBack"><a href="<?php echo($C_feedback_form_url); ?>" target="_blank"><img src="<?php echo(URL_ROOT); ?>images/sendusfeedback.png"></a></div>
 
-				<div id="messageSuccess" style="background-color:lightgreen;">
-					<?php print $translate->_("Envoyé"); ?><br><br>
-				</div>
-				
-				<div id="messageFailed" style="background-color:red;">
-					<?php print $translate->_("Erreur1"); ?><div id="error">&nbsp;</div><br/><br>
-				</div>
-
-			  
-			
-			<a class="button_w" href="#"  id="sendTweet" style="float:right;margin-right:15px;margin-left:35px;width:70px;" >
-				<span><?php print $translate->_("Envoyer"); ?></span>
-			</a>
-			<!--<button name="s" type="button" id="sendTweet"
-					style="float:right;margin-right:15px;margin-left:35px;width:70px;"  >Envoyer</button>-->
-			<?php if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])): ?>
-			<input id="tweetCounter" value="<?php echo(140-strlen($config['hashtag']));?>" disabled="disabled" size="3"/>
-			<?php endif;?>
-			<a
-					
-					id="positive"
-					title="accord"
-					class="tweetButton">++</a>
-			<a
-					
-					id="negative"
-					title="désaccord"
-					class="tweetButton">--</a>
-			<a
-					
-					id="reference"
-					title="reference"
-					class="tweetButton">==</a>
-			<a
-					
-					id="question"
-					title="question"
-					class="tweetButton"> ??</a>
-		</form>
-	  </div>
-	  
-	  <div class="tweetReader">
-			<script>
-				new TWTR.Widget({
-				  version: 2,
-				  type: 'search',
-				  search: '<?php echo($config['hashtag']); ?>',
-				  interval: 3000,
-				  title: '',
-				  subject: '',
-				  width: 377,
-				  height: 450,
-				  theme: {
-					shell: {
-					  background: '#ffffff',
-					  color: '#ffffff'
-					},
-					tweets: {
-					  background: '#ffffff',
-					  color: '#444444',
-					  links: '#1985b5'
-					}
-				  },
-				  features: {
-					scrollbar: true,
-					loop: false,
-					live: true,
-					hashtags: true,
-					timestamp: true,
-					avatars: true,
-					toptweets: true,
-					behavior: 'all'
-				  }
-				}).render().start();
-			</script>
-	  </div>
-
-      <div class="footer">
-		<hr>
-		 <?php
-				echo($translate->_('config__partenaires'));
-				
-				if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])){
-					echo("| 	<a href='clear.php'  class='footerLink'>".$translate->_("D&eacute;connexion")."</a>");
-				}
-		 ?>
-		  <input type="hidden" id="txt"/>
-		  
-	  </div>
-	
-
-    </div>
-	
+        <div id="container">
+            <div id="colgauche">
+                <div class="barre">
+                    <img id="headlogo" src="<?php echo($head_logo); ?>" width="171" height="63" />
+                    <ul class="menu">
+                        <li>
+                            <a href="<?php echo(URL_ROOT); ?>" class="menuLink">
+                                <?php print $translate->_("Accueil"); ?>
+                            </a>
+                        </li>
+                        <li>
+                            <a href="<?php echo($translate->_('config__link')); ?>" class="menuLink" target="_blank" id='Program'>
+                                <?php print $translate->_("Programme"); ?>
+                            </a>
+                        </li>
+                        <li>
+                            <a href="../about.php" class="menuLink" >
+                                <?php print $translate->_("A propos"); ?>
+                            </a>
+                        </li>
+                    </ul>
+                    <ul class="menu">
+                        <li>
+                            <a href="<?php URL_ROOT ?>client.php?lang=ja_JP" class="menuLink" >
+                                <img src='<?php echo(URL_ROOT); ?>images/flag_jp.gif'<?php if($actual!="ja_JP"){echo("style='opacity: .5;'"); } ?> />
+                                <?php print $translate->_("Japonais"); ?>
+                            </a></li>
+                        <li>
+                            <a href="<?php URL_ROOT ?>client.php?lang=fr" class="menuLink">
+                                <img src='<?php echo(URL_ROOT); ?>images/flag_fr.gif' <?php if($actual!="fr"){echo("style='opacity: .5;'"); } ?> />
+                                <?php print $translate->_("Français"); ?>
+                            </a>
+                        </li>
+                        <li>
+                            <a href="<?php URL_ROOT ?>client.php?lang=en" class="menuLink">
+                                <img src='<?php echo(URL_ROOT); ?>images/flag_en.gif' <?php if($actual!="en"){echo("style='opacity: .5;'"); } ?> />
+                                <?php print $translate->_("Anglais"); ?>
+                            </a>
+                        </li>
+                    </ul>
+                </div>
+                <div id="twwWrap">
+                    <div id="tweetWriter">
+                        <h3 class="tweetWriterTitle"><?php print $translate->_("ClientTitle1 :"); ?></h3>
+                        <form  action="tweet.php" method="post" id="statusform" >
+                            <?php if (!isset($_SESSION['TWITTER_ACCESS_TOKEN'])){
+                                echo("<div class='loginbutton'><a href='".URL_ROOT."$rep/client.php?CONNECT=true' class='loginlink'>".$translate->_("Vous n'êtes pas connecté.")."</a></div>");
+                            } else {
+                                echo("<textarea name='status' id='status' rows='3' cols='50' onkeypress='imposemax(this);'>$config[hashtag]</textarea>");
+                            }
+                            ?>
+                            <div id="messageSuccess" style="background-color:lightgreen; display: none;">
+                                <?php print $translate->_("Envoyé"); ?><br/><br/>
+                            </div>
+                            <div id="messageFailed" style="background-color:red; display: none;">
+                                <?php print $translate->_("Erreur1"); ?><div id="error">&nbsp;</div><br/><br/>
+                            </div>
+                            <a href="#"  id="sendTweet" >
+                                <span><?php print $translate->_("Envoyer"); ?></span>
+                            </a>
+                            <?php if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])): ?>
+                            <input id="tweetCounter" value="<?php echo(140-strlen($config['hashtag']));?>" disabled="disabled" size="3"/>
+                            <?php endif;?>
+                            <a id="positive" title="<?php echo $translate->_('Agree'); ?>" class="tweetButton">++</a>
+                            <a id="negative" title="<?php echo $translate->_('Disagree'); ?>" class="tweetButton">--</a>
+                            <a id="reference" title="<?php echo $translate->_('Reference'); ?>" class="tweetButton">==</a>
+                            <a id="question" title="<?php echo $translate->_('Question'); ?>" class="tweetButton"> ??</a>
+                            
+                            <div style="clear: both;"></div>
+                        </form>
+                    </div>
+                </div>
+                <div id="tweetviz">
+                    <div class="barre">
+                        <form id="recherche">
+                            <input autocomplete="off" class="greyed" id="inp_q" value="<?php echo $translate->_('Rechercher'); ?>" />
+                            <input id="inp_submit" type="submit" />
+                            <input id="inp_reset" type="reset" />
+                            <div id="time_controls">
+                                <div id="time_legende"></div>
+                                <div id="time_scale"></div>
+                                <a href="#" id="time_zoomout"></a>
+                                <a href="#" id="time_zoomin"></a>
+                            </div>
+                            <div id="recherche_annot">
+                                <?php echo $translate->_('SearchByPolemic'); ?> : <span id="rech_list_annot"></span><br />
+                            </div>
+                        </form>
+                    </div>
+                    <ul id="tweetlist"></ul>
+                    <div id="timeline"></div>
+                    <div id="scrollcont">
+                        <div id="scrollin"></div>
+                    </div>
+                </div>
+            </div>
+            <div id="coldroite">
+                <div id="vlWrap">
+                    <div id="videoLivePlayer">
+                    <?php if ($config['islive']):?>
+                        <object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="480" height="320">
+                            <param name="movie" value="<?php echo(URL_ROOT); ?>res/mediaplayer/player.swf" />
+                            <param name="allowfullscreen" value="true" />
+                            <param name="allowscriptaccess" value="always" />
+                            <param name="wmode" value="transparent" />
+                            <param name="flashvars" value="autostart=true&live=true&image=<?php echo($big_visual_url); ?>&provider=rtmp&streamer=rtmp://media.iri.centrepompidou.fr/ddc_player/&file=livestream&controlbar=none&autostart=true" />
+                            <embed
+                                type="application/x-shockwave-flash"
+                                id="player2"
+                                name="player2"
+                                src="<?php echo(URL_ROOT); ?>res/mediaplayer/player.swf"
+                                width="480"
+                                height="320"
+                                allowscriptaccess="always"
+                                allowfullscreen="true"
+                                wmode="transparent"
+                                flashvars="autostart=true&live=true&provider=rtmp&streamer=rtmp://media.iri.centrepompidou.fr/ddc_player/&file=livestream&image=<?php echo($big_visual_url); ?>&controlbar=none&autostart=true"
+                            />
+                        </object>
+                    <?php elseif(isset($config['islive_embed']) && count($config['islive_embed'])>0):?>
+                        <?php echo($config['islive_embed']); ?>
+                    <?php else: ?>
+                        <img src="<?php echo($big_visual_url); ?>" width="480"  height="320" />
+                    <?php endif; ?>
+                    </div>
+                </div>
+                <div id="out_fleche">
+                <!--    <div id="in_fleche"></div> -->
+                </div>
+                <ul id="accordeon">
+                    <li class="acctitre">
+                        <h3><?php echo($translate->_('config__title')); ?></h3>
+                    </li>
+                    <li class="acctexte">
+                        <p><?php echo($translate->_('config__description')); ?></p>
+                    </li>
+                    <li class="acctitre">
+                        <h3><?php echo $translate->_('Tagcloud'); ?></h3>
+                    </li>
+                    <li class="acctexte hidden" id="motscles"></li>
+                </ul>
+            </div>
+            <div class="footer">
+                <hr />
+         <?php
+                echo($translate->_('config__partenaires'));
+                
+                if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])){
+                    echo("| <a href='clear.php' class='footerLink'>".$translate->_("D&eacute;connexion")."</a>");
+                }
+         ?>
+            </div>
+        </div>
+        <div id="hovertweet">
+            <div id="hovercontent"></div>
+            <div id="hoverarrow"></div>
+        </div>
   </body>
-</html>
+</html>
\ No newline at end of file
--- a/web/common.php	Mon Dec 12 14:26:20 2011 +0100
+++ b/web/common.php	Tue Dec 13 19:01:59 2011 +0100
@@ -185,6 +185,11 @@
 		'jquery-mousewheel' => URL_ROOT.'res/jquery.fancybox/fancybox/jquery.mousewheel-3.0.4.pack.js',
 		'swfobject' 	=> URL_ROOT.'res/metadataplayer/res/js/swfobject.js',
 		'json-js' 		=> URL_ROOT.'res/douglascrockford-JSON-js/json2.js',
+		'underscore'    => URL_ROOT.'res/underscore/underscore-min.js' ,
+        'twcx-gevent'   => URL_ROOT.'res/js-tweetcast/connect-gevent.js' ,
+        'twcx-nodejs'   => URL_ROOT.'res/js-tweetcast/connect-nodejs.js' ,
+        'twcx-standalone'=> URL_ROOT.'res/js-tweetcast/connect-standalone.js' ,
+        'twcx-main'     => URL_ROOT.'res/js-tweetcast/live-polemic.js' ,
 
 	),
 	'cdn' => array(
@@ -200,6 +205,11 @@
 		'jquery-mousewheel' => URL_ROOT.'res/jquery.fancybox/fancybox/jquery.mousewheel-3.0.4.pack.js',
 		'swfobject' 	=> 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js',
 		'json-js' 		=> URL_ROOT.'res/douglascrockford-JSON-js/json2.js',
+        'underscore'    => URL_ROOT.'res/underscore/underscore-min.js' ,
+        'twcx-gevent'   => URL_ROOT.'res/js-tweetcast/connect-gevent.js' ,
+        'twcx-nodejs'   => URL_ROOT.'res/js-tweetcast/connect-nodejs.js' ,
+        'twcx-standalone'=> URL_ROOT.'res/js-tweetcast/connect-standalone.js' ,
+        'twcx-main'     => URL_ROOT.'res/js-tweetcast/live-polemic.js' ,
 		
 	)
 );
@@ -228,6 +238,7 @@
 		'fancybox' => URL_ROOT.'res/jquery.fancybox/fancybox/jquery.fancybox-1.3.4.css',
 		'jquery-ui' => URL_ROOT.'res/metadataplayer/res/css/jq-css/themes/base/jquery-ui.css',
 		'tabs-slideshow' => URL_ROOT.'res/css/tabs-slideshow.css',
+		'tweetcast' => URL_ROOT.'res/css/tweetcast.css'
 	),
 	'cdn' => array(
 		'blueprint-screen' => URL_ROOT.'res/blueprint/screen.css',
@@ -238,6 +249,7 @@
 		'fancybox' => URL_ROOT.'res/jquery.fancybox/fancybox/jquery.fancybox-1.3.4.css',
 		'jquery-ui' => "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/base/jquery-ui.css",
 		'tabs-slideshow' => URL_ROOT.'res/css/tabs-slideshow.css',
+        'tweetcast' => URL_ROOT.'res/css/tweetcast.css'
 	)
 );
 
Binary file web/res/css/twcx-img/arrow.png has changed
Binary file web/res/css/twcx-img/arrowtop.png has changed
Binary file web/res/css/twcx-img/bgd.jpg has changed
Binary file web/res/css/twcx-img/bgdeplie.png has changed
Binary file web/res/css/twcx-img/bgnoarrow.png has changed
Binary file web/res/css/twcx-img/head_logo.gif has changed
Binary file web/res/css/twcx-img/menu_underline.gif has changed
Binary file web/res/css/twcx-img/placeholder.png has changed
Binary file web/res/css/twcx-img/scale.png has changed
Binary file web/res/css/twcx-img/searchcancel.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/css/tweetcast.css	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,448 @@
+/* Browser-reset CSS */
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+
+img a {
+    border: none;
+}
+
+body {
+	font-family: 'PT Sans', Helvetica, Arial, sans-serif; background-color: #F7F6F6; background-image: url("twcx-img/bgd.jpg"); background-repeat: repeat-x;
+}
+
+h2, h3, h4 {
+    font-family: 'PT Sans Narrow', Helvetica, Arial, sans-serif;
+}
+
+p {
+    font-size: 12px;
+}
+
+b {
+    font-weight: bold;
+}
+
+i {
+    font-style: italic;
+}
+
+.highlight {
+    background: #ffff00;
+}
+
+.hidden {
+    display: none;
+}
+
+/* feedback */
+
+#sendUsFeedBack {
+  position: absolute; right: 0; top: 0; width: 100px; z-index: 999999;
+}
+
+#container {
+    width: 960px; margin: 0 auto;
+}
+
+#colgauche {
+    float: left; width: 455px; margin-right: 13px;
+}
+
+.barre {
+    float: left; width: 100%;
+}
+
+.greyed {
+    color: #999; font-style: italic;
+}
+
+.rechercheCourante {
+    background: #ffa0ff; font-weight: bold; color: #000080;
+}
+
+
+/* Menu */
+
+#headlogo {
+    float: left; margin-right: 10px;
+}
+
+.menu {
+    border-left: 1px solid #C3C3C3;
+    float: left;
+    list-style: none;
+    font-size: 12px;
+    height: 62px; overflow: hidden;
+}
+
+.menu li {
+    background: url("twcx-img/menu_underline.gif") left bottom no-repeat;
+    padding: 3px 0 0 5px;
+    height: 18px;
+    min-width: 80px;
+}
+
+.menu a {
+    color: #000000; text-decoration: none;
+}
+
+.menu a:hover {
+    color: #0099FF;
+}
+
+/* Formulaire */
+
+#twwWrap {
+    float: left; width: 450px; background: #ffffff; padding: 1px; border-width: 1px; border-style: solid solid none solid; border-color: #ababab; margin-top: 6px;
+}
+#tweetWriter {
+    width: 430px; padding: 10px; background: #efefef;
+}
+.loginbutton{
+    margin: 10px auto; height: 60px; width: 330px; padding:5px;
+    background: url(../../images/tweetWriterBgdUnconnect.gif) no-repeat;
+    border: none; color:#fff;
+}
+.loginlink{
+    text-decoration:none;
+    color:#fff;
+}
+textarea {
+    display: block; margin: 10px auto; height: 60px; width: 330px; padding:5px;
+    background: url(../../images/tweetWriterBgdTxtArea.gif) no-repeat;
+    border: none; resize: none;
+}
+
+a#sendTweet {
+    background: transparent url('../../images/bg_button_a_w.png') no-repeat top right;
+    color: #444; display: block; font-size: 12px; height: 24px; line-height: 14px;
+    float:right; margin: 0 45px 0 50px; padding: 0 18px 0 0; text-decoration: none;
+}
+a#sendTweet span {
+    background: transparent url('../../images/bg_button_span_w.png') no-repeat; display: block; height: 14px;
+    padding: 5px 0 5px 18px;
+}
+a#sendTweet:hover, a#sendTweet:active {
+    background-position: right -24px;
+}
+a#sendTweet:hover span, a#sendTweet:active span {
+    background-position: 0 -24px;
+}
+a.tweetButton { 
+    float:right; margin: 2px 5px 0 0; width:32px; height:20px; text-decoration: none; font: normal 12px;
+    color: #444; text-align:center; cursor: pointer; cursor: hand;
+}
+
+#question {
+    background: transparent url('../../images/bt_blue.png') no-repeat;
+}
+#reference{
+    background: transparent url('../../images/bt_yellow.png') no-repeat;
+}
+#positive{
+    background: transparent url('../../images/bt_green.png') no-repeat;
+}
+#negative{
+    background: transparent url('../../images/bt_red.png') no-repeat;
+}
+
+#tweetCounter{
+    float: left; background: transparent; border: none;font-weight:bold; margin: 2px 0 0 42px; padding: 0;
+}
+.tweetCounterNegative{
+    color:red;
+}
+
+/* Liste de Tweets */
+
+#tweetviz {
+    float: left; width: 452px; border: 1px solid #999;
+}
+
+/* Recherche */
+
+#recherche {
+    position: relative; float: left; padding: 2px 0; width: 452px; border-bottom: 1px solid #999;
+}
+
+#recherche input {
+    float: left;
+}
+
+#inp_q {
+    width: 236px; border: none; padding: 1px; margin-left: 2px; height: 17px; font-size: 13px;
+}
+
+#inp_submit, #inp_reset {
+    border: 0; padding: 0; width: 20px; height: 20px; overflow: hidden; text-indent: 800px; background: url(twcx-img/searchcancel.png)
+}
+
+#inp_submit:hover {
+    background-position: -20px 0;
+}
+
+#inp_submit:active {
+    background-position: -40px 0;
+}
+
+#inp_reset {
+    background-position: 0 -20px;
+}
+
+#inp_reset:hover {
+    background-position: -20px -20px;
+}
+
+#inp_reset:active {
+    background-position: -40px -20px;
+}
+
+#time_legende {
+    float: left; margin-left: 30px; width: 30px; height: 20px; background: url(twcx-img/scale.png) left;
+}
+
+#time_scale {
+    float: left; font-size: 12px; margin: 3px 0 0; color: #666; width: 50px; text-align: center;
+}
+
+#time_zoomout, #time_zoomin {
+    float: left; width: 12px; height: 20px; background: url(twcx-img/scale.png);
+}
+
+#time_zoomout {
+    background-position: -30px;
+}
+
+#time_zoomout.inactive {
+    background-position: -54px;
+}
+
+#time_zoomin {
+    background-position: -42px;
+}
+
+#time_zoomin.inactive {
+    background-position: -66px;
+}
+
+#recherche_annot {
+    position: absolute; top: 20px; z-index: 4; background: #ffffff; border: 1px solid #ccc; padding: 4px; font-size: 12px;
+    display: none; box-shadow: 2px 2px 2px rgba(0, 0, 0, .5)
+}
+
+#recherche_annot a {
+    padding: 1px; line-height: 13px; margin: 1px; font-weight: bold; text-decoration: none; color: #000000;
+}
+
+/* Liste des tweets */
+
+#tweetlist {
+	float: left; width: 280px; height: 480px; list-style: none; border-right: 1px solid #999; color: #585858; cursor: pointer; cursor: hand; background: #ffffff;
+}
+
+#tweetlist a {
+    text-decoration: none; color: #1985B5;
+}
+
+#tweetlist a:hover {
+    text-decoration: underline; color: #105060;
+}
+
+li.tweet, li.placeholder {
+	border-bottom : 1px dotted; overflow: hidden; float: left; border-color: #ccc;
+}
+
+li.tweet {
+	position: relative; background: #fff;
+}
+
+li.full {
+    width: 270px; height: 117px; border-right: 10px solid #ff0;
+}
+
+li.half {
+    width: 280px; height: 46px;
+}
+
+li.icons {
+    width: 20px; height: 20px; border: none;
+}
+
+li.placeholder {
+    visibility: hidden;
+}
+
+.tweet p {
+    overflow: hidden;
+}
+
+.full p.tweet_text {
+	font-size: 12px; margin: 5px 0 5px 58px; height: 108px; width: 207px; color: #000000;
+}
+
+.half p.tweet_text {
+    font-size: 11px; margin: 5px 0 5px 49px; height: 36px; line-height: 12px; width: 216px;
+}
+
+div.around_img {
+	float: left;
+}
+
+.full .profile_image {
+    margin: 5px 5px 0 5px; width: 48px; height: 48px;
+}
+
+.half .profile_image {
+    margin: 5px; width: 36px; height: 36px;
+}
+
+.icons .profile_image {
+    margin: 2px; width: 16px; height: 16px;
+}
+
+p.created_at {
+	font-size: 12px; text-align: center; font-style: italic; color: #999999; width: 58px; overflow: hidden;
+}
+
+.annotations {
+    position: absolute; margin: 0; padding: 0; top: 0; left: 0; width: 100%; height: 100%; 
+}
+
+.icons .annotations {
+    position: absolute; width: 20px; height: 6px; left: 0; top: 16px; z-index: 3;
+}
+
+div.annotation {
+    float: left; height: 100%;
+}
+
+div.twmain {
+    position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 2; overflow: hidden;
+}
+
+div.tweet_actions {
+    position: absolute; bottom : 2px; right: 4px; font-size: 11px;
+}
+
+/* timeline */
+
+#timeline {
+    float: left; height: 480px; width: 150px; border-right: 1px solid #999; cursor: pointer; cursor: hand;
+}
+
+#scrollcont {
+    float: left; width: 20px; height: 480px; overflow: auto;
+}
+
+#scrollin {
+    width: 1px; height: 8000px;
+}
+
+/* hovertweet */
+
+#hovertweet {
+    position: absolute; display: none; margin: -20px 0 0 15px; z-index: 12;
+}
+
+div.full {
+    position: absolute; background: #eeeeee; width: 270px; height: 84px; border: 1px solid #808080; border-radius: 3px; box-shadow: 5px 5px 5px rgba(0,0,0,.3);
+}
+
+#hoverarrow {
+    position: absolute; width: 10px; height: 18px; left: -9px; top: 13px;  background: url(twcx-img/arrow.png);
+}
+
+/* Colonne de droite */
+
+#coldroite {
+    float: left; width: 492px;
+}
+
+#vlWrap {
+    float: left; border: 5px solid #ffffff; background: #999999; padding: 1px; margin-top: 70px;
+}
+
+#videoLivePlayer {
+    width: 480px; height: 320px; background: #000000;
+}
+
+#out_fleche {
+    float: left; position: relative; width: 492px; height: 14px; background: url(twcx-img/bgnoarrow.png);
+}
+
+#in_fleche {
+    position: absolute; left: 10px; width: 27px; height: 15px; background: url(twcx-img/arrowtop.png);
+}
+
+#accordeon {
+    float: left; width: 492px; list-style: none; background: #999999;
+}
+
+#accordeon h3 {
+    font-size: 16px; font-weight: bold; color: #666;
+}
+
+#accordeon p {
+    margin: 5px 0; line-height: 1.5em;
+}
+
+#accordeon li {
+    float: left; width: 480px; margin: 0 1px 1px 1px; padding: 4px; border: 1px solid #ffffff;
+}
+
+li.acctitre {
+    background: #efefef; cursor: pointer; cursor: hand;
+}
+
+li.acctexte {
+    background: url(twcx-img/bgdeplie.png) top repeat-x #efefef;
+}
+
+/* Tag Cloud */
+
+#motscles {
+    text-align: center;
+}
+
+#motscles span {
+    padding: 2px; cursor: pointer; cursor: hand;
+}
+
+/* Footer */
+.footer {
+    float: left; width: 100%; margin: 40px 0 10px; text-align: center;
+}
+
+hr {
+  background: #cccccc; border: none; height: 1px; margin: 0 0 10px; width: 100%;
+}
+
+a.footerLink {
+    text-decoration:none; margin:5px; color: #000000;
+    font-family: 'PT Sans Narrow', Arial, Helvetica, sans-serif; font-size: 13px;
+}
+
+a.footerLink:hover {
+    color: #0099FF;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/js-tweetcast/connect-gevent.js	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,14 @@
+function connectTweets() {
+    $.getJSON('http://' + document.location.hostname + ':8888/?callback=?', function(data) {
+        loadTweets(data.tweets)
+    } );
+    
+    setInterval(function() {
+        if (!twCx.tweets) {
+            return;
+        }
+        $.getJSON('http://' + document.location.hostname + ':8888/?after_id=' + twCx.tweets[twCx.tweets.length - 1].id + '&callback=?', function(data) {
+            loadTweets(data.tweets, true);
+        });
+    }, 1000)
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/js-tweetcast/connect-nodejs.js	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,16 @@
+document.write('<script type="text/javascript" src="/socket.io/socket.io.js"><' + '/script>');
+
+function connectTweets() {
+    socket = io.connect('http://' + document.location.host );
+    
+    socket.on("initial_data", function(data) {
+        loadTweets(data.tweets)
+    });
+    
+    socket.on("update", function(data) {
+        if (!twCx.tweets) {
+            return;
+        }
+        loadTweets(data.new_tweets, true);
+    });
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/js-tweetcast/connect-standalone.js	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,3 @@
+function connectTweets() {
+    $.getScript("http://velt.info/polemic/tweetdata.js");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/js-tweetcast/live-polemic.js	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,959 @@
+var socket,
+    tlPaper,
+    twCx = {
+        followLast : true,
+        position : "0",
+        date_levels : [
+            3600 * 1000,
+            15 * 60 * 1000,
+            5 * 60 * 1000,
+            60 * 1000
+        ],
+        timeLevel : 1,
+        deltaX : 40,
+        tlWidth : 150,
+        tlHeight : 480,
+        globalWords : {},
+        refMouse : { x : 0, y : 0},
+        refPosTl : { x : 0, y : 0},
+        tlMouseMoved : false,
+        tlMouseClicked : false,
+        filtre : null
+        },
+    tlBuffer = '',
+    relHover = [],
+    wheelDelta = 0,
+    scrollEnabled = false,
+    scrollExtent = 8000 - 480,
+    lastScrollPos = 0,
+    rx_url = /https?:\/\/[0-9a-zA-Z\.%\/-_]+/g,
+    rx_word = /[^ \.&;,'"!\?\d\(\)\+\[\]\\\…\-«»:\/]{3,}/g,
+    stop_list = [ 'and', 'avec', 'aux', 'car', 'comme', 'dans', 'donc', 'des', 'elle', 'est', 'être', 'eux', 'ils', 'les', 'leur', 'leurs', 'mes', 'mon', 'tes', 'ton', 'notre', 'nos', 'nous', 'ont', 'pas', 'que', 'qui', 'sont', 'the', 'une', 'votre', 'vos', 'vous' ],
+    l10n = { "rechercher" : "Rechercher" };
+
+function getColor(annotation, lum) {
+    return Raphael.hsl2rgb(annotations[annotation].colors.h, annotations[annotation].colors.s, lum);
+}
+
+function tweetPopup(url) {
+    var popW = 550,
+        popH = 350,
+        scrW = screen.width,
+        scrH = screen.height,
+        posX = Math.round((scrW/2)-(popW/2)),
+        posY = (scrH > popH ? Math.round((scrH/2)-(popH/2)) : 0);
+    window.open(url,
+        '',
+        'left=' + posX + ',top=' + posY + ',width=' + popW + ',height=' + popH + ',personalbar=0,toolbar=0,scrollbars=1,resizable=1');
+}
+
+function arc(source, target) {
+    var x3 = .3 * target.y - .3 * source.y + .8 * source.x + .2 * target.x;
+    var y3 = .8 * source.y + .2 * target.y - .3 * target.x + .3 * source.x;
+    var x4 = .3 * target.y - .3 * source.y + .2 * source.x + .8 * target.x;
+    var y4 = .2 * source.y + .8 * target.y - .3 * target.x + .3 * source.x;
+    return "M" + source.x + " " + source.y + "C" + [x3, y3, x4, y4, target.x, target.y].join(" ");
+}
+
+function addTweet(tweet) {
+    function backRef(source_id, target_id, type) {
+        var target = tweetById(target_id);
+        if (target) {
+            var brobj = {
+                "referenced_by_id" : source_id,
+                "type" : type
+            }
+            if (target.backRefs) {
+                target.backRefs.push(brobj);
+            } else {
+                target.backRefs = [ brobj ]
+            }
+        }
+    }
+    
+    if (twCx.idIndex.indexOf(tweet.id) != -1) {
+        return;
+    }
+    
+    var txt_date = tweet.created_at;
+    if (navigator.userAgent.search(/MSIE/) != -1) {
+        txt_date = txt_date.replace(/( \+)/, ' UTC$1');
+    }
+    tweet.date_value = Date.parse(txt_date);
+    
+    var tab = tweet.text.match(/\&\#[0-9]+\;/g);
+    for (var i in tab) {
+        var n = parseInt(tab[i].substr(2));
+        if (n != NaN) {
+            tweet.text = tweet.text.replace(tab[i], String.fromCharCode(n));
+        }
+    }
+    
+    var ann = [];
+    for (var j in annotations) {
+        if (j != "default") {
+            for (var k in annotations[j].keywords) {
+                if (tweet.text.search(annotations[j].keywords[k]) != -1) {
+                    ann.push(j);
+                    break;
+                }
+            }
+        }
+    }
+    tweet.annotations = ann;
+
+    if (tweet.in_reply_to_status_id) {
+        backRef( tweet.id, tweet.in_reply_to_status_id, "reply" );
+    }
+    if (tweet.retweeted_status) {
+        backRef( tweet.id,  tweet.retweeted_status.id, "retweet" );
+    }
+    
+    var localWords = []
+    
+    var tab = tweet.text.replace(rx_url,'').match(rx_word);
+    for (var i in tab) {
+        var word = tab[i].toLowerCase();
+        if (stop_list.indexOf(word) == -1 && tracking_keywords.indexOf(word) == -1) {
+            if (twCx.globalWords[word]) {
+                twCx.globalWords[word]++;
+            } else {
+                twCx.globalWords[word] = 1;
+            }
+            localWords.push(word);
+        }
+    }
+    
+    tweet.words = localWords;
+    
+    var p = twCx.idIndex.length;
+    while (p && tweet.id < twCx.idIndex[p-1]) {
+        p--;
+    }
+    twCx.tweets.splice(p, 0, tweet);
+    twCx.idIndex.splice(p, 0, tweet.id);
+    
+    if (!twCx.timeline.length) {
+        twCx.timeline = [ populateDateStruct(0, twCx.date_levels[0] * parseInt(tweet.date_value / twCx.date_levels[0])) ]
+    }
+    while (tweet.date_value > twCx.timeline[twCx.timeline.length - 1].end) {
+        twCx.timeline.push( populateDateStruct(0, twCx.timeline[twCx.timeline.length - 1].end) );
+    }
+    
+    insertIntoDateStruct(twCx.timeline, tweet);
+}
+
+function getSliceContent(slice) {
+    if (slice.slices) {
+        var result = [];
+        for (var i in slice.slices) {
+            result = result.concat(getSliceContent(slice.slices[i]));
+        }
+    } else {
+        var result = slice.tweets;
+    }
+    return result;
+}
+
+function flattenDateStruct(slices, target_level) {
+    var current_level = slices[0].level,
+        result = [];
+    if (current_level < target_level) {
+        if (slices[0].slices) {
+            for (var i in slices) {
+                result = result.concat(flattenDateStruct(slices[i].slices, target_level));
+            }
+        }
+    }
+    else {
+        for (var i in slices) {
+            result.push({
+                "start" : slices[i].start,
+                "end" : slices[i].end,
+                "tweets" : getSliceContent(slices[i])
+            });
+        }
+    }
+    return result;
+}
+
+function trimFDS() {
+    var slices = flattenDateStruct(twCx.timeline, twCx.timeLevel);
+    while (slices[0].tweets.length == 0) {
+        slices.splice(0,1);
+    }
+    while (slices[slices.length - 1].tweets.length == 0) {
+        slices.pop();
+    }    
+    var centralTweet = ( twCx.centralTweet ? twCx.centralTweet : twCx.tweets[twCx.tweets.length - 1] ),
+        delta = 30 * twCx.date_levels[twCx.timeLevel],
+        centre = Math.min(slices[slices.length - 1].end - delta , Math.max(slices[0].start + delta, centralTweet.date_value)),
+        min = centre - delta,
+        max = centre + delta;
+    while (slices[0].start < min) {
+        slices.splice(0,1);
+    }
+    while (slices[slices.length - 1].end > max) {
+        slices.pop();
+    }
+    return slices;
+}
+
+function populateDateStruct(level, start) {
+    var end = start + twCx.date_levels[level],
+        struct = {
+            "level" : level,
+            "start" : start,
+            "end" : end
+        };
+    if (level < twCx.date_levels.length - 1) {
+        struct.slices = [];
+        var newstart = start;
+        while (newstart < end) {
+            struct.slices.push(populateDateStruct(level + 1, newstart));
+            newstart += twCx.date_levels[level + 1];
+        }
+    } else {
+        struct.tweets = [];
+    }
+    return struct;
+}
+
+function insertIntoDateStruct(slices, tweet) {
+    var creadate = tweet.date_value;
+    for (var i in slices) {
+        if (creadate < slices[i].end) {
+            if (slices[i].slices) {
+                insertIntoDateStruct(slices[i].slices, tweet);
+            } else {
+                slices[i].tweets.push(tweet.id);
+            }
+            break;
+        }
+    }
+}
+
+function placeHolder(className) {
+    return '<li class="placeholder ' + className + '"></li>';
+}
+
+function tweetById(tweetid) {
+    var pos = twCx.idIndex.indexOf(tweetid);
+    return (pos == -1) ? false : twCx.tweets[pos];
+}
+
+function selectTweet(tweetid) {
+    twCx.position = tweetid;
+    twCx.followLast = (twCx.position == twCx.idIndex[twCx.tweets.length - 1]);
+    updateDisplay();
+}
+
+function goToPos(nPos) {
+    twCx.position = twCx.currentIdIndex[Math.min( twCx.currentIdIndex.length - 1, Math.max(0, nPos ) )];
+    twCx.followLast = (!twCx.filtre && nPos == twCx.tweets.length - 1);
+    updateDisplay();
+}
+
+function movePos(delta) {
+    goToPos( delta + twCx.currentIdIndex.indexOf(twCx.position) );
+}
+
+function tweetToHtml(tweet, className, elName) {
+    
+    function highlight(texte) {
+        return ( twCx.filtre ? texte.replace(twCx.filtre, '<span class="highlight">$1</span>' ) : texte );
+    }
+    
+    if (!tweet) {
+        return placeHolder(className);
+    }
+    var el = (elName ? elName : 'li');
+    var html = '<' + el + ' class="tweet ' + className + '" id="tweet_' + tweet.id + '"';
+    if (className != 'full') {
+        html += ' onclick="selectTweet(\'' + tweet.id + '\'); return false;"';
+    }
+    html += ' onmouseover="rolloverTweet(\'' + tweet.id + "', " + ( className == 'icons' ) + ');"';
+    if (twCx.followLast && className == 'full' && el == 'li') {
+        html += ' style="display: none"';
+    }
+    html += '>';
+    if (tweet.annotations.length) {
+        html += '<div class="annotations">';
+        for (var i in tweet.annotations) {
+            html += '<div class="annotation" style="width:' + (100/tweet.annotations.length) + '%; background:' + getColor(tweet.annotations[i], (className == 'icons' ? .4 : .85)).hex + '"></div>';
+        }
+        html += '</div>';
+    }
+    html += '<div class="twmain">';
+    var a_user = '<a href="http://twitter.com/' + tweet.user.screen_name + '"  onclick="filtrerTexte(\'@' + tweet.user.screen_name + '\'); return false;" target="_blank">';
+    html += '<div class="around_img">' + a_user + '<img class="profile_image" src="' + tweet.user.profile_image_url + '" /></a>';
+    if (className == 'full') {
+        html += '<p class="created_at">' + new Date(tweet.date_value).toTimeString().substr(0,8) + '</a></p>';
+    }
+    html += '</div>';
+    if (className != 'icons') {
+        lastend = 0;
+        var txt = '',
+            entities = [];
+        for (var i in tweet.entities.hashtags) {
+            entities.push({
+                "start" : tweet.entities.hashtags[i].indices[0],
+                "end" : tweet.entities.hashtags[i].indices[1],
+                "link" : '<a href="http://twitter.com/search?q=%23' + tweet.entities.hashtags[i].text + '" onclick="filtrerTexte(\'#' + tweet.entities.hashtags[i].text + '\'); return false;" target="_blank">',
+                "text" : '#' + tweet.entities.hashtags[i].text
+            });
+        }
+        for (var i in tweet.entities.urls) {
+            var linkurl = ( tweet.entities.urls[i].expanded_url ? tweet.entities.urls[i].expanded_url : tweet.entities.urls[i].url ),
+                dispurl = linkurl.replace(/https?:\/\//,'');
+            if (linkurl.search(/https?:\/\//) == -1) {
+                linkurl = 'http://' + linkurl;
+            }
+            entities.push({
+                "start" : tweet.entities.urls[i].indices[0],
+                "end" : tweet.entities.urls[i].indices[1],
+                "link" : '<a href="' + linkurl  + '" target="_blank">',
+                "text" : dispurl
+            });
+        }
+        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],
+                "link" : '<a href="http://twitter.com/' + tweet.entities.user_mentions[i].screen_name + '" onclick="filtrerTexte(\'@' + tweet.entities.user_mentions[i].screen_name + '\'); return false;" target="_blank">',
+                "text" : '@' + tweet.entities.user_mentions[i].screen_name
+            });
+        }
+        entities.sort(function(a, b) { return a.start - b.start });
+        for (var i in entities) {
+            txt += highlight( tweet.text.substring(lastend, entities[i].start) ) + entities[i].link + highlight( entities[i].text ) + '</a>';
+            lastend = entities[i].end;
+        }
+        txt += highlight( tweet.text.substring(lastend) );
+        html += '<p class="tweet_text"><b>' + a_user + highlight('@' + tweet.user.screen_name) + '</a>' + ( className == 'full' ? ' (' + tweet.user.name + ')</b><br />' : '</b> : ') + txt + '</p>';
+        if (className == 'full' && el == 'li') {
+            html += '<div class="tweet_actions"><a href="http://twitter.com/' + tweet.user.screen_name + '/status/' + tweet.id + '" onclick="tweetPopup(this.href); return false;" target="_blank">afficher tweet</a> - ';
+            html += '<a href="http://twitter.com/intent/tweet?in_reply_to=' + tweet.id + '" onclick="tweetPopup(this.href); return false;" target="_blank">répondre</a> · ';
+            html += '<a href="http://twitter.com/intent/retweet?tweet_id=' + tweet.id + '" onclick="tweetPopup(this.href); return false;" target="_blank">retweeter</a> · ';
+            html += '<a href="http://twitter.com/intent/favorite?tweet_id=' + tweet.id + '" onclick="tweetPopup(this.href); return false;" target="_blank">favori</a></div>';
+        }
+    }
+    html += '</div></' + el + '>';
+    return html;
+}
+
+function tlIdFromPos(x, y, outside) {
+    if (!twCx.tlOnDisplay) {
+        return;
+    }
+    var ligne = Math.min( twCx.tlOnDisplay.length - 1, Math.max( 0, Math.floor(( twCx.tlHeight - y ) / twCx.scaleY) ) ),
+        colonne = Math.floor(( x - twCx.deltaX ) / twCx.scaleX ),
+        l = 0;
+    if (colonne >= twCx.tlOnDisplay[ligne].totalTweets || colonne < 0 ) {
+        if (outside) {
+            colonne = Math.min( twCx.tlOnDisplay[ligne].totalTweets - 1, Math.max( 0, colonne ));
+        } else {
+            return null;
+        }
+    }
+    for (var i in twCx.tlOnDisplay[ligne].displayData) {
+        var nl = l + twCx.tlOnDisplay[ligne].displayData[i].length;
+        if (colonne < nl) {
+            return {
+                "id" : twCx.tlOnDisplay[ligne].displayData[i][colonne - l],
+                "annotation" : i
+            }
+        }
+        l = nl;
+    }
+}
+
+function tlPosTweet(tweet, annotation) {
+    if (!twCx.tweets) {
+        return;
+    }
+    var x,
+        y,
+        dt = tweet.date_value,
+        ann = ( annotation ? annotation : ( tweet.annotations.length ? tweet.annotations[0] : 'default' ) );
+    for (var i = 0; i < twCx.tlOnDisplay.length; i++) {
+        if (twCx.tlOnDisplay[i].end > dt) {
+            y = twCx.tlHeight - (i + .5) * twCx.scaleY;
+            var l = 0;
+            for (var j in twCx.tlOnDisplay[i].displayData) {
+                if (j == ann) {
+                    var p = twCx.tlOnDisplay[i].displayData[j].indexOf(tweet.id);
+                    if (p != -1) {
+                        x = twCx.deltaX + twCx.scaleX * ( p + l + .5 );
+                    }
+                    break;
+                }
+                l += twCx.tlOnDisplay[i].displayData[j].length;
+            }
+            break;
+        }
+    }
+    return ( x && y ? { "x" : x, "y" : y } : null);
+}
+
+function rolloverTweet(tweetid, showPopup, annotation) {
+    var t = tweetById(tweetid);
+    if (!t) {
+        return;
+    }
+    var p = tlPosTweet(t, annotation);
+    if (!p) {
+        return;
+    }
+    var ptl = $("#timeline").offset();
+    if (showPopup) {
+        $("#hovercontent").html(tweetToHtml(t, 'full', 'div'));
+        $("#hovertweet").css({
+            "left" : parseInt(ptl.left + p.x) + "px",
+            "top" : parseInt(ptl.top + p.y),
+            "display" : "block"});
+    } else {
+        $("#hovertweet").hide();
+    }
+    for (var i in relHover) {
+        relHover[i].remove();
+    }
+    relHover = drawTweetArcs(t, p, '#303030');
+    relHover.push(drawTweetPos(p, '#ffffff'));
+}
+
+function drawTweetPos(pos, color) {
+    var rel = tlPaper.rect(pos.x - .5 * twCx.scaleX, pos.y - .5 * twCx.scaleY, twCx.scaleX, twCx.scaleY);
+    rel.attr({ "stroke" : color, "fill" : color, "fill-opacity" : .25 });
+    return rel;
+}
+
+function drawTweetArcs(tweet, pos, color) {
+    
+    var res = [];
+
+    function tweetAndArc(a, b, aorb) {
+        if (a && b) {
+            res.push(drawTweetPos(aorb ? a : b, color));
+            var aa = tlPaper.path(arc(a,b))
+                .attr({ "stroke" : color, "stroke-width" : 1.5, "stroke-opacity" : .8 });
+            res.push(aa);
+        }
+    }
+    
+    if (tweet.retweeted_status) {
+        var t = tweetById(tweet.retweeted_status.id);
+        if (t) {
+            tweetAndArc(pos, tlPosTweet(t));
+        }
+    }
+    
+    if (tweet.in_reply_to_status_id) {
+        var t = tweetById(tweet.in_reply_to_status_id);
+        if (t) {
+            tweetAndArc(pos, tlPosTweet(t));
+        }
+    }
+    
+    if (tweet.backRefs) {
+        for (var i in tweet.backRefs) {
+            var t = tweetById(tweet.backRefs[i].referenced_by_id);
+            if (t) {
+            tweetAndArc(tlPosTweet(t), pos, true);
+            }
+        }
+    }
+    
+    return res;
+}
+
+function updateDisplay() {
+    if (!twCx.tweets) {
+        return;
+    }
+    if (twCx.filtre) {
+        var tweets = twCx.tweets.filter(function(tweet) {
+            var mention = '@' + tweet.user.screen_name;
+            return ( tweet.text.search(twCx.filtre) != -1 ) || ( mention.search(twCx.filtre) != -1 );
+        });
+        $("#inp_q").val(twCx.filtreTexte + ' (' + tweets.length + ' tweets)');
+        if (tweets.length) {
+            var idIndex = tweets.map(function(tweet) {
+                return tweet.id;
+            });
+            var p = idIndex.indexOf(twCx.position);
+            if (p == -1) {
+                for (p = idIndex.length - 1; p > 0 && idIndex[p] > twCx.position; p--) {
+                }
+            }
+            twCx.position = idIndex[p];
+            twCx.currentIdIndex = idIndex;
+        }
+        
+    } else {
+        twCx.currentIdIndex = twCx.idIndex;
+        var tweets = twCx.tweets;
+        var p = twCx.idIndex.indexOf(twCx.position);
+        if (p == -1) {
+            p = (twCx.followLast ? twCx.idIndex.length - 1 : 0);
+        }
+    }
+
+    var l = tweets.length,
+        lines = 0,
+        ppy = 0,
+        html = '',
+        tweetsOnDisplay = [],
+        localWords = {};
+    
+    function pushTweet(tp, className) {
+        if (tp < l && tp >= 0) {
+            html += tweetToHtml(tweets[tp], className)
+            tweetsOnDisplay.push(tp);
+            for (var i in tweets[tp].words) {
+                var w = tweets[tp].words[i];
+                if (localWords[w]) {
+                    localWords[w].freq++
+                } else {
+                    localWords[w] = {
+                        "freq" : 1,
+                        "annotations" : {}
+                    }
+                    for (var j in annotations) {
+                        if (j != 'default') {
+                            localWords[w].annotations[j] = 0;
+                        }
+                    }
+                }
+                for (var j in tweets[tp].annotations) {
+                    localWords[w].annotations[tweets[tp].annotations[j]]++;
+                }
+            }
+        } else {
+            html += placeHolder(className);
+        }
+    }
+    
+    if (l) {
+    
+        lastScrollPos = Math.floor( scrollExtent * ( 1 - ( p / l ) ) );
+        $("#scrollcont").scrollTop(lastScrollPos);
+        
+        if (l > p + 18) {
+            lines++;
+            ppy += 20;
+            for (var i = p + 31; i >= p + 18; i--) {
+                pushTweet(i, 'icons');
+            }
+        }
+        if (l > p + 4) {
+            lines++;
+            ppy += 20;
+            for (var i = p + 17; i >= p + 4; i--) {
+                pushTweet(i, 'icons');
+            }
+        }
+        for (var k = 3; k >= 1; k--) {
+            if (l > p + k) {
+                ppy += 47;
+                lines++;
+                pushTweet(p + k, 'half');
+            }
+        }
+        pushTweet(p, 'full');
+        var n = p - 1;
+        for (var i = 0; i < Math.min(6, Math.max(3, 6 - lines)); i++) {
+            if (n < 0) {
+                break;
+            }
+            pushTweet(n, 'half');
+            n--;
+        }
+        for (var i = 0; i < 14 * Math.min(4, Math.max(2, 7 - lines)); i++) {
+            if (n < 0) {
+                break;
+            }
+            pushTweet(n, 'icons');
+            n--;
+        }
+        if (html != tlBuffer) {
+            $("#tweetlist").html(html);
+            $(".tweet.full").fadeIn();
+            tlBuffer = html;
+        }
+        
+        /* Recherche des mots pertinents correspondant à la sélection */
+        
+        var tab = _(localWords).map(function(v, k) {
+            return {
+                "word": k,
+                "freq" : v.freq,
+                "annotations" : v.annotations,
+                "score" : v.freq / Math.log( 2 + twCx.globalWords[j] )
+            };
+        }).filter(function(v) {
+            return v.freq > 1;
+        });
+        
+        if (tab.length) {
+            
+            tab = _(tab).sortBy( function(a) { return ( - a.score ) }).slice(0,20);
+            var minfreq = _(tab).min( function(a) { return a.freq} ).freq,
+                maxfreq = Math.max(minfreq + .1, _(tab).max( function(a) { return a.freq} ).freq),
+                echfreq = 8 / Math.sqrt( maxfreq - minfreq ),
+                html = '';
+            for (var j in tab) {
+                var maxann = 0,
+                    ann = "default";
+                for (var k in tab[j].annotations) {
+                    if (tab[j].annotations[k] == maxann) {
+                        ann = "default";
+                    }
+                    if (tab[j].annotations[k] > maxann) {
+                        ann = k;
+                        maxann = tab[j].annotations[k];
+                    }
+                }
+                if (ann == "default") {
+                    var coul = '';
+                } else {
+                    var c = getColor(ann, .6),
+                        coul = "background: rgba(" + [ Math.floor(c.r), Math.floor(c.g), Math.floor(c.b), ( tab[j].annotations[ann] / tab[j].freq )].join(',') + ")";
+                }
+                var fontsize = Math.floor( ( 12 + Math.sqrt( tab[j].freq - minfreq ) * echfreq ) );
+                html += '<span style="line-height: ' + (8 + fontsize) + 'px; font-size: ' + fontsize + 'px;' + coul + '" onclick="filtrerTexte(\'' + tab[j].word.replace(/('|")/g, '\\$1') + '\')">' + tab[j].word + '</span> ';
+            }
+            $("#motscles").html(html);
+        } else {
+            $("#motscles").html('');
+        }
+        twCx.centralTweet = tweets[p];
+    } else {
+        $("#tweetlist").html('');
+        tlBuffer = '';
+        $("#motscles").html('');
+    }
+    
+    twCx.tlOnDisplay = trimFDS();
+    twCx.scaleY = twCx.tlHeight / twCx.tlOnDisplay.length;
+    var maxTweets = 0,
+        startTl = 0,
+        endTl = twCx.tlOnDisplay.length - 1;
+    if (l) {
+        var startTw = tweets[tweetsOnDisplay[tweetsOnDisplay.length - 1]].date_value,
+            endTw = tweets[tweetsOnDisplay[0]].date_value;
+    }
+    for (var i = 0; i < twCx.tlOnDisplay.length; i++) {
+        if (l) {
+            if (startTw >= twCx.tlOnDisplay[i].start && startTw < twCx.tlOnDisplay[i].end) {
+                startTl = i;
+            }
+            if (endTw >= twCx.tlOnDisplay[i].start && endTw < twCx.tlOnDisplay[i].end) {
+                endTl = i;
+            }
+        }
+        var displayData = {};
+        for (var j in annotations) {
+            displayData[j] = [];
+        }
+        for (var j in twCx.tlOnDisplay[i].tweets) {
+            var tweetid = twCx.tlOnDisplay[i].tweets[j],
+                tweet = tweetById(tweetid);
+            if (tweet) {
+                if (tweet.annotations.length) {
+                    for (var k in tweet.annotations) {
+                        displayData[tweet.annotations[k]].push(tweetid);
+                    }
+                } else {
+                    displayData['default'].push(tweetid);
+                }
+            }
+        }
+        var nbT = 0;
+        for (var j in displayData) {
+            nbT += displayData[j].length;
+        }
+        maxTweets = Math.max(maxTweets, nbT);
+        twCx.tlOnDisplay[i].displayData = displayData;
+        twCx.tlOnDisplay[i].totalTweets = nbT;
+    }
+    twCx.scaleX = ( twCx.tlWidth - twCx.deltaX ) / maxTweets;
+    tlPaper.clear();
+    relHover = null;
+    
+    // Dessin de la correspondance liste-timeline
+    if (l) {
+        var startY = twCx.tlHeight - startTl * twCx.scaleY,
+            endY = twCx.tlHeight - ( endTl + 1 ) * twCx.scaleY,
+            path = "M0 " + twCx.tlHeight + "C" + .7*twCx.deltaX + " " + twCx.tlHeight + " " + .3*twCx.deltaX + " " + startY + " " + twCx.deltaX + " " + startY + "L" + twCx.tlWidth + " " + startY + "L" + twCx.tlWidth + " " + endY + "L" + twCx.deltaX + " " + endY + "C" + .3*twCx.deltaX + " " + endY + " " + .7*twCx.deltaX + " 0 0 0";
+        tlPaper.path( path ).attr({ "stroke" : "none", "fill" : "#000080", "opacity" : .2 });
+    }   
+    // dessin de la date de début
+    
+    tlPaper.text(twCx.deltaX / 2, twCx.tlHeight - 7, new Date(twCx.tlOnDisplay[0].start).toTimeString().substr(0,5))
+        .attr({ "text-anchor" : "middle", "font-size": "9px" });
+    
+    // dessin de la date de fin
+    
+    tlPaper.text(twCx.deltaX / 2, 7, new Date(twCx.tlOnDisplay[twCx.tlOnDisplay.length - 1].end).toTimeString().substr(0,5))
+        .attr({ "text-anchor" : "middle", "font-size": "9px" });
+    
+    for (var i = 0; i < twCx.tlOnDisplay.length; i++) {
+        var n = 0,
+            posY = twCx.tlHeight - ( i + 1 ) * twCx.scaleY;
+        for (var j in twCx.tlOnDisplay[i].displayData) {
+            var ll = twCx.tlOnDisplay[i].displayData[j].length;
+            if (ll > 0) {
+                tlPaper.rect( twCx.deltaX + n * twCx.scaleX, posY, ll * twCx.scaleX, twCx.scaleY )
+                    .attr({"stroke" : "none", "fill" : getColor(j, .4).hex });
+                n += ll;
+            }
+        }
+        
+        // Si on est à une demi-heure, on trace un axe secondaire + heure
+        
+        if (i < twCx.tlOnDisplay.length - 1 && !(twCx.tlOnDisplay[i].end % 1800000)) {
+            tlPaper.path("M0 "+posY+"L" + twCx.tlWidth +" "+posY).attr({"stroke":"#ccc"});
+            tlPaper.text(twCx.deltaX / 2, posY, new Date(twCx.tlOnDisplay[i].end).toTimeString().substr(0,5)).attr({ "text-anchor" : "middle", "font-size": "9px" });
+        }
+    }
+    
+    // dessin du tweet courant
+    
+    if (l) {
+        
+        if (twCx.filtre) {
+            for (var i = 0; i < tweets.length; i++) {
+                if (i != p) {
+                    var pos = tlPosTweet(tweets[i]);
+                    if (pos) {
+                        drawTweetPos(pos, "#ffccff");
+                    }
+                }
+            }
+            
+        }
+        
+        var posp = tlPosTweet(tweets[p]);
+        if (posp) {
+            
+            drawTweetPos(posp, "#ffff00");
+            var yy = posp.y - .5 * twCx.scaleY,
+                path = "M0 " + ppy + "C" + ( .7 * twCx.deltaX ) + " " + ppy + " " + ( .2 * twCx.deltaX ) + " " + yy + " " + ( twCx.deltaX ) + " " + yy + "L" + ( posp.x - .5 * twCx.scaleX ) + " " + yy;
+            yy = posp.y + .5 * twCx.scaleY;
+            ppy += 117;
+            path += "L" + ( posp.x - .5 * twCx.scaleX ) + " " + yy + "L" + twCx.deltaX + " " + yy + "C"  + ( .2 * twCx.deltaX ) + " " + yy + " " + ( .7 * twCx.deltaX ) + " " + ppy + " 0 " + ppy;
+            tlPaper.path( path ).attr({"stroke":"#ffff00", "fill" : "#ffff00", "fill-opacity" : .15});
+            
+            drawTweetArcs(tweets[p], posp, '#800080');
+        }
+    }
+}
+
+function filtrerAnnotation(annotation) {
+    if (annotations[annotation]) {
+        effectuerFiltrage(annotations[annotation].display_name,
+            new RegExp( "(" + annotations[annotation].keywords.map(function(a) { return a.source }).join("|") + ")", "gi" ) );
+    } else {
+        effectuerFiltrage('', null)
+    }
+}
+
+function filtrerTexte(valeur) {
+    effectuerFiltrage( valeur, valeur ? new RegExp("(" + valeur.replace(/(\W)/g, '\\$1') + ")" ,'gi') : null );
+}
+
+function effectuerFiltrage(filtreTexte, tabRegexp) {
+    $("#recherche_annot").slideUp();
+    $("#inp_q").val(filtreTexte).attr("class","rechercheCourante");
+    twCx.filtreTexte = filtreTexte;
+    twCx.filtre = tabRegexp;
+    twCx.followLast = !tabRegexp && (twCx.position == twCx.idIndex[twCx.idIndex.length - 1]);
+    updateDisplay();
+}
+
+function clicTl(evt) {
+    var o = $("#timeline").offset();
+    if (twCx.tlMouseClicked && twCx.tlMouseMoved) {
+        var twid = tlIdFromPos(evt.pageX - o.left + twCx.refPosTl.x - twCx.refMouse.x, evt.pageY - o.top + twCx.refPosTl.y - twCx.refMouse.y, true);
+        if (twid) {
+            selectTweet(twid.id);
+        }
+    } else {
+        var twid = tlIdFromPos(evt.pageX - o.left, evt.pageY - o.top, twCx.tlMouseClicked);
+        if (twCx.tlMouseMoved && !twCx.tlMouseClicked) { 
+            if (twid) {
+                rolloverTweet(twid.id, true, twid.annotation);
+            } else {
+                $("#hovertweet").hide();
+            }
+        }
+        if (twCx.tlMouseClicked && !twCx.tlMouseMoved) {
+            if (twid) {
+                selectTweet(twid.id);
+            }
+        }
+    }
+}
+
+function loadTweets(tweets, append) {
+    if (!append) {
+        twCx.timeline = [];
+        twCx.idIndex = [];
+        twCx.tweets = [];
+    }
+    for (var i in tweets) {
+        addTweet(tweets[i]);
+    }
+    if (twCx.followLast) {
+        twCx.position = twCx.idIndex[twCx.tweets.length - 1];
+    }
+    updateDisplay();
+}
+
+function focusOutRecherche() {
+    $("#recherche_annot").slideUp();
+    var inpq = $("#inp_q"),
+        val = inpq.val();
+    if (val == '' || val == twCx.filtreTexte) {
+        if (twCx.filtre) {
+            inpq.attr("class", "rechercheCourante").val(twCx.filtreTexte);
+        } else {
+            inpq.attr("class", "greyed").val(l10n.rechercher);
+        }
+    }
+}
+
+function chaineTimeZoom() {
+    var chaine = "",
+        t = twCx.date_levels[twCx.timeLevel],
+        h = 3600*1000,
+        m = 60*1000,
+        s = 1000,
+        heures = Math.floor(t/h);
+    if (heures) { chaine += heures + ' h. ' };
+    t -= (heures * h);
+    var minutes = Math.floor(t/m);
+    if (minutes) { chaine += minutes + ' min. ' };
+    t -= (minutes * m);
+    if (t) { chaine += Math.floor(t/s) + ' sec.' }
+    $("#time_scale").html(chaine);
+    $("#time_zoomout").attr("class",(twCx.timeLevel == 0 ? "inactive" : ""));
+    $("#time_zoomin").attr("class",(twCx.timeLevel == twCx.date_levels.length - 1 ? "inactive" : ""));
+}
+
+$(document).ready(function() {
+    tlPaper = Raphael("timeline", twCx.tlWidth, twCx.tlHeight);
+    
+    connectTweets();
+    
+    var html = '';
+    for (var j in annotations) {
+        if (j != "default") {
+            html += '<a href="#" style="background: ' + getColor(j, .7).hex + ';" onclick=filtrerAnnotation(\'' + j + '\'); return false;">' + annotations[j].display_name + '</a> '
+        }
+    }
+    $("#rech_list_annot").html(html);
+    
+    chaineTimeZoom();
+    
+    $("#tweetlist").mousewheel(function(e, d) {
+        wheelDelta += d;
+        if (Math.abs(wheelDelta) >= 1) {
+            movePos( parseInt(wheelDelta) );
+            wheelDelta = 0;
+        }
+        return false;
+    });
+    $("#timeline").mousewheel(function(e, d) {
+        wheelDelta += d;
+        if (Math.abs(wheelDelta) >= 1) {
+            if (wheelDelta > 0) {
+                tl = Math.min(twCx.date_levels.length - 1, twCx.timeLevel + 1);
+            } else {
+                tl = Math.max(0, twCx.timeLevel - 1);
+            }
+            if (tl != twCx.timeLevel) {
+                twCx.timeLevel = tl;
+                chaineTimeZoom();
+                updateDisplay();
+            }
+            wheelDelta = 0;
+        }
+        return false;
+    });
+    $("#time_zoomin").click(function() {
+        if (twCx.timeLevel < twCx.date_levels.length - 1) {
+            twCx.timeLevel++;
+            chaineTimeZoom();
+            updateDisplay();
+        }
+    });
+    $("#time_zoomout").click(function() {
+        if (twCx.timeLevel > 0) {
+            twCx.timeLevel--;
+            chaineTimeZoom();
+            updateDisplay();
+        }
+    });
+    $("#timeline, #tweetlist").mouseout(function() {
+        twCx.tlMouseClicked = false;
+        twCx.tlMouseMoved = false;
+        $("#hovertweet").hide();
+    });
+    $("#timeline").mousemove(function(evt) {
+        twCx.tlMouseMoved = true;
+        clicTl(evt);
+    });
+    $("#timeline").mousedown(function(evt) {
+        twCx.tlMouseClicked = true;
+        twCx.tlMouseMoved = false;
+        var o = $(this).offset();
+        twCx.refMouse = { x : evt.pageX - o.left, y : evt.pageY - o.top };
+        twCx.refPosTl = tlPosTweet(tweetById(twCx.position)) || twCx.refMouse;
+    });
+    $("#timeline").mouseup(function(evt) {
+        clicTl(evt);
+        twCx.tlMouseClicked = false;
+        twCx.tlMouseMoved = false;
+    });
+    $("#inp_q").focus(function() {
+        $("#recherche_annot").slideDown();
+        $(this).val($(this).val().replace(/ \(.+\)$/, ''))
+        if ($(this).hasClass("greyed")) {
+            $(this).val("");
+        }
+        $(this).attr("class","");
+    });
+    $("#inp_q").focusout(function() {
+        focusOutRecherche();
+    });
+    $("#inp_reset").click(function() {
+        $("#inp_q").val('');
+        if (twCx.filtre) {
+            twCx.filtre = null;
+            updateDisplay();
+        }
+        twCx.filtreTexte = '';
+        focusOutRecherche();
+        return false;
+    })
+    $("#recherche").submit(function(evt) {
+        evt.preventDefault();
+        if (!$("#inp_q").hasClass("greyed")) {
+            var valeur = $("#inp_q").val();
+            filtrerTexte(valeur);
+        }
+        return false;
+    });
+    
+    setInterval(function() {
+        var sc = $("#scrollcont");
+        if (sc.scrollTop() != lastScrollPos && twCx.tweets) {
+            var p = Math.floor( twCx.currentIdIndex.length * ( 1 - sc.scrollTop() / scrollExtent ) );
+            goToPos(p);
+        }
+        
+    }, 100)
+});
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/underscore/underscore-min.js	Tue Dec 13 19:01:59 2011 +0100
@@ -0,0 +1,30 @@
+// Underscore.js 1.2.2
+// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function r(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(b.isFunction(a.isEqual))return a.isEqual(c);if(b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return String(a)==String(c);case "[object Number]":return a=+a,c=+c,a!=a?c!=c:a==0?1/a==1/c:a==c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&r(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(m.call(a,h)&&(f++,!(g=m.call(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(m.call(c,
+h)&&!f--)break;g=!f}}d.pop();return g}var s=this,F=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,G=k.unshift,l=p.toString,m=p.hasOwnProperty,v=k.forEach,w=k.map,x=k.reduce,y=k.reduceRight,z=k.filter,A=k.every,B=k.some,q=k.indexOf,C=k.lastIndexOf,p=Array.isArray,H=Object.keys,t=Function.prototype.bind,b=function(a){return new n(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else typeof define==="function"&&define.amd?
+define("underscore",function(){return b}):s._=b;b.VERSION="1.2.2";var j=b.each=b.forEach=function(a,c,b){if(a!=null)if(v&&a.forEach===v)a.forEach(c,b);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(b,a[e],e,a)===o)break}else for(e in a)if(m.call(a,e)&&c.call(b,a[e],e,a)===o)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(w&&a.map===w)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=
+d!==void 0;a==null&&(a=[]);if(x&&a.reduce===x)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){a==null&&(a=[]);if(y&&a.reduceRight===y)return e&&(c=b.bind(c,e)),d!==void 0?a.reduceRight(c,d):a.reduceRight(c);a=(b.isArray(a)?a.slice():b.toArray(a)).reverse();return b.reduce(a,c,d,e)};b.find=b.detect=function(a,c,b){var e;
+D(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(z&&a.filter===z)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(A&&a.every===A)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b,a,g,h)))return o});
+return e};var D=b.some=b.any=function(a,c,d){var c=c||b.identity,e=false;if(a==null)return e;if(B&&a.some===B)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return q&&a.indexOf===q?a.indexOf(c)!=-1:b=D(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(c.call?c||a:a[c]).apply(a,d)})};b.pluck=function(a,c){return b.map(a,function(a){return a[c]})};
+b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});return e.value};b.shuffle=function(a){var c=[],b;
+j(a,function(a,f){f==0?c[0]=a:(b=Math.floor(Math.random()*(f+1)),c[f]=c[b],c[b]=a)});return c};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,c){var b=a.criteria,d=c.criteria;return b<d?-1:b>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,c){var b=e(a,c);(d[b]||(d[b]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<
+f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=b.tail=function(a,b,d){return i.call(a,b==null||
+d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);return e};b.union=function(){return b.uniq(b.flatten(arguments,
+true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a,c){return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(q&&a.indexOf===q)return a.indexOf(c);
+for(d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(C&&a.lastIndexOf===C)return a.lastIndexOf(b);for(var d=a.length;d--;)if(a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};var E=function(){};b.bind=function(a,c){var d,e;if(a.bind===t&&t)return t.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;
+e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));E.prototype=a.prototype;var b=new E,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,c){var d={};c||(c=b.identity);return function(){var b=c.apply(this,arguments);return m.call(d,b)?d[b]:d[b]=a.apply(this,arguments)}};b.delay=
+function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=
+null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments));return b.apply(this,d)}};b.compose=function(){var a=i.call(arguments);return function(){for(var b=i.call(arguments),d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=H||function(a){if(a!==
+Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)m.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?
+a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(m.call(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=l.call(arguments)=="[object Arguments]"?function(a){return l.call(a)=="[object Arguments]"}:
+function(a){return!(!a||!m.call(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};
+b.isUndefined=function(a){return a===void 0};b.noConflict=function(){s._=F;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),function(c){I(c,b[c]=a[c])})};var J=0;b.uniqueId=function(a){var b=J++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,
+interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape,function(a,b){return"',_.escape("+b.replace(/\\'/g,"'")+"),'"}).replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,"'")+",'"}).replace(d.evaluate||null,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,
+"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e(a,b)}};var n=function(a){this._wrapped=a};b.prototype=n.prototype;var u=function(a,c){return c?b(a).chain():a},I=function(a,c){n.prototype[a]=function(){var a=i.call(arguments);G.call(a,this._wrapped);return u(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];n.prototype[a]=function(){b.apply(this._wrapped,
+arguments);return u(this._wrapped,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];n.prototype[a]=function(){return u(b.apply(this._wrapped,arguments),this._chain)}});n.prototype.chain=function(){this._chain=true;return this};n.prototype.value=function(){return this._wrapped}}).call(this);
--- a/web/traduction.php	Mon Dec 12 14:26:20 2011 +0100
+++ b/web/traduction.php	Tue Dec 13 19:01:59 2011 +0100
@@ -141,7 +141,18 @@
 										Suite a cette phase d’annotation, vous trouverez à droite de ce texte <b>la version alpha</b> de l'interface de navigation et de représentation de la polémique durant la conférence.
 										<br/><br/>
 										Ce dispositif, outre qu’il approfondit la dimension critique de la discussion avec la salle et les auditeurs présents ou distants, permet ainsi également de pérenniser et de valoriser les commentaires produits en les rendant accessibles en temps différé lors de tout visionnage ultérieur de la vidéo.",
-				"changer de contenu"  => "Changer de contenu"
+				"changer de contenu"  => "Changer de contenu",
+				
+				// Polemic Tweet Tweetcast (rv)
+				
+				"Rechercher" => "Rechercher",
+				"Tagcloud" => "Nuage de mots-clés contextuel",
+				"SearchByPolemic" => "Rechercher par polémique",
+				"Agree" => "accord",
+				"Disagree" => "désaccord",
+				"Question" => "question",
+				"Reference" => "référence"
+				
 				);
                               
 $english = array(
@@ -227,11 +238,11 @@
 				"splatchPageTitle"=> "Polemic tweet annotation ",
 				"splatchPageText" => "When tweeting the live conference, you can qualify your tweets using the polemical syntax . After the event your tweets will be synchronized with the conference video recording.",
 				"clientTitle"	  => "Annotation polémique par tweet",
-				'Libre accès' 	  => 'Read onlys access',
+				'Libre accès' 	  => 'Read only access',
 				'Envoyer'		  => 'Send',
-				'Erreur1'		  => "Ooups! it's a bug you have one coin to kick the developper ;-) :",
+				'Erreur1'		  => "Oops! it's a bug you have one coin to kick the developper ;-) :",
 				"Envoyé"		  => "Your tweet is sent !",
-				"Vous n'êtes pas connecté."=> "You are not login.<br> To post, you must be login, click here.",
+				"Vous n'êtes pas connecté."=> "You are not logged in.<br>To post, click here and log in with your Twitter account.",
 				"ClientTitle1 :"  => "Polemic tweet",
 				
 				
@@ -270,7 +281,17 @@
 					discussion with the present or distant audience, allows also to
 					perpetuate and promote the published comments by making them
 					accessible at any time deferred later viewing of the video.",
-				"changer de contenu"  => "Change content"
+				"changer de contenu"  => "Change content",
+				
+                // Polemic Tweet Tweetcast (rv)
+                
+                "Rechercher" => "Search",
+                "Tagcloud" => "Contextual keyword cloud",
+                "SearchByPolemic" => "Search by polemic",
+                "Agree" => "agree",
+                "Disagree" => "disagree",
+                "Question" => "question",
+                "Reference" => "reference"
 				);
                 
 $japan = array(
@@ -391,6 +412,16 @@
 				そのようにして集積されたアノテーションは、専用のナビゲーション・インターフェイスとして表現され、そのイベントに関する論争の状態を可視化します。この文の右側→にある動画プレイヤーが、まさにその<b>アルファ版</b>というわけです。
 				<br/><br/>
 				このデバイスを通じて、イベントの現場にいる観客が遠隔の視聴者と議論をおこない、批評を深められるだけでなく、コメントは後からビデオを視聴するときにも参照できるので、意見を永続化させ、更に促進させていくことも可能になっています。",
-				"changer de contenu"  => "ビデオを変更"
+				"changer de contenu"  => "ビデオを変更",
+                
+                // Polemic Tweet Tweetcast (rv)
+                
+                "Rechercher" => "Search",
+                "Tagcloud" => "Contextual keyword cloud",
+                "SearchByPolemic" => "Search by polemic",
+                "Agree" => "agree",
+                "Disagree" => "disagree",
+                "Question" => "question",
+                "Reference" => "reference"
 );
 ?>
\ No newline at end of file