18 locked = document.getElementById("locked");
19 unlocked = document.getElementById("unlocked");
20 workarea = document.getElementById("workarea");
21 scriptcell = document.getElementById("scriptcell");
22 goalcell = document.getElementById("goalcell");
23 goals = document.getElementById("goals");
24 goalview = document.getElementById("goalview");
25 filename = document.getElementById("filename");
26 logarea = document.getElementById("logarea");
27 advanceButton = document.getElementById("advance");
28 retractButton = document.getElementById("retract");
29 cursorButton = document.getElementById("cursor");
30 bottomButton = document.getElementById("bottom");
32 // hide sequent view at start
38 // internet explorer (v.9) doesn't work with innerHTML
39 logarea.innerText = txt + "\n" + logarea.innerText;
45 debug("hd of '" + l + "' = '" + ar[0] + "'");
53 debug("tl of '" + l + "' = '" + tl + "'");
57 function listcons(x,l)
59 debug("cons '" + x + "' on '" + l + "'");
73 function fold_left (f,acc,l)
76 { debug("'" + l + "' is fold end");
79 { debug("'" + l + "' is fold cons");
80 return(fold_left (f,f(acc,(listhd(l))),listtl(l))); }
83 function listiter (f,l)
86 { debug("'" + l + "' is nil");
91 debug("'" + l + "' is not nil");
93 listiter(f,listtl(l));
97 function listmap (f,l)
99 debug("listmap on " + l);
101 { debug("returning listnil");
105 { debug("cons f(hd) map(f,tl)");
106 return(f(listhd(l)) + "#" + listmap(f,listtl(l)));
110 var statements = listnil();
113 var metalist = listnil();
115 function pairmap (f,p)
117 debug("pairmap of '" + p + "'");
119 return (f(ar[0],ar[1]));
122 function tripletmap (f,p)
124 debug("tripletmap of '" + p + "'");
126 return (f(ar[0],ar[1],ar[2]));
132 return (pairmap (function (a,b) { return (a); }, p));
138 return (tripletmap (function (a,b,c) { return (a); }, p));
144 return (tripletmap (function (a,b,c) { return (b); }, p));
150 return (tripletmap (function (a,b,c) { return (c); }, p));
153 function populate_goalarray(menv)
155 debug("metasenv.length = " + menv.length);
156 if (menv.length == 0) {
162 goalarray = new Array();
163 metalist = listnil();
164 var tmp_goallist = "";
165 for (i = 0; i < menv.length; i++) {
166 metano = menv[i].getAttribute("number");
167 metaname = menv[i].childNodes[0].childNodes[0].data;
168 goal = menv[i].childNodes[1].childNodes[0].data;
169 debug ("found meta n. " + metano);
170 debug ("found goal\nBEGIN" + goal + "\nEND");
171 goalarray[metano] = goal;
172 tmp_goallist = " <A href=\"javascript:switch_goal(" + metano + ")\">" + metaname + "</A>" + tmp_goallist;
173 metalist = listcons(metano,metalist);
174 debug ("goalarray[\"" + metano + "\"] = " + goalarray[metano]);
176 goals.innerHTML = tmp_goallist;
177 debug("new metalist is '" + metalist + "'");
178 if (is_nil(metalist)) {
182 switch_goal(listhd(metalist));
187 function switch_goal(meta)
189 if (typeof meta == "undefined") {
190 goalview.innerHTML = "";
193 debug("switch_goal " + meta + "\n" + goalarray[meta]);
194 goalview.innerHTML = "<B>Goal ?" + meta + ":</B>\n\n" + goalarray[meta];
198 String.prototype.sescape = function() {
204 result = result.replace(patt1,"%25");
205 result = result.replace(patt2,"%3D");
206 result = result.replace(patt3,"%26");
207 result = result.replace(patt4,"%2B");
211 String.prototype.unescapeHTML = function()
213 var patt1 = /<br(\/|)>/gi;
214 var patt2 = /</gi;
215 var patt3 = />/gi;
217 result = result.replace(patt1,"\n");
218 result = result.replace(patt2,"<");
219 result = result.replace(patt3,">");
220 return (unescape(result));
225 advanceButton.disabled = true;
226 retractButton.disabled = true;
227 cursorButton.disabled = true;
228 bottomButton.disabled = true;
233 advanceButton.disabled = false;
234 retractButton.disabled = false;
235 cursorButton.disabled = false;
236 bottomButton.disabled = false;
239 function is_defined(x)
241 return (typeof x != "undefined");
244 /* servicename: name of the service being called
245 * reqbody: text of the request
246 * processResponse: processes the server response
247 * (takes the response text in input, undefined in case of error)
249 function callServer(servicename,processResponse,reqbody)
253 if (window.XMLHttpRequest)
255 req = new XMLHttpRequest();
257 else if (window.ActiveXObject)
260 req = new ActiveXObject("Msxml2.XMLHTTP");
264 req = new ActiveXObject("Microsoft.XMLHTTP");
268 req.onreadystatechange = function()
276 stxt = req.statusText;
279 debug(req.responseText);
280 if (window.DOMParser) {
281 parser=new DOMParser();
282 xmlDoc=parser.parseFromString(req.responseText,"text/xml");
284 else // Internet Explorer
286 xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
287 xmlDoc.async="false";
288 xmlDoc.loadXML(req.responseText);
290 processResponse(xmlDoc);
296 req.open("POST", servicename); // + escape(unlocked.innerHTML), true);
297 req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
306 function advanceForm1()
308 processor = function(xml) {
309 if (is_defined(xml)) {
310 // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
311 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
312 len0 = unlocked.innerHTML.length;
313 unescaped = unlocked.innerHTML.unescapeHTML();
314 parsedtxt = unescaped.substr(0,len);
315 unparsedtxt = unescaped.substr(len);
316 locked.innerHTML = locked.innerHTML + parsedtxt;
317 unlocked.innerHTML = unparsedtxt;
318 len1 = unlocked.innerHTML.length;
320 metasenv = xml.getElementsByTagName("meta");
321 populate_goalarray(metasenv);
322 statements = listcons(len2,statements);
323 unlocked.scrollIntoView(true);
325 debug("advance failed");
330 callServer("advance",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
334 function gotoBottom()
336 processor = function(xml) {
337 if (is_defined(xml)) {
338 // debug("goto bottom: received response\nBEGIN\n" + req.responseText + "\nEND");
339 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
340 len0 = unlocked.innerHTML.length;
341 unescaped = unlocked.innerHTML.unescapeHTML();
342 parsedtxt = unescaped.substr(0,len);
343 unparsedtxt = unescaped.substr(len);
344 locked.innerHTML = locked.innerHTML + parsedtxt;
345 unlocked.innerHTML = unparsedtxt;
346 len1 = unlocked.innerHTML.length;
348 metasenv = xml.getElementsByTagName("meta");
349 populate_goalarray(metasenv);
350 statements = listcons(len2,statements);
351 unlocked.scrollIntoView(true);
353 debug("goto bottom failed");
358 callServer("bottom",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
363 function gotoPos(offset)
365 if (!is_defined(offset)) {
366 offset = getCursorPos();
368 processor = function(xml) {
369 if (is_defined(xml)) {
370 // debug("goto pos: received response\nBEGIN\n" + req.responseText + "\nEND");
371 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
372 len0 = unlocked.innerHTML.length;
373 unescaped = unlocked.innerHTML.unescapeHTML();
374 parsedtxt = unescaped.substr(0,len);
375 unparsedtxt = unescaped.substr(len);
376 locked.innerHTML = locked.innerHTML + parsedtxt;
377 unlocked.innerHTML = unparsedtxt;
378 len1 = unlocked.innerHTML.length;
380 metasenv = xml.getElementsByTagName("meta");
381 // populate_goalarray(metasenv);
382 statements = listcons(len2,statements);
383 unlocked.scrollIntoView(true);
384 // la populate non andrebbe fatta a ogni passo
386 populate_goalarray(metasenv);
389 gotoPos(offset - len);
392 unlocked.scrollIntoView(true);
393 populate_goalarray(metasenv);
398 callServer("advance",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
403 processor = function(xml) {
404 if (typeof xml != "undefined") {
405 // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
406 statementlen = parseInt(listhd(statements));
407 statements = listtl(statements);
408 lockedlen = locked.innerHTML.length - statementlen;
409 statement = locked.innerHTML.substr(lockedlen, statementlen);
410 locked.innerHTML = locked.innerHTML.substr(0,lockedlen);
411 unlocked.innerHTML = statement + unlocked.innerHTML;
412 metasenv = xml.getElementsByTagName("meta");
413 populate_goalarray(metasenv);
414 unlocked.scrollIntoView(true);
416 debug("retract failed");
422 callServer("retract",processor);
428 processor = function(xml)
430 if (is_defined(xml)) {
431 locked.innerHTML = "";
432 unlocked.innerHTML = xml.documentElement.textContent;
434 debug("file open failed");
437 callServer("open",processor,"file=" + escape(filename.value));
442 function hideSequent() {
443 goalcell.parentNode.removeChild(goalcell);
444 scriptcell.setAttribute("colspan","2");
447 function showSequent() {
448 scriptcell.setAttribute("colspan","1");
449 workarea.appendChild(goalcell);
452 function removeElement(id) {
453 var element = document.getElementById(id);
454 element.parentNode.removeChild(element);
457 function getCursorPos() {
459 if (window.getSelection) {
460 var selObj = window.getSelection();
461 var selRange = selObj.getRangeAt(0);
462 //cursorPos = findNode(selObj.anchorNode.parentNode.childNodes, selObj.anchorNode) + selObj.anchorOffset;
463 cursorPos = findNode(unlocked.childNodes, selObj.anchorNode,0) + selObj.anchorOffset;
464 /* FIXME the following works wrong in Opera when the document is longer than 32767 chars */
467 else if (document.selection) {
468 var range = document.selection.createRange();
469 var bookmark = range.getBookmark();
470 /* FIXME the following works wrong when the document is longer than 65535 chars */
471 cursorPos = bookmark.charCodeAt(2) - 11; /* Undocumented function [3] */
476 function findNode(list, node, acc) {
477 for (var i = 0; i < list.length; i++) {
478 if (list[i] == node) {
479 // debug("success " + i);
482 if (list[i].hasChildNodes()) {
484 // debug("recursion on node " + i);
485 return (findNode(list[i].childNodes,node,acc))
487 catch (e) { /* debug("recursion failed"); */ }
489 sandbox = document.getElementById("sandbox");
490 dup = list[i].cloneNode(true);
491 sandbox.appendChild(dup);
492 // debug("fail " + i + ": " + sandbox.innerHTML);
493 acc += sandbox.innerHTML.length;
494 sandbox.removeChild(dup);
500 debug("cursor test: " + unlocked.innerHTML.substr(0,getCursorPos()));