// Detect browser quirks that we should be aware of. function needsDynPrefix() { var span = document.createElement("span"); span.innerHTML = ""; var scripts = span.getElementsByTagName("script"); return scripts.length == 0; } var dynPrefix = needsDynPrefix() ? "A" : ""; // Function versions of operators function not(x) { return !x; } function neg(x) { return -x; } function eq(x, y) { return x == y; } function plus(x, y) { return x + y; } function minus(x, y) { return x - y; } function times(x, y) { return x * y; } function div(x, y) { return x / y; } function divInt(x, y) { if (y == 0) er("Division by zero"); var n = x / y; return n < 0 ? Math.ceil(n) : Math.floor(n); } function mod(x, y) { return x % y; } function modInt(x, y) { if (y == 0) er("Division by zero"); var n = x % y; return n < 0 ? Math.ceil(n) : Math.floor(n); } function lt(x, y) { return x < y; } function le(x, y) { return x <= y; } // Characters function isLower(c) { return c >= 'a' && c <= 'z'; } function isUpper(c) { return c >= 'A' && c <= 'Z'; } function isAlpha(c) { return isLower(c) || isUpper(c); } function isDigit(c) { return c >= '0' && c <= '9'; } function isAlnum(c) { return isAlpha(c) || isDigit(c); } function isBlank(c) { return c == ' ' || c == '\t'; } function isSpace(c) { return isBlank(c) || c == '\r' || c == '\n'; } function isXdigit(c) { return isDigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); } function ord(c) { return c.charCodeAt(0); } function isPrint(c) { return ord(c) > 31 && ord(c) < 127; } function toLower(c) { return c.toLowerCase(); } function toUpper(c) { return c.toUpperCase(); } // Lists function cons(v, ls) { return { next : ls, data : v }; } function rev(ls) { var acc = null; for (; ls; ls = ls.next) acc = cons(ls.data, acc); return acc; } function concat(ls1, ls2) { var acc = ls2; ls1 = rev(ls1); for (; ls1; ls1 = ls1.next) acc = cons(ls1.data, acc); return acc; } function member(x, ls) { for (; ls; ls = ls.next) if (ls.data == x) return true; return false; } function remove(x, ls) { var acc = null; for (; ls; ls = ls.next) if (ls.data == x) return concat(acc, ls.next); else acc = cons(ls.data, acc); return ls; } function union(ls1, ls2) { var acc = ls2; for (; ls1; ls1 = ls1.next) if (!member(ls1.data, ls2)) acc = cons(ls1.data, acc); return acc; } function length(ls) { var acc = 0; for (; ls; ls = ls.next) ++acc; return acc; } // Floats function float(n) { return n; } function trunc(n) { return ~~n; } function ceil(n) { return Math.ceil(n); } function round(n) { return Math.round(n); } function pow(n, m) { return Math.pow(n, m); } function sqrt(n){ return Math.sqrt(n); } function sin(n){ return Math.sin(n); } function cos(n){ return Math.cos(n); } function log(n){ return Math.log(n); } function exp(n){ return Math.exp(n); } function asin(n){ return Math.asin(n); } function acos(n){ return Math.acos(n); } function atan(n){ return Math.atan(n); } function atan2(n, m){ return Math.atan2(n, m); } function floor(n){ return Math.floor(n); } function abs(n){ return Math.abs(n); } // Time, represented as counts of microseconds since the epoch var time_format = "%c"; function showTime(tm) { return strftime(time_format, tm); } function showTimeHtml(tm) { return eh(showTime(tm)); } function now() { return (new Date()).getTime() * 1000; } function diffInSeconds(tm1, tm2) { return Math.round((tm2 - tm1) / 1000000); } function diffInMilliseconds(tm1, tm2) { return Math.round((tm2 - tm1) / 1000); } function toSeconds(tm) { return Math.round(tm / 1000000); } function toMilliseconds(tm) { return Math.round(tm / 1000); } function fromMilliseconds(tm) { return tm * 1000; } function addSeconds(tm, n) { return tm + n * 1000000; } function stringToTime_error(string) { var t = Date.parse(string); if (isNaN(t)) er("Invalid date string: " + string); else return t * 1000; } function stringToTime(string) { try { var t = Date.parse(string); if (isNaN(t)) return null; else return t * 1000; } catch (e) { return null; } } /* strftime() implementation from: YUI 3.4.1 (build 4118) Copyright 2011 Yahoo! Inc. All rights reserved. Licensed under the BSD License. http://yuilibrary.com/license/ */ var xPad=function (x, pad, r) { if(typeof r === "undefined") { r=10; } pad = pad.toString(); for( ; parseInt(x, 10)1; r/=10) { x = pad + x; } return x.toString(); }; var YDateEn = { a: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], A: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], b: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], B: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], c: "%a %d %b %Y %T %Z", p: ["AM", "PM"], P: ["am", "pm"], r: "%I:%M:%S %p", x: "%d/%m/%y", X: "%T" }; var Dt = { formats: { a: function (d, l) { return l.a[d.getDay()]; }, A: function (d, l) { return l.A[d.getDay()]; }, b: function (d, l) { return l.b[d.getMonth()]; }, B: function (d, l) { return l.B[d.getMonth()]; }, C: function (d) { return xPad(parseInt(d.getFullYear()/100, 10), 0); }, d: ["getDate", "0"], e: ["getDate", " "], g: function (d) { return xPad(parseInt(Dt.formats.G(d)%100, 10), 0); }, G: function (d) { var y = d.getFullYear(); var V = parseInt(Dt.formats.V(d), 10); var W = parseInt(Dt.formats.W(d), 10); if(W > V) { y++; } else if(W===0 && V>=52) { y--; } return y; }, H: ["getHours", "0"], I: function (d) { var I=d.getHours()%12; return xPad(I===0?12:I, 0); }, j: function (d) { var gmd_1 = new Date("" + d.getFullYear() + "/1/1 GMT"); var gmdate = new Date("" + d.getFullYear() + "/" + (d.getMonth()+1) + "/" + d.getDate() + " GMT"); var ms = gmdate - gmd_1; var doy = parseInt(ms/60000/60/24, 10)+1; return xPad(doy, 0, 100); }, k: ["getHours", " "], l: function (d) { var I=d.getHours()%12; return xPad(I===0?12:I, " "); }, m: function (d) { return xPad(d.getMonth()+1, 0); }, M: ["getMinutes", "0"], p: function (d, l) { return l.p[d.getHours() >= 12 ? 1 : 0 ]; }, P: function (d, l) { return l.P[d.getHours() >= 12 ? 1 : 0 ]; }, s: function (d, l) { return parseInt(d.getTime()/1000, 10); }, S: ["getSeconds", "0"], u: function (d) { var dow = d.getDay(); return dow===0?7:dow; }, U: function (d) { var doy = parseInt(Dt.formats.j(d), 10); var rdow = 6-d.getDay(); var woy = parseInt((doy+rdow)/7, 10); return xPad(woy, 0); }, V: function (d) { var woy = parseInt(Dt.formats.W(d), 10); var dow1_1 = (new Date("" + d.getFullYear() + "/1/1")).getDay(); var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1); if(idow === 53 && (new Date("" + d.getFullYear() + "/12/31")).getDay() < 4) { idow = 1; } else if(idow === 0) { idow = Dt.formats.V(new Date("" + (d.getFullYear()-1) + "/12/31")); } return xPad(idow, 0); }, w: "getDay", W: function (d) { var doy = parseInt(Dt.formats.j(d), 10); var rdow = 7-Dt.formats.u(d); var woy = parseInt((doy+rdow)/7, 10); return xPad(woy, 0, 10); }, y: function (d) { return xPad(d.getFullYear()%100, 0); }, Y: "getFullYear", z: function (d) { var o = d.getTimezoneOffset(); var H = xPad(parseInt(Math.abs(o/60), 10), 0); var M = xPad(Math.abs(o%60), 0); return (o>0?"-":"+") + H + M; }, Z: function (d) { var tz = d.toString().replace(/^.*:\d\d( GMT[+-]\d+)? \(?([A-Za-z ]+)\)?\d*$/, "$2").replace(/[a-z ]/g, ""); if(tz.length > 4) { tz = Dt.formats.z(d); } return tz; }, "%": function (d) { return "%"; } }, aggregates: { c: "locale", D: "%m/%d/%y", F: "%Y-%m-%d", h: "%b", n: "\n", r: "%I:%M:%S %p", R: "%H:%M", t: "\t", T: "%H:%M:%S", x: "locale", X: "locale" }, format : function (oDate, format) { var replace_aggs = function (m0, m1) { var f = Dt.aggregates[m1]; return (f === "locale" ? YDateEn[m1] : f); }; var replace_formats = function (m0, m1) { var f = Dt.formats[m1]; switch(typeof f) { case "string": return oDate[f](); case "function": return f.call(oDate, oDate, YDateEn); case "array": case "object": if(typeof(f[0]) === "string") return xPad(oDate[f[0]](), f[1]); default: return m1; } }; while(format.match(/%[cDFhnrRtTxX]/)) { format = format.replace(/%([cDFhnrRtTxX])/g, replace_aggs); } var str = format.replace(/%([aAbBCdegGHIjklmMpPsSuUVwWyYzZ%])/g, replace_formats); replace_aggs = replace_formats = undefined; return str; } }; // End of YUI code function strftime(fmt, thisTime) { var thisDate = new Date(); thisDate.setTime(Math.floor(thisTime / 1000)); return Dt.format(thisDate, fmt); }; function fromDatetime(year, month, date, hour, minute, second) { return (new Date(year, month, date, hour, minute, second)).getTime() * 1000; }; function datetimeYear(t) { return (new Date(t / 1000)).getYear() + 1900; }; function datetimeMonth(t) { return (new Date(t / 1000)).getMonth(); }; function datetimeDay(t) { return (new Date(t / 1000)).getDate(); }; function datetimeHour(t) { return (new Date(t / 1000)).getHours(); }; function datetimeMinute(t) { return (new Date(t / 1000)).getMinutes(); }; function datetimeSecond(t) { return (new Date(t / 1000)).getSeconds(); }; function datetimeDayOfWeek(t) { return (new Date(t / 1000)).getDay(); }; // Error handling function uw_debug(msg) { try { console.debug(msg); } catch (e) { alert("DEBUG: " + msg); } return 0; } function whine(msg) { alert(msg); throw msg; } function pf(loc) { throw ("Pattern match failure (" + loc + ")"); } var lameDuck = false; function runHandlers(kind, ls, arg) { if (!lameDuck) { if (ls == null) alert(kind + ": " + arg); for (; ls; ls = ls.next) try { exec({c:"a", f:{c:"a", f:ls.data, x:{c:"c", v:arg}}, x:{c:"c", v:null}}); } catch (v) { } } } var errorHandlers = null; function flift0(v) { return {c:"c", v:v}; } function onError(f) { errorHandlers = cons(flift0(f), errorHandlers); } function er(s) { runHandlers("Error", errorHandlers, s); throw {uw_error: s}; } var failHandlers = null; function onFail(f) { failHandlers = cons(flift0(f), failHandlers); } function doExn(v) { if (v == null || v.uw_error == null) { var s = (v == null ? "null" : v.message ? v.message : v.toString()); if (v != null && v.fileName && v.lineNumber) s += " (" + v.fileName + ":" + v.lineNumber + ")"; runHandlers("Fail", failHandlers, s); } } var disconnectHandlers = null; function flift(f) { return {c: "c", v:{env:cons(f,null), body:{c:"v", n:1}}}; } function onDisconnect(f) { disconnectHandlers = cons(flift(f), disconnectHandlers); } function discon() { runHandlers("Disconnect", disconnectHandlers, null); } var connectHandlers = null; function onConnectFail(f) { connectHandlers = cons(flift(f), connectHandlers); } function conn(msg) { var rx = /(.*)((.|\n|\r)*)<\/body>(.*)/g; var arr = rx.exec(msg); msg = (arr && arr.length >= 3) ? arr[2] : msg; runHandlers("RPC failure", connectHandlers, msg); } var serverHandlers = null; function onServerError(f) { serverHandlers = cons(flift0(f), serverHandlers); } function servErr(s) { window.setTimeout(function () { runHandlers("Server", serverHandlers, s); }, 0); } // Key and mouse events var uw_event = null; function uw_getEvent() { return window.event ? window.event : uw_event; } function firstGood(x, y) { if (x == undefined || x == 0) return y; else return x; } function uw_mouseEvent() { var ev = uw_getEvent(); return {_ScreenX : firstGood(ev.screenX, 0), _ScreenY : firstGood(ev.screenY, 0), _ClientX : firstGood(ev.clientX, 0), _ClientY : firstGood(ev.clientY, 0), _CtrlKey : firstGood(ev.ctrlKey, false), _ShiftKey : firstGood(ev.shiftKey, false), _AltKey : firstGood(ev.altKey, false), _MetaKey : firstGood(ev.metaKey, false), _Button : ev.button == 2 ? "Right" : ev.button == 1 ? "Middle" : "Left"}; } function uw_keyEvent() { var ev = uw_getEvent(); return {_KeyCode : firstGood(ev.keyCode, ev.which), _CtrlKey : firstGood(ev.ctrlKey, false), _ShiftKey : firstGood(ev.shiftKey, false), _AltKey : firstGood(ev.altKey, false), _MetaKey : firstGood(ev.metaKey, false)}; } // Document events function uw_handler(name, f) { var old = document[name]; if (old == undefined) document[name] = function(event) { uw_event = event; execF(execF(f, uw_mouseEvent())); }; else document[name] = function(event) { uw_event = event; old(); execF(execF(f, uw_mouseEvent())); }; } function uw_onClick(f) { uw_handler("onclick", f); } function uw_onContextmenu(f) { uw_handler("oncontextmenu", f); } function uw_onDblclick(f) { uw_handler("ondblclick", f); } function uw_onMousedown(f) { uw_handler("onmousedown", f); } function uw_onMouseenter(f) { uw_handler("onmouseenter", f); } function uw_onMouseleave(f) { uw_handler("onmouseleave", f); } function uw_onMousemove(f) { uw_handler("onmousemove", f); } function uw_onMouseout(f) { uw_handler("onmouseout", f); } function uw_onMouseover(f) { uw_handler("onmouseover", f); } function uw_onMouseup(f) { uw_handler("onmouseup", f); } function uw_keyHandler(name, f) { var old = document[name]; if (old == undefined) document[name] = function(event) { uw_event = event; execF(execF(f, uw_keyEvent())); }; else document[name] = function(event) { uw_event = event; old(); execF(execF(f, uw_keyEvent())); }; } function uw_onKeydown(f) { uw_keyHandler("onkeydown", f); } function uw_onKeypress(f) { uw_keyHandler("onkeypress", f); } function uw_onKeyup(f) { uw_keyHandler("onkeyup", f); } // Cancelling of further event processing function uw_preventDefault() { var e = window.event ? window.event : uw_event; e.returnValue = false; if (e.preventDefault) e.preventDefault(); } function uw_stopPropagation() { var e = window.event ? window.event : uw_event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); } // Embedding closures in XML strings function cs(f) { return {closure: f}; } function isWeird(v) { return v.closure != null || v.cat1 != null; } function cat(s1, s2) { if (isWeird(s1) || isWeird(s2)) return {cat1: s1, cat2: s2}; else return s1 + s2; } var closures = []; var freeClosures = null; function newClosure(f) { var n; if (freeClosures == null) { n = closures.length; } else { n = freeClosures.data; freeClosures = freeClosures.next; } closures[n] = f; return n; } function freeClosure(n) { closures[n] = null; freeClosures = cons(n, freeClosures); } function cr(n) { return closures[n]; } function flattenAcc(a, cls, trs) { while (trs) { var tr = trs.data; trs = trs.next; if (tr.cat1 != null) { trs = cons(tr.cat1, cons(tr.cat2, trs)); } else if (tr.closure != null) { var cl = newClosure(tr.closure); cls.v = cons(cl, cls.v); a.push("cr(", cl.toString(), ")"); } else a.push(tr); } } function flatten(cls, tr) { var a = []; flattenAcc(a, cls, cons(tr, null)); return a.join(""); } function flattenLocal(s) { var cls = {v : null}; var r = flatten(cls, s); for (cl = cls.v; cl != null; cl = cl.next) freeClosure(cl.data); return r; } // Dynamic tree management function populate(node) { if (node.dead) return; var s = node.signal; var oldSources = node.sources; try { var sr = execF(s, null); var newSources = sr._sources; for (var sp = oldSources; sp; sp = sp.next) if (!member(sp.data, newSources)) sp.data.dyns = remove(node, sp.data.dyns); for (var sp = newSources; sp; sp = sp.next) if (!member(sp.data, oldSources)) sp.data.dyns = cons(node, sp.data.dyns); node.sources = newSources; node.recreate(sr._data); } catch (v) { doExn(v); } } function sc(v) { return {data : v, dyns : null}; } function sv(s, v) { if (s.data != v) { s.data = v; for (var ls = s.dyns; ls; ls = ls.next) populate(ls.data); } } function sg(s) { return s.data; } function ss(s) { return {env:cons(s, null), body:{c:"r", l: cons({n:"sources", v:{c:"c", v:cons(s, null)}}, cons({n:"data", v:{c:"f", f:sg, a:cons({c:"v", n:1}, null)}}, null))}}; } function sr(v) { return {env:null, body:{c:"c", v:{_sources : null, _data : v}}}; } function sb(x,y) { return {env:cons(y,cons(x,null)), body:{c:"=", e1:{c:"a", f:{c:"v", n:2}, x:{c:"c", v:null}}, e2:{c:"=", e1:{c:"a", f:{c:"a", f:{c:"v", n:2}, x:{c:".", r:{c:"v", n:0}, f:"data"}}, x:{c:"c", v:null}}, e2:{c:"r", l:cons( {n:"sources", v:{c:"f", f:union, a:cons({c:".", r:{c:"v", n:1}, f:"sources"}, cons({c:".", r:{c:"v", n:0}, f:"sources"}, null))}}, cons({n:"data", v:{c:".", r:{c:"v", n:0}, f:"data"}}, null))}}}}; } function scur(s) { return execF(s, null)._data; } function lastParent() { var pos = document.body; while (pos.lastChild && pos.lastChild.nodeType == 1) pos = pos.lastChild; pos = pos.parentNode; return pos; } var thisScript = null; function addNode(node) { if (thisScript) { if (thisScript.parentNode) thisScript.parentNode.replaceChild(node, thisScript); } else lastParent().appendChild(node); } function runScripts(node) { if (node.tagName == "SCRIPT") { var savedScript = thisScript; thisScript = node; try { eval(thisScript.text); } catch (v) { doExn(v); } if (thisScript.parentNode) thisScript.parentNode.removeChild(thisScript); thisScript = savedScript; } else if (node.getElementsByTagName) { var savedScript = thisScript; var scripts = node.getElementsByTagName("script"), scriptsCopy = []; var len = scripts.length; for (var i = 0; i < len; ++i) scriptsCopy[i] = scripts[i]; for (var i = 0; i < len; ++i) { thisScript = scriptsCopy[i]; try { eval(thisScript.text); } catch (v) { doExn(v); } if (thisScript.parentNode) thisScript.parentNode.removeChild(thisScript); } thisScript = savedScript; } } // Dynamic tree entry points function killScript(scr) { scr.dead = true; for (var ls = scr.sources; ls; ls = ls.next) ls.data.dyns = remove(scr, ls.data.dyns); for (var ls = scr.closures; ls; ls = ls.next) freeClosure(ls.data); } // Sometimes we wind up with tables that contain