// script.js -- HotCRP JavaScript library // HotCRP is Copyright (c) 2006-2011 Eddie Kohler and Regents of the UC // Distributed under an MIT-like license; see LICENSE function $$(id) { return document.getElementById(id); } isArray = (function (toString) { return function (x) { return toString.call(x) === "[object Array]"; }; })(Object.prototype.toString); function e_value(id, value) { var elt = $$(id); if (value == null) return elt ? elt.value : undefined; else if (elt) elt.value = value; } setLocalTime = (function () { var servhr24, showdifference = false; function setLocalTime(elt, servtime) { var d, s, hr; if (elt && typeof elt == "string") elt = $$(elt); if (elt && showdifference) { d = new Date(servtime * 1000); s = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"][d.getDay()]; s += "day " + d.getDate() + " "; s += ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][d.getMonth()]; s += " " + d.getFullYear(); hr = d.getHours(); s += " " + (servhr24 ? hr : ((hr + 11) % 12) + 1); s += ":" + (d.getMinutes() < 10 ? "0" : "") + d.getMinutes(); s += ":" + (d.getSeconds() < 10 ? "0" : "") + d.getSeconds(); if (!servhr24) s += (hr < 12 ? "am" : "pm"); s += " your time"; if (elt.tagName.toUpperCase() == "SPAN") { elt.innerHTML = " (" + s + ")"; elt.style.display = "inline"; } else { elt.innerHTML = s; elt.style.display = "block"; } } } setLocalTime.initialize = function (servtime, servzone, hr24) { var now = new Date(), x; if (Math.abs(now.getTime() - servtime * 1000) >= 300000 && (x = $$("clock_drift_container"))) x.innerHTML = "
The HotCRP server's clock is more than 5 minutes off from your computer's clock. If your computer's clock is correct, you should update the server's clock.
"; servhr24 = hr24; // print local time if server time is in a different time zone showdifference = Math.abs(now.getTimezoneOffset() - servzone) >= 60; }; return setLocalTime; })(); loadDeadlines = (function () { var dl, dlname, dltime, dlurl, redisplay_timeout, reload_timeout; function redisplayDeadlines() { redisplay_timeout = null; displayDeadlines(); } // this logic is repeated in the back end function displayDeadlines() { var s = "", amt, what = null, x, subtype, time_since_load = new Date().getTime() / 1000 - +dl.load, now = +dl.now + time_since_load, elt = $$("maindeadline"); if (!elt) return; dlname = ""; dltime = 0; if (dl.sub_open) { x = {"sub_reg": "registration", "sub_update": "update", "sub_sub": "submission"}; for (subtype in x) if (+dl.now <= +dl[subtype] ? now - 120 <= +dl[subtype] : dl[subtype + "_ingrace"]) { dlname = "Paper " + x[subtype] + " deadline"; dltime = +dl[subtype]; break; } } if (dlname) { if (dlurl) s = "" + dlname + " "; else s = dlname + " "; amt = dltime - now; if (!dltime || amt <= 0) s += "is NOW"; else { s += "in "; if (amt > 259200 /* 3 days */) { amt = Math.ceil(amt / 86400); what = "day"; } else if (amt > 28800 /* 8 hours */) { amt = Math.ceil(amt / 3600); what = "hour"; } else if (amt > 3600 /* 1 hour */) { amt = Math.ceil(amt / 1800) / 2; what = "hour"; } else if (amt > 180) { amt = Math.ceil(amt / 60); what = "minute"; } else { amt = Math.ceil(amt); what = "second"; } s += amt + " " + what + (amt == 1 ? "" : "s"); } if (!dltime || dltime - now <= 180) s = "" + s + ""; } elt.innerHTML = s; elt.style.display = s ? (elt.tagName.toUpperCase() == "SPAN" ? "inline" : "block") : "none"; if (!redisplay_timeout) { if (what == "second") redisplay_timeout = setTimeout(displayDeadlines, 250); else if (what == "minute") redisplay_timeout = setTimeout(displayDeadlines, 15000); } } function reloadDeadlines() { reload_timeout = null; Miniajax.get(dlurl + "?ajax=1", loadDeadlines, 10000); } function loadDeadlines(dlx) { var t; if (dlx) { dl = dlx; dl.load = new Date().getTime() / 1000; } displayDeadlines(); if (dlurl && !reload_timeout) { t = (dlname && (!dltime || dltime - dl.load <= 120) ? 45000 : 300000); reload_timeout = setTimeout(reloadDeadlines, t); } } loadDeadlines.init = function (dlx, dlurlx) { dlurl = dlurlx; loadDeadlines(dlx); }; return loadDeadlines; })(); var hotcrp_onload = []; function hotcrpLoad(arg) { if (!arg) for (x = 0; x < hotcrp_onload.length; ++x) hotcrp_onload[x](); else if (typeof arg === "string") hotcrp_onload.push(hotcrpLoad[arg]); else hotcrp_onload.push(arg); } hotcrpLoad.time = function (servtime, servzone, hr24) { setLocalTime.initialize(servtime, servzone, hr24); }; hotcrpLoad.opencomment = function () { if (location.hash.match(/^\#?commentnew$/)) open_new_comment(); }; function highlightUpdate(which, off) { var ins, i, result; if (typeof which == "string") { result = $$(which + "result"); if (result && !off) result.innerHTML = ""; which = $$(which); } if (!which) which = document; i = which.tagName ? which.tagName.toUpperCase() : ""; if (i != "INPUT" && i != "BUTTON") { ins = which.getElementsByTagName("input"); for (i = 0; i < ins.length; i++) if (ins[i].className.substr(0, 2) == "hb") highlightUpdate(ins[i], off); } if (which.className) { result = which.className.replace(" alert", ""); which.className = (off ? result : result + " alert"); } } function hiliter(which, off) { var elt = which; while (elt && elt.tagName && (elt.tagName.toUpperCase() != "DIV" || elt.className.substr(0, 4) != "aahc")) elt = elt.parentNode; if (!elt || !elt.tagName) highlightUpdate(null, off); else if (off && elt.className) elt.className = elt.className.replace(" alert", ""); else if (elt.className) elt.className = elt.className + " alert"; } var foldmap = {}, foldsession_unique = 1; function fold(which, dofold, foldtype) { var i, elt, selt, opentxt, closetxt, foldnum, foldnumid; if (which instanceof Array) { for (i = 0; i < which.length; i++) fold(which[i], dofold, foldtype); } else if (typeof which == "string") { foldnum = foldtype; if (foldmap[which] != null && foldmap[which][foldtype] != null) foldnum = foldmap[which][foldtype]; foldnumid = foldnum ? foldnum : ""; elt = $$("fold" + which) || $$(which); fold(elt, dofold, foldnum); // check for session if ((selt = $$('foldsession.' + which + foldnumid))) selt.src = selt.src.replace(/val=.*/, 'val=' + (dofold ? 1 : 0) + '&u=' + foldsession_unique++); else if ((selt = $$('foldsession.' + which))) selt.src = selt.src.replace(/val=.*/, 'val=' + (dofold ? 1 : 0) + '&sub=' + (foldtype || foldnumid) + '&u=' + foldsession_unique++); // check for focus if (!dofold && (selt = $$("fold" + which + foldnumid + "_d"))) selt.focus(); } else if (which) { foldnumid = foldtype ? foldtype : ""; opentxt = "fold" + foldnumid + "o"; closetxt = "fold" + foldnumid + "c"; if (dofold == null && which.className.indexOf(opentxt) >= 0) dofold = true; if (dofold) which.className = which.className.replace(opentxt, closetxt); else which.className = which.className.replace(closetxt, opentxt); // IE won't actually do the fold unless we yell at it if (document.recalc) try { which.innerHTML = which.innerHTML + ""; } catch (err) { } } return false; } function crpfocus(id, subfocus, seltype) { var selt = $$(id); if (selt && subfocus) selt.className = selt.className.replace(/links[0-9]*/, 'links' + subfocus); var felt = $$(id + (subfocus ? subfocus : "") + "_d"); if (felt && !(felt.type == "text" && felt.value && seltype == 1)) felt.focus(); if (felt && felt.type == "text" && seltype == 3 && felt.select) felt.select(); if ((selt || felt) && window.event) window.event.returnValue = false; if (seltype && seltype >= 1) window.scrollTo(0, 0); return !(selt || felt); } function crpSubmitKeyFilter(elt, event) { var e = event || window.event; var code = e.charCode || e.keyCode; var form; if (e.ctrlKey || e.altKey || e.shiftKey || code != 13) return true; form = elt; while (form && form.tagName && form.tagName.toUpperCase() != "FORM") form = form.parentNode; if (form && form.tagName) { elt.blur(); form.submit(); return false; } else return true; } function make_link_callback(elt) { return function () { window.location = elt.href; }; } // accounts function contactPulldown(which) { var pulldown = $$(which + "_pulldown"); if (pulldown.value != "") { var name = $$(which + "_name"); var email = $$(which + "_email"); var parse = pulldown.value.split("`````"); email.value = parse[0]; name.value = (parse.length > 1 ? parse[1] : ""); } var folder = $$('fold' + which); folder.className = folder.className.replace("foldo", "foldc"); } function shiftPassword(direction) { var form = $$("accountform"); fold("account", direction); if (form && form.whichpassword) form.whichpassword.value = direction ? "" : "t"; } // paper selection function papersel(value, name) { var ins = document.getElementsByTagName("input"), xvalue = value, value_hash = true, i; name = name || "pap[]"; if (isArray(value)) { xvalue = {}; for (i = value.length; i >= 0; --i) xvalue[value[i]] = 1; } else if (value === null || typeof value !== "object") value_hash = false; for (var i = 0; i < ins.length; i++) if (ins[i].name == name) ins[i].checked = !!(value_hash ? xvalue[ins[i].value] : xvalue); return false; } var papersel_check_safe = false; function paperselCheck() { var ins, i, e, values, check_safe = papersel_check_safe; papersel_check_safe = false; if ((e = $$("sel_papstandin"))) e.parentNode.removeChild(e); ins = document.getElementsByTagName("input"); for (i = 0, values = []; i < ins.length; i++) if ((e = ins[i]).name == "pap[]") { if (e.checked) return true; else values.push(e.value); } if (check_safe) { e = document.createElement("div"); e.id = "sel_papstandin"; e.innerHTML = ""; $$("sel").appendChild(e); return true; } alert("Select one or more papers first."); return false; } var pselclick_last = {}; function pselClick(evt, elt, thisnum, name) { var i, j, sel; name = (name ? name : "psel"); if (!evt.shiftKey || !pselclick_last[name]) /* nada */; else { if (pselclick_last[name] <= thisnum) { i = pselclick_last[name]; j = thisnum - 1; } else { i = thisnum + 1; j = pselclick_last[name]; } for (; i <= j; i++) { if ((sel = $$(name + i))) sel.checked = elt.checked; } } pselclick_last[name] = thisnum; return true; } function pc_tags_members(tag) { var pc_tags = pc_tags_json, answer = [], pc, tags; tag = " " + tag + " "; for (pc in pc_tags) if (pc_tags[pc].indexOf(tag) >= 0) answer.push(pc); return answer; } function defact(what) { var elt = $$("defaultact"); if (elt) elt.value = what; } function plactions_dofold() { var elt = $$("placttagtype"), folded, x, i; if (elt) { folded = elt.selectedIndex < 0 || elt.options[elt.selectedIndex].value != "cr"; fold("placttags", folded, 99); if (folded) fold("placttags", true); else if ((elt = $$("sel"))) { if ((elt.tagcr_source && elt.tagcr_source.value != "") || (elt.tagcr_method && elt.tagcr_method.selectedIndex >= 0 && elt.tagcr_method.options[elt.tagcr_method.selectedIndex].value != "schulze") || (elt.tagcr_gapless && elt.tagcr_gapless.checked)) fold("placttags", false); } } if ((elt = $$("foldass"))) { x = elt.getElementsByTagName("select"); for (i = 0; i < x.length; ++i) if (x[i].name == "marktype") { folded = x[i].selectedIndex < 0 || x[i].options[x[i].selectedIndex].value.charAt(0) == "x"; fold("ass", folded); } } } // assignment selection var selassign_blur = 0; function foldassign(which) { var folder = $$("foldass" + which); if (folder.className.indexOf("foldo") < 0 && selassign_blur != which) { fold("ass" + which, false); $$("pcs" + which).focus(); } selassign_blur = 0; return false; } function selassign(elt, which) { if (elt) { $$("ass" + which).className = "pctbname" + elt.value + " pctbl"; var i = $$("assimg" + which); i.className = "ass" + elt.value; hiliter(elt); } var folder = $$("folderass" + which); if (folder && elt !== 0) folder.focus(); setTimeout("fold(\"ass" + which + "\", true)", 50); if (elt === 0) { selassign_blur = which; setTimeout("selassign_blur = 0;", 300); } } // author entry var numauthorfold = []; function authorfold(prefix, relative, n) { var elt; if (relative > 0) n += numauthorfold[prefix]; if (n <= 1) n = 1; for (var i = 1; i <= n; i++) if ((elt = $$(prefix + i)) && elt.className == "aueditc") elt.className = "auedito"; else if (!elt) n = i - 1; for (var i = n + 1; i <= 50; i++) if ((elt = $$(prefix + i)) && elt.className == "auedito") elt.className = "aueditc"; else if (!elt) break; // set number displayed if (relative >= 0) { e_value(prefix + "count", n); numauthorfold[prefix] = n; } // IE won't actually do the fold unless we yell at it elt = $$(prefix + "table"); if (document.recalc && elt) try { elt.innerHTML = elt.innerHTML + ""; } catch (err) { } return false; } function staged_foreach(a, f, backwards) { var i = (backwards ? a.length - 1 : 0); var step = (backwards ? -1 : 1); var stagef = function () { var x; for (x = 0; i >= 0 && i < a.length && x < 50; i += step, ++x) f(a[i]); if (i < a.length) setTimeout(arguments.callee, 0); }; stagef(); } // temporary text function tempText(elt, text, on) { if (on && elt.value == text) { elt.value = ""; elt.className = elt.className.replace(/\btemptext\b/, "temptextoff"); } else if (!on && elt.value == "") { elt.value = text; elt.className = elt.className.replace(/\btemptextoff\b/, "temptext"); } } // check marks for ajax saves function setajaxcheck(elt, rv) { if (typeof elt == "string") elt = $$(elt); if (elt) { var s = (rv.ok ? "Saved" : (rv.error ? rv.error : "Error")), c = elt.className.replace(/\s*ajaxcheck\w*\s*/, ""); elt.setAttribute("title", s); elt.setAttribute("alt", rv.ok ? "Saved" : "Error"); elt.className = c + " ajaxcheck_" + (rv.ok ? "good" : "bad"); } } // open new comment function open_new_comment(sethash) { var x; fold("addcomment", 0); x = $$("foldaddcomment"); x = x ? x.getElementsByTagName("textarea") : null; if (x && x.length) setTimeout(function () { x[0].focus(); }, 0); if (sethash) location.hash = "#commentnew"; return false; } // quicklink shortcuts function add_quicklink_shortcuts(elt) { if (!elt) return; function quicklink_shortcut_keypress(event) { var code, a, f, target, x, i, j; // IE compatibility event = event || window.event; code = event.charCode || event.keyCode; target = event.target || event.srcElement; // reject modified keys, non-j/k, interesting targets if (code == 0 || event.altKey || event.ctrlKey || event.metaKey || (code != 106 && code != 107) || (target && target.tagName && target != elt && (x = target.tagName.toUpperCase()) && (x == "TEXTAREA" || x == "SELECT" || (x == "INPUT" && (target.type == "file" || target.type == "password" || target.type == "text"))))) return true; // reject if any forms have outstanding data x = document.getElementsByTagName("form"); for (i = 0; i < x.length; ++i) for (j = 0; j < x[i].childNodes.length; ++j) { a = x[i].childNodes[j]; if (a.nodeType == 1 && a.tagName.toUpperCase() == "DIV" && a.className.match(/\baahc\b.*\balert\b/)) return true; } // find the quicklink, reject if not found a = $$(code == 106 ? "quicklink_prev" : "quicklink_next"); if (!a || !a.focus) return true; // focus (for visual feedback), call callback a.focus(); f = make_link_callback(a); if (!Miniajax.isoutstanding("revprefform", f)) f(); if (event.preventDefault) event.preventDefault(); else event.returnValue = false; return false; } if (elt.addEventListener) elt.addEventListener("keypress", quicklink_shortcut_keypress, false); else elt.onkeypress = quicklink_shortcut_keypress; } // review preferences addRevprefAjax = (function () { function revpref_focus() { tempText(this, "0", 1); defact(""); } function revpref_blur() { tempText(this, "0", 0); } function revpref_change() { var form = $$("prefform"), whichpaper = this.name.substr(7); form.p.value = whichpaper; form.revpref.value = this.value; Miniajax.submit("prefform", function (rv) { setajaxcheck("revpref" + whichpaper + "ok", rv); }); } return function () { var inputs = document.getElementsByTagName("input"), form = $$("prefform"); if (!(form && form.p && form.revpref)) form = null; staged_foreach(inputs, function (elt) { if (elt.type == "text" && elt.name.substr(0, 7) == "revpref") { elt.onfocus = revpref_focus; elt.onblur = revpref_blur; if (form) elt.onchange = revpref_change; } }); }; })(); function makeassrevajax(select, pcs, paperId) { return function () { var form = $$("assrevform"); var immediate = $$("assrevimmediate"); var roundtag = $$("assrevroundtag"); if (form && form.p && form[pcs] && immediate && immediate.checked) { form.p.value = paperId; form.rev_roundtag.value = (roundtag ? roundtag.value : ""); form[pcs].value = select.value; Miniajax.submit("assrevform", function (rv) { setajaxcheck("assrev" + paperId + "ok", rv); }); } else hiliter(select); }; } function addAssrevAjax() { var form = $$("assrevform"); if (!form || !form.reviewer) return; var pcs = "pcs" + form.reviewer.value; var inputs = document.getElementsByTagName("select"); staged_foreach(inputs, function (elt) { if (elt.name.substr(0, 6) == "assrev") { var whichpaper = elt.name.substr(6); elt.onchange = makeassrevajax(elt, pcs, whichpaper); } }); } function makeconflictajax(input, pcs, paperId) { return function () { var form = $$("assrevform"); var immediate = $$("assrevimmediate"); if (form && form.p && form[pcs] && immediate && immediate.checked) { form.p.value = paperId; form[pcs].value = (input.checked ? -1 : 0); Miniajax.submit("assrevform", function (rv) { setajaxcheck("assrev" + paperId + "ok", rv); }); } else hiliter(input); }; } function addConflictAjax() { var form = $$("assrevform"); if (!form || !form.reviewer) return; var pcs = "pcs" + form.reviewer.value; var inputs = document.getElementsByTagName("input"); staged_foreach(inputs, function (elt) { if (elt.name == "pap[]") { var whichpaper = elt.value; elt.onclick = makeconflictajax(elt, pcs, whichpaper); } }); } // thank you David Flanagan var Geometry = null; if (window.innerWidth) { Geometry = function () { return { left: window.pageXOffset, top: window.pageYOffset, width: window.innerWidth, height: window.innerHeight, right: window.pageXOffset + window.innerWidth, bottom: window.pageYOffset + window.innerHeight }; }; } else if (document.documentElement && document.documentElement.clientWidth) { Geometry = function () { var e = document.documentElement; return { left: e.scrollLeft, top: e.scrollTop, width: e.clientWidth, height: e.clientHeight, right: e.scrollLeft + e.clientWidth, bottom: e.scrollTop + e.clientHeight }; }; } else if (document.body.clientWidth) { Geometry = function () { var e = document.body; return { left: e.scrollLeft, top: e.scrollTop, width: e.clientWidth, height: e.clientHeight, right: e.scrollLeft + e.clientWidth, bottom: e.scrollTop + e.clientHeight }; }; } function eltPos(e) { var pos = { top: 0, left: 0, right: e.offsetWidth, bottom: e.offsetHeight }; while (e) { pos.left += e.offsetLeft; pos.top += e.offsetTop; pos.right += e.offsetLeft; pos.bottom += e.offsetTop; e = e.offsetParent; } return pos; } // score help function makescorehelp(anchor, which, dofold) { return function () { var elt = $$("scorehelp_" + which); if (elt && dofold) elt.className = "scorehelpc"; else if (elt && Geometry) { var anchorPos = eltPos(anchor); var wg = Geometry(); elt.className = "scorehelpo"; elt.style.left = Math.max(wg.left + 5, Math.min(wg.right - 5 - elt.offsetWidth, anchorPos.left)) + "px"; if (anchorPos.bottom + 8 + elt.offsetHeight >= wg.bottom) elt.style.top = Math.max(wg.top, anchorPos.top - 2 - elt.offsetHeight) + "px"; else elt.style.top = (anchorPos.bottom + 8) + "px"; } }; } function addScoreHelp() { var anchors = document.getElementsByTagName("a"), href, pos; for (var i = 0; i < anchors.length; i++) if (anchors[i].className.match(/^scorehelp(?: |$)/) && (href = anchors[i].getAttribute('href')) && (pos = href.indexOf("f=")) >= 0) { var whichscore = href.substr(pos + 2); anchors[i].onmouseover = makescorehelp(anchors[i], whichscore, 0); anchors[i].onmouseout = makescorehelp(anchors[i], whichscore, 1); } } // review ratings function makeratingajax(form, id) { var selects; form.className = "fold7c"; form.onsubmit = function () { return Miniajax.submit(id, function (rv) { if ((ee = $$(id + "result")) && rv.result) ee.innerHTML = "  |  " + rv.result; }); }; selects = form.getElementsByTagName("select"); for (var i = 0; i < selects.length; ++i) selects[i].onchange = function () { void form.onsubmit(); }; } function addRatingAjax() { var forms = document.getElementsByTagName("form"), id; for (var i = 0; i < forms.length; ++i) if ((id = forms[i].getAttribute("id")) && id.substr(0, 11) == "ratingform_") makeratingajax(forms[i], id); } // popup dialogs function popup(anchor, which, dofold, populate) { var elt = $$("popup_" + which), form, elts, populates, i, xelt, type; if (elt && dofold) elt.className = "popupc"; else if (elt && Geometry) { if (!anchor) anchor = $$("popupanchor_" + which); var anchorPos = eltPos(anchor); var wg = Geometry(); elt.className = "popupo"; var x = (anchorPos.right + anchorPos.left - elt.offsetWidth) / 2; var y = (anchorPos.top + anchorPos.bottom - elt.offsetHeight) / 2; elt.style.left = Math.max(wg.left + 5, Math.min(wg.right - 5 - elt.offsetWidth, x)) + "px"; elt.style.top = Math.max(wg.top + 5, Math.min(wg.bottom - 5 - elt.offsetHeight, y)) + "px"; } // transfer input values to the new form if asked if (anchor && populate) { elts = elt.getElementsByTagName("input"); populates = {}; for (i = 0; i < elts.length; ++i) if (elts[i].className.indexOf("popup_populate") >= 0) populates[elts[i].name] = elts[i]; form = anchor; while (form && form.tagName && form.tagName.toUpperCase() != "FORM") form = form.parentNode; elts = (form && form.tagName ? form.getElementsByTagName("input") : []); for (i = 0; i < elts.length; ++i) if (elts[i].name && (xelt = populates[elts[i].name])) { if (elts[i].type == "checkbox" && !elts[i].checked) xelt.value = ""; else if (elts[i].type != "radio" || elts[i].checked) xelt.value = elts[i].value; } } return false; } // Thank you David Flanagan var Miniajax = (function () { var Miniajax = {}, outstanding = {}, _factories = [ function () { return new XMLHttpRequest(); }, function () { return new ActiveXObject("Msxml2.XMLHTTP"); }, function () { return new ActiveXObject("Microsoft.XMLHTTP"); } ]; function newRequest() { while (_factories.length) { try { var req = _factories[0](); if (req != null) return req; } catch (err) { } _factories.shift(); } return null; } Miniajax.onload = function (formname) { var req = newRequest(); if (req) fold($$(formname), 1, 7); }; Miniajax.submit = function (formname, callback, timeout) { var form, req = newRequest(), resultname, myoutstanding; if (typeof formname !== "string") { resultname = formname[1]; formname = formname[0]; } else resultname = formname; outstanding[formname] = myoutstanding = []; form = $$(formname); if (!form || !req || form.method != "post") { fold(form, 0, 7); return true; } var resultelt = $$(resultname + "result") || {}; var checkelt = $$(resultname + "check"); if (!callback) callback = function (rv) { resultelt.innerHTML = rv.response; if (checkelt) setajaxcheck(checkelt, rv); }; if (!timeout) timeout = 4000; // set request var timer = setTimeout(function () { req.abort(); resultelt.innerHTML = "Network timeout. Please try again."; form.onsubmit = ""; fold(form, 0, 7); }, timeout); req.onreadystatechange = function () { var i; if (req.readyState != 4) return; clearTimeout(timer); if (req.status == 200) { resultelt.innerHTML = ""; var rv = eval("(" + req.responseText + ")"); callback(rv); if (rv.ok) hiliter(form, true); } else { resultelt.innerHTML = "Network error. Please try again."; form.onsubmit = ""; fold(form, 0, 7); } delete outstanding[formname]; for (i = 0; i < myoutstanding.length; ++i) myoutstanding[i](); }; // collect form value var pairs = [], regexp = /%20/g; for (var i = 0; i < form.elements.length; i++) { var elt = form.elements[i]; if (elt.name && elt.value && elt.type != "submit" && elt.type != "cancel" && (elt.type != "checkbox" || elt.checked)) pairs.push(encodeURIComponent(elt.name).replace(regexp, "+") + "=" + encodeURIComponent(elt.value).replace(regexp, "+")); } pairs.push("ajax=1"); // send req.open("POST", form.action); req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send(pairs.join("&")); return false; }; Miniajax.get = function (url, callback, timeout) { var req = newRequest(), timer; if (!timeout) timeout = 4000; timer = setTimeout(function () { req.abort(); callback(null); }, timeout); req.onreadystatechange = function () { if (req.readyState != 4) return; clearTimeout(timer); if (req.status == 200) callback(eval("(" + req.responseText + ")")); else callback(null); }; req.open("GET", url); req.send(); return false; }; Miniajax.isoutstanding = function (formname, callback) { var myoutstanding = outstanding[formname]; myoutstanding && callback && myoutstanding.push(callback); return !!myoutstanding; }; return Miniajax; })(); // ajax loading of paper information var plinfo_title = { abstract: "Abstract", tags: "Tags", reviewers: "Reviewers", shepherd: "Shepherd", lead: "Discussion lead", topics: "Topics", pcconf: "PC conflicts", collab: "Collaborators", authors: "Authors", aufull: "Authors" }; var plinfo_needload = {}, plinfo_aufull = {}; function make_plloadform_callback(which, type, dofold) { var xtype = ({au: 1, anonau: 1, aufull: 1}[type] ? "authors" : type); return function (rv) { var i, x, elt, eltx, h6 = ""; if ((x = rv[xtype + ".title"])) plinfo_title[type] = x; if ((x = plinfo_title[type])) h6 = "
" + x + ":
"; for (i in rv) if (i.substr(0, xtype.length) == xtype && (elt = $$(i))) { if (rv[i] == "") elt.innerHTML = ""; else elt.innerHTML = h6 + rv[i]; } plinfo_needload[xtype] = false; fold(which, dofold, xtype); if (type == "aufull") plinfo_aufull[!!dofold] = rv; }; } function foldplinfo(dofold, type, which) { var elt, i, divs, h6, callback; // fold if (!which) which = "pl"; if (dofold.checked !== undefined) dofold = !dofold.checked; fold(which, dofold, type); if (type == "aufull" && !dofold && (elt = $$("showau")) && !elt.checked) elt.click(); if (window.foldplinfo_extra) foldplinfo_extra(type, dofold); if (plinfo_title[type]) h6 = "
" + plinfo_title[type] + ":
"; else h6 = ""; // may need to load information by ajax if (type == "aufull" && plinfo_aufull[!!dofold]) make_plloadform_callback(which, type, dofold)(plinfo_aufull[!!dofold]); else if ((!dofold || type == "aufull") && plinfo_needload[type]) { // set up "loading" display if ((elt = $$("fold" + which))) { divs = elt.getElementsByTagName("div"); for (i = 0; i < divs.length; i++) if (divs[i].id.substr(0, type.length) == type) { if (divs[i].className == "") divs[i].className = "fx" + foldmap[which][type]; divs[i].innerHTML = h6 + " Loading"; } } // initiate load if (type == "aufull") { e_value("plloadform_get", "authors"); e_value("plloadform_aufull", (dofold ? "" : "1")); } else e_value("plloadform_get", type); Miniajax.submit(["plloadform", type + "loadform"], make_plloadform_callback(which, type, dofold)); } return false; } function savedisplayoptions() { $$("scoresortsave").value = $$("scoresort").value; Miniajax.submit("savedisplayoptionsform", function (rv) { if (rv.ok) $$("savedisplayoptionsbutton").disabled = true; else alert("Unable to save current display options as default."); }); } function docheckformat(dt) { var form = $$("checkformatform" + dt); if (!form.onsubmit) return true; fold("checkformat" + dt, 0); return Miniajax.submit("checkformatform" + dt, null, 10000); } function dosubmitdecision() { var sel = $$("folddecision_d"); if (sel && sel.value > 0) fold("shepherd", 0, 2); return Miniajax.submit("decisionform"); } function docheckpaperstillready() { var e = $$("paperisready"); if (e && !e.checked) return window.confirm("Are you sure the paper is no longer ready for review?\n\nOnly papers that are ready for review will be considered."); else return true; } function doremovedocument(button, name) { var e = $$("remove_" + name), estk = [], tn, i; if (e) { e.value = 1; if ((e = $$("current_" + name))) { estk = [e]; while (estk.length) { e = estk.pop(); tn = e.nodeType == 1 ? e.tagName.toUpperCase() : ""; if (tn == "TD") e.style.textDecoration = "line-through"; else if (tn == "TABLE" || tn == "TBODY" || tn == "TR") for (i = e.childNodes.length - 1; i >= 0; --i) estk.push(e.childNodes[i]); } } fold("replacement_" + name); hiliter(button); } } // mail function setmailpsel(sel) { var dofold = !!sel.value.match(/^(?:pc$|pc:|all$)/); fold("psel", dofold, 9); } // settings function doopttype(e, nohilite) { var m; if (!nohilite) hiliter(e); if ((m = e.name.match(/^optvt(.*)$/))) { fold("optv" + m[1], e.value != 1); fold("optvis" + m[1], e.value != 100, 2); } }