integration/js/streamgraph.js
changeset 26 94f586daa623
parent 24 bd6d2bdbc47a
child 28 10a958322a62
--- a/integration/js/streamgraph.js	Tue Jan 22 14:43:22 2013 +0100
+++ b/integration/js/streamgraph.js	Wed Jan 23 18:21:30 2013 +0100
@@ -1,17 +1,19 @@
-function Streamgraph($selector) {
+function Streamgraph($selector, data) {
     
     /* Constants */
    
     var VMARGIN = 3,
         YEARSHEIGHT = 20,
-        STARTTIME = new Date(2007,6,1),
+        STARTTIME = new Date(2007,5,1),
         ENDTIME = new Date(),
+        DATASTART = new Date(data.from_date),
+        DATAEND = new Date(data.to_date),
         CURVE = .25,
         DATEPADDING = 10,
         COLORS = [ "#943a23", "#fbee97", "#cfbb95", "#da9761", "#ba5036" ],
-        SELECTEDCOLOR = "#c51810"; 
+        SELECTEDCOLOR = "#007dad"; 
     
-    /* Generating random data */
+    /* Generating random data
     
     var data = [],
         clustercount = 12,
@@ -33,7 +35,7 @@
     
     var width = $selector.width(),
         height = $selector.height(),
-        transp = _.zip.apply( _, data ),
+        transp = _.zip.apply( _, _(data.clusters).pluck("volumes") ),
         cumulative = _(transp).map(function(column) {
             var total = 0;
             return _(column).map(function(point) {
@@ -45,22 +47,27 @@
         })
         maxcol = _(sums).max(),
         streamheight = height - YEARSHEIGHT,
+        streamwidth = width * (DATAEND - DATASTART) / (ENDTIME - STARTTIME),
         yscale = (streamheight - 2 * VMARGIN) / maxcol,
         centery = streamheight / 2,
-        xscale = width / (transp.length - 1),
+        xscale = streamwidth / (transp.length - 1),
         txscale = width / (ENDTIME - STARTTIME),
-        coords = _(data).map(function(line, lineindex) {
+        startx = txscale * (DATASTART - STARTTIME),
+        endx = txscale * (DATAEND - STARTTIME),
+        coords = _(data.clusters).map(function(line, lineindex) {
             return {
-                points : _(line).map(function(point, colindex) {
+                points : _(line.volumes).map(function(point, colindex) {
                     var lowercumul = lineindex ? cumulative[colindex][lineindex - 1] : 0,
                         uppercumul = cumulative[colindex][lineindex];
                     return {
                         data: point,
-                        x: xscale * colindex,
+                        x: startx + xscale * colindex,
                         lowery: centery + yscale * ( ( sums[colindex] / 2 ) - lowercumul ),
                         uppery: centery + yscale * ( ( sums[colindex] / 2 ) - uppercumul ),
                     }
-                })
+                }),
+                id : line.id,
+                title: line.title
             }
         }),
         _(coords).each(function(line) {
@@ -93,13 +100,24 @@
     
     /* Drawing streamgraph*/
    
+    $selector.empty();
+   
     var paper = new Raphael($selector[0]);
     
+    paper.path("M0 " + centery + "L" + width + " " + centery).attr({
+        stroke: "#000",
+        "stroke-width": .25
+    })
+    
     _(coords).each(function(line, index) {
         line.color = COLORS[index % COLORS.length];
+        //var hue = (parseInt(line.id)%6)/6;
+        //line.color = Raphael.hsl( hue, 1, .8 );
+        //line.highlightColor = Raphael.hsl( hue, 1, .4 );
         line.surface = paper.path(line.path);
         line.surface.attr({
-            stroke: "none",
+            stroke: "#ffffff",
+            "stroke-width": .25,
             fill: line.color
         });
     });
@@ -127,14 +145,14 @@
         attrcarres = {
             fill: "#333333",
             "fill-opacity": .5,
-            stroke: SELECTEDCOLOR
+            stroke: "#c51810"
         };
     carregauche.attr(attrcarres);
     carredroite.attr(attrcarres);
     
     var rangerect = paper.rect(0, (height - YEARSHEIGHT), width, YEARSHEIGHT);
     rangerect.attr({
-        fill: SELECTEDCOLOR,
+        fill: "#c51810",
         stroke: "none"
     });
     
@@ -163,16 +181,34 @@
         line.mousesurface.attr({
             stroke: "none",
             fill: line.color,
-            opacity: .01
+            opacity: .01,
+            title: line.title
         }).mouseover(function() {
-            line.surface.attr({
-                fill: SELECTEDCOLOR
-            })
+            $("body").trigger("select-cluster", line.id);
         }).mouseout(function() {
+            $("body").trigger("unselect-cluster", line.id);
+        });
+    });
+    
+    $("body").on("unselect-cluster", function(e, clusterid) {
+        var line = _(coords).find(function(line) {
+            return line.id == clusterid;
+        });
+        if (line) {
             line.surface.attr({
                 fill: line.color
-            })
+            });
+        }
+    });
+    $("body").on("select-cluster", function(e, clusterid) {
+        var line = _(coords).find(function(line) {
+            return line.id == clusterid;
         });
+        if (line) {
+            line.surface.attr({
+                fill: SELECTEDCOLOR //line.highlightColor
+            });
+        }
     });
     
     /* Returning a handler for slide value change */
@@ -195,10 +231,21 @@
             width: right - left
         });
     }
+    
+    $("#slider-range").dragslider("values", [startx, endx]);
+    this.slidevalues(startx, endx);
 
 }
 
+function loadStreamgraph(url) {
+    $(".streamgraph").empty();
+    delete window.streamgraph;
+    $.getJSON(url, function(data) {
+        window.streamgraph = new Streamgraph($(".streamgraph"), data);
+        streamgraph.slidevalues.apply(streamgraph,$("#slider-range").dragslider("values"));
+    });
+}
+
 $(function() {
-    window.streamgraph = new Streamgraph($(".streamgraph"));
-    streamgraph.slidevalues.apply(streamgraph,$("#slider-range").dragslider("values"));
+    loadStreamgraph("data/json_streamgraph.json");
 })