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@609
|
136 function getXHR()
|
adamc@609
|
137 {
|
adamc@609
|
138 try {
|
adamc@609
|
139 return new XMLHttpRequest();
|
adamc@609
|
140 } catch (e) {
|
adamc@609
|
141 try {
|
adamc@609
|
142 return new ActiveXObject("Msxml2.XMLHTTP");
|
adamc@609
|
143 } catch (e) {
|
adamc@609
|
144 try {
|
adamc@609
|
145 return new ActiveXObject("Microsoft.XMLHTTP");
|
adamc@609
|
146 } catch (e) {
|
adamc@609
|
147 throw "Your browser doesn't seem to support AJAX.";
|
adamc@609
|
148 }
|
adamc@609
|
149 }
|
adamc@609
|
150 }
|
adamc@609
|
151 }
|
adamc@609
|
152
|
adamc@613
|
153 function rc(uri, parse, k) {
|
adamc@609
|
154 var xhr = getXHR();
|
adamc@609
|
155
|
adamc@609
|
156 xhr.onreadystatechange = function() {
|
adamc@612
|
157 if (xhr.readyState == 4) {
|
adamc@612
|
158 var isok = false;
|
adamc@612
|
159
|
adamc@612
|
160 try {
|
adamc@612
|
161 if (xhr.status == 200)
|
adamc@612
|
162 isok = true;
|
adamc@612
|
163 } catch (e) { }
|
adamc@612
|
164
|
adamc@612
|
165 if (isok)
|
adamc@613
|
166 k(parse(xhr.responseText));
|
adamc@649
|
167 else {
|
adamc@612
|
168 alert("Error querying remote server!");
|
adamc@649
|
169 throw "Error querying remote server!";
|
adamc@649
|
170 }
|
adamc@612
|
171 }
|
adamc@609
|
172 };
|
adamc@609
|
173
|
adamc@609
|
174 xhr.open("GET", uri, true);
|
adamc@609
|
175 xhr.send(null);
|
adamc@609
|
176 }
|