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, " – showing 24 hours") 236*368c31abSDavid du Colombier graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – 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, " – showing 24 hours") 314*368c31abSDavid du Colombier graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – 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+" " 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