blob: 155ce2d3cbaf781f7e684a4ad7fca9ca5ab133c5 [file] [log] [blame]
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +01001// *********** HERE STARTS graf.js *************
2
Javier López-Contreras052503f2018-12-26 12:34:42 +01003window.addEventListener("load", initGraf);
4
5// s is the sigma graph
6// graf is the JSON graph
7var s, graf;
8
9// query dario JSON for the graph information
10function xhr(method, url, params, callback) {
11 var http = new XMLHttpRequest();
12 if (method == "POST") {
13 http.open(method, url, true);
14 } else {
15 if (params != "") {
16 http.open(method, url+"?"+params, true);
17 } else {
18 http.open(method, url, true);
19 }
20 }
21 http.onload = function() {
22 if(this.status != 200) {
23 console.warn("Attention, status code "+this.status+" when loading via xhr url "+url);
24 }
25 callback(this.responseText, this.status);
26 };
27 if (method == "POST") {
28 http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
29 http.send(params);
30 } else {
31 http.send();
32 }
33}
34
35
36function initGraf() {
37 // create new methods for sigma library
38 updateSigma();
39
40 // create graf, s is the sigma graf
41 s = new sigma({
42 renderers: [{
43 container: "graf",
44 type: "webgl"
45 }],
46 settings: {
47 defaultEdgeColor: "#fff",
48 edgeColor: "default",
49 defaultLabelColor: "#fff",
50 autoRescale: false,
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +010051 zoomMax: 30,
Javier López-Contreras052503f2018-12-26 12:34:42 +010052 // enableEdgeHovering: true,
53 font: "Roboto",
54 labelThreshold: 5
55 }
56 });
57
58
59 // query for JSON for graph data
60 xhr("GET", "api.php", "action=getgraf", function(responseText, status) {
61 // graf is the JSON data
62 graf = JSON.parse(responseText);
63
64 // does graf.nodes have a size attribute?
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +010065 var rectBorrar = [[0,0], [0,0], [0,0], [0,0]];
Javier López-Contreras052503f2018-12-26 12:34:42 +010066 for (var i in graf.nodes) {
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +010067 if (graf.nodes[i].name == "Erase") rectBorrar[0] = [ graf.nodes[i].x , graf.nodes[i].y ];
68 if (graf.nodes[i].name == "Borrar") rectBorrar[1] = [ graf.nodes[i].x , graf.nodes[i].y ];
69 if (graf.nodes[i].name == "Esborrar") rectBorrar[2] = [ graf.nodes[i].x , graf.nodes[i].y ];
70 if (graf.nodes[i].name == "Delete") rectBorrar[3] = [ graf.nodes[i].x , graf.nodes[i].y ];
Javier López-Contreras052503f2018-12-26 12:34:42 +010071 }
72
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +010073 var sizegraf = 0;
74 for (var i in graf.nodes) {
75 if ( isInRect(graf.nodes[i].x, graf.nodes[i].y, rectBorrar) ) continue;
76 sizegraf++;
77 }
Javier López-Contreras052503f2018-12-26 12:34:42 +010078 var nnode = 0;
79 for (var i in graf.nodes) {
80 var ncolor = null;
81
82 if(graf.nodes[i].sex =="F") ncolor = "#d61c08";
83 else if(graf.nodes[i].sex == "M") ncolor = "#0159aa";
84 else ncolor = "#0ca80a";
85
86 // post-processing for year corrections
87 if(1970 < graf.nodes[i].year && graf.nodes[i].year < 2004) graf.nodes[i].year += 18;
88
89 var newX = 5000*Math.cos( 2*Math.PI*nnode/sizegraf );
90 var newY = 5000*Math.sin( 2*Math.PI*nnode/sizegraf );
91
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +010092 if (isInRect(graf.nodes[i].x, graf.nodes[i].y, rectBorrar) ) continue;
93
Javier López-Contreras052503f2018-12-26 12:34:42 +010094 s.graph.addNode({
95 // we add color, originalColor, size, originalX..Y, circleX..Y atributes
96 id: graf.nodes[i].id,
97 year: graf.nodes[i].year,
98 sex: graf.nodes[i].sex,
99 label: graf.nodes[i].name,
100 x: graf.nodes[i].x,
101 y: graf.nodes[i].y,
102 circleX: newX,
103 circleY: newY,
104 originalX: graf.nodes[i].x,
105 originalY: graf.nodes[i].y,
106 size: 10,
107 color: ncolor,
108 originalColor: ncolor
109 });
110 nnode++;
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +0100111
Javier López-Contreras052503f2018-12-26 12:34:42 +0100112 }
113
114 for (var i in graf.edges) {
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +0100115 if (isInRect(graf.nodes[graf.edges[i].a].x, graf.nodes[graf.edges[i].a].y, rectBorrar)) continue;
116 if (isInRect(graf.nodes[graf.edges[i].b].x, graf.nodes[graf.edges[i].b].y, rectBorrar)) continue;
Javier López-Contreras052503f2018-12-26 12:34:42 +0100117
118 s.graph.addEdge({
119 id: i,
120 source: graf.edges[i].a,
121 target: graf.edges[i].b,
122 size: Math.min(4, Math.max((7/(2*Math.pow(20, 2)))*Math.pow(graf.edges[i].votes, 2) + 1/2, 0.5))
123 });
124
125 }
126
127 s.bind('clickNode', function(e) {
128 var nodeId = e.data.node.id,
129 toKeep = s.graph.neighbors(nodeId);
130 // toKeep[nodeId] = e.data.node;
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +0100131
132
Javier López-Contreras052503f2018-12-26 12:34:42 +0100133 s.graph.nodes().forEach(function(n) {
134 if (toKeep[n.id] || n.id == nodeId) {
135 n.color = n.originalColor;
136 } else {
137 n.color = '#333';
138 }
139 });
140
141 s.graph.edges().forEach(function(e) {
142 if ((e.source == nodeId || e.target == nodeId) && (toKeep[e.source] || toKeep[e.target])) {
143 e.color = '#fff';
144 } else {
145 e.color = '#333';
146 }
147 });
148
149 if (circleMode) {
Javier López-Contreras6d1d72d2018-12-27 23:17:18 +0100150 s.graph.nodes().forEach(function (n) {
151 n.x = n.circleX;
152 n.y = n.circleY;
153 n.size = 10;
154 });
155
Javier López-Contreras052503f2018-12-26 12:34:42 +0100156 e.data.node.x = 0;
157 e.data.node.y = 0;
158 e.data.node.size = 30;
159 }
160
161 s.refresh();
162
163 dialog.show(nodeId, toKeep);
164 });
165
166
167 s.refresh();
168 initSearchBar();
169
170 autocomplete(document.querySelector("#search-input"), graf.nodes, "search");
171 });
172}
173
174function updateSigma() {
175 // returns set of neighouts
176 sigma.classes.graph.addMethod("neighbors", function(nodeId) {
177 var k,
178 neighbors = {},
179 index = this.allNeighborsIndex[nodeId] || [];
180
181 for (k in index) {
182 neighbors[k] = this.nodesIndex[k];
183 }
184
185 return neighbors;
186 });
187
188 // returns number of neighbours from a set of years
189 sigma.classes.graph.addMethod("numNeighborsFromYears", function(nodeId, showYearsCopy) {
190 var k,
191 neighbors = 0,
192 index = this.allNeighborsIndex[nodeId] || [];
193
194 for (k in index) {
195 if(this.nodesIndex){
196 if (showYearsCopy.has("" + this.nodesIndex[k].year)) neighbors++;
197 else if (this.nodesIndex[k].year == 0) neighbors++;
198 }
199 }
200
201 return neighbors;
202 });
203}