21 if (readCookie("session") == null) {
22 window.location = "/login.html"
24 locked = document.getElementById("locked");
25 unlocked = document.getElementById("unlocked");
26 workarea = document.getElementById("workarea");
27 scriptcell = document.getElementById("scriptcell");
28 goalcell = document.getElementById("goalcell");
29 goals = document.getElementById("goals");
30 goalview = document.getElementById("goalview");
31 filename = document.getElementById("filename");
32 logarea = document.getElementById("logarea");
33 advanceButton = document.getElementById("advance");
34 retractButton = document.getElementById("retract");
35 cursorButton = document.getElementById("cursor");
36 bottomButton = document.getElementById("bottom");
37 dialogBox = document.getElementById("dialogBox");
38 dialogTitle = document.getElementById("dialogTitle");
39 dialogContent = document.getElementById("dialogContent");
41 // hide sequent view at start
48 // internet explorer (v.9) doesn't work with innerHTML
49 logarea.innerText = txt + "\n" + logarea.innerText;
55 debug("hd of '" + l + "' = '" + ar[0] + "'");
63 debug("tl of '" + l + "' = '" + tl + "'");
67 function listcons(x,l)
69 debug("cons '" + x + "' on '" + l + "'");
83 function fold_left (f,acc,l)
86 { debug("'" + l + "' is fold end");
89 { debug("'" + l + "' is fold cons");
90 return(fold_left (f,f(acc,(listhd(l))),listtl(l))); }
93 function listiter (f,l)
96 { debug("'" + l + "' is nil");
101 debug("'" + l + "' is not nil");
103 listiter(f,listtl(l));
107 function listmap (f,l)
109 debug("listmap on " + l);
111 { debug("returning listnil");
115 { debug("cons f(hd) map(f,tl)");
116 return(f(listhd(l)) + "#" + listmap(f,listtl(l)));
120 var statements = listnil();
123 var metalist = listnil();
125 function pairmap (f,p)
127 debug("pairmap of '" + p + "'");
129 return (f(ar[0],ar[1]));
132 function tripletmap (f,p)
134 debug("tripletmap of '" + p + "'");
136 return (f(ar[0],ar[1],ar[2]));
142 return (pairmap (function (a,b) { return (a); }, p));
148 return (tripletmap (function (a,b,c) { return (a); }, p));
154 return (tripletmap (function (a,b,c) { return (b); }, p));
160 return (tripletmap (function (a,b,c) { return (c); }, p));
163 function populate_goalarray(menv)
165 debug("metasenv.length = " + menv.length);
166 if (menv.length == 0) {
172 goalarray = new Array();
173 metalist = listnil();
174 var tmp_goallist = "";
175 for (i = 0; i < menv.length; i++) {
176 metano = menv[i].getAttribute("number");
177 metaname = menv[i].childNodes[0].childNodes[0].data;
178 goal = menv[i].childNodes[1].childNodes[0].data;
179 debug ("found meta n. " + metano);
180 debug ("found goal\nBEGIN" + goal + "\nEND");
181 goalarray[metano] = goal;
182 tmp_goallist = " <A href=\"javascript:switch_goal(" + metano + ")\">" + metaname + "</A>" + tmp_goallist;
183 metalist = listcons(metano,metalist);
184 debug ("goalarray[\"" + metano + "\"] = " + goalarray[metano]);
186 goals.innerHTML = tmp_goallist;
187 debug("new metalist is '" + metalist + "'");
188 if (is_nil(metalist)) {
192 switch_goal(listhd(metalist));
197 function switch_goal(meta)
199 if (typeof meta == "undefined") {
200 goalview.innerHTML = "";
203 debug("switch_goal " + meta + "\n" + goalarray[meta]);
204 goalview.innerHTML = "<B>Goal ?" + meta + ":</B>\n\n" + goalarray[meta];
208 String.prototype.sescape = function() {
214 result = result.replace(patt1,"%25");
215 result = result.replace(patt2,"%3D");
216 result = result.replace(patt3,"%26");
217 result = result.replace(patt4,"%2B");
221 String.prototype.unescapeHTML = function()
223 var patt1 = /<br(\/|)>/gi;
224 var patt2 = /</gi;
225 var patt3 = />/gi;
227 result = result.replace(patt1,"\n");
228 result = result.replace(patt2,"<");
229 result = result.replace(patt3,">");
230 return (unescape(result));
235 advanceButton.disabled = true;
236 retractButton.disabled = true;
237 cursorButton.disabled = true;
238 bottomButton.disabled = true;
243 advanceButton.disabled = false;
244 retractButton.disabled = false;
245 cursorButton.disabled = false;
246 bottomButton.disabled = false;
249 function is_defined(x)
251 return (typeof x != "undefined");
254 /* servicename: name of the service being called
255 * reqbody: text of the request
256 * processResponse: processes the server response
257 * (takes the response text in input, undefined in case of error)
259 function callServer(servicename,processResponse,reqbody)
263 if (window.XMLHttpRequest)
265 req = new XMLHttpRequest();
267 else if (window.ActiveXObject)
270 req = new ActiveXObject("Msxml2.XMLHTTP");
274 req = new ActiveXObject("Microsoft.XMLHTTP");
278 req.onreadystatechange = function()
286 stxt = req.statusText;
289 debug(req.responseText);
290 if (window.DOMParser) {
291 parser=new DOMParser();
292 xmlDoc=parser.parseFromString(req.responseText,"text/xml");
294 else // Internet Explorer
296 xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
297 xmlDoc.async="false";
298 xmlDoc.loadXML(req.responseText);
300 processResponse(xmlDoc);
306 req.open("POST", servicename); // + escape(unlocked.innerHTML), true);
307 req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
316 function advanceForm1()
318 processor = function(xml) {
319 if (is_defined(xml)) {
320 // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
321 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
322 len0 = unlocked.innerHTML.length;
323 unescaped = unlocked.innerHTML.unescapeHTML();
324 parsedtxt = unescaped.substr(0,len);
325 unparsedtxt = unescaped.substr(len);
326 locked.innerHTML = locked.innerHTML + parsedtxt;
327 unlocked.innerHTML = unparsedtxt;
328 len1 = unlocked.innerHTML.length;
330 metasenv = xml.getElementsByTagName("meta");
331 populate_goalarray(metasenv);
332 statements = listcons(len2,statements);
333 unlocked.scrollIntoView(true);
335 debug("advance failed");
340 callServer("advance",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
344 function gotoBottom()
346 processor = function(xml) {
347 if (is_defined(xml)) {
348 // debug("goto bottom: received response\nBEGIN\n" + req.responseText + "\nEND");
349 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
350 len0 = unlocked.innerHTML.length;
351 unescaped = unlocked.innerHTML.unescapeHTML();
352 parsedtxt = unescaped.substr(0,len);
353 unparsedtxt = unescaped.substr(len);
354 locked.innerHTML = locked.innerHTML + parsedtxt;
355 unlocked.innerHTML = unparsedtxt;
356 len1 = unlocked.innerHTML.length;
358 metasenv = xml.getElementsByTagName("meta");
359 populate_goalarray(metasenv);
360 statements = listcons(len2,statements);
361 unlocked.scrollIntoView(true);
363 debug("goto bottom failed");
368 callServer("bottom",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
373 function gotoPos(offset)
375 if (!is_defined(offset)) {
376 offset = getCursorPos();
378 processor = function(xml) {
379 if (is_defined(xml)) {
380 // debug("goto pos: received response\nBEGIN\n" + req.responseText + "\nEND");
381 len = parseInt(xml.getElementsByTagName("parsed")[0].getAttribute("length"));
382 len0 = unlocked.innerHTML.length;
383 unescaped = unlocked.innerHTML.unescapeHTML();
384 parsedtxt = unescaped.substr(0,len);
385 unparsedtxt = unescaped.substr(len);
386 locked.innerHTML = locked.innerHTML + parsedtxt;
387 unlocked.innerHTML = unparsedtxt;
388 len1 = unlocked.innerHTML.length;
390 metasenv = xml.getElementsByTagName("meta");
391 // populate_goalarray(metasenv);
392 statements = listcons(len2,statements);
393 unlocked.scrollIntoView(true);
394 // la populate non andrebbe fatta a ogni passo
396 populate_goalarray(metasenv);
399 gotoPos(offset - len);
402 unlocked.scrollIntoView(true);
403 populate_goalarray(metasenv);
408 callServer("advance",processor,"body=" + (unlocked.innerHTML.unescapeHTML()).sescape());
413 processor = function(xml) {
414 if (typeof xml != "undefined") {
415 // debug("advance: received response\nBEGIN\n" + req.responseText + "\nEND");
416 statementlen = parseInt(listhd(statements));
417 statements = listtl(statements);
418 lockedlen = locked.innerHTML.length - statementlen;
419 statement = locked.innerHTML.substr(lockedlen, statementlen);
420 locked.innerHTML = locked.innerHTML.substr(0,lockedlen);
421 unlocked.innerHTML = statement + unlocked.innerHTML;
422 metasenv = xml.getElementsByTagName("meta");
423 populate_goalarray(metasenv);
424 unlocked.scrollIntoView(true);
426 debug("retract failed");
432 callServer("retract",processor);
438 processor = function(xml)
440 if (is_defined(xml)) {
441 locked.innerHTML = "";
442 unlocked.innerHTML = xml.documentElement.textContent;
444 debug("file open failed");
447 callServer("open",processor,"file=" + escape(filename.value));
450 function retrieveFile(thefile)
452 processor = function(xml)
454 if (is_defined(xml)) {
455 locked.innerHTML = "";
456 unlocked.innerHTML = xml.documentElement.textContent;
458 debug("file open failed");
461 dialogBox.style.display = "none";
462 callServer("open",processor,"file=" + escape(thefile));
465 function showLibrary()
469 if (window.XMLHttpRequest)
471 req = new XMLHttpRequest();
473 else if (window.ActiveXObject)
476 req = new ActiveXObject("Msxml2.XMLHTTP");
480 req = new ActiveXObject("Microsoft.XMLHTTP");
484 req.onreadystatechange = function()
492 stxt = req.statusText;
495 debug(req.responseText);
496 showDialog("<H2>Library</H2>",req.responseText);
500 req.open("POST", "viewlib"); // + escape(unlocked.innerHTML), true);
501 req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
508 function hideSequent() {
509 goalcell.parentNode.removeChild(goalcell);
510 scriptcell.setAttribute("colspan","2");
513 function showSequent() {
514 scriptcell.setAttribute("colspan","1");
515 workarea.appendChild(goalcell);
518 function showDialog(title,content) {
519 dialogTitle.innerHTML = title;
520 dialogContent.innerHTML = content;
521 dialogBox.style.display = "block";
524 function removeElement(id) {
525 var element = document.getElementById(id);
526 element.parentNode.removeChild(element);
529 function getCursorPos() {
531 if (window.getSelection) {
532 var selObj = window.getSelection();
533 var selRange = selObj.getRangeAt(0);
534 //cursorPos = findNode(selObj.anchorNode.parentNode.childNodes, selObj.anchorNode) + selObj.anchorOffset;
535 cursorPos = findNode(unlocked.childNodes, selObj.anchorNode,0) + selObj.anchorOffset;
536 /* FIXME the following works wrong in Opera when the document is longer than 32767 chars */
539 else if (document.selection) {
540 var range = document.selection.createRange();
541 var bookmark = range.getBookmark();
542 /* FIXME the following works wrong when the document is longer than 65535 chars */
543 cursorPos = bookmark.charCodeAt(2) - 11; /* Undocumented function [3] */
548 function findNode(list, node, acc) {
549 for (var i = 0; i < list.length; i++) {
550 if (list[i] == node) {
551 // debug("success " + i);
554 if (list[i].hasChildNodes()) {
556 // debug("recursion on node " + i);
557 return (findNode(list[i].childNodes,node,acc))
559 catch (e) { /* debug("recursion failed"); */ }
561 sandbox = document.getElementById("sandbox");
562 dup = list[i].cloneNode(true);
563 sandbox.appendChild(dup);
564 // debug("fail " + i + ": " + sandbox.innerHTML);
565 acc += sandbox.innerHTML.length;
566 sandbox.removeChild(dup);
572 debug("cursor test: " + unlocked.innerHTML.substr(0,getCursorPos()));
575 function readCookie(name) {
576 var nameEQ = name + "=";
577 var ca = document.cookie.split(';');
578 for(var i=0;i < ca.length;i++) {
580 while (c.charAt(0)==' ') c = c.substring(1,c.length);
581 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
586 function delete_cookie ( cookie_name )
588 var cookie_date = new Date(); // current date & time
589 cookie_date.setTime ( cookie_date.getTime() - 1 );
590 document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();
593 function delete_session()
595 delete_cookie("session");