summaryrefslogtreecommitdiff
path: root/ebus/webapp/static/src/d3.control.js
blob: 489edea66763f310171d7ca3b6b4c2bb2287a6b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
var d3_control = function(element, svgurl, mapping) {
    this.mapping = mapping;
    this.element = element;
    var control = this;
    d3.xml(svgurl, "image/svg+xml", function(xml) {
	       element[0][0].appendChild(xml.documentElement);
	       element.select("svg")
		   .style("width","100%").style("height", "100%");

	       // Setup mapping
	       for (var element_id in this.mapping) {
		   control.initElement(element_id);
	       }
	       d3.json("../all_values", function(response) {
			   control.process(response.data);
			   control.reload(response.time_stop);
		       });
	   });
};

d3_control.prototype = {
    initElement:function(element_id) {
	var options = this.mapping[element_id];
	d3.select(document.getElementById(element_id))
	    .on("mouseover", 
		function() {
		    if( typeof(options._plot) == "undefined") {
			options._plot = d3.select(this.ownerSVGElement)
			    .append("svg:g")
			    .classed("d3.control_popup", true);

			var startdate = (new Date().getTime()/1000) - 7*60*60*24;
			var enddate = (new Date().getTime()/1000);
			var plot = d3.plot(options._plot);
			d3.json("../sensor/"+options.sensor+"/" + startdate + "/" + enddate,
				function(resp) {
				    var data = resp.data.map(function(d) {
								 return [new Date(d[0]), d[1]];
							     });
				    plot.draw(data);
				});

			options._plot.on("mouseout",
					 function() {
					     if (options._plot.node().contains(d3.event.relatedTarget))
						 return;
					     options._plot
						 .transition()
						 .duration(1000)
						 .style("opacity", 0.0)
						 .remove();
					 });

			var drag = d3.behavior.drag()
			    .on("dragstart", function() {
				    options._plot.on("mouseout", null);
				    options._plot.transition().duration(1000).style("opacity", 1.0);

				    delete options._plot;
				    d3.select(this).select("rect")
					.style("stroke", "gray")
					.style("stroke-width", "3px");
				})
			    .on("drag", function(d,i){
				    d=[];
				    d.x = d3.event.x;
				    d.y = d3.event.y;
				    d3.select(this).attr("transform", "translate("+d.x+","+d.y+")");
				})
			    .on("dragend", function() {
				    d3.select(this).on("mousedown.drag", null);
				    d3.select(this).on("click", function() { d3.select(this).remove(); });
				});

			options._plot.call(drag);
		    } else {
			this.ownerSVGElement
			    .appendChild(options._plot.node());

			options._plot.style("opacity", 1);
		    }
		    
		    var xy = d3.svg.mouse(this.ownerSVGElement);
		    options._plot.attr("transform", "translate("+xy[0]+","+xy[1]+")");
		});
    },
    process:function(data) {
	for (var i in data) {
            var row = data[i];

	    if (typeof(console) != "undefined") {
		console.log("[" + d3.format("02d")(row.timestamp) + "] " + 
			    row.name + " Value: " + row.value_real + " - " + 
			    row.value_string);
	    }

            for (var element_id in this.mapping) {
                var options = this.mapping[element_id];
                if (row.name == options.sensor){
                    d3.select(document.getElementById(element_id))
                        .text(""+row.value_real);
                }
            }
        }
    },
    reload:function(time_stop) {
	var url = "../stream";
	if (time_stop != null)
	    url += "/" + time_stop;
	var control = this;
	d3.json(url, function(response) {
		    control.process(response.data);
		    control.reload(response.time_stop);
		});
    }
};

d3.control = function(element, svgurl, mapping) {
    return new d3_control(element,svgurl,mapping);
};