--- 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"> </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é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"> </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é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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};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