adamc@580
|
1 function cons(v, ls) {
|
adamc@580
|
2 return { n : ls, v : v };
|
adamc@580
|
3 }
|
adamc@579
|
4 function callAll(ls) {
|
adamc@585
|
5 for (; ls; ls = ls.n)
|
adamc@579
|
6 ls.v();
|
adamc@579
|
7 }
|
adamc@574
|
8
|
adamc@580
|
9 function sc(v) {
|
adamc@580
|
10 return {v : v, h : null};
|
adamc@580
|
11 }
|
adamc@580
|
12 function sv(s, v) {
|
adamc@580
|
13 s.v = v;
|
adamc@580
|
14 callAll(s.h);
|
adamc@580
|
15 }
|
adamc@601
|
16 function sg(s) {
|
adamc@601
|
17 return s.v;
|
adamc@601
|
18 }
|
adamc@579
|
19
|
adamc@580
|
20 function ss(s) {
|
adamc@580
|
21 return s;
|
adamc@580
|
22 }
|
adamc@580
|
23 function sr(v) {
|
adamc@580
|
24 return {v : v, h : null};
|
adamc@580
|
25 }
|
adamc@580
|
26 function sb(x,y) {
|
adamc@580
|
27 var z = y(x.v);
|
adamc@580
|
28 var s = {v : z.v, h : null};
|
adamc@580
|
29
|
adamc@580
|
30 function reZ() {
|
adamc@580
|
31 z.h = cons(function() { s.v = z.v; callAll(s.h); }, z.h);
|
adamc@580
|
32 }
|
adamc@580
|
33
|
adamc@580
|
34 x.h = cons(function() { z = y(x.v); reZ(); s.v = z.v; callAll(s.h); }, x.h);
|
adamc@580
|
35 reZ();
|
adamc@580
|
36
|
adamc@580
|
37 return s;
|
adamc@580
|
38 }
|
adamc@571
|
39
|
adamc@604
|
40 function lastParent() {
|
adamc@604
|
41 var pos = document;
|
adamc@604
|
42
|
adamc@600
|
43 while (pos.lastChild && pos.lastChild.nodeType == 1)
|
adamc@600
|
44 pos = pos.lastChild;
|
adamc@600
|
45
|
adamc@600
|
46 return pos.parentNode;
|
adamc@600
|
47 }
|
adamc@600
|
48
|
adamc@604
|
49 var thisScript = null;
|
adamc@603
|
50
|
adamc@604
|
51 function addNode(node) {
|
adamc@604
|
52 if (thisScript) {
|
adamc@604
|
53 thisScript.parentNode.appendChild(node);
|
adamc@604
|
54 thisScript.parentNode.removeChild(thisScript);
|
adamc@604
|
55 } else
|
adamc@604
|
56 lastParent().appendChild(node);
|
adamc@603
|
57 }
|
adamc@603
|
58
|
adamc@604
|
59 function runScripts(node) {
|
adamc@604
|
60 var savedScript = thisScript;
|
adamc@603
|
61
|
adamc@646
|
62 var scripts = node.getElementsByTagName("script"), scriptsCopy = {};
|
adamc@604
|
63 var len = scripts.length;
|
adamc@646
|
64 for (var i = 0; i < len; ++i)
|
adamc@646
|
65 scriptsCopy[i] = scripts[i];
|
adamc@604
|
66 for (var i = 0; i < len; ++i) {
|
adamc@646
|
67 thisScript = scriptsCopy[i];
|
adamc@604
|
68 eval(thisScript.textContent);
|
adamc@604
|
69 }
|
adamc@604
|
70
|
adamc@604
|
71 thisScript = savedScript;
|
adamc@603
|
72 }
|
adamc@603
|
73
|
adamc@603
|
74 function populate(node, html) {
|
adamc@603
|
75 node.innerHTML = html;
|
adamc@604
|
76 runScripts(node);
|
adamc@603
|
77 }
|
adamc@603
|
78
|
adamc@571
|
79 function dyn(s) {
|
adamc@571
|
80 var x = document.createElement("span");
|
adamc@604
|
81 populate(x, s.v);
|
adamc@604
|
82 addNode(x);
|
adamc@603
|
83 s.h = cons(function() { populate(x, s.v) }, s.h);
|
adamc@571
|
84 }
|
adamc@582
|
85
|
adamc@598
|
86 function inp(t, s) {
|
adamc@598
|
87 var x = document.createElement(t);
|
adamc@598
|
88 x.value = s.v;
|
adamc@604
|
89 addNode(x);
|
adamc@598
|
90 s.h = cons(function() { x.value = s.v }, s.h);
|
adamc@598
|
91 x.onkeyup = function() { sv(s, x.value) };
|
adamc@606
|
92 return x;
|
adamc@598
|
93 }
|
adamc@598
|
94
|
adamc@597
|
95 function eh(x) {
|
adamc@597
|
96 return x.split("&").join("&").split("<").join("<").split(">").join(">");
|
adamc@597
|
97 }
|
adamc@597
|
98
|
adamc@582
|
99 function ts(x) { return x.toString() }
|
adamc@586
|
100 function bs(b) { return (b ? "True" : "False") }
|
adamc@586
|
101
|
adamc@649
|
102 function pi(s) {
|
adamc@649
|
103 var r = parseInt(s);
|
adamc@649
|
104 if (r.toString() == s)
|
adamc@649
|
105 return r;
|
adamc@649
|
106 else
|
adamc@649
|
107 throw "Can't parse int: " + s;
|
adamc@649
|
108 }
|
adamc@649
|
109
|
adamc@649
|
110 function pfl(s) {
|
adamc@649
|
111 var r = parseFloat(s);
|
adamc@649
|
112 if (r.toString() == s)
|
adamc@649
|
113 return r;
|
adamc@649
|
114 else
|
adamc@649
|
115 throw "Can't parse float: " + s;
|
adamc@649
|
116 }
|
adamc@649
|
117
|
adamc@649
|
118 function pf() {
|
adamc@649
|
119 alert("Pattern match failure");
|
adamc@649
|
120 throw "Pattern match failure";
|
adamc@649
|
121 }
|
adamc@589
|
122
|
adamc@603
|
123 var closures = [];
|
adamc@603
|
124
|
adamc@603
|
125 function ca(f) {
|
adamc@603
|
126 var n = closures.length;
|
adamc@603
|
127 closures[n] = f;
|
adamc@603
|
128 return n;
|
adamc@603
|
129 }
|
adamc@603
|
130
|
adamc@603
|
131 function cr(n) {
|
adamc@603
|
132 return closures[n]();
|
adamc@603
|
133 }
|
adamc@603
|
134
|
adamc@609
|
135
|
adamc@668
|
136 var client_id = 0;
|
adamc@668
|
137 var client_pass = 0;
|
adamc@668
|
138 var url_prefix = "/";
|
adamc@668
|
139
|
adamc@668
|
140 function getXHR(uri)
|
adamc@609
|
141 {
|
adamc@609
|
142 try {
|
adamc@609
|
143 return new XMLHttpRequest();
|
adamc@609
|
144 } catch (e) {
|
adamc@609
|
145 try {
|
adamc@609
|
146 return new ActiveXObject("Msxml2.XMLHTTP");
|
adamc@609
|
147 } catch (e) {
|
adamc@609
|
148 try {
|
adamc@609
|
149 return new ActiveXObject("Microsoft.XMLHTTP");
|
adamc@609
|
150 } catch (e) {
|
adamc@609
|
151 throw "Your browser doesn't seem to support AJAX.";
|
adamc@609
|
152 }
|
adamc@609
|
153 }
|
adamc@609
|
154 }
|
adamc@609
|
155 }
|
adamc@609
|
156
|
adamc@668
|
157 function requestUri(xhr, uri) {
|
adamc@668
|
158 xhr.open("GET", uri, true);
|
adamc@668
|
159
|
adamc@668
|
160 if (client_id != 0) {
|
adamc@668
|
161 xhr.setRequestHeader("UrWeb-Client", client_id.toString());
|
adamc@668
|
162 xhr.setRequestHeader("UrWeb-Pass", client_pass.toString());
|
adamc@668
|
163 }
|
adamc@668
|
164
|
adamc@668
|
165 xhr.send(null);
|
adamc@668
|
166 }
|
adamc@668
|
167
|
adamc@613
|
168 function rc(uri, parse, k) {
|
adamc@609
|
169 var xhr = getXHR();
|
adamc@609
|
170
|
adamc@609
|
171 xhr.onreadystatechange = function() {
|
adamc@612
|
172 if (xhr.readyState == 4) {
|
adamc@612
|
173 var isok = false;
|
adamc@612
|
174
|
adamc@612
|
175 try {
|
adamc@612
|
176 if (xhr.status == 200)
|
adamc@612
|
177 isok = true;
|
adamc@612
|
178 } catch (e) { }
|
adamc@612
|
179
|
adamc@612
|
180 if (isok)
|
adamc@613
|
181 k(parse(xhr.responseText));
|
adamc@649
|
182 else {
|
adamc@612
|
183 alert("Error querying remote server!");
|
adamc@649
|
184 throw "Error querying remote server!";
|
adamc@649
|
185 }
|
adamc@612
|
186 }
|
adamc@609
|
187 };
|
adamc@609
|
188
|
adamc@668
|
189 requestUri(xhr, uri);
|
adamc@609
|
190 }
|
adamc@667
|
191
|
adamc@667
|
192
|
adamc@667
|
193 function path_join(s1, s2) {
|
adamc@667
|
194 if (s1.length > 0 && s1[s1.length-1] == '/')
|
adamc@667
|
195 return s1 + s2;
|
adamc@667
|
196 else
|
adamc@667
|
197 return s1 + "/" + s2;
|
adamc@667
|
198 }
|
adamc@667
|
199
|
adamc@667
|
200 function listener() {
|
adamc@668
|
201 var uri = path_join(url_prefix, ".msgs");
|
adamc@667
|
202 var xhr = getXHR();
|
adamc@667
|
203
|
adamc@667
|
204 xhr.onreadystatechange = function() {
|
adamc@667
|
205 if (xhr.readyState == 4) {
|
adamc@667
|
206 var isok = false;
|
adamc@667
|
207
|
adamc@667
|
208 try {
|
adamc@667
|
209 if (xhr.status == 200)
|
adamc@667
|
210 isok = true;
|
adamc@667
|
211 } catch (e) { }
|
adamc@667
|
212
|
adamc@668
|
213 if (isok) {
|
adamc@667
|
214 alert("Messages: " + xhr.responseText);
|
adamc@668
|
215 requestUri(xhr, uri);
|
adamc@668
|
216 }
|
adamc@667
|
217 else {
|
adamc@667
|
218 alert("Error querying remote server for messages!");
|
adamc@667
|
219 throw "Error querying remote server for messages!";
|
adamc@667
|
220 }
|
adamc@667
|
221 }
|
adamc@667
|
222 };
|
adamc@667
|
223
|
adamc@668
|
224 requestUri(xhr, uri);
|
adamc@667
|
225 }
|