@@ -1,77 +1,60 @@
1−//refactor this into a client library
2−var socket = new WebSocket("ws://localhost:8888");
3−socket.onopen = function(event) {
4− console.log("connected");
5− setStatus("connected");
6−}
7−socket.onerror = function(event) {
8− console.log("error: " + event);
9−}
10−socket.onmessage = function (event) {
11− console.log("message received: " + event.data);
12− var msg = JSON.parse(event.data);
13− handleResponse(msg);
14−}
15−socket.onclose = function(event) {
16− console.log("conn closed: " + event);
17− setStatus("disconnected");
18−}
19−
20−function setStatus(text)
21−{
22− var newtext = document.createTextNode(text);
23− var statusnode = document.getElementById("status");
24− while( statusnode.firstChild ) {
25− statusnode.removeChild( statusnode.firstChild );
26− }
27− statusnode.appendChild(newtext);
1+var ProjectM36Connection = function (host, port, openCallback, errorCallback, statusCallback, closeCallback) {
2+ this.host = host
3+ this.port = port
4+ var socket = new WebSocket("ws://" + host + ":" + port);
5+ socket.onopen = function(event) { openCallback(event); };
6+ socket.onerror = function(event) { errorCallback(event); };
7+ var self = this;
8+ socket.onmessage = function(event) {
9+ var msg = JSON.parse(event.data);
10+ self.handleResponse(msg);
11+ };
12+ socket.onclose = function(event) {
13+ closeCallback(event);
14+ };
15+ this.statuscallback = statusCallback;
16+ this.socket = socket;
2817}
2918
30−function execTutorialD()
19+var ProjectM36Status = function (relationResult, acknowledgementResult, errorResult)
3120{
32− var tutd = document.getElementById("tutd").value;
33− socket.send("executetutd:" + tutd);
34− return false;
21+ this.relation = relationResult;
22+ this.acknowledgement = acknowledgementResult;
23+ this.error = errorResult;
3524}
3625
37−function handleResponse(message)
26+ProjectM36Connection.prototype.handleResponse = function(message)
3827{
3928 var relation = message["displayrelation"];
4029 var acknowledged = message["acknowledged"];
4130 var error = message["displayerror"];
4231 if(relation)
4332 {
44− var reltable = generateRelation(relation);
45− var existingtable = document.getElementById("relationresult");
46− while(existingtable.firstChild)
47− {
48− existingtable.removeChild(existingtable.firstChild);
49− }
50− reltable.id = "relationresult";
51− existingtable.parentNode.replaceChild(reltable, existingtable);
52− }
53− else
54− {
33+ this.statuscallback(new ProjectM36Status(relation, null, null));
5534 }
5635
57− var message = "";
5836 if(acknowledged)
5937 {
60− message="acknowledged";
38+ this.statuscallback(new ProjectM36Status(null, true, null));
6139 }
40+
6241 if(error)
6342 {
64− message=error;
43+ this.statuscallback(new ProjectM36Status(null, null, error));
6544 }
66− document.getElementById("resultstatus").innerHTML = message;
6745}
6846
69−function generateRelation(relation)
47+ProjectM36Connection.prototype.executeTutorialD = function(tutd)
48+{
49+ this.socket.send("executetutd:" + tutd);
50+}
51+
52+ProjectM36Connection.prototype.generateRelation = function(relation)
7053{
7154 var table = document.createElement("table");
7255
73− var headers = generateRelationHeader(relation[0]);
74− var body = generateRelationBody(relation[1]);
56+ var headers = this.generateRelationHeader(relation[0]);
57+ var body = this.generateRelationBody(relation[1]);
7558
7659 table.appendChild(headers);
7760 table.appendChild(body);
@@ -79,14 +62,14 @@ function generateRelation(relation)
7962 return table;
8063}
8164
82−function generateRelationHeader(header)
65+ProjectM36Connection.prototype.generateRelationHeader = function(header)
8366{
8467 var thead = document.createElement("thead");
8568 var headerrow = document.createElement("tr");
8669 for(var hindex=0; hindex < header.length; hindex++)
8770 {
8871 var th = document.createElement("th");
89− var attrtype = generateAtomType(header[hindex]);
72+ var attrtype = this.generateAtomType(header[hindex]);
9073 th.appendChild(attrtype);
9174 headerrow.appendChild(th);
9275 }
@@ -94,7 +77,7 @@ function generateRelationHeader(header)
9477 return thead;
9578}
9679
97−function generateAtomType(attr)
80+ProjectM36Connection.prototype.generateAtomType = function(attr)
9881{
9982 var atomType = attr[1]["tag"];
10083 var attrName = attr[0];
@@ -116,7 +99,7 @@ function generateAtomType(attr)
11699 for(var attrindex = 0; attrindex < relattrs.length; attrindex++)
117100 {
118101 var th = document.createElement("th");
119− var relattrNode = generateAtomType(relattrs[attrindex]);
102+ var relattrNode = this.generateAtomType(relattrs[attrindex]);
120103 th.appendChild(relattrNode);
121104 tr.appendChild(th);
122105 }
@@ -128,7 +111,7 @@ function generateAtomType(attr)
128111 return element
129112}
130113
131−function generateRelationBody(body)
114+ProjectM36Connection.prototype.generateRelationBody = function (body)
132115{
133116 var bodyrows = body["asList"]
134117 var tbody = document.createElement("tbody");
@@ -139,7 +122,7 @@ function generateRelationBody(body)
139122 for(var atomindex=0; atomindex < bodyrow[1].length; atomindex++)
140123 {
141124 var td = document.createElement("td");
142− var atomNode = generateAtom(bodyrow[1][atomindex]);
125+ var atomNode = this.generateAtom(bodyrow[1][atomindex]);
143126 td.appendChild(atomNode);
144127 tablerow.appendChild(td);
145128 }
@@ -148,14 +131,14 @@ function generateRelationBody(body)
148131 return tbody;
149132}
150133
151−function generateAtom(atom)
134+ProjectM36Connection.prototype.generateAtom = function(atom)
152135{
153136 var element = document.createElement("span");
154137 var atomType = atom["type"]["tag"];
155138
156139 if(atomType == "RelationAtomType")
157140 {
158− var rel = generateRelation(atom["val"]);
141+ var rel = this.generateRelation(atom["val"]);
159142 element.appendChild(rel);
160143 }
161144 else