CheckBadValues should run on the first sample as well
[supercollider.git] / HelpSource / scdoc.js
blobeb36fa1dff6b0f210365e717e9998fe4a3de4f2c
1 function toggle_visibility(e) {
2     if(e.style.display == 'none') {
3         e.style.display = 'block';
4         return e;
5     } else {
6         e.style.display = 'none';
7         return undefined;
8     }
12 function createCookie(name,value,days) {
13     if (days) {
14         var date = new Date();
15         date.setTime(date.getTime()+(days*24*60*60*1000));
16         var expires = "; expires="+date.toGMTString();
17     }
18     else var expires = "";
19     document.cookie = name+"="+value+expires+"; path=/";
22 function readCookie(name) {
23     var nameEQ = name + "=";
24     var ca = document.cookie.split(';');
25     for(var i=0;i < ca.length;i++) {
26         var c = ca[i];
27         while (c.charAt(0)==' ') c = c.substring(1,c.length);
28         if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
29     }
30     return null;
34 var sidetoc;
35 var toc;
36 var menubar;
37 function popOutTOC(original_toc, p0) {
38     var t = original_toc.cloneNode(true);
39     t.id = "sidetoc";
40     var c = document.getElementsByClassName("contents")[0];
41     var left = c.style.marginLeft;
42     c.style.marginLeft = "20.5em";
43     document.body.insertBefore(t,c);
45     t.style.top = menubar.clientHeight;
46     t.style.maxHeight = "none";
47     t.style.display = "block";
49     var p = t.getElementsByClassName("popoutlink")[0];
50     p.innerHTML = "close";
51     p.onclick = function() {
52         t.parentNode.removeChild(t);
53         c.style.marginLeft = left;
54         p0.style.display = "";
55         sidetoc = null;
56         sessionStorage.popToc = "no";
57         return false;
58     }
59     var x = document.createElement("div");
60     x.id = "toctitle";
61     x.innerHTML = "Table of contents";
62     t.insertBefore(x,p.nextSibling);
63     p0.style.display = "none";
65     sidetoc = t;
66     resize_handler();
67     sessionStorage.popToc = "yes";
70 function resize_handler() {
71     var height = window.innerHeight - menubar.clientHeight - 20;
72     if(sidetoc)
73         sidetoc.style.height = height;
74     if(toc)
75         toc.style.maxHeight = height * 0.75;
78 function addInheritedMethods() {
79     if(! /\/Classes\/[^\/]+/.test(window.location.pathname)) return; // skip this if not a class doc
80     var doc = docmap["Classes/"+document.title];
81     if(!doc) return;
82     if(doc.implementor) {
83         var sups = docmap["Classes/"+doc.implementor].superclasses;
84     } else {
85         var sups = doc.superclasses;
86     }
87     if(!sups) return;
88     var divs = [document.getElementById("inheritedclassmets"), document.getElementById("inheritedinstmets")];
89     for(var i=0;i<sups.length;i++) {
90         var s = docmap["Classes/"+sups[i]];
91         var d = [];
92         for(var j=0;j<2;j++) {
93             d[j] = document.createElement("ul");
94             d[j].className = "inheritedmets";
95             d[j].style.display = "none";
96         }
97         var mets = s.methods.sort();
98         for(var j=0;j<mets.length;j++) {
99             var m = mets[j];
100             if(doc.methods.indexOf(m)<0) { // ignore methods already documented in this helpfile
101                 var li = document.createElement("li");
102                 li.innerHTML = "<a href='"+helpRoot+"/"+s.path+".html#"+m.slice(1)+"'>"+m.slice(2)+"</a>";
103                 if(m[1]=="*") {
104                     d[0].appendChild(li);
105                 } else
106                 if(m[1]=="-") {
107                     d[1].appendChild(li);
108                 }
109             }
110         }
111         for(var j=0;j<2;j++) {
112             var count = d[j].childElementCount;
113             if(count) {
114                 var x = document.createElement("div");
115                 var show = "&#9658; show";
116                 var hide = "&#9660; hide";
117                 x.className = "inheritedmets_class";
118                 x.innerHTML = count+" methods from <a href='"+helpRoot+"/"+s.path+".html'>"+s.title+"</a> ";
119                 divs[j].appendChild(x);
120                 (function(z) {
121                     var a = document.createElement("a");
122                     a.className = "inheritedmets_toggle";
123                     a.setAttribute("href","#");
124                     a.innerHTML = show;
125                     a.onclick = function() {
126                         if(z.style.display == "none") {
127                             z.style.display = "block";
128                             a.innerHTML = hide;
129                         } else {
130                             z.style.display = "none";
131                             a.innerHTML = show;
132                         }
133                         return false;
134                     };
135                     x.appendChild(a);
136                 })(d[j]);
137                 divs[j].appendChild(d[j]);
138             }
139         }
140     }
143 function showAllSubclasses(a) {
144     var e = document.getElementById("hiddensubclasses");
145     e.style.display = "";
146     a.style.display = "none";
150 This key event handler selects the whole line when pressing shift/ctrl-enter with no selection.
151 But the problem is that it does not update the selection sent to the client.
152 This is probably because the WebView catches the key event before javascript does!
153 A fix might be to expose a function to JS that evaluates selection, and call it here.
154 Or can the WebView make sure that JS has responded to all key events before getting the selection?
156 function selectLine() {
157     var s =  window.getSelection();
158     var r = s.getRangeAt();
160     function findleft(p) {
161         var y, j;
162         while(p) {
163             if(p.nodeName == "BR")
164                 return [p,j];
165             if(p.childNodes.length>0) {
166                 for(var i=p.childNodes.length-1;i>=0;i--) {
167                     y = findleft(p.childNodes[i]);
168                     if(y) return y;
169                 }
170             }
171             p = p.previousSibling;
172         }
173         return null;
174     };
176     function findright(p) {
177         var y, j;
178         while(p) {
179             if(p.nodeName == "BR")
180                 return [p,j];
181             for(var i=0;i<p.childNodes.length;i++) {
182                 y = findright(p.childNodes[i]);
183                 if(y) return y;
184             }
185             p = p.nextSibling;
186         }
187         return null;
188     };
191     if(r.collapsed) {
192         var r2 = document.createRange();
193         var top = r.startContainer;
194         while(top && top.nodeName != "PRE")
195             top = top.parentNode;
197         var p = r.startContainer;
198         while(!p.previousSibling && p != top) {
199             p = p.parentNode;
200         }
201         if(p==top) {
202             r2.setStartBefore(top.firstChild);
203         } else {
204             var found = findleft(p.previousSibling);
205             if(found) {
206                 r2.setStartAfter(found[0]);
207             } else {
208                 r2.setStartBefore(top.firstChild);
209             }
210         }
211         var p = r.startContainer;
212         while(!p.nextSibling && p != top) {
213             p = p.parentNode;
214         }
215         if(p==top) {
216             r2.setEndAfter(top.lastChild);
217         } else {
218             var found = findright(p.nextSibling);
219             if(found) {
220                 r2.setEndBefore(found[0]);
221             } else {
222                 r2.setEndAfter(top.lastChild);
223             }
224         }
225         s.removeAllRanges();
226         s.addRange(r2);
227     }
230 function countChar(str,chr) {
231     var x = 0, a, b;
232     for(var i=0;i<str.length;i++) {
233         if(str[i]==chr) {
234             if(a==undefined) a = i;
235             b = i;
236             x++;
237         }
238     }
239     // return count, first occurence and last occurence
240     return [x,a,b];
243 function selectParens(ev) {
244     var s =  window.getSelection();
245     var r = s.getRangeAt();
246     var r2 = document.createRange();
247     var j;
249     // FIXME: it always selects from the left paren, so clicking on the right-par does not select from the matching left-par
250     // need to abort lpar search if rpar was found and then start with the rpar to the right (or closest) instead
251     function findlpar(x) {
252         var p = x;
253         var y, j;
254         while(p) {
255             if(j = p.nodeValue) {
256                 j = countChar(j,"(");
257                 if(j[0]>0) {
258                     return [p, j[2]];
259                 }
260             }
261             for(var i=0;i<p.childNodes.length;i++) {
262                 y = findlpar(p.childNodes[i]);
263                 if(y) return y;
264             }
265             p = p.previousSibling;
266         }
267         return null;
268     }
270     function findrpar(x,count) {
271         var p = x;
272         var y, j;
273         count = count || [0];
274         while(p) {
275             if(j = p.nodeValue) {
276                 count[0] += countChar(j,"(")[0];
277                 j = countChar(j,")");
278                 if(j[0]>0) {
279                     if(count[0]==0)
280                         return [p,j[1]];
281                     else
282                         count[0] -= j[0];
283                 }
284             }
285             for(var i=0;i<p.childNodes.length;i++) {
286                 y = findrpar(p.childNodes[i],count);
287                 if(y) return y;
288             }
289             p = p.nextSibling;
290         }
291         return null;
292     }
294     var p = r.startContainer;
295     if(p.nodeValue && (j = p.nodeValue.indexOf("("))>=0) {
296         r2.setStart(p,j+1);
297         p = p.parentNode.nextSibling;
298     } else {
299         while(!p.previousSibling && p != ev.target) {
300             p = p.parentNode;
301         }
302         if(p==ev.target)
303             return;
304         var found = findlpar(p);
305         if(found)
306             r2.setStart(found[0],found[1]+1);
307     }
309     var found = findrpar(p);
310     if(found)
311         r2.setEnd(found[0],found[1]);
313     s.removeAllRanges();
314     s.addRange(r2);
317 function fixTOC() {        
318     var x = document.getElementsByClassName("lang-sc");
319     for(var i=0;i<x.length;i++) {
320         var e = x[i];
322         // make all code examples editable!
323         e.setAttribute("contentEditable",true);
325         // select parenthesis on double-click
326         e.ondblclick = selectParens;
327     }
329     addInheritedMethods();
331     if(sessionStorage == undefined)
332         sessionStorage = {};
334     var openMenu;
335     var inMenu = false;
337     var toggleMenu = function(e) {
338         if(openMenu) {
339             openMenu.style.display = 'none';
340         }
341         if(e != openMenu) {
342             e.style.display = 'block';
343             openMenu = e;
344         } else {
345             openMenu = undefined;
346         }
347         inMenu = true;
348     }
350     document.onclick = function() {
351         if(openMenu && !inMenu) {
352             openMenu.style.display = 'none';
353             openMenu = undefined;
354         }
355         inMenu = false;
356         return true;
357     }
359 // make header menu
360     var bar = document.getElementById("menubar");
361     menubar = bar;
362     var nav = ["Home","Browse","Search"];
363     var url = ["Help.html","Browse.html","Search.html"];
364     for(var i=0;i<nav.length;i++) {
365         var li = document.createElement("li");
366         li.className = "menuitem";
367         var a = document.createElement("a");
368         a.innerHTML = nav[i];
369         a.setAttribute("href",helpRoot+"/"+url[i]);
370         a.className = "navLink";
371         li.appendChild(a);
372         bar.appendChild(li);
373     }
375     var li = document.createElement("li");
376     li.className = "menuitem";
377     var a = document.createElement("a");
378     a.innerHTML = "Indexes &#9660;";
379     a.setAttribute("href","#");
380     var m1 = document.createElement("div");
381     m1.className = "submenu";
382     m1.style.display = "none";
383     a.onclick = function() {
384         toggleMenu(m1);
385         return false;
386     };
387     var nav = ["Documents","Classes","Methods"];
388     for(var i=0;i<nav.length;i++) {
389         var b = document.createElement("a");
390         b.setAttribute("href",helpRoot+"/Overviews/"+nav[i]+".html");
391         b.innerHTML = nav[i];
392         m1.appendChild(b);
393     }
394     li.appendChild(a);
395     li.appendChild(m1);
396     bar.appendChild(li);
398     var li = document.createElement("li");
399     li.className = "menuitem";
400     var x = document.createElement("span");
401     x.id = "topdoctitle";
402     x.appendChild(document.createTextNode(document.title));
403     x.onclick = function() {
404         scroll(0,0);
405         return false;
406     }
407     li.appendChild(x)
408     bar.appendChild(li);
410     var t = document.getElementById("toc");
411     toc = t;
412     if(t) {
413         x.appendChild(document.createTextNode(" - "));
414         t.style.display = 'none';
415         t.onclick = function() {
416             t.style.display = 'none';
417             openMenu = undefined;
418             inMenu = false;
419             return true;
420         }
421         var a = document.createElement("a");
422         a.setAttribute("href","#");
423         a.innerHTML = "Table of contents &#9660;";
424         li.appendChild(a);
425         a.onclick = function() {
426             toggleMenu(t);
427             return false;
428         };
429         li.appendChild(t.parentNode.removeChild(t));
430         var p = document.createElement("a");
431         p.setAttribute("href","#");
432         p.className = "popoutlink";
433         p.innerHTML = "pop out";
434         p.onclick = function() {
435             if(!sidetoc)
436                 popOutTOC(t,a);
437             return false;
438         }
439         t.insertBefore(p,t.firstChild);
440         resize_handler();
441         if(sessionStorage.popToc == "yes") {
442             popOutTOC(t,a);
443         }
444     }
445     window.onresize = resize_handler;