/*
*
* Copyright 2010 Institut de recherche et d'innovation
* contributor(s) : Samuel Huron
*
* contact@iri.centrepompidou.fr
* http://www.iri.centrepompidou.fr
*
* This software is a computer program whose purpose is to show and add annotations on a video .
* This software is governed by the CeCILL-C license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL-C
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
// CHART TIMELINE / VERSION PROTOTYPE ::
var RAWTweets;
var userPol = new Array();
var userNoPol = new Array();
var numberOfTweet = 0;
var Users;
var TweetPolemic;
var yMax = config.height;
var PaperSlider;
var heightOfChart;
var tweets = new Array();
// Make and define the Raphael area
//var paper = Raphael(document.getElementById(config.target),config.width, config.height);
function ChartTimeLine (){
// variable
// yMax
var yCoef = 2; // coef for height of 1 tweet
var frameSize = 5; // frame size
var margin = 1; // marge between frame
var lineSize = config.width; // timeline pixel width
var nbrframes = lineSize/frameSize; // frame numbers
var numberOfTweet = 0; // number of tweet overide later
var duration = config.duration; // timescale width
var frameLenght = lineSize/frameSize; // frame timescale
var timeline;
var colors = new Array("","#1D973D","#C5A62D","#CE0A15","#036AAE","#585858");
// array
//var tweets = new Array();
var element = new Array();
var cluster = new Array();
var frames = new Array(frameLenght);
var slices = new Array();
// Classes =======================================================================
var Frames = function(){
var Myclusters;
var x;
var y;
var width;
var height;
};
Frames = function(json){
// make my clusters
// ou Frame vide
};
Frames.prototype.draw = function(){
};
Frames.prototype.zoom = function(){
};
Frames.prototype.inside = function(){
};
var Clusters = function(){
var Object;
var yDist;
var x;
var y;
var width;
var height;
};
Clusters = function(json){
// make my object
};
var Tweet = function(){
};
// Classes =======================================================================
// trace function
var traceNum = 0;
function trace(msg,value){
traceNum += 1;
__IriSP.jQuery("<div>"+traceNum+" - "+msg+" : "+value+"</div>").appendTo("#output");
}
// Refactoring (parametere) ************************************************************
// color translastion
var qTweet_0 =0;
var qTweet_Q =0;
var qTweet_REF=0;
var qTweet_OK =0;
var qTweet_KO =0;
function colorTranslation(value){
if(value == "Q"){
qTweet_Q+=1;
return 2;
}else if(value =="REF"){
qTweet_REF+=1;
return 4;
}else if(value =="OK"){
qTweet_OK+=1;
return 1;
}else if(value =="KO"){
qTweet_KO+=1;
return 3;
}else if(value ==""){
qTweet_0+=1;
return 5;
}
}
// Refactoring (parametere) ************************************************************
// load tweets send in parameters
__IriSP.jQuery.ajax({
dataType: "jsonp",
url:config.metadata,
success : function(json){
trace("load","");
// get current view (the first ???)
view = json.views[0];
// the tweets are by definition of the second annotation type
tweet_annot_type = null;
if(typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
tweet_annot_type = view.annotation_types[1];
}
RAWTweets = json.annotations;
__IriSP.jQuery.each(json.annotations, function(i,item) {
var MyTime = Math.floor(item.begin/duration*lineSize);
var Myframe = Math.floor(MyTime/lineSize*frameLenght);
if (typeof(item.meta) !== "undefined"
&& typeof(item.meta["id-ref"]) !== "undefined"
&& item.meta["id-ref"] === tweet_annot_type) {
var MyTJson = JSON.parse(item.meta['dc:source']['content']);
if (item.content['polemics'] != undefined
&& item.content['polemics'][0] != null) {
//console.log(item.meta['dc:source']['content']);
for(var j=0; j<item.content['polemics'].length; j++){
tweets[numberOfTweet] = {
id:i,
qualification:colorTranslation(item.content['polemics'][j]),
yIndicator:MyTime,
yframe:Myframe,
title:item.content['title'],
timeframe:item.begin,
userId: MyTJson.id,
userScreenName: MyTJson.screen_name,
tsource:MyTJson
};
numberOfTweet+=1;
}
}
else {
//trace("k = ",i);
tweets[numberOfTweet] = {
id:i,
qualification:colorTranslation(""),
yIndicator:MyTime,
yframe:Myframe,
title:item.content['title'],
timeframe:item.begin,
userId: MyTJson.id,
userScreenName: MyTJson.screen_name,
tsource:MyTJson
};
numberOfTweet+=1;
}
}
else {
//trace("tweet qualification = ","null");
}
});
DrawTweets ();
if(numberOfTweet>0){Report();}
}
});
function pourcent(value,max){
var myPourcentage = Math.round(value/max*1000)/10;
return myPourcentage;
}
function round2Dec(value){
var myValueRounded = Math.round(value*100)/100;
return myValueRounded
}
function searchKeyValueArray(mykey,myvalue,myarray){
for(var i=0; i<myarray.length; i++) {
if(myarray[i][mykey]==myvalue){
return i;
console.log("trouvé !");
}
}
return true;
}
var tweetConversationel = new Array();
var tweetConversationelSP = 0;
var tweetClient = new Array();
var tweetRetweet = new Array();
var maxRetweet
function tweetRetweetCount(mytweet){
tweet = mytweet.tsource
var retweetIsHere = false;
var myRT = {
id:'',
tweet:tweet,
total:1,
SPtraine:''
}
if(tweet.retweet_count>0){
for(var i=0; i<tweetRetweet.length; i++){
if(tweetRetweet[i].id==myRT.id){
myRT = tweetRetweet[i];
retweetIsHere=true;
}
}
if (mytweet.qualification==5){
myTclient.numberNsp+=1;
}else{
myTclient.numberSp+=1;
}
if(retweetIsHere==false){
tweetRetweet.push(myRT);
}else{
myRT.total+=1;
}
}
}
function tweetRetweetReport(tweet){
}
function tweetClientCount(tweet){
var myTclient = {
client:tweet.tsource.source,
numberNsp:0,
numberSp:0,
total:1,
}
var clientIsHere = false;
for(var i=0; i<tweetClient.length; i++) {
if (tweetClient[i].client==tweet.tsource.source){
clientIsHere = true;
myTclient = tweetClient[i];
}
}
if (tweet.qualification==5){
myTclient.numberNsp+=1;
}else{
myTclient.numberSp+=1;
}
if(clientIsHere==false){
tweetClient.push(myTclient);
}else{
myTclient.total+=1
}
}
function tweetClientSort(a,b){
return (a.total < b.total)?1:-1;
}
function tweetClientReport(){
tweetClient.sort(tweetClientSort);
console.log("_______________________________");
for(var i=0; i<tweetClient.length; i++) {
if(tweetClient[i].total>1){
console.log("t: "+tweetClient[i].total+" / sp :"+tweetClient[i].numberSp+" : "+tweetClient[i].client);
}
}
console.log(JSON.stringify(tweetClient));
}
function conversationalCount(tweet){
if(tweet.tsource.entities.user_mentions.length>2){
if (tweet.qualification!=5){
tweetConversationelSP+=1;
}
var myTc = {
polemique:tweet.qualification,
user_mentions:tweet.tsource.entities.user_mentions,
tsource:tweet
}
tweetConversationel.push(myTc);
}
}
function conversationalReport(){
console.log("_______________________________");
console.log("tweets conversationel : "+tweetConversationel.length);
console.log("tweets conversationel sp : "+pourcent(tweetConversationelSP,tweetConversationel.length));
console.log("tweets conversationel nsp: "+pourcent(tweetConversationel.length-tweetConversationelSP,tweetConversationel.length));
}
function tweetsStats(){
for(var i=0; i<tweets.length; i++) {
conversationalCount(tweets[i])
tweetClientCount(tweets[i]);
//tweetRetweetCount(tweets[i]);
}
conversationalReport();
tweetClientReport();
}
function numberUserUsePolemic(){
for(var i=0; i<tweets.length; i++) {
/*
var searchKeyValueArrayTest = searchKeyValueArray('userId',tweets[i].userId,userPol);
myUser = {
userId: tweets[i].userId,
userScreenName: tweets[i].userScreenName,
};
if(searchKeyValueArrayTest==true){
myUser = userPol.push({
userId: tweets[i].userId,
userScreenName: tweets[i].userScreenName,
tweets:[]
});
if (tweets[i].qualification!=5){
}else{
}
}
*/
if (tweets[i].qualification!=5){
var searchKeyValueArrayTest = searchKeyValueArray('userId',tweets[i].userId,userPol);
if(searchKeyValueArrayTest==true){
myUser = userPol.push({
userId: tweets[i].userId,
userScreenName: tweets[i].userScreenName,
tweets:[]
});
//var myUTweets = myUser.tweets = new Array();
//myUTweets.push(tweets[i]);
}
}else{
var searchKeyValueArrayTest = searchKeyValueArray('userId',tweets[i].userId,userPol);
if(searchKeyValueArrayTest==true){
myUser = userNoPol.push({
userId: tweets[i].userId,
userScreenName: tweets[i].userScreenName,
tweets:[]
});
}
}
}
console.log("user SP : "+userPol.length);
console.log("user nSP : "+userNoPol.length);
console.log("nbrTP / user SP : "+round2Dec((numberOfTweet-qTweet_0)/userPol.length));
console.log("nbrT / user nSP : "+round2Dec((numberOfTweet-qTweet_0)/userNoPol.length));
}
function Report(){
console.log("_______________________________");
console.log("Total de tweets : "+numberOfTweet)
console.log("Total de tweets P : "+(numberOfTweet-qTweet_0)+" "+ pourcent((numberOfTweet-qTweet_0),numberOfTweet)+"%")
console.log("accord : "+qTweet_OK+" "+pourcent(qTweet_OK,numberOfTweet)+" %");
console.log("desaccord : "+qTweet_KO+" "+pourcent(qTweet_KO,numberOfTweet)+" %");
console.log("question : "+qTweet_Q+" "+pourcent(qTweet_Q,numberOfTweet)+" %");
console.log("reference : "+qTweet_REF+" "+pourcent(qTweet_REF,numberOfTweet)+" %");
console.log("sans polemic : "+qTweet_0+" "+pourcent(qTweet_0,numberOfTweet)+" %");
numberUserUsePolemic();
tweetsStats();
}
// tweet Drawing (in raphael)
function DrawTweets (){
// GROUPES TWEET ============================================
// Count nbr of cluster and tweet in a frame an save int in "frames"
numberOfTweet = tweets.length;
for(var i=0; i<nbrframes; i++) {
for(var j=0; j<numberOfTweet; j++) {
if (i==tweets[j].yframe){
var k = tweets[j].qualification;
// make array for frame cluster
if(frames[i]==undefined){
frames[i] = {id:i,
qualifVol:new Array(),
mytweetsID:new Array()
};
}
// add my tweet to frame
frames[i].mytweetsID.push(tweets[j]);
// count opinion by frame
if( frames[i].qualifVol[k] == undefined){
frames[i].qualifVol[k] = 1;
}else{
frames[i].qualifVol[k] += 1;
}
}
}
}
// GROUPES TWEET ============================================
// max of tweet by Frame
var max = 0;
for(var i=0; i<nbrframes; i++) {
var moy = 0;
for (var j=0; j<6; j++){
if (frames[i]!=undefined){
if (frames[i].qualifVol[j]!=undefined){
moy += frames[i].qualifVol[j];
}
}
}
//trace("frame "+i,moy);
if (moy>max){max=moy;}
}
var tweetDrawed = new Array();
var TweetHeight = 5;
// DRAW TWEETS ============================================
for(var i=0; i<nbrframes;i++) {
var addEheight = 5;
if (frames[i]!=undefined){
trace (i+" k=",frames[i].mytweetsID.length);
// by type
for (var j=6; j>-1; j--){
if (frames[i].qualifVol[j]!=undefined){
// show tweet by type
for (var k=0; k<frames[i].mytweetsID.length; k++){
if (frames[i].mytweetsID[k].qualification==j){
var y=config.heightmax-addEheight;
if(yMax>y){yMax=y;}
e = paper.rect( i*frameSize, // x
y, // y
frameSize-margin, // width
TweetHeight // height
).attr({stroke:"#00","stroke-width":0.1, fill: colors[j]});
addEheight +=TweetHeight;
e.time= frames[i].mytweetsID[k].timeframe;
e.title= frames[i].mytweetsID[k].title;
e.mouseover(function () {
//this.attr({stroke:"#fff","stroke-width":5});
//this.toFront();
}).mouseout(function () {
//this.attr({stroke:"#00","stroke-width":0.1});
}).mousedown(function () {
__IriSP.MyApiPlayer.seek(this.time/1000);
});
__IriSP.jQuery(e.node).attr('id', 't'+k+'');
__IriSP.jQuery(e.node).attr('title', frames[i].mytweetsID[k].title);
__IriSP.jQuery(e.node).attr('begin', frames[i].mytweetsID[k].timeframe);
var tempPosition = {x:i*frameSize,y:config.heightmax-addEheight};
addTip(e.node, frames[i].mytweetsID[k].title,colors[j],tempPosition);
//frames[i].mytweetsID.pop();
}
}
}
}
}
}
// DRAW UI :: resize border and bgd
heightOfChart = (yMax-(config.height-yMax));
PaperBackground = paper.rect(0,yMax,config.width,heightOfChart).attr({fill:"#fff","stroke-width":0.1,opacity: 0.1});
PaperBorder = paper.rect(0,yMax,config.width,1).attr({fill:"#fff",stroke: "none",opacity: 1});
PaperSlider = paper.rect(0,20,1,heightOfChart).attr({fill:"#fff",stroke: "none",opacity: 1});
// decalage
tweetSelection = paper.rect(-100,-100,5,5).attr({fill:"#fff",stroke: "none",opacity: 1});
PaperSlider.toFront();
PaperBackground.toBack();
}
if(typeof(PaperSlider) !== 'undefined' ) {
PaperSlider.toFront();
}
Report();
}
jQuery(document).mousemove(function(e){
if (over){
__IriSP.jQuery("#tip").css("left", e.pageX-106).css("top", e.pageY-160);
__IriSP.jQuery("#tipcolor").css("background-color", tipColor);
__IriSP.jQuery("#tiptext").text(tipText);
__IriSP.jQuery("#tip").show();
}else{
if (typeof(__IriSP) !== 'undefined' && typeof(__IriSP.jQuery) === 'function') {
__IriSP.jQuery("#tip").css("left", -10000).css("top", -100000);
//tweetSelection.attr({x:-100,y:-100});
}
}
});
var over = false;
var tipText = "";
var tipColor = "#efefef";
var tweetSelection;
var PaperSlider;
// AddTip ******************************************************************************
function addTip(node, txt,color,tempPosition){
__IriSP.jQuery(node).mouseover(function(){
tipText = txt;
//tip.hide();//fadeIn(0);
tipColor = color;
over = true;
//tweetSelection.attr(tempPosition);
//tweetSelection.toFront();
}).mouseout(function(){
//tip.show()//tip.fadeOut(0);
over = false;
});
}
jQuery(document).ready(function() {
if (typeof(__IriSP) !== 'undefined' && typeof(__IriSP.jQuery) === 'function') {
__IriSP.jQuery("#tip").hide();
}
});