changeset 6:9d2f4e6a3f36

color coding in client ui
author mgeorgi
date Fri, 22 Jun 2012 10:14:12 +0100
parents 02b4c5e122e8
children 6bb7132fe78e
files mcserver/.DS_Store mcserver/static/app.js mcserver/static/app.js~ mcserver/static/index.html mcserver/static/index.html~ mcserver/static/moods.csv nodejs-server/app.js nodejs-server/app.js~ nodejs-server/index.html nodejs-server/index.html~ nodejs-server/moods.csv nodejs-server/server.js
diffstat 12 files changed, 351 insertions(+), 261 deletions(-) [+]
line wrap: on
line diff
Binary file mcserver/.DS_Store has changed
--- a/mcserver/static/app.js	Sun Jun 17 00:00:01 2012 +0100
+++ b/mcserver/static/app.js	Fri Jun 22 10:14:12 2012 +0100
@@ -8,28 +8,95 @@
     this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
     this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
     
-    this.request("/moodconductor/moods.csv", this.loadCSV.bind(this));
+    this.request("/moods.csv", this.loadMoods.bind(this));
+    this.background();
   },
 
-  loadCSV: function(text) {
+  tl: { r: 200, g: 0, b: 0 },
+  tr: { r: 200, g: 150, b: 0 },
+  bl: { r: 0, g: 50, b: 100 },
+  br: { r: 200, g: 230, b: 80 },
+  
+  interpolateColor: function(a, b, x) {
+    return {
+      r: Math.floor(a.r + (b.r - a.r) * x),
+      g: Math.floor(a.g + (b.g - a.g) * x),
+      b: Math.floor(a.b + (b.b - a.b) * x)
+    };
+  },
+
+  background: function() {
+    var step = 20;
+    var ctx = this.canvas.getContext("2d");  
+    ctx.clearRect(0, 0, 320, 320);
+
+    for (var y = 0; y < 320; y += step) {
+      var left = this.interpolateColor(this.tl, this.bl, y / 320);
+      var right = this.interpolateColor(this.tr, this.br, y / 320);
+      for (var x = 0; x < 320; x += step) {
+        var color = this.interpolateColor(left, right, x / 320);
+        ctx.fillStyle = "rgb(" + color.r + "," + color.g + "," + color.b + ")";
+        ctx.fillRect(x, y, step, step);
+      }
+    }
+    ctx.strokeStyle = "rgb(0,0,0)";
+    ctx.moveTo(0, 160);
+    ctx.lineTo(320, 160);
+    ctx.stroke();
+    
+    ctx.fillStyle = "rgb(0,0,0)";
+    ctx.beginPath();
+    ctx.moveTo(320, 160);
+    ctx.lineTo(310, 150);
+    ctx.lineTo(310, 170);
+    ctx.fill();
+
+    ctx.strokeStyle = "rgb(0,0,0)";
+    ctx.moveTo(160, 320);
+    ctx.lineTo(160, 0);
+    ctx.stroke();
+    
+    ctx.fillStyle = "rgb(0,0,0)";
+    ctx.beginPath();
+    ctx.moveTo(160, 0);
+    ctx.lineTo(150, 10);
+    ctx.lineTo(170, 10);
+    ctx.fill();
+
+    ctx.font = "16px Arial";
+    ctx.fillText("Valence", 200, 158);  
+    
+    ctx.save();
+    ctx.translate(158, 120);
+    ctx.rotate(Math.PI * 1.5);
+    ctx.font = "16px Arial";
+    ctx.fillText("Arousal", 0, 0);  
+    ctx.restore();
+  },
+
+  loadMoods: function(text) {
     this.moods = [];
 
     var lines = text.split("\n");
-
+    
     for (var i = 1; i < lines.length; i++) {
       var row = lines[i].split(",");
-      this.moods.push({
-        label: row[1], 
-        x: Number(row[3]), 
-        y: Number(row[5])
-      });
+      var mood = {
+        label: row[0],
+        val: Number(row[1]), 
+        aro: Number(row[2]),
+        dom: Number(row[3])
+      };
+      this.moods.push(mood);
     }
   },
-  
+ 
   request: function(url, callback) {
     var request = new XMLHttpRequest();
     request.onreadystatechange = function() {
-      callback(request.responseText);
+      if (callback) {
+        callback(request.responseText);
+      }
     }.bind(this);
     request.open("GET", url);
     request.send(null);
@@ -52,21 +119,28 @@
   },
 
   setMarker: function(pageX, pageY) {
-    this.marker.style.left = pageX + 'px';
-    this.marker.style.top = pageY + 'px';
-    
-    var x = 1 - pageX / 480;
-    var y = 1 - pageY / 960;
+    this.background();
+    this.drawMarker(pageX, pageY);
+
+    var x = pageX / 320;
+    var y = 1 - pageY / 320;
     
     var mood = this.findMood(x, y);
 
-    this.marker.innerHTML = mood.label;
-   
     if (mood != this.mood) {
+      this.label.innerHTML = mood.label;
       this.mood = mood;
-      this.request("/moodconductor/mood?x=" + x + "&y=" + y);
+      this.request("/mood?x=" + x + "&y=" + y);
     }
   },
+  
+  drawMarker: function(x, y) {
+    var ctx = this.canvas.getContext("2d");  
+    ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
+    ctx.beginPath();
+    ctx.arc(x, y, 20, 0, Math.PI*2, true); 
+    ctx.fill();
+  },
 
   findMood: function(x, y) {
     var distance = 1;
@@ -74,8 +148,8 @@
     
     for (var i = 0; i < this.moods.length; i++) {
       var mood = this.moods[i];
-      var dx = Math.abs(mood.x - x);
-      var dy = Math.abs(mood.y - y);
+      var dx = Math.abs(mood.val - x);
+      var dy = Math.abs(mood.aro - y);
       var d = Math.sqrt(dx * dx + dy * dy);
 
       if (d < distance) {
--- a/mcserver/static/app.js~	Sun Jun 17 00:00:01 2012 +0100
+++ b/mcserver/static/app.js~	Fri Jun 22 10:14:12 2012 +0100
@@ -8,28 +8,51 @@
     this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
     this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
     
-    this.request("/moods.csv", this.loadCSV.bind(this));
+    this.request("/moods.csv", this.loadMoods.bind(this));
+    this.request("/colors.txt", this.loadColors.bind(this));
   },
 
-  loadCSV: function(text) {
+  loadMoods: function(text) {
     this.moods = [];
 
     var lines = text.split("\n");
+    
+    for (var i = 1; i < lines.length; i++) {
+      var row = lines[i].split(",");
+      var mood = {
+        label: row[1], 
+        x: Number(row[3]), 
+        y: Number(row[5])
+      };
+
+      // var div = document.createElement('div');
+      // this.canvas.appendChild(div);
+      // div.style.position = 'absolute';
+      // div.style.left = mood.x * 320 + 'px';
+      // div.style.top = mood.y * 320 + 'px';
+      // div.innerHTML = mood.label;
+      
+      this.moods.push(mood);
+    }
+  },
+
+  loadColors: function(text) {
+    this.colors = {};
+
+    var lines = text.split("\n");
 
     for (var i = 1; i < lines.length; i++) {
-      var row = lines[i].split(",");
-      this.moods.push({
-        label: row[1], 
-        x: Number(row[3]), 
-        y: Number(row[5])
-      });
+      var row = lines[i].split("\t");
+      this.colors[row[0]] = row[2];
     }
   },
   
   request: function(url, callback) {
     var request = new XMLHttpRequest();
     request.onreadystatechange = function() {
-      callback(request.responseText);
+      if (callback) {
+        callback(request.responseText);
+      }
     }.bind(this);
     request.open("GET", url);
     request.send(null);
@@ -51,30 +74,39 @@
     this.setMarker(event.pageX, event.pageY);
   },
 
-  setMarker: function(x, y) {
-    this.marker.style.left = x + 'px';
-    this.marker.style.top = y + 'px';
+  setMarker: function(pageX, pageY) {
+    this.marker.style.left = pageX + 'px';
+    this.marker.style.top = pageY + 'px';
     
-    var _x = x / 480;
-    var _y = y / 960;
-    var match = {
-      dx: 1,
-      dy: 1,
-      index: null
-    };
+    var x = pageX / 320;
+    var y = 1 - pageY / 320;
+    
+    var mood = this.findMood(x, y);
+
+    if (mood != this.mood) {
+      this.marker.innerHTML = mood.label;
+      this.mood = mood;
+      this.canvas.style.backgroundColor = '#' + this.colors[mood.label];
+      this.request("/mood?x=" + x + "&y=" + y);
+    }
+  },
+
+  findMood: function(x, y) {
+    var distance = 1;
+    var index = null;
     
     for (var i = 0; i < this.moods.length; i++) {
       var mood = this.moods[i];
-      var dx = Math.abs(mood.x - _x);
-      var dy = Math.abs(mood.y - _y);
+      var dx = Math.abs(mood.x - x);
+      var dy = Math.abs(mood.y - y);
+      var d = Math.sqrt(dx * dx + dy * dy);
 
-      if (dx < match.dx && dy < match.dy) {
-        match.dx = dx;
-        match.dy = dy;
-        match.index = i;
+      if (d < distance) {
+        distance = d;
+        index = i;
       }
     }
 
-    this.label.innerHTML = this.moods[match.index].label;
+    return this.moods[index];
   }
 };
--- a/mcserver/static/index.html	Sun Jun 17 00:00:01 2012 +0100
+++ b/mcserver/static/index.html	Fri Jun 22 10:14:12 2012 +0100
@@ -6,8 +6,10 @@
     <script src="app.js"></script>
   </head>
   <body onload="Application.init()" style="margin:0px;padding:0px">
-    <div style="background:#eee; position:absolute; width: 640px; height: 960px" id="canvas">
+    <canvas width="320" height="320" id="canvas">
       <span id="marker" style="position:relative; background:#ccc;"></span>
+    </canvas>
+    <div style="font-size:40px;font-weight:bold" id="label">
     </div>
   </body>
 </html>
--- a/mcserver/static/index.html~	Sun Jun 17 00:00:01 2012 +0100
+++ b/mcserver/static/index.html~	Fri Jun 22 10:14:12 2012 +0100
@@ -6,9 +6,8 @@
     <script src="app.js"></script>
   </head>
   <body onload="Application.init()" style="margin:0px;padding:0px">
-    <div id="label">mood</div>
-    <div style="position:absolute; width: 640px; height: 960px" id="canvas">
-      <div id="marker" style="position:relative; background:#ccc;width:10px;height:10px"></div>
+    <div style="background:#eee; position:absolute; width: 320px; height: 320px" id="canvas">
+      <span id="marker" style="position:relative; background:#ccc;"></span>
     </div>
   </body>
 </html>
--- a/mcserver/static/moods.csv	Sun Jun 17 00:00:01 2012 +0100
+++ b/mcserver/static/moods.csv	Fri Jun 22 10:14:12 2012 +0100
@@ -1,81 +1,17 @@
-ID,Label,Wdnum,ValMn,ValSD,AroMn,AroSD,DomMn,DomSD,termFreq,tfIdf,Cluster
-694,power,323,0.6925,2.21,0.70875,1.87,0.785,2.35,887,28.5893418465265,1
-540,action,1049,0.70375,1.45,0.69125,1.87,0.57875,2.06,781,28.2483558210672,1
-477,extreme,1526,0.67375,1.93,0.76375,1.97,0.58875,1.61,257,25.1763585519582,1
-6993,future,1605,0.71375,2.12,0.685,2.23,0.48625,2.56,210,24.598760450539,1
-6868,sports,2252,0.68125,1.95,0.65375,2.31,0.59625,2.13,140,23.4195748299111,1
-254,bright,671,0.8125,1.55,0.55,2.33,0.6675,1.82,17914,36.1000023619732,2
-253,lively,849,0.775,1.97,0.56625,2.9,0.63625,1.95,17557,36.0527861238605,2
-50,powerful,324,0.73,1.8,0.60375,2.69,0.77375,2.52,1588,30.1236537090796,2
-453,silly,981,0.80125,1.8,0.61,2.38,0.625,2.09,764,28.1891794407021,2
-150,hopeful,212,0.7625,1.46,0.5975,2.09,0.55125,1.92,699,27.9494397014472,2
-465,brutal,53,0.225,1.9,0.7,2.36,0.44875,2.7,1700,30.3004997894381,3
-161,fear,592,0.22,2.12,0.745,2.17,0.2775,2.2,200,24.4582721352504,3
-467,violent,478,0.16125,1.78,0.73625,2.47,0.52,2.86,168,23.95312270896,3
-671,danger,713,0.24375,2.22,0.79,2.07,0.32375,2.31,116,22.8633926619437,3
-323,angry,18,0.23125,1.7,0.77125,2.07,0.56875,2.74,92,22.1693366147185,3
-219,confused,80,0.27625,1.51,0.62875,1.88,0.405,1.91,486,26.9584966849828,4
-173,uneasy,2402,0.25875,1.91,0.62875,2.29,0.28,1.79,191,24.3253448141016,4
-6817,crime,704,0.23625,2.06,0.55125,2.69,0.39,2.24,172,24.0215836741884,4
-6813,loss,1800,0.11125,1.25,0.5975,2.95,0.1725,2.3,119,22.9392660289403,4
-1562,sadness,2125,0.15125,1.75,0.52625,2.44,0.2275,1.63,90,22.1030289758825,4
-542,rock,965,0.57,1.38,0.44,2.37,0.51875,2.01,406,26.4613688004033,5
-7000,mood,1861,0.575,1.38,0.46625,1.78,0.575,1.65,185,24.2330009076431,5
-7141,robot,2106,0.545,1.31,0.46375,2.14,0.4325,1.97,66,21.1577964718149,5
-6779,autumn,29,0.6625,2.14,0.43875,2.5,0.51875,1.85,39,19.5114355362196,5
-7670,organ,1923,0.53,1.57,0.4425,1.86,0.495,1.75,33,18.9765393849369,5
-213,serious,383,0.51,1.59,0.375,1.87,0.515,1.65,721,28.0331094308249,6
-8,sensitive,2160,0.5625,1.87,0.40875,2.21,0.44375,1.55,603,27.548796315552,6
-591,building,550,0.53625,1.15,0.365,1.94,0.53125,1.57,150,23.6221252039632,6
-789,street,412,0.5275,0.72,0.29875,1.87,0.47625,1.21,97,22.3286386724693,6
-7604,patient,929,0.53625,1.89,0.40125,2.37,0.4875,2.31,71,21.3819774332507,6
-139,relaxed,350,0.75,1.77,0.17375,2.13,0.56875,1.9,14499,35.6020149916429,7
-178,peaceful,1951,0.84625,1.28,0.23375,2.39,0.5875,1.93,9722,34.6493282121594,7
-25,gentle,183,0.78875,1.3,0.27625,2.57,0.5125,2.16,1307,29.6152576102165,7
-719,peace,308,0.84,1.75,0.24375,2.55,0.55625,2.84,8,14.1618492055577,7
-7795,sleep,399,0.775,1.77,0.225,2.66,0.55125,2.41,1,5.72358510195238,7
-19,calm,1239,0.71625,1.68,0.325,2.51,0.67125,2.06,9982,34.7127129441325,8
-15,cool,1344,0.72875,1.34,0.39625,2.27,0.62125,1.38,3106,31.8409617497445,8
-1,carefree,63,0.8175,1.38,0.39625,2.84,0.5975,2.5,2031,30.7595399590721,8
-208,innocent,814,0.68875,1.34,0.40125,1.99,0.535,2.08,1693,30.2898087798446,8
-117,tender,1011,0.74125,1.28,0.485,2.3,0.54125,1.75,910,28.6576769310574,8
-27,dark,714,0.46375,2.36,0.41,2.21,0.48,2.15,2754,31.5368320001884,9
-258,lazy,843,0.4225,2.02,0.20625,2.06,0.38375,1.93,1273,29.5460923812129,9
-6764,slow,982,0.36625,1.6,0.29875,2.22,0.41875,1.61,219,24.7192936903497,9
-6649,science,2143,0.47,2.28,0.46375,2.31,0.4775,2.13,188,24.279561687715,9
-212,solemn,405,0.415,1.51,0.32,1.95,0.45125,1.87,137,23.3558158478845,9
-272,dirty,590,0.26,2.05,0.485,2.29,0.4625,2.12,970,28.8277558155937,10
-74,moody,883,0.275,1.58,0.3975,2.38,0.42375,1.71,611,27.5846578730596,10
-329,heavy,1677,0.33625,1.38,0.4475,1.93,0.3875,1.62,568,27.385799232442,10
-367,raw,2049,0.415,1.68,0.505,2.16,0.5275,1.5,142,23.4612834269641,10
-315,busy,1233,0.39875,1.6,0.4475,1.96,0.46125,1.49,87,22.0005798416296,10
-731,energy,1488,0.77875,1.55,0.7375,1.94,0.74125,1.62,933,28.7242254785195,11
-115,intimate,821,0.82625,1.51,0.7475,2.21,0.6075,2.29,379,26.2699410242964,11
-90,adventure,630,0.825,1.5,0.7475,2.15,0.6825,1.67,359,26.1186543383373,11
-6739,holiday,791,0.81875,2.14,0.69875,2.73,0.6625,2.17,352,26.0635993732902,11
-340,festive,749,0.7875,2.26,0.6975,2.29,0.59625,2.34,303,25.6426324947449,11
-78,fun,759,0.92125,1.11,0.7775,2.01,0.725,1.85,2034,30.7633330898033,12
-155,triumphant,452,0.9775,0.73,0.7225,2.58,0.74375,2.55,1780,30.4195126890535,12
-29,romantic,364,0.915,1,0.82375,2.07,0.635,2.29,1371,29.7404866014185,12
-252,sexy,530,0.8775,1.12,0.795,1.91,0.7275,2.13,1241,29.4792060341353,12
-22,funny,1599,0.945,0.85,0.75,1.86,0.64375,1.92,969,28.8250124776833,12
-226,aggressive,9,0.5125,1.68,0.60375,2.33,0.57375,2.4,6149,33.5380693366296,13
-17,warm,2436,0.6875,1.2,0.5175,1.92,0.545,1.25,3046,31.7917491725818,13
-83,crazy,1365,0.61625,1.95,0.66,2.25,0.51625,2.33,804,28.3263031713168,13
-309,hard,781,0.5275,1.82,0.515,2.19,0.57375,1.63,370,26.2029275113697,13
-6895,news,901,0.5375,1.67,0.52125,2.11,0.45,1.88,205,24.529420068381,13
-243,scary,2139,0.28,1.83,0.71125,1.98,0.3325,2.13,2113,30.8611682388858,14
-52,tense,428,0.32,1.36,0.69125,2.1,0.5275,2.02,1380,29.7576047626339,14
-6652,drama,1446,0.3575,2.59,0.67375,1.93,0.54,2.36,867,28.5283931033577,14
-34,evil,741,0.27875,2.64,0.67375,2.44,0.53125,2.6,683,27.8868350184496,14
-123,anxious,21,0.47625,1.98,0.74,1.81,0.54125,1.82,339,25.9582288134905,14
-5,positive,2005,0.88375,1.1,0.57125,2.18,0.64875,1.83,27157,37.067584198024,15
-136,cheerful,1275,0.8875,1.35,0.67,2.41,0.72375,1.71,11764,35.1056830093899,15
-2,happy,200,0.90125,1.82,0.68625,2.77,0.70375,2.43,11479,35.0471772450881,15
-160,optimistic,1919,0.82375,1.32,0.60375,2.24,0.75,1.51,6997,33.8536040156862,15
-348,proud,334,0.87875,1.56,0.57,3.01,0.7175,2.73,5168,33.1108643649477,15
-106,sad,368,0.07625,0.95,0.39125,2.38,0.30625,2.18,4165,32.5761009776072,16
-225,lonely,261,0.14625,1.76,0.43875,2.68,0.24375,2.12,3272,31.9721116595814,16
-7102,loneliness,260,0.07625,1.02,0.445,2.97,0.18875,2.27,104,22.5376171760696,16
-287,sorrow,2240,0.165,1.68,0.435,2.38,0.33375,2.18,59,20.8116008389468,16
-288,grief,195,0.08625,1.04,0.4725,2.84,0.3125,2.35,5,12.4325371482612,16
+Label,ValMn,AroMn,DomMn,Cluster
+power,0.69,0.71,0.79,1
+bright,0.81,0.55,0.67,2
+brutal,0.23,0.7,0.45,3
+confused,0.28,0.63,0.41,4
+rock,0.57,0.44,0.52,5
+serious,0.51,0.38,0.52,6
+relaxed,0.75,0.17,0.57,7
+calm,0.72,0.33,0.67,8
+dark,0.46,0.41,0.48,9
+dirty,0.26,0.49,0.46,10
+energy,0.78,0.74,0.74,11
+fun,0.92,0.78,0.73,12
+aggressive,0.51,0.6,0.57,13
+scary,0.28,0.71,0.33,14
+positive,0.88,0.57,0.65,15
+sad,0.08,0.39,0.31,16
\ No newline at end of file
--- a/nodejs-server/app.js	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/app.js	Fri Jun 22 10:14:12 2012 +0100
@@ -8,28 +8,95 @@
     this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
     this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
     
-    this.request("/moods.csv", this.loadCSV.bind(this));
+    this.request("/moods.csv", this.loadMoods.bind(this));
+    this.background();
   },
 
-  loadCSV: function(text) {
+  tl: { r: 200, g: 0, b: 0 },
+  tr: { r: 200, g: 150, b: 0 },
+  bl: { r: 0, g: 50, b: 100 },
+  br: { r: 200, g: 230, b: 80 },
+  
+  interpolateColor: function(a, b, x) {
+    return {
+      r: Math.floor(a.r + (b.r - a.r) * x),
+      g: Math.floor(a.g + (b.g - a.g) * x),
+      b: Math.floor(a.b + (b.b - a.b) * x)
+    };
+  },
+
+  background: function() {
+    var step = 20;
+    var ctx = this.canvas.getContext("2d");  
+    ctx.clearRect(0, 0, 320, 320);
+
+    for (var y = 0; y < 320; y += step) {
+      var left = this.interpolateColor(this.tl, this.bl, y / 320);
+      var right = this.interpolateColor(this.tr, this.br, y / 320);
+      for (var x = 0; x < 320; x += step) {
+        var color = this.interpolateColor(left, right, x / 320);
+        ctx.fillStyle = "rgb(" + color.r + "," + color.g + "," + color.b + ")";
+        ctx.fillRect(x, y, step, step);
+      }
+    }
+    ctx.strokeStyle = "rgb(0,0,0)";
+    ctx.moveTo(0, 160);
+    ctx.lineTo(320, 160);
+    ctx.stroke();
+    
+    ctx.fillStyle = "rgb(0,0,0)";
+    ctx.beginPath();
+    ctx.moveTo(320, 160);
+    ctx.lineTo(310, 150);
+    ctx.lineTo(310, 170);
+    ctx.fill();
+
+    ctx.strokeStyle = "rgb(0,0,0)";
+    ctx.moveTo(160, 320);
+    ctx.lineTo(160, 0);
+    ctx.stroke();
+    
+    ctx.fillStyle = "rgb(0,0,0)";
+    ctx.beginPath();
+    ctx.moveTo(160, 0);
+    ctx.lineTo(150, 10);
+    ctx.lineTo(170, 10);
+    ctx.fill();
+
+    ctx.font = "16px Arial";
+    ctx.fillText("Valence", 200, 158);  
+    
+    ctx.save();
+    ctx.translate(158, 120);
+    ctx.rotate(Math.PI * 1.5);
+    ctx.font = "16px Arial";
+    ctx.fillText("Arousal", 0, 0);  
+    ctx.restore();
+  },
+
+  loadMoods: function(text) {
     this.moods = [];
 
     var lines = text.split("\n");
-
+    
     for (var i = 1; i < lines.length; i++) {
       var row = lines[i].split(",");
-      this.moods.push({
-        label: row[1], 
-        x: Number(row[3]), 
-        y: Number(row[5])
-      });
+      var mood = {
+        label: row[0],
+        val: Number(row[1]), 
+        aro: Number(row[2]),
+        dom: Number(row[3])
+      };
+      this.moods.push(mood);
     }
   },
-  
+ 
   request: function(url, callback) {
     var request = new XMLHttpRequest();
     request.onreadystatechange = function() {
-      callback(request.responseText);
+      if (callback) {
+        callback(request.responseText);
+      }
     }.bind(this);
     request.open("GET", url);
     request.send(null);
@@ -52,21 +119,28 @@
   },
 
   setMarker: function(pageX, pageY) {
-    this.marker.style.left = pageX + 'px';
-    this.marker.style.top = pageY + 'px';
-    
-    var x = 1 - pageX / 480;
-    var y = 1 - pageY / 960;
+    this.background();
+    this.drawMarker(pageX, pageY);
+
+    var x = pageX / 320;
+    var y = 1 - pageY / 320;
     
     var mood = this.findMood(x, y);
 
-    this.marker.innerHTML = mood.label;
-   
     if (mood != this.mood) {
+      this.label.innerHTML = mood.label;
       this.mood = mood;
       this.request("/mood?x=" + x + "&y=" + y);
     }
   },
+  
+  drawMarker: function(x, y) {
+    var ctx = this.canvas.getContext("2d");  
+    ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
+    ctx.beginPath();
+    ctx.arc(x, y, 20, 0, Math.PI*2, true); 
+    ctx.fill();
+  },
 
   findMood: function(x, y) {
     var distance = 1;
@@ -74,8 +148,8 @@
     
     for (var i = 0; i < this.moods.length; i++) {
       var mood = this.moods[i];
-      var dx = Math.abs(mood.x - x);
-      var dy = Math.abs(mood.y - y);
+      var dx = Math.abs(mood.val - x);
+      var dy = Math.abs(mood.aro - y);
       var d = Math.sqrt(dx * dx + dy * dy);
 
       if (d < distance) {
--- a/nodejs-server/app.js~	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/app.js~	Fri Jun 22 10:14:12 2012 +0100
@@ -8,28 +8,51 @@
     this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
     this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
     
-    this.request("/moods.csv", this.loadCSV.bind(this));
+    this.request("/moods.csv", this.loadMoods.bind(this));
+    this.request("/colors.txt", this.loadColors.bind(this));
   },
 
-  loadCSV: function(text) {
+  loadMoods: function(text) {
     this.moods = [];
 
     var lines = text.split("\n");
+    
+    for (var i = 1; i < lines.length; i++) {
+      var row = lines[i].split(",");
+      var mood = {
+        label: row[1], 
+        x: Number(row[3]), 
+        y: Number(row[5])
+      };
+
+      // var div = document.createElement('div');
+      // this.canvas.appendChild(div);
+      // div.style.position = 'absolute';
+      // div.style.left = mood.x * 320 + 'px';
+      // div.style.top = mood.y * 320 + 'px';
+      // div.innerHTML = mood.label;
+      
+      this.moods.push(mood);
+    }
+  },
+
+  loadColors: function(text) {
+    this.colors = {};
+
+    var lines = text.split("\n");
 
     for (var i = 1; i < lines.length; i++) {
-      var row = lines[i].split(",");
-      this.moods.push({
-        label: row[1], 
-        x: Number(row[3]), 
-        y: Number(row[5])
-      });
+      var row = lines[i].split("\t");
+      this.colors[row[0]] = row[2];
     }
   },
   
   request: function(url, callback) {
     var request = new XMLHttpRequest();
     request.onreadystatechange = function() {
-      callback(request.responseText);
+      if (callback) {
+        callback(request.responseText);
+      }
     }.bind(this);
     request.open("GET", url);
     request.send(null);
@@ -51,30 +74,39 @@
     this.setMarker(event.pageX, event.pageY);
   },
 
-  setMarker: function(x, y) {
-    this.marker.style.left = x + 'px';
-    this.marker.style.top = y + 'px';
+  setMarker: function(pageX, pageY) {
+    this.marker.style.left = pageX + 'px';
+    this.marker.style.top = pageY + 'px';
     
-    var _x = x / 480;
-    var _y = y / 960;
-    var match = {
-      dx: 1,
-      dy: 1,
-      index: null
-    };
+    var x = pageX / 320;
+    var y = 1 - pageY / 320;
+    
+    var mood = this.findMood(x, y);
+
+    if (mood != this.mood) {
+      this.marker.innerHTML = mood.label;
+      this.mood = mood;
+      this.canvas.style.backgroundColor = '#' + this.colors[mood.label];
+      this.request("/mood?x=" + x + "&y=" + y);
+    }
+  },
+
+  findMood: function(x, y) {
+    var distance = 1;
+    var index = null;
     
     for (var i = 0; i < this.moods.length; i++) {
       var mood = this.moods[i];
-      var dx = Math.abs(mood.x - _x);
-      var dy = Math.abs(mood.y - _y);
+      var dx = Math.abs(mood.x - x);
+      var dy = Math.abs(mood.y - y);
+      var d = Math.sqrt(dx * dx + dy * dy);
 
-      if (dx < match.dx && dy < match.dy) {
-        match.dx = dx;
-        match.dy = dy;
-        match.index = i;
+      if (d < distance) {
+        distance = d;
+        index = i;
       }
     }
 
-    this.label.innerHTML = this.moods[match.index].label;
+    return this.moods[index];
   }
 };
--- a/nodejs-server/index.html	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/index.html	Fri Jun 22 10:14:12 2012 +0100
@@ -6,8 +6,10 @@
     <script src="app.js"></script>
   </head>
   <body onload="Application.init()" style="margin:0px;padding:0px">
-    <div style="background:#eee; position:absolute; width: 640px; height: 960px" id="canvas">
+    <canvas width="320" height="320" id="canvas">
       <span id="marker" style="position:relative; background:#ccc;"></span>
+    </canvas>
+    <div style="font-size:40px;font-weight:bold" id="label">
     </div>
   </body>
 </html>
--- a/nodejs-server/index.html~	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/index.html~	Fri Jun 22 10:14:12 2012 +0100
@@ -6,9 +6,8 @@
     <script src="app.js"></script>
   </head>
   <body onload="Application.init()" style="margin:0px;padding:0px">
-    <div id="label">mood</div>
-    <div style="position:absolute; width: 640px; height: 960px" id="canvas">
-      <div id="marker" style="position:relative; background:#ccc;width:10px;height:10px"></div>
+    <div style="background:#eee; position:absolute; width: 320px; height: 320px" id="canvas">
+      <span id="marker" style="position:relative; background:#ccc;"></span>
     </div>
   </body>
 </html>
--- a/nodejs-server/moods.csv	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/moods.csv	Fri Jun 22 10:14:12 2012 +0100
@@ -1,81 +1,17 @@
-ID,Label,Wdnum,ValMn,ValSD,AroMn,AroSD,DomMn,DomSD,termFreq,tfIdf,Cluster
-694,power,323,0.6925,2.21,0.70875,1.87,0.785,2.35,887,28.5893418465265,1
-540,action,1049,0.70375,1.45,0.69125,1.87,0.57875,2.06,781,28.2483558210672,1
-477,extreme,1526,0.67375,1.93,0.76375,1.97,0.58875,1.61,257,25.1763585519582,1
-6993,future,1605,0.71375,2.12,0.685,2.23,0.48625,2.56,210,24.598760450539,1
-6868,sports,2252,0.68125,1.95,0.65375,2.31,0.59625,2.13,140,23.4195748299111,1
-254,bright,671,0.8125,1.55,0.55,2.33,0.6675,1.82,17914,36.1000023619732,2
-253,lively,849,0.775,1.97,0.56625,2.9,0.63625,1.95,17557,36.0527861238605,2
-50,powerful,324,0.73,1.8,0.60375,2.69,0.77375,2.52,1588,30.1236537090796,2
-453,silly,981,0.80125,1.8,0.61,2.38,0.625,2.09,764,28.1891794407021,2
-150,hopeful,212,0.7625,1.46,0.5975,2.09,0.55125,1.92,699,27.9494397014472,2
-465,brutal,53,0.225,1.9,0.7,2.36,0.44875,2.7,1700,30.3004997894381,3
-161,fear,592,0.22,2.12,0.745,2.17,0.2775,2.2,200,24.4582721352504,3
-467,violent,478,0.16125,1.78,0.73625,2.47,0.52,2.86,168,23.95312270896,3
-671,danger,713,0.24375,2.22,0.79,2.07,0.32375,2.31,116,22.8633926619437,3
-323,angry,18,0.23125,1.7,0.77125,2.07,0.56875,2.74,92,22.1693366147185,3
-219,confused,80,0.27625,1.51,0.62875,1.88,0.405,1.91,486,26.9584966849828,4
-173,uneasy,2402,0.25875,1.91,0.62875,2.29,0.28,1.79,191,24.3253448141016,4
-6817,crime,704,0.23625,2.06,0.55125,2.69,0.39,2.24,172,24.0215836741884,4
-6813,loss,1800,0.11125,1.25,0.5975,2.95,0.1725,2.3,119,22.9392660289403,4
-1562,sadness,2125,0.15125,1.75,0.52625,2.44,0.2275,1.63,90,22.1030289758825,4
-542,rock,965,0.57,1.38,0.44,2.37,0.51875,2.01,406,26.4613688004033,5
-7000,mood,1861,0.575,1.38,0.46625,1.78,0.575,1.65,185,24.2330009076431,5
-7141,robot,2106,0.545,1.31,0.46375,2.14,0.4325,1.97,66,21.1577964718149,5
-6779,autumn,29,0.6625,2.14,0.43875,2.5,0.51875,1.85,39,19.5114355362196,5
-7670,organ,1923,0.53,1.57,0.4425,1.86,0.495,1.75,33,18.9765393849369,5
-213,serious,383,0.51,1.59,0.375,1.87,0.515,1.65,721,28.0331094308249,6
-8,sensitive,2160,0.5625,1.87,0.40875,2.21,0.44375,1.55,603,27.548796315552,6
-591,building,550,0.53625,1.15,0.365,1.94,0.53125,1.57,150,23.6221252039632,6
-789,street,412,0.5275,0.72,0.29875,1.87,0.47625,1.21,97,22.3286386724693,6
-7604,patient,929,0.53625,1.89,0.40125,2.37,0.4875,2.31,71,21.3819774332507,6
-139,relaxed,350,0.75,1.77,0.17375,2.13,0.56875,1.9,14499,35.6020149916429,7
-178,peaceful,1951,0.84625,1.28,0.23375,2.39,0.5875,1.93,9722,34.6493282121594,7
-25,gentle,183,0.78875,1.3,0.27625,2.57,0.5125,2.16,1307,29.6152576102165,7
-719,peace,308,0.84,1.75,0.24375,2.55,0.55625,2.84,8,14.1618492055577,7
-7795,sleep,399,0.775,1.77,0.225,2.66,0.55125,2.41,1,5.72358510195238,7
-19,calm,1239,0.71625,1.68,0.325,2.51,0.67125,2.06,9982,34.7127129441325,8
-15,cool,1344,0.72875,1.34,0.39625,2.27,0.62125,1.38,3106,31.8409617497445,8
-1,carefree,63,0.8175,1.38,0.39625,2.84,0.5975,2.5,2031,30.7595399590721,8
-208,innocent,814,0.68875,1.34,0.40125,1.99,0.535,2.08,1693,30.2898087798446,8
-117,tender,1011,0.74125,1.28,0.485,2.3,0.54125,1.75,910,28.6576769310574,8
-27,dark,714,0.46375,2.36,0.41,2.21,0.48,2.15,2754,31.5368320001884,9
-258,lazy,843,0.4225,2.02,0.20625,2.06,0.38375,1.93,1273,29.5460923812129,9
-6764,slow,982,0.36625,1.6,0.29875,2.22,0.41875,1.61,219,24.7192936903497,9
-6649,science,2143,0.47,2.28,0.46375,2.31,0.4775,2.13,188,24.279561687715,9
-212,solemn,405,0.415,1.51,0.32,1.95,0.45125,1.87,137,23.3558158478845,9
-272,dirty,590,0.26,2.05,0.485,2.29,0.4625,2.12,970,28.8277558155937,10
-74,moody,883,0.275,1.58,0.3975,2.38,0.42375,1.71,611,27.5846578730596,10
-329,heavy,1677,0.33625,1.38,0.4475,1.93,0.3875,1.62,568,27.385799232442,10
-367,raw,2049,0.415,1.68,0.505,2.16,0.5275,1.5,142,23.4612834269641,10
-315,busy,1233,0.39875,1.6,0.4475,1.96,0.46125,1.49,87,22.0005798416296,10
-731,energy,1488,0.77875,1.55,0.7375,1.94,0.74125,1.62,933,28.7242254785195,11
-115,intimate,821,0.82625,1.51,0.7475,2.21,0.6075,2.29,379,26.2699410242964,11
-90,adventure,630,0.825,1.5,0.7475,2.15,0.6825,1.67,359,26.1186543383373,11
-6739,holiday,791,0.81875,2.14,0.69875,2.73,0.6625,2.17,352,26.0635993732902,11
-340,festive,749,0.7875,2.26,0.6975,2.29,0.59625,2.34,303,25.6426324947449,11
-78,fun,759,0.92125,1.11,0.7775,2.01,0.725,1.85,2034,30.7633330898033,12
-155,triumphant,452,0.9775,0.73,0.7225,2.58,0.74375,2.55,1780,30.4195126890535,12
-29,romantic,364,0.915,1,0.82375,2.07,0.635,2.29,1371,29.7404866014185,12
-252,sexy,530,0.8775,1.12,0.795,1.91,0.7275,2.13,1241,29.4792060341353,12
-22,funny,1599,0.945,0.85,0.75,1.86,0.64375,1.92,969,28.8250124776833,12
-226,aggressive,9,0.5125,1.68,0.60375,2.33,0.57375,2.4,6149,33.5380693366296,13
-17,warm,2436,0.6875,1.2,0.5175,1.92,0.545,1.25,3046,31.7917491725818,13
-83,crazy,1365,0.61625,1.95,0.66,2.25,0.51625,2.33,804,28.3263031713168,13
-309,hard,781,0.5275,1.82,0.515,2.19,0.57375,1.63,370,26.2029275113697,13
-6895,news,901,0.5375,1.67,0.52125,2.11,0.45,1.88,205,24.529420068381,13
-243,scary,2139,0.28,1.83,0.71125,1.98,0.3325,2.13,2113,30.8611682388858,14
-52,tense,428,0.32,1.36,0.69125,2.1,0.5275,2.02,1380,29.7576047626339,14
-6652,drama,1446,0.3575,2.59,0.67375,1.93,0.54,2.36,867,28.5283931033577,14
-34,evil,741,0.27875,2.64,0.67375,2.44,0.53125,2.6,683,27.8868350184496,14
-123,anxious,21,0.47625,1.98,0.74,1.81,0.54125,1.82,339,25.9582288134905,14
-5,positive,2005,0.88375,1.1,0.57125,2.18,0.64875,1.83,27157,37.067584198024,15
-136,cheerful,1275,0.8875,1.35,0.67,2.41,0.72375,1.71,11764,35.1056830093899,15
-2,happy,200,0.90125,1.82,0.68625,2.77,0.70375,2.43,11479,35.0471772450881,15
-160,optimistic,1919,0.82375,1.32,0.60375,2.24,0.75,1.51,6997,33.8536040156862,15
-348,proud,334,0.87875,1.56,0.57,3.01,0.7175,2.73,5168,33.1108643649477,15
-106,sad,368,0.07625,0.95,0.39125,2.38,0.30625,2.18,4165,32.5761009776072,16
-225,lonely,261,0.14625,1.76,0.43875,2.68,0.24375,2.12,3272,31.9721116595814,16
-7102,loneliness,260,0.07625,1.02,0.445,2.97,0.18875,2.27,104,22.5376171760696,16
-287,sorrow,2240,0.165,1.68,0.435,2.38,0.33375,2.18,59,20.8116008389468,16
-288,grief,195,0.08625,1.04,0.4725,2.84,0.3125,2.35,5,12.4325371482612,16
+Label,ValMn,AroMn,DomMn,Cluster
+power,0.69,0.71,0.79,1
+bright,0.81,0.55,0.67,2
+brutal,0.23,0.7,0.45,3
+confused,0.28,0.63,0.41,4
+rock,0.57,0.44,0.52,5
+serious,0.51,0.38,0.52,6
+relaxed,0.75,0.17,0.57,7
+calm,0.72,0.33,0.67,8
+dark,0.46,0.41,0.48,9
+dirty,0.26,0.49,0.46,10
+energy,0.78,0.74,0.74,11
+fun,0.92,0.78,0.73,12
+aggressive,0.51,0.6,0.57,13
+scary,0.28,0.71,0.33,14
+positive,0.88,0.57,0.65,15
+sad,0.08,0.39,0.31,16
\ No newline at end of file
--- a/nodejs-server/server.js	Sun Jun 17 00:00:01 2012 +0100
+++ b/nodejs-server/server.js	Fri Jun 22 10:14:12 2012 +0100
@@ -9,6 +9,10 @@
     res.end("{status:'ok'}");
     res.writeHead(200, {'Content-Type': 'application/json'});
     break;
+  case '/colors.txt':
+    res.end(fs.readFileSync("colors.txt"));
+    res.writeHead(200, {'Content-Type': 'text/plain'});
+    break;
   case '/moods.csv':
     res.end(fs.readFileSync("moods.csv"));
     res.writeHead(200, {'Content-Type': 'text/plain'});