xref: /plan9/sys/src/cmd/venti/srv/www/stats.js (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier
2*368c31abSDavid du Colombierbiggraph = "arg=rpctotal&graph=diff"
3*368c31abSDavid du Colombier
4*368c31abSDavid du Colombiergraphname = new Array(
5*368c31abSDavid du Colombier	"arg=*&graph=diskbw",
6*368c31abSDavid du Colombier		"<b>disk</b> bytes/second",
7*368c31abSDavid du Colombier	"arg=*&graph=netbw",
8*368c31abSDavid du Colombier		"<b>network</b> bytes/second",
9*368c31abSDavid du Colombier	"arg=*&graph=iobw",
10*368c31abSDavid du Colombier		"total: <b>disk+net</b> bytes/second",
11*368c31abSDavid du Colombier
12*368c31abSDavid du Colombier	"arg=apartreadbyte&graph=diff",
13*368c31abSDavid du Colombier		"arena read bytes/second",
14*368c31abSDavid du Colombier	"arg=apartwritebyte&graph=diff",
15*368c31abSDavid du Colombier		"arena write bytes/second",
16*368c31abSDavid du Colombier
17*368c31abSDavid du Colombier	"arg=bloomfalsemiss&graph=pctdiff&arg2=bloomlookup&max=100",
18*368c31abSDavid du Colombier		"bloom false hit %",
19*368c31abSDavid du Colombier	"arg=bloomhit&graph=pctdiff&arg2=bloomlookup&max=100",
20*368c31abSDavid du Colombier		"bloom miss %",
21*368c31abSDavid du Colombier	"arg=bloomlookuptime&graph=divdiff&arg2=bloomlookup",
22*368c31abSDavid du Colombier		"bloom lookup time",
23*368c31abSDavid du Colombier	"arg=bloomones&graph=pct&arg2=bloombits&max=100",
24*368c31abSDavid du Colombier		"bloom usage %",
25*368c31abSDavid du Colombier
26*368c31abSDavid du Colombier	"arg=dcachedirty&graph=pct&arg2=dcachesize&max=100",
27*368c31abSDavid du Colombier		"dcache dirty %",
28*368c31abSDavid du Colombier	"arg=dcachehit&graph=pctdiff&arg2=dcachelookup&max=100",
29*368c31abSDavid du Colombier		"dcache hit %",
30*368c31abSDavid du Colombier	"arg=dcachelookuptime&graph=divdiff&arg2=dcachelookup",
31*368c31abSDavid du Colombier		"dcache lookup time",
32*368c31abSDavid du Colombier	"arg=dcachelookup&graph=diff",
33*368c31abSDavid du Colombier		"dcache lookups/second",
34*368c31abSDavid du Colombier	"arg=dcachewrite&graph=diff",
35*368c31abSDavid du Colombier		"dcache writes/second",
36*368c31abSDavid du Colombier
37*368c31abSDavid du Colombier	"arg=icachedirty&graph=pct&arg2=icachesize&max=100",
38*368c31abSDavid du Colombier		"icache dirty %",
39*368c31abSDavid du Colombier	"arg=icachehit&graph=pctdiff&arg2=icachelookup&max=100",
40*368c31abSDavid du Colombier		"icache hit %",
41*368c31abSDavid du Colombier	"arg=icachelookuptime&graph=divdiff&arg2=icachelookup",
42*368c31abSDavid du Colombier		"icache lookup time",
43*368c31abSDavid du Colombier	"arg=icacheprefetch&graph=diff",
44*368c31abSDavid du Colombier		"icache prefetches/second",
45*368c31abSDavid du Colombier	"arg=icachewrite&graph=diff",
46*368c31abSDavid du Colombier		"icache writes/second",
47*368c31abSDavid du Colombier
48*368c31abSDavid du Colombier	"arg=isectreadbyte&graph=diff",
49*368c31abSDavid du Colombier		"isect read bytes/second",
50*368c31abSDavid du Colombier	"arg=isectwritebyte&graph=diff",
51*368c31abSDavid du Colombier		"isect write bytes/second",
52*368c31abSDavid du Colombier
53*368c31abSDavid du Colombier	"arg=lcachehit&graph=pctdiff&arg2=lcachelookup&max=100",
54*368c31abSDavid du Colombier		"lump cache hit %",
55*368c31abSDavid du Colombier	"arg=lcachelookuptime&graph=divdiff&arg2=lcachelookup",
56*368c31abSDavid du Colombier		"lump cache lookup time",
57*368c31abSDavid du Colombier	"arg=lcachewrite&graph=diff",
58*368c31abSDavid du Colombier		"lcache writes/second",
59*368c31abSDavid du Colombier
60*368c31abSDavid du Colombier	"arg=rpcreadbyte&graph=diff",
61*368c31abSDavid du Colombier		"read RPC bytes/second",
62*368c31abSDavid du Colombier	"arg=rpctotal&graph=diff",
63*368c31abSDavid du Colombier		"RPCs/second",
64*368c31abSDavid du Colombier	"arg=rpcwritebyte&graph=diff",
65*368c31abSDavid du Colombier		"write RPC bytes/second",
66*368c31abSDavid du Colombier	"arg=rpcreadtime&graph=divdiff&arg2=rpcread",
67*368c31abSDavid du Colombier		"read RPC time",
68*368c31abSDavid du Colombier	"arg=rpcwritetime&graph=divdiff&arg2=rpcwrite",
69*368c31abSDavid du Colombier		"write RPC time",
70*368c31abSDavid du Colombier	"arg=rpcreadcachedtime&graph=divdiff&arg2=rpcreadcached",
71*368c31abSDavid du Colombier		"cached read RPC time",
72*368c31abSDavid du Colombier	"arg=rpcreaduncachedtime&graph=divdiff&arg2=rpcreaduncached",
73*368c31abSDavid du Colombier		"uncached read RPC time",
74*368c31abSDavid du Colombier	"arg=rpcwritenewtime&graph=divdiff&arg2=rpcwritenew",
75*368c31abSDavid du Colombier		"fresh write RPC time",
76*368c31abSDavid du Colombier	"arg=rpcwriteoldtime&graph=divdiff&arg2=rpcwriteold",
77*368c31abSDavid du Colombier		"dup write RPC time",
78*368c31abSDavid du Colombier
79*368c31abSDavid du Colombier	"arg=sumreadbyte&graph=diff",
80*368c31abSDavid du Colombier		"checksum bytes/second",
81*368c31abSDavid du Colombier
82*368c31abSDavid du Colombier	"arg=dblockstall",
83*368c31abSDavid du Colombier		"threads stalled: dblock",
84*368c31abSDavid du Colombier	"arg=dcachestall",
85*368c31abSDavid du Colombier		"threads stalled: dcache",
86*368c31abSDavid du Colombier	"arg=icachestall",
87*368c31abSDavid du Colombier		"threads stalled: icache",
88*368c31abSDavid du Colombier	"arg=lumpstall",
89*368c31abSDavid du Colombier		"threads stalled: lump",
90*368c31abSDavid du Colombier
91*368c31abSDavid du Colombier	"arg=END"
92*368c31abSDavid du Colombier)
93*368c31abSDavid du Colombier
94*368c31abSDavid du Colombiercolumn0 = new Array(
95*368c31abSDavid du Colombier	"column0",
96*368c31abSDavid du Colombier	"!bandwidth",
97*368c31abSDavid du Colombier	"arg=*&graph=iobw",
98*368c31abSDavid du Colombier	"arg=*&graph=netbw",
99*368c31abSDavid du Colombier	"arg=rpcreadbyte&graph=diff",
100*368c31abSDavid du Colombier	"arg=rpcwritebyte&graph=diff",
101*368c31abSDavid du Colombier	"arg=*&graph=diskbw",
102*368c31abSDavid du Colombier	"arg=isectreadbyte&graph=diff",
103*368c31abSDavid du Colombier	"arg=isectwritebyte&graph=diff",
104*368c31abSDavid du Colombier	"arg=apartreadbyte&graph=diff",
105*368c31abSDavid du Colombier	"arg=apartwritebyte&graph=diff",
106*368c31abSDavid du Colombier	"arg=sumreadbyte&graph=diff",
107*368c31abSDavid du Colombier
108*368c31abSDavid du Colombier	"!bloom filter",
109*368c31abSDavid du Colombier	"arg=bloomhit&graph=pctdiff&arg2=bloomlookup&max=100",
110*368c31abSDavid du Colombier	"arg=bloomfalsemiss&graph=pctdiff&arg2=bloomlookup&max=100",
111*368c31abSDavid du Colombier	"arg=bloomones&graph=pct&arg2=bloombits&max=100",
112*368c31abSDavid du Colombier
113*368c31abSDavid du Colombier	"END"
114*368c31abSDavid du Colombier)
115*368c31abSDavid du Colombier
116*368c31abSDavid du Colombiercolumn1 = new Array(
117*368c31abSDavid du Colombier	"column1",
118*368c31abSDavid du Colombier	"!icache",
119*368c31abSDavid du Colombier	"arg=icachedirty&graph=pct&arg2=icachesize&max=100",
120*368c31abSDavid du Colombier	"arg=icachehit&graph=pctdiff&arg2=icachelookup&max=100",
121*368c31abSDavid du Colombier	"arg=icachewrite&graph=diff",
122*368c31abSDavid du Colombier	"arg=icacheprefetch&graph=diff",
123*368c31abSDavid du Colombier
124*368c31abSDavid du Colombier	"!dcache",
125*368c31abSDavid du Colombier	"arg=dcachedirty&graph=pct&arg2=dcachesize&max=100",
126*368c31abSDavid du Colombier	"arg=dcachehit&graph=pctdiff&arg2=dcachelookup&max=100",
127*368c31abSDavid du Colombier	"arg=dcachelookup&graph=diff",
128*368c31abSDavid du Colombier	"arg=dcachewrite&graph=diff",
129*368c31abSDavid du Colombier
130*368c31abSDavid du Colombier	"!lump cache",
131*368c31abSDavid du Colombier	"arg=lcachehit&graph=pctdiff&arg2=lcachelookup&max=100",
132*368c31abSDavid du Colombier	"arg=lcachewrite&graph=diff",
133*368c31abSDavid du Colombier
134*368c31abSDavid du Colombier	"END"
135*368c31abSDavid du Colombier)
136*368c31abSDavid du Colombier
137*368c31abSDavid du Colombiercolumn2 = new Array(
138*368c31abSDavid du Colombier	"column2",
139*368c31abSDavid du Colombier
140*368c31abSDavid du Colombier	"!stalls",
141*368c31abSDavid du Colombier	"arg=icachestall",
142*368c31abSDavid du Colombier	"arg=dcachestall",
143*368c31abSDavid du Colombier	"arg=dblockstall",
144*368c31abSDavid du Colombier	"arg=lumpstall",
145*368c31abSDavid du Colombier
146*368c31abSDavid du Colombier	"!timings",
147*368c31abSDavid du Colombier	"arg=bloomlookuptime&graph=divdiff&arg2=bloomlookup",
148*368c31abSDavid du Colombier	"arg=icachelookuptime&graph=divdiff&arg2=icachelookup",
149*368c31abSDavid du Colombier	"arg=lcachelookuptime&graph=divdiff&arg2=lcachelookup",
150*368c31abSDavid du Colombier	"arg=dcachelookuptime&graph=divdiff&arg2=dcachelookup",
151*368c31abSDavid du Colombier	"arg=rpcreadtime&graph=divdiff&arg2=rpcread",
152*368c31abSDavid du Colombier	"arg=rpcwritetime&graph=divdiff&arg2=rpcwrite",
153*368c31abSDavid du Colombier	"arg=rpcreadcachedtime&graph=divdiff&arg2=rpcreadcached",
154*368c31abSDavid du Colombier	"arg=rpcreaduncachedtime&graph=divdiff&arg2=rpcreaduncached",
155*368c31abSDavid du Colombier	"arg=rpcwritenewtime&graph=divdiff&arg2=rpcwritenew",
156*368c31abSDavid du Colombier	"arg=rpcwriteoldtime&graph=divdiff&arg2=rpcwriteold",
157*368c31abSDavid du Colombier
158*368c31abSDavid du Colombier	"END"
159*368c31abSDavid du Colombier)
160*368c31abSDavid du Colombier
161*368c31abSDavid du Colombiercol0info = new Array(column0.length)
162*368c31abSDavid du Colombiercol1info = new Array(column1.length)
163*368c31abSDavid du Colombiercol2info = new Array(column2.length)
164*368c31abSDavid du Colombier
165*368c31abSDavid du Colombierfunction cleardebug() {
166*368c31abSDavid du Colombier	var p = document.getElementById("debug")
167*368c31abSDavid du Colombier	p.innerHTML = ""
168*368c31abSDavid du Colombier}
169*368c31abSDavid du Colombier
170*368c31abSDavid du Colombierfunction debug(s) {
171*368c31abSDavid du Colombier	var p = document.getElementById("debug")
172*368c31abSDavid du Colombier	if(p.innerHTML == "")
173*368c31abSDavid du Colombier		p.innerHTML = "<a href=\"javascript:cleardebug()\">clear</a>\n"
174*368c31abSDavid du Colombier	p.innerHTML += "<br>"+s
175*368c31abSDavid du Colombier}
176*368c31abSDavid du Colombier
177*368c31abSDavid du Colombierfunction Ginfo(y, fill, name) {
178*368c31abSDavid du Colombier	var g = new Object()
179*368c31abSDavid du Colombier	g.y = y
180*368c31abSDavid du Colombier	g.fill = fill
181*368c31abSDavid du Colombier	g.name = name
182*368c31abSDavid du Colombier	return g
183*368c31abSDavid du Colombier}
184*368c31abSDavid du Colombier
185*368c31abSDavid du Colombierfunction cleartable(t) {
186*368c31abSDavid du Colombier	for(var i=t.rows.length-1; i>=0; i--)
187*368c31abSDavid du Colombier		t.deleteRow(i)
188*368c31abSDavid du Colombier}
189*368c31abSDavid du Colombier
190*368c31abSDavid du Colombierfunction textofname(name)
191*368c31abSDavid du Colombier{
192*368c31abSDavid du Colombier	for(var i=0; i<graphname.length; i+=2)
193*368c31abSDavid du Colombier		if(name == graphname[i])
194*368c31abSDavid du Colombier			return graphname[i+1]
195*368c31abSDavid du Colombier}
196*368c31abSDavid du Colombier
197*368c31abSDavid du Colombierfunction graphrow(row, span, name, dt, wid, ht, fill, text) {
198*368c31abSDavid du Colombier	var url = "/graph?"+name
199*368c31abSDavid du Colombier	url = url+"&min=0"
200*368c31abSDavid du Colombier	url = url+"&t0=-"+dt
201*368c31abSDavid du Colombier	url = url+"&wid="+wid
202*368c31abSDavid du Colombier	url = url+"&ht="+ht
203*368c31abSDavid du Colombier	url = url+"&fill="+fill
204*368c31abSDavid du Colombier
205*368c31abSDavid du Colombier	var s = "<td colSpan="+span
206*368c31abSDavid du Colombier	s = s+" valign=bottom"
207*368c31abSDavid du Colombier	s = s+" align=center"
208*368c31abSDavid du Colombier	s = s+" width="+wid
209*368c31abSDavid du Colombier	s = s+" height="+ht
210*368c31abSDavid du Colombier	s = s+" style=\"background-image: url("+url+");\""
211*368c31abSDavid du Colombier	s = s+">"+textofname(name)+text+"</td>"
212*368c31abSDavid du Colombier	row.innerHTML = s
213*368c31abSDavid du Colombier}
214*368c31abSDavid du Colombier
215*368c31abSDavid du Colombier
216*368c31abSDavid du Colombierfunction graphcell(cell, name, dt, wid, ht, fill) {
217*368c31abSDavid du Colombier	cell.vAlign = "bottom"
218*368c31abSDavid du Colombier	cell.align = "center"
219*368c31abSDavid du Colombier	cell.width = wid
220*368c31abSDavid du Colombier	cell.height = ht
221*368c31abSDavid du Colombier}
222*368c31abSDavid du Colombier
223*368c31abSDavid du Colombierfunction redraw() {
224*368c31abSDavid du Colombier	redrawgraphs()
225*368c31abSDavid du Colombier	redrawsettings()
226*368c31abSDavid du Colombier}
227*368c31abSDavid du Colombier
228*368c31abSDavid du Colombierfunction redrawgraphs() {
229*368c31abSDavid du Colombier	var t = document.getElementById("statgraphs")
230*368c31abSDavid du Colombier
231*368c31abSDavid du Colombier	cleartable(t)
232*368c31abSDavid du Colombier	for(var i=0; i<4; i++)
233*368c31abSDavid du Colombier		t.insertRow(i)
234*368c31abSDavid du Colombier
235*368c31abSDavid du Colombier	graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " &ndash; showing 24 hours")
236*368c31abSDavid du Colombier	graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " &ndash; showing 1 hour")
237*368c31abSDavid du Colombier	t.rows[2].innerHTML = "<td height=10></td>"
238*368c31abSDavid du Colombier
239*368c31abSDavid du Colombier	var r = t.rows[3]
240*368c31abSDavid du Colombier	graphtable(r.insertCell(0), column0, col0info, 0)
241*368c31abSDavid du Colombier	graphtable(r.insertCell(1), column1, col1info, 2)
242*368c31abSDavid du Colombier	graphtable(r.insertCell(2), column2, col2info, 4)
243*368c31abSDavid du Colombier}
244*368c31abSDavid du Colombier
245*368c31abSDavid du Colombierfunction graphtable(bigcell, list, infolist, fill) {
246*368c31abSDavid du Colombier	bigcell.innerHTML = "<table id=\""+list[0]+"\"></table>"
247*368c31abSDavid du Colombier	bigcell.vAlign = "top"
248*368c31abSDavid du Colombier	var t = document.getElementById(list[0])
249*368c31abSDavid du Colombier	t.onclick = columnclick
250*368c31abSDavid du Colombier
251*368c31abSDavid du Colombier	for(var i=1; i<list.length; i++){
252*368c31abSDavid du Colombier		var r = t.insertRow(t.rows.length)
253*368c31abSDavid du Colombier		name = list[i]
254*368c31abSDavid du Colombier		infolist[i] = Ginfo(t.offsetHeight, fill, name)
255*368c31abSDavid du Colombier		if(name == "END")
256*368c31abSDavid du Colombier			break
257*368c31abSDavid du Colombier		if(name.substring(0,1) == "!"){
258*368c31abSDavid du Colombier			name = name.substring(1)
259*368c31abSDavid du Colombier			if(i > 1){
260*368c31abSDavid du Colombier				r.innerHTML = "<td height=10></td>"
261*368c31abSDavid du Colombier				r = t.insertRow(t.rows.length)
262*368c31abSDavid du Colombier			}
263*368c31abSDavid du Colombier			r.innerHTML = "<td align=center><b>"+name+"</b>"
264*368c31abSDavid du Colombier		}else{
265*368c31abSDavid du Colombier			graphrow(r, 1, name, 600, 300, 30, fill++, "")
266*368c31abSDavid du Colombier		}
267*368c31abSDavid du Colombier	}
268*368c31abSDavid du Colombier}
269*368c31abSDavid du Colombier
270*368c31abSDavid du Colombierfunction xpos(obj) {
271*368c31abSDavid du Colombier	var x = 0
272*368c31abSDavid du Colombier	if(obj.fixedx)
273*368c31abSDavid du Colombier		return obj.fixedx
274*368c31abSDavid du Colombier	if(obj.offsetParent){
275*368c31abSDavid du Colombier		while(obj.offsetParent){
276*368c31abSDavid du Colombier			x += obj.offsetLeft
277*368c31abSDavid du Colombier			obj = obj.offsetParent
278*368c31abSDavid du Colombier		}
279*368c31abSDavid du Colombier	}else if(obj.x)
280*368c31abSDavid du Colombier		x = obj.x
281*368c31abSDavid du Colombier	return x
282*368c31abSDavid du Colombier}
283*368c31abSDavid du Colombier
284*368c31abSDavid du Colombierfunction ypos(obj) {
285*368c31abSDavid du Colombier	var y = 0
286*368c31abSDavid du Colombier	if(obj.fixedy)
287*368c31abSDavid du Colombier		return obj.fixedy
288*368c31abSDavid du Colombier	if(obj.offsetParent){
289*368c31abSDavid du Colombier		while(obj.offsetParent){
290*368c31abSDavid du Colombier			y += obj.offsetTop
291*368c31abSDavid du Colombier			obj = obj.offsetParent
292*368c31abSDavid du Colombier		}
293*368c31abSDavid du Colombier	}else if(obj.y)
294*368c31abSDavid du Colombier		y = obj.y
295*368c31abSDavid du Colombier	return y
296*368c31abSDavid du Colombier}
297*368c31abSDavid du Colombier
298*368c31abSDavid du Colombierfunction scrollleft() {
299*368c31abSDavid du Colombier	return document.body.scrollLeft
300*368c31abSDavid du Colombier}
301*368c31abSDavid du Colombier
302*368c31abSDavid du Colombierfunction scrolltop() {
303*368c31abSDavid du Colombier	return document.body.scrollTop
304*368c31abSDavid du Colombier}
305*368c31abSDavid du Colombier
306*368c31abSDavid du Colombierfunction columnclick(e) {
307*368c31abSDavid du Colombier	if(e.which && e.which != 1)
308*368c31abSDavid du Colombier		return;
309*368c31abSDavid du Colombier	var g = findgraph(scrollleft()+e.clientX, scrolltop()+e.clientY)
310*368c31abSDavid du Colombier	if(g && g.name.substring(0,1) != "!"){
311*368c31abSDavid du Colombier		biggraph = g.name
312*368c31abSDavid du Colombier		var t = document.getElementById("statgraphs")
313*368c31abSDavid du Colombier		graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " &ndash; showing 24 hours")
314*368c31abSDavid du Colombier		graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " &ndash; showing 1 hour")
315*368c31abSDavid du Colombier	}
316*368c31abSDavid du Colombier}
317*368c31abSDavid du Colombier
318*368c31abSDavid du Colombierfunction findgraph(x, y) {
319*368c31abSDavid du Colombier	var g
320*368c31abSDavid du Colombier
321*368c31abSDavid du Colombier	if(g = findgraphin(x, y, "column2", col2info))
322*368c31abSDavid du Colombier		return g
323*368c31abSDavid du Colombier	if(g = findgraphin(x, y, "column1", col1info))
324*368c31abSDavid du Colombier		return g
325*368c31abSDavid du Colombier	if(g = findgraphin(x, y, "column0", col0info))
326*368c31abSDavid du Colombier		return g
327*368c31abSDavid du Colombier	return
328*368c31abSDavid du Colombier}
329*368c31abSDavid du Colombier
330*368c31abSDavid du Colombierfunction findgraphin(x, y, tname, info) {
331*368c31abSDavid du Colombier	var t = document.getElementById(tname)
332*368c31abSDavid du Colombier	if(x < xpos(t))
333*368c31abSDavid du Colombier		return
334*368c31abSDavid du Colombier	y = y - ypos(t)
335*368c31abSDavid du Colombier	for(var i=info.length-2; i>=1; i--){
336*368c31abSDavid du Colombier		if(y > info[i].y)
337*368c31abSDavid du Colombier			return info[i]
338*368c31abSDavid du Colombier	}
339*368c31abSDavid du Colombier	return
340*368c31abSDavid du Colombier}
341*368c31abSDavid du Colombier
342*368c31abSDavid du Colombierfunction setof(name, val, list) {
343*368c31abSDavid du Colombier	var s = ""
344*368c31abSDavid du Colombier	for(var i=0; i<list.length; i++){
345*368c31abSDavid du Colombier		if(val == list[i])
346*368c31abSDavid du Colombier			s = s+" <b>"+val+"</b>"
347*368c31abSDavid du Colombier		else
348*368c31abSDavid du Colombier			s = s+" <a href=\"javascript:set('"+name+"', '"+list[i]+"')\">"+list[i]+"</a>"
349*368c31abSDavid du Colombier	}
350*368c31abSDavid du Colombier	return s
351*368c31abSDavid du Colombier}
352*368c31abSDavid du Colombier
353*368c31abSDavid du Colombierfunction loglinks(list) {
354*368c31abSDavid du Colombier	var s = ""
355*368c31abSDavid du Colombier	for(var i=0; i<list.length; i++){
356*368c31abSDavid du Colombier		s = s+" <a href=\"/log/"+list[i]+"\">"+list[i]+"</a>"
357*368c31abSDavid du Colombier	}
358*368c31abSDavid du Colombier	return s
359*368c31abSDavid du Colombier}
360*368c31abSDavid du Colombier
361*368c31abSDavid du Colombierfirst = 1
362*368c31abSDavid du Colombierfunction redrawsettings() {
363*368c31abSDavid du Colombier	if(first){
364*368c31abSDavid du Colombier		loadsettings()
365*368c31abSDavid du Colombier		first = 0
366*368c31abSDavid du Colombier	}
367*368c31abSDavid du Colombier	var s = ""
368*368c31abSDavid du Colombier	s = s+"<font size=-1>\n"
369*368c31abSDavid du Colombier	s = s+"logging:"+setof("logging", logging, loggingchoices)
370*368c31abSDavid du Colombier	s = s+" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "
371*368c31abSDavid du Colombier	s = s+"stats:"+setof("stats", stats, statschoices)
372*368c31abSDavid du Colombier	s = s+"\n<p/>\n"
373*368c31abSDavid du Colombier	s = s+"compression:"+setof("compress", compress, compresschoices1)
374*368c31abSDavid du Colombier	s = s+"<br>"+setof("compress", compress, compresschoices2)
375*368c31abSDavid du Colombier	s = s+"\n<p/>\n"
376*368c31abSDavid du Colombier	s = s+"<a href=/index>index</a> | <a href=/storage>storage</a> | "
377*368c31abSDavid du Colombier	s = s+"log:"+loglinks(logs)
378*368c31abSDavid du Colombier	s = s+"</font>"
379*368c31abSDavid du Colombier	document.getElementById("settings").innerHTML = s
380*368c31abSDavid du Colombier}
381*368c31abSDavid du Colombier
382*368c31abSDavid du Colombierfunction set(name, value) {
383*368c31abSDavid du Colombier	eval(name+"= \""+value+"\"")
384*368c31abSDavid du Colombier	redrawsettings()
385*368c31abSDavid du Colombier	// Works in FireFox, not in Safari
386*368c31abSDavid du Colombier	parent.hidden.location.href = "/set/"+name+"/"+value
387*368c31abSDavid du Colombier}
388