{"version":3,"file":"esnext.min.js","sources":["js/i18n/datepicker/jquery.ui.datepicker-nl.js","js/lib/gettext.js","js/i18n/nl.js","js/lib/polyfills/url-search-params.js","js/lib/text-utils.js","js/lib/errors.js","js/lib/tokens.js","js/lib/baby-lisp.js","js/lib/lenses.js","js/lib/functional.js","js/lib/baby-lisp-apply.js","js/lib/booleanbucket.js","js/lib/mode.js","js/lib/collect-values.js","js/lib/vars.js","js/lib/case-exit.js","js/lib/a11y-user-detect.js","js/lib/a11y.js","js/lib/escape.js","js/lib/notify.js","js/lib/conf.js","js/lib/location.js","js/lib/ajax.js","js/lib/settled.js","js/lib/bbi.js","js/lib/control-helpers.js","js/lib/quotable.js","js/lib/dates.js","js/lib/feature-queries.js","js/lib/form-widgets.js","js/lib/dynprops.js","js/lib/hooks.js","js/lib/control.js","js/lib/types.js","js/lib/groupings.js","js/lib/font-classes.js","js/lib/names.js","js/lib/form-groups.js","node_modules/lit-html/lit-html.js","node_modules/@lit/reactive-element/css-tag.js","node_modules/@lit/reactive-element/reactive-element.js","node_modules/lit-element/lit-element.js","node_modules/@cahmoraes93/maybe/dist/index.js","js/lib/numerals.js","js/lib/url-utils.js","js/lib/form-widgets-definitions.js","js/lib/utils.js","js/lib/jumplist.js","js/lib/user-info.js","js/lib/permissions.js","js/json.js","js/lib/$.scrollTo.js","js/lib/control-validation.js","plugins/a11y-describedby/a11y-describedby.js","plugins/array._groupby/array._groupby.js","plugins/asterisk/asterisk.js","plugins/mustache/mustache.js","plugins/case-template/case-template.js","plugins/change-nav-text/change-nav-text.js","plugins/close-caseslist/close-caseslist.js","plugins/has-no-next/has-no-next.js","plugins/headings/headings.js","plugins/history/history.js","plugins/showdown/showdown.js","plugins/showdown-converter/showdown-converter.js","plugins/info-inline/info-inline.js","plugins/md-labels/md-labels.js","plugins/model-filter/model-filter.js","plugins/modelinfo/modelinfo.js","plugins/modelitem/modelitem.js","plugins/reset-password/reset-password.js","plugins/show-server-side-validation/show-server-side-validation.js"],"sourcesContent":["/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */\n/* Written by Mathias Bynens */\njQuery(function($){\n\t$.datepicker.regional.nl = {\n\t\tcloseText: 'Sluiten',\n\t\tprevText: '←',\n\t\tnextText: '→',\n\t\tcurrentText: 'Vandaag',\n\t\tmonthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',\n\t\t'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n\t\tmonthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',\n\t\t'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n\t\tdayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n\t\tdayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],\n\t\tdayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n\t\tweekHeader: 'Wk',\n\t\tdateFormat: 'dd-mm-yy',\n\t\tfirstDay: 1,\n\t\tisRTL: false,\n\t\tshowMonthAfterYear: false,\n\t\tyearSuffix: ''};\n\t$.datepicker.setDefaults($.datepicker.regional.nl);\n});\n","/******* Translations ******/\n\nconst dicts = {};\n\nlet dict = {};\n\n// gettext stub\nfunction _(s, fb) {\n return dict[s] || fb || s;\n}\n\n_.tagged = (strings, ...values) =>\n strings.reduce((acc, cur, idx) => acc + cur + _(values[idx] || \"\"), \"\");\n\n_.taggedWithin =\n prefix =>\n (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc +\n cur +\n (_(prefix, { [values[idx]]: values[idx] })[values[idx]] ||\n values[idx] ||\n \"\"),\n \"\"\n );\n\n_.set = function (ob) {\n const lang = ob[\"lang\"] || _(\"lang\"); // Either provided or current lang?\n if (!dicts[lang]) {\n dicts[lang] = {};\n }\n for (let [key, val] of Object.entries(ob)) {\n // Set only if not set before (by _.set, or by _.addTranslations)\n dicts[lang][key] || (dicts[lang][key] = val);\n }\n dict = dicts[lang];\n};\n\n_.addTranslations = function (translations) {\n for (var term in translations) {\n if (translations.hasOwnProperty(term))\n for (var lang in translations[term]) {\n if (!dicts[lang]) dicts[lang] = {};\n // Always override what has been set before\n dicts[lang][term] = translations[term][lang];\n }\n }\n};\n\nObject.freeze(_);\n\nexport { _ };\n","import { _ } from \"$json/lib/gettext\";\n\nconst strings = {\n \"lang\": \"nl\",\n \"Doubleclick to go back to this question\":\n \"Dubbelklikken om naar deze vraag terug te springen\",\n \"create a new case\": \"maak een nieuwe casus aan\",\n \"new\": \"nieuw\",\n \"Delete\": \"Verwijder\",\n \"case\": \"casus\",\n \"cases\": \"casus\",\n \"Last opened\": \"Laatst geopend\",\n \"created\": \"gemaakt\",\n \"report\": \"rapport\",\n \"Sun\": \"Zo\",\n \"Mon\": \"Ma\",\n \"Tue\": \"Di\",\n \"Wed\": \"Wo\",\n \"Thu\": \"Do\",\n \"Fri\": \"Vr\",\n \"Sat\": \"Za\",\n \"Jan\": \"Jan\",\n \"Feb\": \"Feb\",\n \"Mar\": \"Maart\",\n \"Apr\": \"April\",\n \"May\": \"Mei\",\n \"June\": \"Juni\",\n \"July\": \"Juli\",\n \"Aug\": \"Aug\",\n \"Sep\": \"Sep\",\n \"Oct\": \"Okt\",\n \"Nov\": \"Nov\",\n \"Dec\": \"Dec\",\n \"press enter to accept\": \"accepteer met ENTER\",\n \"filter cases by name\": \"zoek casus op naam\",\n \"field--value\": \"deze waarde\",\n \"field--date\": \"deze datum\",\n \"field--field\": \"dit veld\",\n \"field--list\": \"deze opties\",\n \"quoted--value\": \"de waarde “{quotable}”\",\n \"quoted--date\": \"de datum “{quotable}”\",\n \"quoted--field\": \"het veld “{quotable}”\",\n \"quoted--list\": \"de opties in “{quotable}”\",\n \"Date required\":\n \"{quotable--init} is verplicht; gebruik het formaat dd - mm - j j j j.\",\n \"Input required\": \"{quotable--init} is verplicht\",\n \"Choice required\": \"Keuze uit {quotable} is verplicht\",\n \"Field required\": \"{quotable--init} is verplicht\",\n \"Value has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen\",\n \"Date has to lie between {minimum} and {maximum}\":\n \"{quotable--init} moet tussen {minimum} en {maximum} liggen; gebruik het formaat dd-mm-jjjj.\",\n \"Negative number or zero expected\":\n \"{quotable--init} moet negatief zijn of nul\",\n \"Negative number expected\": \"{quotable--init} moet negatief zijn\",\n \"Value has to lie below {maximum}\":\n \"{quotable--init} moet lager zijn dan {maximum+1}\",\n \"Positive number or zero expected\": \"{quotable} moet positief zijn of nul\",\n \"Positive number expected\": \"{quotable} moet hoger zijn dan nul\",\n \"Value has to lie above {minimum}\":\n \"{quotable--init} moet hoger zijn dan {minimum-1}\",\n \"A date after {maximum} is not allowed\":\n \"{quotable--init} ná {maximum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"A date before {minimum} is not allowed\":\n \"{quotable--init} vóór {minimum} is niet toegestaan; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid date\":\n \"{quotable--init} is ongeldig; gebruik het formaat dd-mm-jjjj.\",\n \"Invalid number\": \"{quotable--init} is geen getal\",\n \"Text length exceeds the maximum of {0} characters\":\n \"{quotable--init} mag maximaal {maxlength} karakters bevatten\",\n \"click for more...\": \"klik voor meer...\",\n \" (click to open link)\": \" (klik om link te openen)\",\n \"Are you sure? This will reset all values.\":\n \"Weet u het zeker? Dit zal alle ingevulde velden leegmaken.\",\n \"Yesterday\": \"Gisteren\",\n \"No valid session\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"Maximum allowed characters: {0}\": \"Maximaal {0} karakters toegestaan\",\n \"No interfaces to show\":\n \"Geen zichtbare elementen (vragen, tekstvelden) gedefinieerd\",\n // feedback\n \"Feedback\": \"Feedback\",\n \"describe the problem\": \"omschrijf het probleem\",\n \"Please do not collate issues.\": \"Een melding per keer!\",\n \"Please send only feedback about the currently visible question or questions; information about these will be sent back to the developers.\":\n \"Geef alleen feedback over de vraag of vragen die je op dit moment op je scherm ziet; informatie over die vragen wordt namelijk meegezonden naar de ontwikkelaars.\",\n \"send\": \"verstuur\",\n \"Thanks for your feedback!\": \"Bedankt voor uw melding!\",\n \"Interface has failed (probably a failing SOAP or database connection)\":\n \"Interface gefaald (waarschijnlijk een falende SOAP- of databasekoppeling)\",\n \"Choose...\": \"Kies...\",\n \"Choose or type...\": \"Kies of typ...\",\n \"cUMWrongUserNamePassword\": \"Ongeldige gebruikersnaam of wachtwoord\",\n \"cWebCaseIsRunning\":\n \"Casus laden is niet gelukt; deze casus wordt al gedraaid in een andere sessie\",\n \"The model you are trying to open does not exist\":\n \"Het beslismodel dat u probeert te openen bestaat niet\",\n \"You may now safely close this window\": \"U kunt het venster nu sluiten\",\n \"user name\": \"gebruikersnaam\",\n \"password\": \"wachtwoord\",\n \"Your models\": \"Uw modellen\",\n \"Your sessions\": \"Uw sessies\",\n \"log in\": \"inloggen\",\n \"load session\": \"Lees uw gegevens in\",\n \"load\": \"inlezen\",\n \"Choose the session file you saved earlier\":\n \"Kies het gegevensbestand dat u de vorige keer hebt opgeslagen\",\n \"Error loading session (wrong data)\":\n \"Inlezen gegevens mislukt (verkeerde gegevens).\",\n \"Please login\": \"Gelieve in te loggen\",\n \"open\": \"open\",\n \"copy\": \"kopie\",\n 'You have no tickets left for model \"{0}\"':\n 'Uw strippenkaart voor model \"{0}\" is op',\n \"__digitgroupingchar__\": \".\",\n \"__radixpoint__\": \",\",\n \"__digitgroupingrules__\": [3],\n \"attachments\": \"bijlagen\",\n \"your documents\": \"uw documenten\",\n \"saved sessions\": \"bewaarde sessies\",\n \"We are currently updating. Please try again later.\":\n \"Er is momenteel een update aan de gang, probeert u het binnenkort nogmaals.\",\n \"case name\": \"casusnaam\",\n \"dateplaceholder\": \"dd - mm - j j j j\",\n \"Error: No response from server, server probably down\":\n \"Fout: Server is tijdelijk buiten gebruik. U moet zich opnieuw aanmelden.\",\n \"Session has timed out. Please log in again.\":\n \"De sessie is afgelopen. U moet zich opnieuw aanmelden.\",\n \"first {0} results\": \"eerste {0} resultaten\",\n \"previous {0} results\": \"vorige {0} resultaten\",\n \"next {0} results\": \"volgende {0} resultaten\",\n \"last {0} results\": \"laatste {0} resultaten\",\n \"results {0} to {1} from {2}\": \"resultaten {0} tot {1} van {2}\",\n \"add row\": \"Voeg rij toe\",\n \"insert row\": \"voeg rij in\",\n \"delete row\": \"verwijder rij\",\n \"There are errors, please double check your answers.\":\n \"Er zijn nog fouten, gelieve uw antwoorden nogmaals na te gaan.\",\n \"cancel\": \"annuleer\",\n \"Something went wrong; see the server log for more information.\":\n \"Er is iets misgegaan; bekijk de server log voor meer informatie\"\n};\n\n_.set(strings);\n\nexport { strings };\n","/*! (c) Andrea Giammarchi - ISC */\nvar self = window || /* istanbul ignore next */ {};\ntry {\n (function (URLSearchParams, plus) {\n if (\n new URLSearchParams(\"q=%2B\").get(\"q\") !== plus ||\n new URLSearchParams({ q: plus }).get(\"q\") !== plus ||\n new URLSearchParams([[\"q\", plus]]).get(\"q\") !== plus ||\n new URLSearchParams(\"q=\\n\").toString() !== \"q=%0A\" ||\n new URLSearchParams({ q: \" &\" }).toString() !== \"q=+%26\" ||\n new URLSearchParams({ q: \"%zx\" }).toString() !== \"q=%25zx\"\n )\n throw URLSearchParams;\n self.URLSearchParams = URLSearchParams;\n })(URLSearchParams, \"+\");\n} catch (URLSearchParams) {\n (function (Object, String, isArray) {\n \"use strict\";\n var create = Object.create;\n var defineProperty = Object.defineProperty;\n var find = /[!'\\(\\)~]|%20|%00/g;\n var findPercentSign = /%(?![0-9a-fA-F]{2})/g;\n var plus = /\\+/g;\n var replace = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\x00\"\n };\n var proto = {\n append: function (key, value) {\n appendTo(this._ungap, key, value);\n },\n delete: function (key) {\n delete this._ungap[key];\n },\n get: function (key) {\n return this.has(key) ? this._ungap[key][0] : null;\n },\n getAll: function (key) {\n return this.has(key) ? this._ungap[key].slice(0) : [];\n },\n has: function (key) {\n return key in this._ungap;\n },\n set: function (key, value) {\n this._ungap[key] = [String(value)];\n },\n forEach: function (callback, thisArg) {\n var self = this;\n for (var key in self._ungap) self._ungap[key].forEach(invoke, key);\n function invoke(value) {\n callback.call(thisArg, value, String(key), self);\n }\n },\n toJSON: function () {\n return {};\n },\n toString: function () {\n var query = [];\n for (var key in this._ungap) {\n var encoded = encode(key);\n for (var i = 0, value = this._ungap[key]; i < value.length; i++) {\n query.push(encoded + \"=\" + encode(value[i]));\n }\n }\n return query.join(\"&\");\n }\n };\n for (var key in proto)\n defineProperty(URLSearchParams.prototype, key, {\n configurable: true,\n writable: true,\n value: proto[key]\n });\n self.URLSearchParams = URLSearchParams;\n function URLSearchParams(query) {\n var dict = create(null);\n defineProperty(this, \"_ungap\", { value: dict });\n switch (true) {\n case !query:\n break;\n case typeof query === \"string\":\n if (query.charAt(0) === \"?\") {\n query = query.slice(1);\n }\n for (\n var pairs = query.split(\"&\"), i = 0, length = pairs.length;\n i < length;\n i++\n ) {\n var value = pairs[i];\n var index = value.indexOf(\"=\");\n if (-1 < index) {\n appendTo(\n dict,\n decode(value.slice(0, index)),\n decode(value.slice(index + 1))\n );\n } else if (value.length) {\n appendTo(dict, decode(value), \"\");\n }\n }\n break;\n case isArray(query):\n for (var i = 0, length = query.length; i < length; i++) {\n var value = query[i];\n appendTo(dict, value[0], value[1]);\n }\n break;\n case \"forEach\" in query:\n query.forEach(addEach, dict);\n break;\n default:\n for (var key in query) appendTo(dict, key, query[key]);\n }\n }\n\n function addEach(value, key) {\n appendTo(this, key, value);\n }\n\n function appendTo(dict, key, value) {\n var res = isArray(value) ? value.join(\",\") : value;\n if (key in dict) dict[key].push(res);\n else dict[key] = [res];\n }\n\n function decode(str) {\n return decodeURIComponent(\n str.replace(findPercentSign, \"%25\").replace(plus, \" \")\n );\n }\n\n function encode(str) {\n return encodeURIComponent(str).replace(find, replacer);\n }\n\n function replacer(match) {\n return replace[match];\n }\n })(Object, String, Array.isArray);\n}\n\n(function (URLSearchParamsProto) {\n var iterable = false;\n try {\n iterable = !!Symbol.iterator;\n } catch (o_O) {}\n\n /* istanbul ignore else */\n if (!(\"forEach\" in URLSearchParamsProto)) {\n URLSearchParamsProto.forEach = function forEach(callback, thisArg) {\n var self = this;\n var names = Object.create(null);\n this.toString()\n .replace(/=[\\s\\S]*?(?:&|$)/g, \"=\")\n .split(\"=\")\n .forEach(function (name) {\n if (!name.length || name in names) return;\n (names[name] = self.getAll(name)).forEach(function (value) {\n callback.call(thisArg, value, name, self);\n });\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"keys\" in URLSearchParamsProto)) {\n URLSearchParamsProto.keys = function keys() {\n return iterator(this, function (value, key) {\n this.push(key);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"values\" in URLSearchParamsProto)) {\n URLSearchParamsProto.values = function values() {\n return iterator(this, function (value, key) {\n this.push(value);\n });\n };\n }\n\n /* istanbul ignore else */\n if (!(\"entries\" in URLSearchParamsProto)) {\n URLSearchParamsProto.entries = function entries() {\n return iterator(this, function (value, key) {\n this.push([key, value]);\n });\n };\n }\n\n /* istanbul ignore else */\n if (iterable && !(Symbol.iterator in URLSearchParamsProto)) {\n URLSearchParamsProto[Symbol.iterator] = URLSearchParamsProto.entries;\n }\n\n /* istanbul ignore else */\n if (!(\"sort\" in URLSearchParamsProto)) {\n URLSearchParamsProto.sort = function sort() {\n var entries = this.entries(),\n entry = entries.next(),\n done = entry.done,\n keys = [],\n values = Object.create(null),\n i,\n key,\n value;\n while (!done) {\n value = entry.value;\n key = value[0];\n keys.push(key);\n if (!(key in values)) {\n values[key] = [];\n }\n values[key].push(value[1]);\n entry = entries.next();\n done = entry.done;\n }\n // not the champion in efficiency\n // but these two bits just do the job\n keys.sort();\n for (i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n this.append(key, values[key].shift());\n }\n };\n }\n\n function iterator(self, callback) {\n var items = [];\n self.forEach(callback, items);\n return iterable\n ? items[Symbol.iterator]()\n : {\n next: function () {\n var value = items.shift();\n return { done: value === undefined, value: value };\n }\n };\n }\n\n /* istanbul ignore next */\n (function (Object) {\n var dP = Object.defineProperty,\n gOPD = Object.getOwnPropertyDescriptor,\n createSearchParamsPollute = function (search) {\n function append(name, value) {\n URLSearchParamsProto.append.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function del(name) {\n URLSearchParamsProto.delete.call(this, name);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n function set(name, value) {\n URLSearchParamsProto.set.call(this, name, value);\n name = this.toString();\n search.set.call(this._usp, name ? \"?\" + name : \"\");\n }\n return function (sp, value) {\n sp.append = append;\n sp.delete = del;\n sp.set = set;\n return dP(sp, \"_usp\", {\n configurable: true,\n writable: true,\n value: value\n });\n };\n },\n createSearchParamsCreate = function (polluteSearchParams) {\n return function (obj, sp) {\n dP(obj, \"_searchParams\", {\n configurable: true,\n writable: true,\n value: polluteSearchParams(sp, obj)\n });\n return sp;\n };\n },\n updateSearchParams = function (sp) {\n var append = sp.append;\n sp.append = URLSearchParamsProto.append;\n URLSearchParams.call(sp, sp._usp.search.slice(1));\n sp.append = append;\n },\n verifySearchParams = function (obj, Class) {\n if (!(obj instanceof Class))\n throw new TypeError(\n \"'searchParams' accessed on an object that \" +\n \"does not implement interface \" +\n Class.name\n );\n },\n upgradeClass = function (Class) {\n var ClassProto = Class.prototype,\n searchParams = gOPD(ClassProto, \"searchParams\"),\n href = gOPD(ClassProto, \"href\"),\n search = gOPD(ClassProto, \"search\"),\n createSearchParams;\n if (!searchParams && search && search.set) {\n createSearchParams = createSearchParamsCreate(\n createSearchParamsPollute(search)\n );\n Object.defineProperties(ClassProto, {\n href: {\n get: function () {\n return href.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n href.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n search: {\n get: function () {\n return search.get.call(this);\n },\n set: function (value) {\n var sp = this._searchParams;\n search.set.call(this, value);\n if (sp) updateSearchParams(sp);\n }\n },\n searchParams: {\n get: function () {\n verifySearchParams(this, Class);\n return (\n this._searchParams ||\n createSearchParams(\n this,\n new URLSearchParams(this.search.slice(1))\n )\n );\n },\n set: function (sp) {\n verifySearchParams(this, Class);\n createSearchParams(this, sp);\n }\n }\n });\n }\n };\n try {\n upgradeClass(HTMLAnchorElement);\n if (/^function|object$/.test(typeof URL) && URL.prototype)\n upgradeClass(URL);\n } catch (meh) {}\n })(Object);\n})(self.URLSearchParams.prototype, Object);\nexport default self.URLSearchParams;\n","/******* positionalFormat() BEGIN ******/\n\n/* https://github.com/pft/javascript/blob/master/positionalformat.js\n *\n * Copyright (C) 2006-2013 Niels Giesen.\n *\n * Contact: \n *\n * Author: Niels Giesen\n * Keywords: JavaScript, formatting, String\n *\n * This file is dual-licensed under either the BSD license or the\n * GNU Affero General Public License.\n *\n * positionalFormat enables you to replace numbers enclosed in curly braces (C# format\n * apparently) with positional arguments (that can be reused), like\n * this:\n *\n * positionalFormat('argument { 1 } (or is it { 2 }, or { 0 }?) comes { 1 }',3,'first',1)\n *\n * evals to:\n *\n * \"argument first (or is it 1, or 3?) comes first\"\n */\n\nexport function positionalFormat(str) {\n var args = arguments;\n return str.replace(/{\\s*(\\d+)\\s*}/g, function (match, num) {\n return args[parseInt(num) + 1] !== undefined\n ? args[parseInt(num) + 1]\n : match;\n });\n}\n\n/******* positionalFormat() END ******/\n\nexport function format(str, ob = {}) {\n return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, sub) {\n return ob[sub] !== undefined ? ob[sub] : sub;\n });\n}\n\n// export function formatPlus(str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduce((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n\nexport const formatPlus = format;\n\n// (str, ob = {}) {\n// return str.replace(/{\\s*([^{]+?)\\s*}/g, function (match, subwithstuff) {\n// const subs = subwithstuff.split(/\\|/);\n// console.log(subs);\n// return subs.reduceRight((acc, cur) => {\n// if (ob[cur] === undefined) return acc;\n// return ob[cur];\n// }, subs[0]);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // const [sub, directives] = subwithstuff.split(/\\|/);\n// // if (ob[sub] === undefined) return sub;\n// // if (!directives) return ob[sub] !== undefined ? ob[sub] : sub;\n// // if (\n// // directives.startsWith(\"+\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// // if (\n// // directives.startsWith(\"-\") &&\n// // !Number.isNaN(ob[sub]) &&\n// // !Number.isNaN(Number(directives.slice(1)))\n// // )\n// // return Number(ob[sub]) + Number(directives.slice(1));\n// return ob[sub];\n// });\n// }\n","import { positionalFormat } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst CODES = {\n cException: 1,\n cHTMLFormLoadCaseNotFound: 2,\n cHTMLMenuFileNotFound: 3,\n cWebModelIDDifferent: 4,\n cWebPleaseLogin: 5,\n cGetFileNotAllowed: 6,\n cGetDocumentNotFound: 7,\n cUMWrongUserNamePassword: 8,\n cWebSessionTimeOut: 9,\n cWebNoModelID: 10,\n cWebIllegalAccess: 11,\n cWebModelNotFound: 12,\n cWebCaseIsRunning: 13,\n cEngineLoadCaseFailed: 14, // Was: 3\n cEngineUpgrading: 15,\n cEngineNoInterfacesToShow: 16,\n cEngineLoadCaseFailedNotFound: 17,\n cEngineLoadCaseFailedWrongType: 18,\n cEngineLoadCaseFailedWrongData: 19,\n cWebOpenIsCalledWithUniqueID: 20,\n cTechGraphVizNotInstalled: 21,\n cGraphVizSessionNotFound: 22,\n cUMUserNotFound: 23,\n cUMModelNotFound: 24,\n cUMCaseNotFound: 25,\n cWebAdminNotAllowed: 26,\n cEngineGotoNodeFailed: 27,\n cPreviewNoCaseFound: 28,\n cTechUploadedFileToLarge: 29,\n cWebSaveCaseNotAllowed: 30,\n cWebSaveCaseFailed: 31,\n cInvalidUpload: 53\n};\n\nconst CODESREV = Object.fromEntries(\n Object.entries(CODES).map(([key, value]) => [value, key])\n);\n\n// Translate error - put translation in message property, return\n// error.\nfunction translate(_error) {\n const error = Object.assign({}, _error);\n // New API\n switch (error.code) {\n case CODES.cException:\n error.message = _(\n \"Something went wrong; see the server log for more information.\"\n );\n break;\n case CODES.cWebSessionTimeOut:\n error.message = _(\"Session has timed out. Please log in again.\");\n break;\n case CODES.cEngineLoadCaseFailed:\n switch (error.subcode) {\n case 1004:\n error.message = positionalFormat(\n _('You have no tickets left for model \"{0}\"'),\n error.summary\n .substring(56, error.summary.length - 1)\n .replace(/_/g, \" \")\n );\n break;\n default:\n error.message = error.summary; // Won't translate for now, may be st. like \"Loading case failed (xxx.mdl)\"\n }\n break;\n case CODES.cEngineLoadCaseFailedWrongData:\n error.message = _(\"Error loading session (wrong data)\");\n break;\n default:\n switch (error.subcode) {\n case 1002:\n error.message = _(\n \"We are currently updating. Please try again later.\"\n );\n break;\n case 1009:\n case 1025:\n error.message = positionalFormat(\n _('Infinite loop detected in {0}\"'),\n // Might be embedded though (in 1 or in 14...)\n error.summary.slice(18, error.summary.indexOf(\", infinite\"))\n );\n break;\n case 1010:\n error.message = _(\n \"Interface has failed (probably a failing SOAP or database connection)\"\n );\n break;\n default:\n error.message = _(CODESREV[error.code], _(error.summary));\n }\n }\n return error;\n}\n\nexport { CODES, translate };\n","let _token;\n\nexport const setToken = token => {\n _token = token;\n};\n\nexport async function digestMessage(message) {\n if (!(\"crypto\" in window)) return null;\n const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", msgUint8); // hash the message\n const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array\n const hashHex = hashArray.map(b => b.toString(16).padStart(2, \"0\")).join(\"\"); // convert bytes to hex string\n return hashHex;\n}\n\nexport const tokenChannel =\n \"BroadcastChannel\" in window ? new BroadcastChannel(\"token\") : \"\";\n\nexport const token = {\n addEventListener: (...args) =>\n tokenChannel && tokenChannel.addEventListener(...args),\n removeEventListener: (...args) =>\n tokenChannel && tokenChannel.removeEventListener(...args),\n getHash: () => digestMessage(_token),\n setToken,\n postMessage: message =>\n token.getHash().then(\n tokenHash =>\n // digestMessage will return null on missing crypto on older\n // browsers\n tokenHash &&\n tokenChannel &&\n tokenChannel.postMessage({ tokenHash, ...message })\n )\n};\n","// https://gist.github.com/jameslaneconkling/24acb8ea326a1c8fdf64225aa7d0f44e\nconst rules = [\n { type: \"space\", regex: /^\\s/ },\n { type: \"lParen\", regex: /^\\(/ },\n { type: \"rParen\", regex: /^\\)/ },\n { type: \"number\", regex: /^[0-9.]+/ },\n { type: \"string\", regex: /^\".*?\"/ },\n { type: \"variable\", regex: /^[^\\s()]+/ } // take from the beginning 1+ characters until you hit a ' ', '(', or ')' // TODO - support escaped double quote\n];\n\nconst tokenizer = rules => input => {\n for (let i = 0; i < rules.length; i += 1) {\n let tokenized = rules[i].regex.exec(input);\n if (tokenized) {\n return {\n token: tokenized[0],\n type: rules[i].type,\n rest: input.slice(tokenized[0].length)\n };\n }\n }\n\n throw new Error(`no matching tokenize rule for ${JSON.stringify(input)}`);\n};\n\nconst parser = tokenize =>\n function parse(input, ast, parents = []) {\n if (input === \"\") {\n return ast;\n }\n\n const { token, type, rest } = tokenize(input);\n\n if (type === \"space\") {\n // do nothing\n return parse(rest, ast, parents);\n } else if (type === \"variable\") {\n ast.push(token);\n return parse(rest, ast, parents);\n } else if (type === \"number\") {\n ast.push(Number(token));\n return parse(rest, ast, parents);\n } else if (type === \"string\") {\n ast.push(token.replace(/(^\"|\"$)/g, \"'\"));\n return parse(rest, ast, parents);\n } else if (type === \"lParen\") {\n parents.push(ast);\n return parse(rest, [], parents);\n } else if (type === \"rParen\") {\n const parentAst = parents.pop();\n if (parentAst) {\n parentAst.push(ast);\n return parse(rest, parentAst, parents);\n }\n\n return parse(rest, ast, parents);\n }\n\n throw new Error(`Missing parse logic for rule ${JSON.stringify(type)}`);\n };\n\nexport default parser(tokenizer(rules));\n","const Identity = x => ({ x, map: fn => Identity(fn(x)) });\n\nconst Const = x => ({ x, map: fn => Const(x) });\n\nconst lens = (getter, setter) => functor => target =>\n functor(getter(target)).map(focus => setter(focus, target));\n\nconst over = (lens, fn, obj) => lens(x => Identity(fn(x)))(obj).x;\n\nconst set = (lens, val, obj) => over(lens, () => val, obj);\n\nconst view = (lens, obj) => lens(Const)(obj).x;\n\nexport { lens, over, set, view };\n","/** Map fn on array, then join it with joiner */\nimport * as Lenses from \"./lenses.js\";\n\nexport const applyTo = arg => fn => fn(arg);\n\nconst _apply = (fn, args) => fn(...args);\n\nexport const dec = arg => arg - 1;\n\nexport const inc = arg => arg + 1;\n\nexport function mapConcat(arr, fn, joiner) {\n return arr.map(fn).join(joiner);\n}\n\nexport const identity = x => x;\n\nexport const isNil = x => x == null;\n\nexport const not = a => !a;\n\n/**\n Differs from Ramda in that the first function in the pipe chain is\n called with a single argument.\n */\nexport const pipe =\n (...fns) =>\n value =>\n fns.reduce((acc, cur) => cur(acc), value);\n\n/**\n Differs from Ramda in that the first function in the compose chain is\n called with a single argument.\n */\nexport const compose =\n (...fns) =>\n value =>\n fns.reduceRight((acc, cur) => cur(acc), value);\n\n/**\n Same as Ramda compose() in that the first function in the compose\n chain may be called with more than one argument.\n */\nexport const composeX =\n (...fns) =>\n (...value) =>\n fns.reduceRight((acc, cur) => [cur.apply(null, acc)], value);\n\nexport const curry = (fn, ...args) => {\n if (args.length >= fn.length) return fn(...args);\n return (...args2) => curry(fn, ...[...args, ...args2]);\n};\n\nexport const join = curry((sep, arr) => arr.join(sep));\n\nexport const split = curry((sep, arr) => arr.split(sep));\n\nexport const reverse = arr => [...arr].reverse();\n\nexport const type = compose(\n s => s.slice(8, -1),\n ob => Object.prototype.toString.call(ob)\n);\n\nexport const always = value => () => value;\n\nexport const F = always(false);\n\nexport const T = always(true);\n\nexport const propOr = curry((or, prop, obj) => {\n try {\n return ifElse(isNil, () => or, identity)(obj[prop]);\n } catch (_) {\n return or;\n }\n});\n\nexport const prop = propOr(undefined);\nexport const pathOr = curry((or, pathArg, obj) =>\n reduce((acc, cur) => propOr(or, cur, acc), obj, pathArg)\n);\n\nexport const path = pathOr(undefined);\n\nexport const tail = arr => Array.prototype.slice.call(arr, 1);\n\nconst _nth = (i, arr) => arr[i];\n\nexport const head = arr => arr[0];\n\nexport const last = arr => arr[arr.length - 1];\n\nexport const cond = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return ifElse(cur[0], cur[1], cond(tail(rules)))(ob);\n});\n\nexport const choose = curry((rules, ob) => {\n const cur = rules[0];\n if (!cur) return undefined;\n return cur[0](ob) ? cur[1] : choose(tail(rules))(ob);\n});\n\nexport const length = prop(\"length\");\n\nexport const strictUniq = arr =>\n reduce((acc, cur) => (acc.indexOf(cur) > -1 ? acc : [...acc, cur]), [])(arr);\n\nexport const any = curry((fn, arr) => {\n return arr.length === 0\n ? false\n : compose(fn, head)(arr)\n ? true\n : any(fn, tail(arr));\n});\n\nexport const find = curry((fn, arr) => {\n return arr.length === 0\n ? undefined\n : fn(head(arr))\n ? head(arr)\n : find(fn, tail(arr));\n});\n\nconst _findIndex = (fn, arr) => arr.findIndex(fn);\n/**\n * Returns a function applying all arguments to a *manually* curried function.\n *\n * Behaves a bit strange (see tests), so keeping it private-ish\n **/\nexport const _uncurry =\n fn =>\n (...args) =>\n args.reduce((acc, cur) => {\n return acc(cur);\n }, fn);\n\n/** Curriable functions **/\n\n/**\n * Takes a function and two values and returns true if the values map\n * to the same value; false otherwise.\n */\nconst _eqBy = (fn, a, b) => _equals(fn(a), fn(b));\n\nconst _all = (fn, arr) =>\n reduce((acc, cur) => (acc ? fn(cur) : acc), true, arr);\n\nconst _none = (fn, arr) =>\n reduce((acc, cur) => (fn(cur) ? false : acc), true, arr);\n\nconst _append = (arg, arr) => [...((arr instanceof Array && arr) || []), arg];\n\nconst _test = (regex, string) => regex.test(string);\n\nconst _match = (regex, string) => string.match(regex) || [];\n\n// https://raphacmartin.medium.com/deep-equality-in-javascript-objects-1eea8abb3649\n/**\n *\n * @param a Object\n * @param b Object\n * @returns {boolean}\n */\nfunction _equals(a, b) {\n if (!(a instanceof Object) || !(b instanceof Object)) return a === b;\n // if the number of keys is different, they are different\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n const a_value = a[key];\n const b_value = b[key];\n // If the value is an object, check if they're different objects\n // If it isn't, uses !== to check\n if (\n (a_value instanceof Object && !_equals(a_value, b_value)) ||\n (!(a_value instanceof Object) && a_value !== b_value)\n ) {\n return false;\n }\n }\n return true;\n}\n\nconst _eqProps = (prop, a, b) => _equals(a[prop], b[prop]);\n\nconst _hasPath = (p, ob) => {\n if (p.length === 0) return true;\n return has(p[0], ob) && _hasPath(tail(p), prop(p[0], ob));\n};\n\n/** Associate prop with val in obj */\nfunction _assoc(prop, val, obj) {\n var result = {};\n for (var p in obj) {\n result[p] = obj[p];\n }\n result[prop] = val;\n return result;\n}\n\nconst _assocPath = (path, val, obj) => {\n if (path.length === 0) {\n return val;\n }\n var idx = path[0];\n if (path.length > 1) {\n var nextObj =\n !isNil(obj) && Object.prototype.hasOwnProperty.call(obj, idx)\n ? obj[idx]\n : Number.isInteger(path[1])\n ? []\n : {};\n val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);\n }\n if (Number.isInteger(idx) && Array.isArray(obj)) {\n var arr = [].concat(obj);\n arr[idx] = val;\n return arr;\n } else {\n return assoc(idx, val, obj);\n }\n};\n\n/**\n * Apply fun to all but first argN args */\nconst _consume =\n (fn, argN) =>\n (...args) => {\n return fn(...args.slice(argN));\n };\n\nconst _propEq = (key, value, ob) => _equals(prop(key, ob), value);\n\nconst _propSatisfies = (fn, key, ob) => fn(prop(key, ob));\n\nconst _pathEq = (key, value, ob) => _equals(path(key, ob), value);\n\nconst _has = (prop, ob) =>\n complement(isNil)(ob) && Object.prototype.hasOwnProperty.call(ob, prop);\n\nconst _tryCatch = (tryer, catcher) => arg => {\n try {\n return tryer(arg);\n } catch (e) {\n return catcher(e, arg);\n }\n};\n\n/**\n Call arr.map(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _map = (fn, arr) => arr.map(fn);\n\n/**\n Call arr.filter(fn)\n\n Note: differs from Ramda, in that the callback will receive both the item, the index and the list.\n\n If you want the callback function `fn` to read only the first parameter, wrap `fn` in `unary(fn)`.\n */\nconst _filter = (fn, arr) => arr.filter(fn);\n\nconst _when = (predicate, whenTrueFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : arg;\n\nconst _ifElse = (predicate, whenTrueFn, whenFalseFn, arg) =>\n predicate(arg) ? whenTrueFn(arg) : whenFalseFn(arg);\n\nconst _either = (fn1, fn2, arg) => fn1(arg) || fn2(arg);\n\nconst _allPass = (fns, arg) =>\n fns.reduce((mem, cur) => (!mem ? false : cur(arg)), true);\n\nconst _anyPass = (fns, arg) =>\n fns.reduce((mem, cur) => (mem ? true : cur(arg)), false);\n\nconst _both = (fn1, fn2, arg) => _allPass([fn1, fn2], arg);\n\nconst _complement = (fn, arg) => !fn(arg);\n\nconst _includes = (item, c) => c.includes(item);\n\nconst _lte = (first, second) => first <= second;\n\nconst _lt = (first, second) => first < second;\n\nconst _gte = (first, second) => first >= second;\n\nconst _gt = (first, second) => first > second;\n\n/**\n Call arr.reduce(fn, into);\n\n Note: differs from Ramda, in that the callback will receive the\n accumular, the item, the index and the list.\n\n If you want the callback function `fn` to read only the first two\n parameters, as with Ramda, wrap `fn` in `binary(fn)`.\n */\nconst _reduce = (fn, into, arr) => arr.reduce(fn, into);\n\nconst _tap = (fn, value) => (fn(value), value);\n\nconst _groupWith = (fn, arr) =>\n reduce(\n (acc, cur, index, arr) =>\n index === 0 || !fn(cur, arr[index - 1])\n ? [...acc, [cur]]\n : [...acc.slice(0, acc.length - 1), [...acc[acc.length - 1], cur]],\n []\n )(arr);\n\nconst _groupBy = (fn, arr) =>\n reduce((acc, cur) => over(lensProp(fn(cur)), append(cur), acc), {})(arr);\n\nconst _nthArg = (n, arg1, ...args) => [arg1, ...args][n];\n\n/** Dissociate props from obj */\nconst _omit = (props, obj) => {\n var result = {};\n for (var p in obj) {\n if (!props.includes(p)) result[p] = obj[p];\n }\n return result;\n};\n\nconst _pickBy = (pred, obj) => {\n var result = {};\n for (var k in obj) {\n if (pred(obj[k], k)) result[k] = obj[k];\n }\n return result;\n};\n\nconst _pick = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n if (prop in obj) result[prop] = obj[prop];\n });\n return result;\n};\n\nconst _pickAll = (props, obj) => {\n var result = {};\n props.forEach(prop => {\n result[prop] = obj[prop];\n });\n return result;\n};\n\nfunction _dissoc(prop, obj) {\n return _omit([prop], obj);\n}\n\nconst _infichain = (fns, arg) =>\n fns.reduce(\n (acc, cur, index) => (index === 0 ? cur(arg) : cur(acc, arg)),\n null\n );\n\nconst _mergeRight = (ob1, ob2) => Object.assign({}, ob1, ob2);\n\nconst _mergeLeft = (ob1, ob2) => Object.assign({}, ob2, ob1);\n\nconst _strictWithout = (items, list) =>\n list.reduce((acc, cur) => (items.includes(cur) ? acc : [...acc, cur]), []);\n\nconst _unary = fn => arg => fn(arg);\n\nconst _binary = fn => (arg1, arg2) => fn(arg1, arg2);\n\nconst _strictDifference = (list1, list2) => {\n const out = new Set();\n const s1 = new Set(list1);\n const s2 = new Set(list2);\n for (let item of s1) {\n if (!s2.has(item)) out.add(item);\n }\n return [...out];\n};\n\nconst _mapWithRest = (fn, arr, rest1, ...rest) =>\n arr.map((cur, i, list) => fn(cur, i, list, rest1, ...rest));\n\nconst _andThen = (fn, promise) => Promise.resolve(promise).then(fn);\nconst _otherwise = (fn, promise) => promise.then(null, fn);\n\n/**\n * @param {Funcion} f f(await g(val), val)\n * @param {Funtion} g g(val) => Promise\n * @return Promise\n */\nconst _fChain = (f, g, val) => g(val).then(x => f(x, val));\n\nconst _chain = (f, g, val) => f(g(val), val);\n\nconst _juxt = (arr, arg1, ...argN) => {\n return arr.map(fn => fn(arg1, ...argN));\n};\n\nconst _slice = (from, to, arr) => arr.slice(from, to);\n\nexport const toLower = s => s.toLowerCase();\nexport const toUpper = s => s.toUpperCase();\n\nexport const maybeNumber = string =>\n Number.isInteger(Number(string)) ? Number(string) : string;\n\nconst _applySpec =\n specs =>\n (...args) => {\n if (specs instanceof Function) {\n return specs(...args);\n }\n if (specs instanceof Array) {\n return specs.map(fn => _applySpec(fn)(...args));\n }\n const out = {};\n for (let [key, value] of Object.entries(specs)) {\n out[key] = _applySpec(value)(...args);\n }\n return out;\n };\n\nexport const applySpec = curry((specs, arg, ...args) =>\n _applySpec(specs)(arg, ...args)\n);\n\nexport const all = curry(_all),\n nthArg = curry(_nthArg),\n andThen = curry(_andThen),\n append = curry(_append),\n apply = curry(_apply),\n assoc = curry(_assoc),\n assocPath = curry(_assocPath),\n anyPass = curry(_anyPass),\n both = curry(_both),\n consume = curry(_consume),\n chain = curry(_chain),\n strictDifference = curry(_strictDifference),\n dissoc = curry(_dissoc),\n eqProps = curry(_eqProps),\n equals = curry(_equals),\n filter = curry(_filter),\n has = curry(_has),\n hasPath = curry(_hasPath),\n juxt = curry(_juxt),\n map = curry(_map),\n nth = curry(_nth),\n otherwise = curry(_otherwise),\n propEq = curry(_propEq),\n propSatisfies = curry(_propSatisfies),\n tryCatch = curry(_tryCatch),\n when = curry(_when),\n ifElse = curry(_ifElse),\n either = curry(_either),\n allPass = curry(_allPass),\n complement = curry(_complement),\n includes = curry(_includes),\n infichain = curry(_infichain),\n mapWithRest = curry(_mapWithRest),\n mergeLeft = curry(_mergeLeft),\n mergeRight = curry(_mergeRight),\n omit = curry(_omit),\n pathEq = curry(_pathEq),\n pick = curry(_pick),\n pickBy = curry(_pickBy),\n pickAll = curry(_pickAll),\n lt = curry(_lt),\n lte = curry(_lte),\n fChain = curry(_fChain),\n gt = curry(_gt),\n gte = curry(_gte),\n reduce = curry(_reduce),\n groupBy = curry(_groupBy),\n groupWith = curry(_groupWith),\n tap = curry(_tap),\n eqBy = curry(_eqBy),\n lens = curry(Lenses.lens),\n over = curry(Lenses.over),\n set = curry(Lenses.set),\n view = curry(Lenses.view),\n test = curry(_test),\n match = curry(_match),\n none = curry(_none),\n findIndex = curry(_findIndex),\n slice = curry(_slice),\n strictWithout = curry(_strictWithout),\n unary = curry(_unary),\n binary = curry(_binary),\n lensPath = p => Lenses.lens(path(p), assocPath(p)),\n lensProp = p => Lenses.lens(prop(p), assoc(p));\n\nexport const uncurried = {\n all: _all,\n apply: _apply,\n append: _append,\n assoc: _assoc,\n assocPath: _assocPath,\n both: _both,\n filter: _filter,\n propEq: _propEq,\n consume: _consume,\n tryCatch: _tryCatch,\n when: _when,\n ifElse: _ifElse,\n either: _either,\n allPass: _allPass,\n complement: _complement,\n includes: _includes,\n lt: _lt,\n lte: _lte,\n gt: _gt,\n gte: _gte,\n has: _has,\n hasPath: _hasPath,\n tap: _tap,\n groupBy: _groupBy,\n groupWith: _groupWith,\n nth: _nth,\n eqBy: _eqBy,\n eqProps: _eqProps,\n equals: _equals,\n omit: _omit,\n pathEq: _pathEq,\n pick: _pick,\n pickBy: _pickBy,\n pickAll: _pickAll,\n dissoc: _dissoc,\n test: _test,\n match: _match,\n mergeLeft: _mergeLeft,\n mergeRight: _mergeRight,\n strictWithout: _strictWithout,\n unary: _unary,\n binary: _binary,\n slice: _slice,\n findIndex: _findIndex,\n toLower,\n toUpper,\n ...Lenses\n};\n","import parse from \"./baby-lisp.js\";\nimport * as L from \"./functional.js\";\n\n/**\n * @typedef {Object} Bucket\n * @property {method} get Method to get key\n */\n\n/**\n * Test string against a bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {String} string Lispy string to test against the bucket\n */\nexport const stringSaysDo = (bucket, string) => {\n const ast = parse(`(${string})`);\n return astSaysDo(bucket)(ast);\n};\n\n/**\n * Test ast against bucket's contents\n * @function\n * @param {Bucket} bucket with a get(key) method returning a Boolean\n * or undefined.\n * @param {Object} AST Lispy AST (nested array of strings) to test against the bucket\n */\nconst astSaysDo = bucket => ast => {\n if (ast instanceof Array) {\n if (ast[0] === \"and\") {\n return L.compose(L.all(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"or\") {\n return L.compose(L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n if (ast[0] === \"not\") {\n return L.compose(L.not, L.any(astSaysDo(bucket)), L.tail)(ast);\n }\n return L.compose(L.any(astSaysDo(bucket)))(ast);\n } else {\n return bucket.get(ast);\n }\n};\n","export class BooleanBucket {\n constructor() {\n this.booleans = [];\n }\n /**\n * @param {String} key Key to get\n */\n get(key) {\n return this.booleans[key];\n }\n /**\n * @param {String} key Key to set\n */\n set(key) {\n return this.toggle(key, true);\n }\n /**\n * @param {String} key Key to unset\n */\n unset(key) {\n return this.toggle(key, false);\n }\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n */\n toggle(key, bool) {\n bool = typeof bool === \"boolean\" ? bool : !this.get(key);\n if (bool !== this.get(key)) {\n this.booleans[key] = bool;\n return [true, bool];\n } else {\n return [false, bool];\n }\n }\n}\n","/* global $ */\nimport { stringSaysDo } from \"./baby-lisp-apply.js\";\nimport { BooleanBucket } from \"./booleanbucket.js\";\n\nclass BucketWithConsequences extends BooleanBucket {\n /**\n * @param {String} key Key to toggle\n * @param {Boolean} [bool] New value\n * @param {Boolean} [reflect] Reflect the key as a class in the \n\n * Will hide or show any element which has somewhere inside data-when or data-hide-when attribute.\n * Whether or not to show or hide is based on the parsing of those attributes.\n *\n * See baby-lisp.test.js for examples.\n */\n toggle(mode, bool, reflect = true) {\n if (mode.includes('\"')) {\n console.warn(\n \"Mode contains a double quote, that is not allowed - used in querySelectorAll\"\n );\n return this;\n }\n const [changedOrAdded, bool2] = super.toggle(mode, bool);\n // Refrain from unnecessary redraw (by checking previous value):\n if (changedOrAdded) {\n $(document).trigger(\"bb:mode:\" + mode, bool2);\n if (reflect) $(\"body\").toggleClass(mode, bool2);\n {\n [\n ...document.querySelectorAll(\n '[data-when*=\"' + mode + '\"], [data-hide-when*=\"' + mode + '\"]'\n )\n ].forEach(elt => {\n let hidden = false;\n const hideWhen = elt.dataset[\"hideWhen\"];\n if (hideWhen) {\n hidden = stringSaysDo(this, hideWhen);\n }\n // hideWhen is absent or yields false, so still shown, and\n // when becomes the judge:\n if (!hidden) {\n const when = elt.dataset[\"when\"];\n // If there is no when, still show.\n if (when) {\n hidden = !stringSaysDo(this, when);\n }\n }\n elt.hidden = hidden;\n });\n }\n }\n return this;\n }\n}\n\nconst Mode = new BucketWithConsequences();\n\nexport { Mode };\n","/* global URLSearchParams FormData */\n\nimport { mapConcat, either, when } from \"./functional.js\";\n\nconst ATTR_SNAME = \"data-server-name\";\nconst ATTR_SVALUE = \"data-server-value\";\nconst CONTAINER_SELECTOR = \"#bb-q .group.selected\";\n\nconst INPUT_SELECTOR = mapConcat(\n [\"input\", \"textarea\", \"select\"],\n function (c) {\n return c + \"[name]:not([disabled])\";\n },\n \", \"\n);\n\nconst inputsOf = container => container.querySelectorAll(INPUT_SELECTOR);\n\nconst isEmptyRadioValue = val => val === null;\nconst isEmptyCheckboxValue = val => val === false;\nconst isCheckedCheckboxValue = val => val === true;\n\nfunction collectWithin({\n params = null, // Object with an .append method, taking two params\n flavor = URLSearchParams, // Constructor for an object with an .append method, taking two params, used when params is not provided\n container = document.querySelector(CONTAINER_SELECTOR),\n omitFn = isEmptyCheckboxValue,\n changeFn = when(isCheckedCheckboxValue, () => \"on\"),\n collector = inputsOf\n} = {}) {\n return _collectAll(\n collector(container),\n params || new flavor(),\n omitFn,\n changeFn\n );\n}\n\nfunction _collectAll(nodeList, params, omitFn, changeFn) {\n for (const node of nodeList) {\n const val = valueOf(node),\n name = node.getAttribute(ATTR_SNAME) || node.getAttribute(\"name\");\n if (!either(isEmptyRadioValue, omitFn, val)) {\n params.append(name, changeFn(val));\n }\n }\n return params;\n}\n\nfunction valueOf(node) {\n if (node.hasAttribute(ATTR_SVALUE)) return node.getAttribute(ATTR_SVALUE);\n switch (node.type) {\n case \"radio\":\n return node.checked ? node.value : null; // Do not collect unchecked radios -- stripped in collectAll.\n case \"checkbox\":\n /* Collect unchecked checkboxes as false -- goes against usual form submission,\n but we need this for Studio API (using JSON). Stripped out by collectAll() unless provided with a omitFn. */\n if (!node.checked) return false;\n return node.hasAttribute(\"value\") // NOT the property -- this would still be \"on\".\n ? node.value // A checkbox should send either its value or\n : true; // Return Boolean true instead of \"on\", to be changed by collectAll() with changeFn,\n // or leave it at true (for JSON communication for instance) */\n default:\n return String(node.value).replace(/\\r?\\n/g, \"\\r\\n\");\n }\n}\n\nconst serializeQuestions = () =>\n collectWithin({}).toString().replace(/\\r?\\n/g, \"%0D%0A\");\n\nexport { valueOf, serializeQuestions, collectWithin };\n","/* global $ FormData URLSearchParams */\nlet _vars = {};\n\nconst SESSION_KEYS = [\"dbname\", \"sessionid\", \"uniqueid\"];\nconst NAV_KEYS = [\"screenid\", ...SESSION_KEYS];\n\nObject.freeze(SESSION_KEYS);\nObject.freeze(NAV_KEYS);\n\nfunction setValueInVars(data, key) {\n if (typeof data[key] != \"undefined\") _vars[key] = data[key];\n}\n\nexport function setVars(data) {\n setValueInVars(data, \"version\");\n setValueInVars(data, \"uniqueid\");\n setValueInVars(data, \"replyserveraddress\");\n setValueInVars(data, \"replyserverport\");\n setValueInVars(data, \"proxyredirect\");\n setValueInVars(data, \"sessionid\");\n setValueInVars(data, \"modelname\");\n setValueInVars(data, \"dbname\");\n setValueInVars(data, \"modelid\");\n setValueInVars(data, \"showdeleteinmenu\");\n setValueInVars(data, \"showdatecreated\");\n setValueInVars(data, \"showreport\");\n setValueInVars(data, \"userinfo\");\n setValueInVars(data, \"showcopycase\");\n setValueInVars(data, \"screenid\");\n var version = getVar(\"version\");\n if (typeof version === \"string\") _vars[\"version\"] = version.split(\".\");\n}\n\nexport function getVar(string, obj) {\n return $.extend({}, _vars, obj)[string];\n}\n\n/**\n * Unset either all vars, or only those present in param vars\n *\n * @param {Array} vars An array of variable keys to delete\n *\n **/\nfunction unsetVars(arr) {\n if (!arr) return (_vars = {});\n arr.forEach(function (key) {\n delete _vars[key];\n });\n return _vars;\n}\n\nfunction collect(keys, collector = new FormData(), obj) {\n function append(key) {\n const val = getVar(key, obj);\n if (val !== undefined) collector.append(key, getVar(key, obj));\n }\n if (Array.isArray(keys)) {\n keys.forEach(append);\n } else {\n append(keys);\n }\n return collector;\n}\n\nfunction querify(keys, obj) {\n const usp = collect(keys, new URLSearchParams(), obj);\n return usp.toString();\n}\n\nexport default {\n querify,\n setVars,\n getVar,\n unsetVars,\n collect,\n NAV_KEYS,\n SESSION_KEYS\n};\n","/* global URLSearchParams */\nimport \"./polyfills/url-search-params.js\";\nimport { Mode } from \"./mode.js\";\nimport { serializeQuestions } from \"./collect-values.js\";\nimport Vars from \"./vars.js\";\n\nexport const shouldExit = () =>\n Mode.get(\"hasModel\") && Boolean(Vars.getVar(\"sessionid\"));\n\nexport const onEnd = () => {\n if (!shouldExit()) return;\n if (!navigator.sendBeacon) return;\n const data = [\n \"step=exitdelayed\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\");\n\n const usp = new URLSearchParams(data);\n\n navigator.sendBeacon(\"/action\", usp);\n};\n\nfunction addEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.addEventListener(\"pagehide\", onEnd);\n } else {\n window.addEventListener(\"unload\", onEnd, false);\n }\n}\n\nexport function removeEndListener() {\n // Update state before navigating away, but do not logout\n if (\"onpagehide\" in window) {\n window.removeEventListener(\"pagehide\", onEnd);\n } else {\n window.removeEventListener(\"unload\", onEnd, false);\n }\n}\n\naddEndListener();\n","/* a11y-user-detect:\n *\n * \"User Detect\" will dynamically toggle between\n * a-keyboard-user & a-mouse-user (described in a11y.less)\n * depending on user interaction on document.\n *\n * The idea is to give keyboard users more visual queues,\n * without effecting the aesthetics for non-keyboard users.\n *\n * Author: Tim Bauwens\n * Copyright 2017 Berkeley Bridge\n *\n */\n\nimport { Mode } from \"$json/lib/mode\";\n\nexport const isKeyboardUser = () => Mode.get(\"a-keyboard-user\");\n\nexport const isMouseUser = () => Mode.get(\"a-mouse-user\");\n\nexport const setKeyboardUser = () => {\n Mode.set(\"a-keyboard-user\");\n Mode.unset(\"a-mouse-user\");\n};\n\nexport const setMouseUser = () => {\n Mode.unset(\"a-keyboard-user\");\n Mode.set(\"a-mouse-user\");\n};\n\n$(function () {\n let openingMatch, mouse;\n try {\n // Could have no opener, or opener could be X-Origin\n if (window.opener.document.body) {\n openingMatch = window.opener.document.body.className.match(\n /\\ba-(keyboard|mouse)-user\\b/\n );\n if (openingMatch) mouse = openingMatch[1] === \"mouse\";\n }\n } catch (e) {\n mouse = false;\n }\n if (mouse) {\n setMouseUser();\n } else {\n setKeyboardUser();\n }\n $(document.body).on(\"mousedown touchstart\", function () {\n setMouseUser();\n });\n $(document.body).on(\"keydown\", function (e) {\n if (\n e.key === \"Tab\" ||\n e.target.matches(`input[type=\"radio\"], input[type=\"checkbox\"]`)\n ) {\n setKeyboardUser();\n }\n });\n});\n","/* global $ */\nimport \"./a11y-user-detect.js\";\nimport { _ } from \"./gettext.js\";\n\n/*** A11y BEGIN ***/\nexport const A11y = {\n log: function (message) {\n var logdiv = document.getElementById(\"a-logdiv\");\n if (logdiv) logdiv.innerHTML = \"
\" + message + \"
\";\n }\n};\n\n/**\n * Datepicker a11y enhancements\n */\nexport const observeDatepickers = (function () {\n var init = false;\n return function initDateObservance() {\n var picker, observer;\n\n if (init || !(\"MutationObserver\" in window)) {\n init = true;\n return;\n }\n\n $(document).on(\"blur\", '[data-type=\"datetimepicker\"]', function () {\n A11y.log(\"\");\n });\n\n function observation(records, instance) {\n try {\n var infocus =\n document.activeElement.className.split(\" \").indexOf(\"hasDatepicker\") >\n -1;\n } catch (e) {\n // there mayn't be an activeElement, in which case className is undefined.\n }\n if (infocus) {\n var message = [\n $(\".ui-state-hover\").text(),\n $(\".ui-datepicker-month [selected]\").text(),\n $(\".ui-datepicker-year [selected]\").text()\n ].join(\" \");\n A11y.log(message + \", \" + _(\"press enter to accept\"));\n }\n }\n\n picker = document.getElementById(\"ui-datepicker-div\");\n\n if (picker) {\n observer = new window.MutationObserver(observation);\n observer.observe(picker, { attributes: true });\n init = true;\n }\n };\n})();\n","let escapeHTML = (function () {\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\"\n };\n var re = new RegExp(\"[&<>\\\"'/]\", \"g\");\n return function escapeHTML(string) {\n return String(string).replace(re, function (s) {\n return entityMap[s];\n });\n };\n})();\n\nconst escaped = (strings, ...values) =>\n strings.reduce(\n (acc, cur, idx) =>\n acc + cur + (values.length > idx ? escapeHTML(values[idx]) : \"\"),\n \"\"\n );\n\nexport { escapeHTML, escaped };\n","import { Mode } from \"./mode.js\";\n\n/*** NOTIFICATIONS BEGIN ***/\nlet message;\n// Notification can either be a String or an object with a message\n// property. When supplying an object, the message property will be\n// shown to the user, but the entire object will be given to\n// console.error.\nfunction notify(options = { keepalive: false, html: false }, notification) {\n if (!notification) return;\n var text = notification.message || notification,\n timeout = 5000;\n if (\n typeof console !== \"undefined\" &&\n console &&\n typeof console.error === \"function\"\n )\n console.error(notification);\n message = { notification, options };\n Mode.set(\"hasMessage\");\n if (options.html) {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.innerHTML = text));\n } else {\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.textContent = text));\n }\n if (!options.keepalive)\n window.setTimeout(Mode.unset.bind(Mode, \"hasMessage\"), timeout);\n}\n\nexport { notify, message };\n/*** NOTIFICATIONS END ***/\n","/*** CONFIG BEGIN ***/\n\nimport conf from \"$conf.json\";\nimport { has } from \"./functional.js\";\n\nconf.a11y = Object.assign(\n {\n captions: false,\n optionfieldsets: false,\n strictlegends: false\n },\n conf.a11y\n);\n\nfunction propFinder(ob, prefix) {\n if (prefix) ob = find(prefix);\n\n function find(prop, fallback) {\n if (ob === undefined) return fallback;\n if (prop === undefined) return fallback;\n var leafs = prop.split(\".\").filter(Boolean),\n leaf = ob;\n while (has(leafs[0], leaf)) {\n leaf = leaf[leafs.shift()];\n }\n if (leafs.length === 0) return leaf;\n return fallback;\n }\n\n return find;\n}\n\nexport { conf, propFinder };\n\n/*** CONFIG END ***/\n","import { conf } from \"./conf\";\nexport const fromApiServer = s =>\n s.startsWith(\"http://\") || s.startsWith(\"https://\")\n ? s\n : [conf.apiserver, s].filter(Boolean).join(\"/\");\n","/* global jQuery */\nlet $ = jQuery;\n\nimport { escapeHTML } from \"./escape.js\";\nimport { notify } from \"./notify.js\";\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\n\n/**\n * Keep track of ajax requests + some convenience\n *\n * Exports busy and replace to bb.ajax object for plugins to use.\n */\nvar Ajax = {\n busy: false,\n last: null,\n direction: null,\n\n defaultOptions: {\n dataType: \"json\",\n type: \"POST\",\n url: \"action\",\n cache: false,\n async: true,\n success: checkJSON,\n error: onJSONError\n },\n\n post: function (options) {\n const _options = Object.assign({}, Ajax.defaultOptions, options, {\n url: fromApiServer(options.url || Ajax.defaultOptions.url)\n });\n $(document).trigger(\"bb:prePost\", _options);\n return $.ajax(_options);\n },\n\n replace: function (obj) {\n Ajax.last && Ajax.last.abort();\n Ajax.last = Ajax.post(obj);\n return Ajax.last;\n },\n\n release: function () {\n Ajax.busy = false;\n $(\".group.selected\").prop(\"disabled\", false);\n }\n};\n\n/**\n * Convenience method, like getJSON, but with POST\n *\n * @param {String} url URL where we POST to\n * @param {Object|String} data POST data\n *\n * Use Ajax.post instead if you want to overrule any default\n * settings from Ajax.defaultOptions.\n */\n$.postJSON = function (url, data) {\n return Ajax.post({ url: url, data: data });\n};\n\n/**\n * The default JSON error handler.\n *\n * Set appropriate flags, let user now what went wrong (as good as\n * possible).\n *\n * Trigger custom 'bb:jsonError' event on document.\n *\n * @param {Object} data XMLHTTPRequest object\n * @param {String} err Error message\n */\nfunction onJSONError(data, err) {\n Ajax.release();\n $(document).trigger(\"bb:jsonError\", data, err);\n if (data.responseText === undefined) {\n if (data.statusText === \"abort\");\n else {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n }\n } else if ($.trim(data.responseText) === \"\") {\n notify(\n { html: false, keepalive: true },\n _(\"Error: No response from server, server probably down\")\n );\n } else {\n notify(\n { html: true, keepalive: true },\n \"Error: \" +\n escapeHTML(err) +\n \"
Response was:
\" +\n \"
\" +\n        escapeHTML(data.responseText) +\n        \"
\"\n );\n }\n}\n\n/**\n * Indicate further processing ought to be skipped when this symbol is\n * set on JSON data.\n * @example\n import { stopDispatches } from \"$json/lib/ajax\";\n $(document).on(\"bb:preHandleData\", (event, data) => {\n event.stopImmediatePropagation(); // prevent further bb:preHandleData handlers.\n data[stopDispatches] = true;\n })\n * @constant\n * @type {Symbol}\n */\nexport const stopDispatches = Symbol(\"Skip all further dispatches\");\n\n/**\n Set this symbol to a promise on ajax data, and it shall be awaited\n before the next *handleData is run.\n*/\nconst awaiting = Symbol(\"awaiting promise\");\n\n/**\n * The default AJAX success handler. Perform actions on data.\n\n *\n * If data is not a JSON object, do nothing.\n *\n * @todo Either check data against JSON API, in some way or the\n * other, or make sure this function doesn't get called in the\n * first place when we're dealing with a non-core request; as\n * checkJSON is currently bound to ALL $.ajax requests,\n * this function may also fire for non-core requests.\n *\n * @param {Object} data 'JSON object according to BB JSON API'\n * @param {String} status Status of XHR\n * @param {Object} req The XHR object retrieving the resource\n *\n * @return undefined\n */\nasync function checkJSON(data, status, req) {\n if (typeof req.responseJSON !== \"undefined\") {\n // Since subsequent events may mess with the responseJSON\n // object, give (debuggers) the option to see the raw stuff.\n // Could be solved with a service worker instead.\n $(document).trigger(\"bb:responseText\", req.responseText);\n // use bb:preHandleData to change the JSON object for later invocations\n $(document).trigger(\"bb:preHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n // handleData has the main stuff - the core rendering\n $(document).trigger(\"bb:handleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // use bb:postHandleData to change the DOM after initial rendering\n $(document).trigger(\"bb:postHandleData\", data);\n if (data[stopDispatches]) return;\n await data[awaiting];\n\n // finalHandleData may not change the DOM, but set focus for instance.\n $(document).trigger(\"bb:finalHandleData\", data);\n if (data[stopDispatches]) return;\n }\n}\n\nexport { Ajax, checkJSON, awaiting };\n","import { Mode } from \"./mode.js\";\n\nexport const setSettled = () => Mode.set(\"isSettled\");\n","/* global $, URLSearchParams */\nimport { setSettled } from \"./settled.js\";\nimport { removeEndListener } from \"./case-exit.js\";\n\nfunction BBI(options) {\n options = options || {};\n if (options.redirect_uri) {\n /** Example response:\n *\n * {\n * \"bbis\" : \"test\",\n * \"authid\" : \"Stubby\",\n * \"redirect_uri\" : \"https:\\/\\/HOST:8078\\/login?returnurl=http%3A%2F%2Fhost%3A80%2Fbbisreturns%3Fbbis%3Dtest&state=1507301556%3AGUID&authid=Stubby\",\n * \"url\": \"http:\\/\\/HOST:80\\/bbisreturns?bbis=test\",\n * \"state\": \"1507301556:6F2146D3-E0E6-4EB2-9DE4-2F31670B80D6\"\n * }\n *\n */\n var path = window.location.pathname.split(\"/\"),\n template = path.pop() || \"inlog.html\",\n returnurl =\n window.location.origin +\n path.concat(template).join(\"/\") +\n \"?\" +\n $.param({ bbis: options.bbis }),\n server = options.redirect_uri.split(\"?\")[0]; // The identity server sans params\n this.params = Object.assign({}, options.extraparams, {\n returnurl,\n authid: options.authid,\n // Add specific HTML page to state:\n state: options.state\n });\n this.url = server + \"?\" + $.param(this.params);\n this.stage = 1;\n } else {\n this.params = $.extend($.parseQuery(), { fmt: \"json\" });\n this.stage = 2;\n }\n return this;\n}\n\nBBI.prototype.authenticate = function () {\n if (!this.stage) throw \"BBI was not properly initialized\";\n if (this.stage === 1) {\n removeEndListener();\n window.location.href = this.url;\n } else if (this.stage === 2) {\n $.postJSON(\"bbisreturns\", this.params).then(setSettled);\n }\n};\n\nexport { BBI };\n","import { escapeHTML } from \"./escape.js\";\nimport {\n allPass,\n anyPass,\n both,\n complement,\n compose,\n either,\n F,\n has,\n ifElse,\n pipe,\n prop,\n propEq,\n type\n} from \"./functional.js\";\nexport const isOptional = allPass([\n complement(prop(\"notnull\")),\n either(\n complement(prop(\"stringmask\")),\n pipe(prop(\"stringmask\"), RegExp, re => re.test(\"\"))\n )\n]);\n\nexport const isVisible = prop(\"visible\");\n\nexport const isLabel = either(\n propEq(\"name\", \"label\"),\n propEq(\"controltype\", \"label\")\n);\n\nexport const isOption = either(\n propEq(\"controltype\", \"radio\"),\n propEq(\"controltype\", \"checkbox\")\n);\n\nexport const isLink = propEq(\"name\", \"linklabel\");\n\nexport const isTextual = either(isLabel, isLink);\n\nexport const isPicture = propEq(\"controltype\", \"picture\");\n\nexport const isQuestion = complement(either(isTextual, isPicture));\n\nexport const isReadOnly = both(\n isQuestion,\n either(\n ifElse(has(\"originalreadonly\"), prop(\"originalreadonly\"), prop(\"readonly\")),\n propEq(\"visible\", false)\n )\n);\n\nexport const isValidatable = ifElse(\n either(isReadOnly, propEq(\"visible\", false)),\n F,\n anyPass([\n has(\"minimum\"),\n has(\"maximum\"),\n both(has(\"maxlength\"), complement(propEq(\"maxlength\", 0))),\n prop(\"notnull\"),\n compose(s => s === \"string\", type, prop(\"stringmask\"))\n ])\n);\n\nexport const renderAttribs = attr =>\n Object.entries(attr).reduce(\n (acc, [key, value]) => acc + ` ${key}=\"${escapeHTML(value)}\"`,\n \"\"\n );\n\nexport const setAttribs = (elt, attr) =>\n Object.entries(attr).forEach(([key, value]) => elt.setAttribute(key, value));\n\nexport const bbmClass = stylename =>\n `bbm-${stylename.toLowerCase().replace(/[^a-z0-9]/g, \"-\")}`;\n","import {\n assoc,\n hasPath,\n chain,\n compose,\n either,\n path,\n prop,\n toLower,\n toUpper,\n ifElse,\n juxt,\n when\n} from \"./functional.js\";\nimport { format } from \"./text-utils.js\";\nimport { _ } from \"./gettext.js\";\n\nconst fieldDesignators = {\n datetimepicker: \"field--date\",\n numedit: \"field--value\",\n radio: \"field--list\",\n checkmultilist: \"field--list\",\n customlist: \"field--list\",\n combobox: \"field--list\",\n listbox: \"field--list\",\n multilist: \"field--list\",\n any: \"field--field\"\n};\n\nconst fieldKey = compose(\n controltype => fieldDesignators[controltype] || fieldDesignators[\"any\"],\n prop(\"controltype\")\n);\n\nconst generic = compose(key => _(key), fieldKey);\n\nconst genericQuoted = compose(\n key => _(key), // Runtime!\n key => key.replace(\"field--\", \"quoted--\"),\n fieldKey\n);\nexport const quotable = compose(\n when(\n prop(\"quotable\"),\n chain(\n assoc(\"quotable--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quotable\"))\n )\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--upper\"), compose(toUpper, prop(\"quotable\")))\n ),\n when(\n prop(\"quotable\"),\n chain(assoc(\"quotable--lower\"), compose(toLower, prop(\"quotable\")))\n ),\n chain(assoc(\"quotable\"), either(path([\"metadata\", \"quotable\"]), generic)),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n compose(assoc(\"<<\", _(\"<<\", \"«\")), assoc(\">>\", _(\">>\", \"»\"))),\n compose(assoc(\"<<\", \"\"), assoc(\">>\", \"\"))\n ),\n chain(\n assoc(\"quoted--init\"),\n compose(s => s.slice(0, 1).toUpperCase() + s.slice(1), prop(\"quoted\"))\n ),\n ifElse(\n hasPath([\"metadata\", \"quotable\"]),\n chain(\n assoc(\"quoted\"),\n compose(\n arr => format(...arr),\n juxt([\n genericQuoted,\n compose(quotable => ({ quotable }), path([\"metadata\", \"quotable\"]))\n ])\n )\n ),\n chain(assoc(\"quoted\"), generic)\n )\n);\n","/* global $ */\nimport { quotable } from \"./quotable.js\";\nimport {\n apply,\n assoc,\n cond,\n compose,\n dec,\n equals,\n identity,\n lensPath,\n mergeLeft,\n match,\n over,\n path,\n pipe,\n tail,\n test,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\n\n/*** DATE UTILITIES BEGIN ***/\nDate.prototype.toHoursAndMinutes = function () {\n var hours = this.getHours();\n var minutes = this.getMinutes();\n if (hours < 10) hours = \"0\" + hours;\n if (minutes < 10) minutes = \"0\" + minutes;\n return hours + \":\" + minutes;\n};\nconst dateTimeRe = /^\\/Date\\((-?\\d+)\\)\\/$/,\n pureDateRe = /^(\\d{4})-(\\d{2})-(\\d{2})$/,\n ISO8601DateTimeInZuluRe =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?Z$/;\n\n/*\n * Convert JSON date string to a Date object and return it.\n *\n * @{datestring}:\n *\n * An ISO-8601 datetime string in Zulu Time\n *\n * OR\n *\n * a JSON date string of the form\n *\n * \"/Date(102938293293)/\"\n *\n * where the numerical part is\n * seconds from epoch\n *\n * OR:\n *\n * a date formatted as \"yyyy-mm-dd\"\n *\n * OR:\n *\n * undefined -> undefined\n *\n */\nconst date = (...args) => new Date(...args);\n\nexport const parseDate = cond([\n [equals(0), () => undefined],\n [equals(undefined), identity],\n [equals(\"\"), identity],\n [\n test(pureDateRe),\n // Note if we were to pass pureDates to new Date as a valid\n // DateStamp, the engine will interpret it as 0:00 Zulu\n // time. Which, in this very case, is probably not what we\n // want. We want the date as in the minds of the case (min/max in\n // a calendar etc). It should be represented 'as is' to the user,\n // so 2022-02-09 may never become 2022-02-08 in users TZ, so\n // interpret it according in users TZ.\n pipe(match(pureDateRe), tail, over(lensPath([1]), dec), apply(date))\n ],\n [test(ISO8601DateTimeInZuluRe), date],\n [test(dateTimeRe), pipe(match(dateTimeRe), path([1]), parseInt, date)],\n [\n T,\n thing => {\n throw `Not a date in our book: ${thing}`;\n }\n ]\n]);\n\nexport const leadWithZeroes = string =>\n string.replace(/([^0-9]|^)([0-9]{3})([^0-9]|$)/, \"$10$2$3\");\n\n/**\n *\n * @param {Object} spec Object describing a control conforming to the BB json api.\n * @param {String} value The value to be checked\n * @returns {Boolean|Error} true when value is according to spec\n * @throws Localized error message\n */\nexport function checkDate(spec = { notnull: false }, value) {\n const UIFormat = $.datepicker._defaults.dateFormat;\n const formatDate = $.datepicker.formatDate.bind($.datepicker);\n var date, mindate, maxdate;\n if (!spec.notnull && value.trim() === \"\") {\n return true;\n }\n const metadata = spec.metadata || {};\n try {\n date = valueToDate(UIFormat, value); // $.datepicker.parseDate(UIFormat, value); // This line may throw an error.\n } catch (e) {\n //couldn't parse - throw a translatable error message\n throw formatPlus(\n metadata.errdateinvalid || _(\"Invalid date\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n if (date === null) {\n if (spec.notnull) {\n throw format(\n metadata.errrequired || _(\"Date required\"),\n compose(assoc(\"value\", value), quotable)(spec)\n );\n }\n return true;\n }\n (mindate = parseDate(spec.minimum)), (maxdate = parseDate(spec.maximum));\n if (!(mindate || maxdate)) return true; // Neither is set\n const fmindate = formatDate(UIFormat, mindate),\n fmaxdate = formatDate(UIFormat, maxdate);\n const quotableDate = compose(\n mergeLeft({\n value,\n minimum: fmindate,\n maximum: fmaxdate\n }),\n quotable\n )(spec);\n try {\n if (mindate && !maxdate && date < mindate)\n throw (\n metadata.errdatebeforemimimum ||\n _(\"A date before {minimum} is not allowed\")\n );\n else if (mindate && maxdate && (date < mindate || maxdate < date))\n throw (\n metadata.errdatenotinrange ||\n _(\"Date has to lie between {minimum} and {maximum}\")\n );\n else if (maxdate && !mindate && maxdate < date)\n throw (\n metadata.errdateaftermaximum ||\n _(\"A date after {maximum} is not allowed\")\n );\n } catch (e) {\n throw format(e, quotableDate);\n }\n return true;\n}\n\nexport const valueToDate = (format, value) => {\n let date;\n try {\n date = $.datepicker.parseDate(format, value);\n } catch (e) {\n const yyyycleanformat = format.replace(/[^mdy]/g, \"\").replace(\"yy\", \"yyyy\"),\n clean = value.replace(/[^0-9]/g, \"\");\n date = new Date();\n const yearindex = yyyycleanformat.indexOf(\"yyyy\");\n // If year was less than 4 digits, and not at end, adjust indices of other fields.\n const adjustment = yearindex === 0 ? clean.length - 8 : 0;\n let year = Number(clean.substr(yearindex, 4 + adjustment));\n if (year <= 99) {\n const cutoffyear = Number.isInteger(\n $.datepicker._defaults.shortYearCutoff\n )\n ? $.datepicker._defaults.shortYearCutoff\n : (date.getYear() % 100) +\n Number($.datepicker._defaults.shortYearCutoff);\n // Note: this will become odd if current year approaches end of\n // century. Let's say we live in 2099. User enters 98 -> fine.\n // Is below 109. User enters 02 => not fine. Still below 109.\n // But jQuery UI should also fix this. And it's still a long time.\n const century = (date.getFullYear() / 100) >> 0;\n if (year <= cutoffyear) {\n year += century * 100;\n } else {\n year += (century - 1) * 100;\n }\n }\n const month = Math.max(\n 0,\n Number(clean.substr(yyyycleanformat.indexOf(\"mm\") + adjustment, 2)) - 1\n );\n const dom = Number(\n clean.substr(yyyycleanformat.indexOf(\"dd\") + adjustment, 2)\n );\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(dom);\n if (\n date.getFullYear() !== year ||\n date.getMonth() !== month ||\n date.getDate() !== dom\n ) {\n throw \"invalid date\";\n }\n }\n return date;\n};\n\nexport const onChangeDate = ev => {\n let date;\n try {\n date = valueToDate($.datepicker._defaults.dateFormat, ev.target.value);\n } catch (e) {\n // ignore\n } finally {\n if (date) {\n ev.target.value = leadWithZeroes(\n $.datepicker.formatDate($.datepicker._defaults.dateFormat, date)\n );\n }\n }\n};\n\nexport const humanDate = (function () {\n var now = new Date();\n var hour0 = now.setHours(0, 0, 0, 0);\n var dayinms = 1000 * 60 * 60 * 24;\n var hour24 = hour0 + dayinms;\n var thisyear = now.getYear();\n var daysofweek = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map(\n function (day) {\n return _(day);\n }\n );\n var monthsofyear = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"June\",\n \"July\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ].map(function (month) {\n return _(month);\n });\n function isToday(ms) {\n return ms > hour0 && ms < hour24;\n }\n function isYesterday(ms) {\n return hour0 > ms && ms > hour0 - dayinms;\n }\n function isLastWeek(ms) {\n return ms > hour0 - dayinms * 6;\n }\n function isThisYear(date) {\n return thisyear == date.getYear();\n }\n function humanDate(date) {\n if (!(date instanceof Date)) throw \"Expects a Date object\";\n var ms = date.valueOf();\n var hm = \"\";\n hm = date.toHoursAndMinutes();\n if (isToday(ms)) {\n return hm;\n }\n if (isYesterday(ms)) {\n return _(\"Yesterday\") + \", \" + hm;\n }\n if (isLastWeek(ms)) {\n return daysofweek[date.getDay()] + \" \" + hm;\n }\n return (\n date.getDate() +\n \" \" +\n monthsofyear[date.getMonth()] +\n (isThisYear(date) ? \"\" : \" \" + date.getFullYear()) +\n \", \" +\n hm\n );\n }\n return humanDate;\n})();\n","import { compose, either, isNil, not, path } from \"./functional.js\";\n\n/* editPolicy may be \"return\", \"stay\", or undefined, meaning off */\nexport const editPolicy = path([\"arbitrary\", \"core\", \"editPolicy\"]);\n\nexport const canEditEarlier = compose(not, isNil, editPolicy);\n\nconst isLabelValueDynamic = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"isLabelValueDynamic\"])\n);\n\nconst preferUpdate = compose(\n value => value === true,\n path([\"arbitrary\", \"core\", \"preferUpdate\"])\n);\n\nexport const mustUpdate = either(preferUpdate, canEditEarlier);\n\nexport const updateLabels = either(mustUpdate, isLabelValueDynamic);\n","const _Widgets = {};\n\nexport function registerWidget(options) {\n _Widgets[options.name] = options;\n}\nexport function getWidget(name) {\n return _Widgets[name];\n}\n","/* global $ */\n\nimport { parseDate } from \"./dates\";\nimport { isReadOnly, isValidatable } from \"./control-helpers\";\nimport { updateLabels } from \"./feature-queries.js\";\nimport { conf } from \"./conf.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { anyPass, has, prop } from \"./functional.js\";\nconst Dynprops = {};\n\n// Update the control element\nDynprops.update = function ($widget, control, Updates, requestor) {\n if (!$widget.get(0)) return;\n const oldval = $widget.val();\n\n const updates = Object.keys(Updates);\n const definition = getWidget(control.controltype);\n $widget.removeData([\"validated\"]);\n\n /** isForNotNull **/\n if (has(\"isForNotNull\", Updates)) {\n $widget.toggleClass(\"bb-for-required\", Boolean(control.isForNotNull));\n $widget.toggleClass(\"bb-for-optional\", !control.isForNotNull);\n }\n\n /** Placeholder **/\n if (has(\"placeholder\", Updates) > -1) {\n $widget.attr(\"placeholder\", control.placeholder);\n }\n\n /** Visible **/\n if (has(\"visible\", Updates)) {\n if (control.identifier === \"gformulier.gegevens.geschil_partner\")\n $widget.attr(\"aria-hidden\", !control.visible);\n $widget.attr(\"data-visible\", control.visible);\n\n if (control.visible) {\n window.setTimeout(function () {\n $widget.removeAttr(\"hidden\");\n }, 80);\n } else {\n window.setTimeout(function () {\n $widget.attr(\"hidden\", !control.visible);\n }, 80);\n }\n }\n\n /** Value **/\n if (has(\"value\", Updates)) {\n if (updateLabels(conf)) {\n /**\n @done: linklabel, listlabel, checkmultilist, memo, combobox, radio,\n checkbox, numedit, datetimepicker, edit, grid, multilist(?), listbox(?)\n @todo: freebox.\n\n NOTE: A widget currently can change itself *only* if\n they are registered with allowUpdatingSelf : true\n\n Widgets within a grid can update other widgets in a grid.\n */\n if (definition.setValue) {\n definition.setValue($widget.get(0), control.value, requestor, Updates);\n }\n }\n }\n\n /** Readonly **/\n if (\n anyPass([has(\"readonly\"), has(\"originalreadonly\"), has(\"visible\")], Updates)\n ) {\n const readonly = isReadOnly(control);\n if (typeof definition.onreadonly === \"function\") {\n definition.onreadonly($widget.get(0), readonly);\n } else {\n $widget.prop(\"disabled\", readonly);\n }\n }\n\n /** Minimum **/\n if (has(\"minimum\", Updates)) {\n $widget.attr(\"min\", control.minimum);\n if (control.controltype === \"datetimepicker\") {\n if (control.minimum) {\n $widget.datepicker(\"option\", \"minDate\", parseDate(control.minimum));\n }\n }\n }\n\n /** Maximum **/\n if (has(\"maximum\", Updates)) {\n $widget.attr(\"max\", control.maximum);\n if (control.controltype === \"datetimepicker\") {\n if (control.maximum) {\n $widget.datepicker(\"option\", \"maxDate\", parseDate(control.maximum));\n }\n }\n }\n\n /** Maxlength **/\n if (has(\"maxlength\", Updates)) {\n if (control.maxlength === 0) $widget.removeAttr(\"maxlength\");\n else $widget.attr(\"maxlength\", control.maxlength);\n }\n\n /** Let user know something changed perhaps against their intent. **/\n if (oldval !== $widget.val()) {\n $widget.addClass(\"bb-programmatically-changed\");\n $widget.trigger(\"change\", { programmatically: true });\n self.setTimeout(function () {\n $widget.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n\n /** Notnull **/\n if (has(\"notnull\", Updates)) {\n if (typeof definition.onrequired === \"function\") {\n definition.onrequired($widget.get(0), control.notnull);\n } else {\n $widget.attr(\"aria-required\", control.notnull);\n }\n if (control.notnull) {\n $widget.addClass(\"notnull\");\n } else {\n $widget.removeClass(\"notnull\");\n }\n }\n\n if (isValidatable(control)) {\n $widget.attr(\"aria-errormessage\", `${control.id}--error`);\n $widget.addClass(\"validatable\");\n } else {\n $widget.removeAttr(\"aria-errormessage\");\n $widget.removeClass(\"validatable\");\n }\n\n if (updates.length > 0) {\n const event = new CustomEvent(\"bb:updatedControl\", {\n detail: { control, Updates },\n bubbles: true\n });\n $widget.get(0).dispatchEvent(event);\n $(document).trigger(\"bb:updated\", [$widget, control, updates]);\n }\n};\n\n$.fn.extend({\n updateControl: function (controls, requestor) {\n return this.each(function () {\n const $this = $(this),\n control = $this.data(\"control\");\n if (\n this === requestor &&\n !prop(\"allowUpdatingSelf\", getWidget(control.controltype))\n ) {\n // This was the one requesting an update\n return this;\n }\n if (!control) throw (\"No updateControl defined for\", $this);\n const id = control.id,\n update = controls.find(function (c) {\n return c.id === id;\n }),\n // updates = [],\n Updates = {},\n props = [\n \"maxlength\",\n \"isForNotNull\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"readonly\",\n \"originalreadonly\",\n \"placeholder\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"visible\",\n \"value\",\n \"columns\",\n \"text\"\n ];\n // Caron-syntax used in label, therefore no (text) interface\n // returned -- should not mix and match dynprops with empty\n // labels! Do not allow this to error on the user though!\n\n // Does also handle (cause to ignore) labels within a grid!\n if (typeof update === \"undefined\") {\n return this;\n // update = $.extend({}, control, {visible: false});\n }\n for (var i in props) {\n if (control[props[i]] !== update[props[i]]) {\n Updates[props[i]] = { from: control[props[i]], to: update[props[i]] };\n control[props[i]] = update[props[i]];\n // updates.push(props[i]);\n }\n }\n Dynprops.update($this, control, Updates, requestor);\n return this;\n });\n }\n});\n\nexport { Dynprops };\n","const Hooks = new Map();\n\nexport const registerHook = key => hook => {\n if (typeof hook !== \"function\") throw \"Can only add a function as a hook\";\n Hooks.set(key, hook);\n};\n\nexport const runHook =\n key =>\n (...args) => {\n if (Hooks.has(key)) Hooks.get(key)(...args);\n };\n","/* global $ */\nimport { bbmClass, isReadOnly, renderAttribs } from \"./control-helpers\";\nimport { Dynprops } from \"./dynprops\";\nimport { escaped, escapeHTML } from \"./escape.js\";\nimport { conf, propFinder } from \"./conf\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n assoc,\n both,\n compose,\n complement,\n has,\n hasPath,\n isNil,\n not,\n prop\n} from \"./functional.js\";\nimport { runHook } from \"./hooks.js\";\nimport { Mode } from \"./mode.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\n/**\n * Create a control widget, then insert it into the DOM\n *\n * @param {Object} control A control object as defined in the JSON API. The one to render + add.\n * @param {Object} group The group object to which this control belongs.\n * @param {Element} wGroup Element whereto this control should be added. *NOTE* that this need not be a .bb-group\n *\n * @return undefined\n *\n * @todo Simplify parameter list.\n */\nfunction wControl(control, group, wGroup) {\n control._group = group;\n let attribs = {};\n let widget;\n const enabled = group.current || complement(isReadOnly)(control);\n // Has been rendered\n if (control.$elt) {\n $(wGroup).append(control.$elt);\n return control.$elt;\n }\n if (compose(has(\"fixup\"), getWidget)(control.controltype))\n compose(fn => fn(control), prop(\"fixup\"), getWidget)(control.controltype);\n\n if (control.datatype) attribs[\"data-datatype\"] = control.datatype;\n\n if (control.meta)\n for (let d in control.meta) {\n if (both(has(d), compose(not, isNil, prop(d)))(control.meta))\n attribs[\"data-\" + d] = escape(control.meta[d]);\n }\n if (control.metadata) {\n attribs[\"data-metadata-keys\"] = Object.keys(control.metadata)\n .map(s => s.replace(/\\s/g, \"-\"))\n .join(\" \");\n }\n if (control.aria)\n for (let a in control.aria) {\n if (has(a, control.aria)) attribs[\"aria-\" + a] = control.aria[a];\n }\n\n if (control.name) {\n attribs[\"name\"] = control.name;\n }\n\n const wdef = getWidget(control.controltype);\n if (!wdef) {\n console.warn(`No widget definition for ${control.controltype}`);\n return null;\n }\n const tagName = wdef.tagName;\n attribs = wdef.attribs(attribs, control, enabled);\n\n attribs[\"data-type\"] = control.controltype;\n if (tagName) {\n widget = $(\"<\" + tagName + \" \" + renderAttribs(attribs) + \"/>\");\n } else {\n widget = $(wdef.render(control, group, attribs));\n if (!widget) return null;\n }\n\n if (control.className) {\n widget.addClass(control.className);\n }\n control.$elt = widget;\n control._elt = widget.get(0);\n\n if (wdef && wdef.tagName) {\n /**\n Okay, some (older) definitions have a tagName definition ->\n from which a quite empty skeleton widget is created.\n\n Afterwards, they fill that very widget with a render function\n of a different signature than usual:\n\n Instead of (control (plain object), group (plain object), attribs (array)), they get\n (control (plain object), widget (jQuery collection), group (plain object))).\n\n */\n wdef.render(control, widget, group);\n }\n\n // attach an id whenever meaningful:\n // if (control.id && /\\d+$/.test(control.id))\n if (control.id) {\n // id used not to be safe, but now we prepend the groupid, making it safe.\n widget.attr(\"id\", control.id);\n }\n if (control._originalid) {\n // Use data-id for stuff refering to the interface, no matter in which group it is, such as informationsources.\n widget.attr(\"data-id\", control._originalid);\n }\n\n if (hasPath([\"metadata\", \"autocomplete\"], control)) {\n widget\n .attr(\"data-server-name\", control.name)\n .attr(\"name\", control.metadata.autocomplete)\n .attr(\"autocomplete\", control.metadata.autocomplete);\n }\n\n $(wGroup).append(widget);\n\n /* Insert a space between elements so that elements are reasonably\n * well-placed when CSS is disabled.\n */\n $(wGroup).append(\" \");\n\n // Tooltips:\n if (control.hint) {\n if (enabled) Mode.set(\"hasHints\");\n runHook(\"hinter\")(widget, assoc(\"enabled\", enabled, control));\n }\n widget.data(\"control\", control);\n\n /**\n * Dynamic properties\n */\n var dynprops = [\n \"maxlength\",\n \"minimum\",\n \"maximum\",\n \"notnull\",\n \"isForNotNull\",\n \"readonly\",\n \"precision\",\n \"stringmask\",\n \"errortext\",\n \"placeholder\"\n ],\n dynpropsforus = {};\n\n for (var ii in dynprops) {\n if (has(dynprops[ii], control))\n dynpropsforus[dynprops[ii]] = { to: control[dynprops[ii]] }; // .push(dynprops[ii]);\n }\n\n if (has(\"visible\", control) && control.visible === false) {\n dynpropsforus[\"visible\"] = { to: false }; // .push(dynprops[ii]);\n }\n // dynpropsforus.push(\"visible\");\n\n widget.data(\"anchor\", widget);\n\n if (wdef && wdef.afterRender) {\n wdef.afterRender(widget, control);\n }\n\n if (shouldWrap(control)) {\n wrapInlineInput(widget);\n }\n\n /* Allow class-based styling */\n if (control[\"font-class\"]) {\n widget.addClass(bbmClass(control[\"font-class\"]));\n }\n\n /**\n * Two things:\n * - Put control tags in data-tags of Element.\n * - Make TAG known to CSS as bb-tagged-TAG.\n */\n if (control[\"tags\"] instanceof Array) {\n $(widget).data(\"tags\", control[\"tags\"]);\n $.each(control[\"tags\"], function (i, tag) {\n widget.addClass(\"bb-tagged-\" + tag);\n });\n }\n\n Dynprops.update(widget, control, dynpropsforus);\n\n return widget;\n}\n\nfunction shouldWrap(control) {\n return (\n control.prelabel ||\n control.postlabel ||\n (arbitraryCoreProp(\"wrapAllSingleLiners\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype)) ||\n (control.placeholder &&\n arbitraryCoreProp(\"accessiblePlaceholders\") === true &&\n compose(prop(\"couldWrap\"), getWidget)(control.controltype))\n );\n}\n\nfunction wrapInlineInput(widget) {\n var control = widget.data(\"control\"),\n prelabel = control.prelabel,\n postlabel = control.postlabel;\n var anchor = widget.data(\"anchor\");\n var wraptag = \"span\";\n if (anchor.get(0).nodeName === \"DIV\") wraptag = \"div\";\n anchor.wrapAll(\n \"<\" +\n wraptag +\n ' data-wraps-type=\"' +\n control.controltype +\n '\" class=\"bb-input-wrap\">\"\n );\n anchor = anchor.parent();\n widget.data(\"anchor\", anchor);\n anchor.data({\n control: control,\n type: control.controltype\n });\n if (prelabel)\n anchor.prepend(\n '' +\n escapeHTML(prelabel) +\n \"\"\n );\n if (control.placeholder && arbitraryCoreProp(\"accessiblePlaceholders\")) {\n widget\n .get(0)\n .setAttribute(\n \"aria-describedby\",\n (\n (widget.get(0).getAttribute(\"aria-describedby\") || \"\") +\n ` ${control.id}--placeholder`\n ).trim()\n );\n anchor.append(\n `${escapeHTML(control.placeholder)}`\n );\n }\n if (postlabel)\n anchor.append(\n '' +\n escapeHTML(postlabel) +\n \"\"\n );\n}\n\nconst getControl = elt => $.data(elt, \"control\");\n\nexport { getControl, wControl };\n","export const listtypes = {\n radio: \"LIST\",\n checkmultilist: \"LIST\",\n customlist: \"LIST\",\n combobox: \"BOX\",\n listbox: \"BOX\",\n multilist: \"BOX\"\n};\n","import {\n groupWith,\n map,\n filter,\n pipe,\n path,\n strictUniq,\n lensPath\n} from \"./functional.js\";\n\nconst pathToGroup = [\"metadata\", \"group\"];\nexport const pathGroup = path(pathToGroup);\nexport const lensGroup = lensPath([\"metadata\", \"group\"]);\n\nconst areOfOneQuestion = (a, b) => a.isfor === b.id || b.isfor === a.id;\n\nexport const groupInner = groupWith(areOfOneQuestion);\n\nconst InfinityIfMinus1 = num => (num + 1 || Infinity) - 1;\nconst indexOfOrInfinity = (sub, s) => InfinityIfMinus1(s.indexOf(sub));\nexport const baseGroup = s => s.substr(0, indexOfOrInfinity(\".\", s));\nexport const tailGroup = s => s.substr(indexOfOrInfinity(\".\", s) + 1);\n\nconst belongTogether = (a, b) =>\n areOfOneQuestion(a, b) ||\n (pathGroup(a) &&\n pathGroup(b) &&\n baseGroup(pathGroup(a)) === baseGroup(pathGroup(b)));\n\nexport const groupOuter = groupWith(belongTogether);\n\nexport const groupClasses = pipe(\n map(path[(\"metadata\", \"groupClasses\")]),\n filter(Boolean),\n strictUniq\n);\n\nexport const doGrouping = path([\"arbitrary\", \"core\", \"form-group\", \"on\"]);\n","export const normalize = s => s.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n","import { path, either, compose, prop } from \"./functional.js\";\nimport { conf } from \"./conf.js\";\n\n/**\n\nName keys follow this pattern:\n\n__\n\n is any of:\n\n- GROUPING: subgroup of questions and/or texts and/or links\n- ITEM: a question and/or text and/or link\n- QUESTION: a question (is also an item)\n- TEXT: a top level text (not a label for a question)\n- LINK: a top level link (so: not inside markdown)\n- PICTURE: a top level image (so : nto inside markdown)\n\nGROUPING ::= ITEM+\nITEM ::= QUESTION | TEXT | LINK | PICTURE\n\n is any of:\n\n- _CLASS_ : the css class to put on this type \n- _PREFIX_: a css class prefix\n- _DATA_: a data- attribute\n\nwhere can be anything.\n\nThe default values for those keys, thus the strings that willl be used\nin the generated DOM, are provided in nameDefaults. They can be\noverwritten in the `conf.json` file in the property\n`core.form-group.names` in order to retrofit older or other naming\nschemes.\n\n*/\n\nexport const /* A grouping groups items */\n GROUPING_CLASS = \"grouping-class\", // Class of grouping\n GROUPING_PREFIX_TYPE = \"grouping-prefix-type\", // prefix for -question, -text or -author\n GROUPING_DATA_NAME = \"grouping-data-name\", // data attribute conveying author provided group name\n GROUPING_DATA_LEVEL = \"grouping-data-level\", // grouping level, 1-based\n ITEM_PREFIX_AUTHORCLASS = \"item-prefix-authorclass\", // prefix for author class set with cssclasses on the metadata\n QUESTION_CLASS = \"question-class\", //: \"bb-questionlabelgroup\",\n QUESTION_PREFIX_TYPE = \"question-prefix-type\", //: \"bb-itype\",\n QUESTION_PREFIX_PROPERTY = \"question-prefix-property\", //: \"bb-itype\",\n QUESTION_DATA_LAYOUT = \"question-data-layout\", //: \"data-form-group-layout\",\n QUESTION_PREFIX_AUTHORSTYLE = \"question-prefix-authorstyle\", //: \"bb-g-\",\n QUESTION_CLASS_NOLABEL = \"question-class-nolabel\"; //: \"form-group__question--no-label\",\n\nconst nameDefaults = {\n [GROUPING_CLASS]: \"form-group\",\n [GROUPING_PREFIX_TYPE]: \"form-group-\",\n [GROUPING_DATA_NAME]: \"data-form-group-name\",\n [GROUPING_DATA_LEVEL]: \"data-form-group-level\",\n [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n [QUESTION_PREFIX_TYPE]: \"bb-itype\",\n [QUESTION_PREFIX_PROPERTY]: \"question-\", //: \"bb-itype\",\n [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n [QUESTION_PREFIX_AUTHORSTYLE]: \"bb-g-\",\n [QUESTION_CLASS_NOLABEL]: \"form-group__question--no-label\"\n};\n\n// const fg = {\n// [GROUPING_CLASS]: \"no-form-group-outer\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup p-form-group\",\n// [QUESTION_PREFIX_TYPE]: \"bb-itype-\",\n// [QUESTION_DATA_LAYOUT]: \"data-p-form-group-layout-type\",\n// [QUESTION_CLASS_NOLABEL]: \"p-form-group-orphaned\"\n// };\n\n// const bem_example = {\n// [GROUPING_CLASS]: \"form-group\",\n// [GROUPING_PREFIX_TYPE]: \"form-group-\",\n// [ITEM_PREFIX_AUTHORCLASS]: \"form-group__item--author-class-\",\n// [QUESTION_CLASS]: \"bb-questionlabelgroup\",\n// [QUESTION_PREFIX_TYPE]: \"form-group__question-\",\n// [QUESTION_DATA_LAYOUT]: \"data-form-group-layout\",\n// [QUESTION_PREFIX_AUTHORSTYLE]: \"form-group__question--author-style-\"\n// };\n\nconst pathToNames = path([\"arbitrary\", \"core\", \"form-group\", \"names\"]);\n\nexport const names = propArg =>\n either(compose(prop(propArg), pathToNames), _ => prop(propArg, nameDefaults))(\n conf\n );\n","/* global $ */\nimport {\n all,\n both,\n curry,\n filter,\n has,\n compose,\n ifElse,\n head,\n path,\n prop,\n propEq,\n any,\n find,\n pathOr,\n split,\n join,\n map,\n when,\n tap,\n cond,\n not\n} from \"./functional.js\";\nimport {\n isTextual,\n isPicture,\n isQuestion,\n isVisible\n} from \"./control-helpers.js\";\nimport { groupOuter, baseGroup, tailGroup, pathGroup } from \"./groupings\";\nimport { normalize } from \"./font-classes\";\nimport { getWidget } from \"./form-widgets.js\";\nimport { conf } from \"./conf\";\nimport * as n from \"./names.js\";\nimport { names } from \"./names.js\";\n\nconst doTopLevel = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"toplevel\"\n]);\n\nconst doLegends = pathOr(true, [\n \"arbitrary\",\n \"core\",\n \"form-group\",\n \"doLegends\"\n]);\n\nconst getLayout = type =>\n pathOr(compose(prop(\"layout\"), getWidget)(type), [\n \"arbitrary\",\n \"form-group\",\n type\n ]);\n\nconst getGroupName = compose(when(Boolean, baseGroup), pathGroup, head);\n\n// Interface Font Style\nconst questionGroupClass = compose(\n s => names(n.QUESTION_PREFIX_AUTHORSTYLE) + s,\n normalize,\n prop(\"font-class\")\n);\n\n// interface metadata: cssclasses=\nexport const extraClasses = prefix =>\n compose(\n when(\n Boolean,\n compose(\n join(\" \"),\n map(compose(s => names(prefix) + s, normalize)),\n split(\" \")\n )\n ),\n path([\"metadata\", \"cssclasses\"])\n );\n\nconst asciify = s => s.replace(/[^a-z-]/g, \"-\");\n\nconst areAllInvisible = compose(not, any(isVisible));\nconst areAllReadonly = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"originalreadonly\")), filter(both(isQuestion, isVisible)))\n);\n\nconst areAllNotNull = both(\n any(both(isQuestion, isVisible)),\n compose(all(prop(\"notnull\")), filter(both(isQuestion, isVisible)))\n);\n\nconst updateClassWhen = curry((className, fn, controls, elt) => {\n elt.classList.toggle(className, fn(controls));\n});\n\nconst setReadonlyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredFGClass = updateClassWhen(\n names(n.GROUPING_PREFIX_TYPE) + \"-required\",\n areAllNotNull\n);\n\nconst setReadonlyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-readonly\",\n areAllReadonly\n);\nconst setEmptyQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-empty\",\n areAllInvisible\n);\nconst setRequiredQClass = updateClassWhen(\n names(n.QUESTION_PREFIX_PROPERTY) + \"-required\",\n areAllNotNull\n);\n\nexport const createFormGroup = (wControl, group, level) => c => {\n let formGroup;\n const groupName = getGroupName(c);\n\n if (\n groupName ||\n (doTopLevel(conf) &&\n (doLegends(conf) || !all(propEq(\"controltype\", \"legend\"))(c)))\n ) {\n formGroup = document.createElement(\"div\");\n formGroup.className = names(n.GROUPING_CLASS);\n formGroup.setAttribute(names(n.GROUPING_DATA_LEVEL), level);\n setEmptyFGClass(c, formGroup);\n setReadonlyFGClass(c, formGroup);\n setRequiredFGClass(c, formGroup);\n formGroup.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyFGClass(c, formGroup);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyFGClass(c, formGroup);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredFGClass(c, formGroup);\n }\n });\n if (groupName) {\n formGroup.setAttribute(names(n.GROUPING_DATA_NAME), asciify(groupName));\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-author\");\n } else if (find(isQuestion, c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-interface\");\n } else if (compose(isPicture, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-picture\");\n } else if (compose(isTextual, head)(c)) {\n formGroup.classList.add(names(n.GROUPING_PREFIX_TYPE) + \"-text\");\n }\n } else {\n formGroup = document.createDocumentFragment();\n }\n\n const cWithin = compose(\n groupOuter,\n map(\n when(\n pathGroup,\n tap(control =>\n compose(\n ifElse(\n s => s === \"\",\n () => delete control.metadata.group,\n group => (control.metadata.group = group)\n ),\n tailGroup\n )(control.metadata.group)\n )\n )\n )\n )(c);\n cWithin.forEach(\n cond([\n [\n getGroupName,\n compose(\n n => formGroup.appendChild(n),\n createFormGroup(wControl, group, level + 1)\n )\n ],\n [\n any(isQuestion),\n controls => {\n const answer = find(isQuestion, controls);\n const classes = [\n names(n.QUESTION_CLASS),\n `${names(n.QUESTION_PREFIX_TYPE)}-${answer.controltype}`,\n questionGroupClass(answer),\n extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(answer),\n controls.length === 1 && names(n.QUESTION_CLASS_NOLABEL)\n ].filter(Boolean);\n const qlg = document.createElement(\"div\");\n qlg.setAttribute(\n names(n.QUESTION_DATA_LAYOUT),\n answer._layout || getLayout(answer.controltype)(conf)\n );\n qlg.className = classes.join(\" \");\n setEmptyQClass(controls, qlg);\n setReadonlyQClass(controls, qlg);\n setRequiredQClass(controls, qlg);\n qlg.addEventListener(\"bb:updatedControl\", ({ detail }) => {\n if (has(\"visible\", detail.Updates)) {\n setEmptyQClass(controls, qlg);\n }\n if (has(\"readonly\", detail.Updates)) {\n setReadonlyQClass(controls, qlg);\n }\n if (has(\"notnull\", detail.Updates)) {\n setRequiredQClass(controls, qlg);\n }\n });\n controls.forEach(c => wControl(c, group, $(qlg)));\n formGroup.appendChild(qlg);\n }\n ],\n [\n () => true,\n map(c => {\n const $widget = wControl(c, group, $(formGroup));\n if ($widget)\n $widget.addClass(extraClasses(n.ITEM_PREFIX_AUTHORCLASS)(c));\n })\n ]\n ])\n );\n return formGroup;\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nvar t,i,s,e;const o=globalThis.trustedTypes,l=o?o.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,n=`lit$${(Math.random()+\"\").slice(9)}$`,h=\"?\"+n,r=`<${h}>`,u=document,c=(t=\"\")=>u.createComment(t),d=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,v=Array.isArray,a=t=>{var i;return v(t)||\"function\"==typeof(null===(i=t)||void 0===i?void 0:i[Symbol.iterator])},f=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=/>|[ \t\\n\f\\r](?:([^\\s\"'>=/]+)([ \t\\n\f\\r]*=[ \t\\n\f\\r]*(?:[^ \t\\n\f\\r\"'`<>=]|(\"|')|))|$)/g,$=/'/g,g=/\"/g,y=/^(?:script|style|textarea)$/i,b=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),T=b(1),x=b(2),w=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),P=new WeakMap,V=(t,i,s)=>{var e,o;const l=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let n=l._$litPart$;if(void 0===n){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;l._$litPart$=n=new C(i.insertBefore(c(),t),t,void 0,s)}return n.I(t),n},E=u.createTreeWalker(u,129,null,!1),M=(t,i)=>{const s=t.length-1,e=[];let o,h=2===i?\"\":\"\",u=f;for(let i=0;i\"===c[0]?(u=null!=o?o:f,d=-1):void 0===c[1]?d=-2:(d=u.lastIndex-c[2].length,l=c[1],u=void 0===c[3]?p:'\"'===c[3]?g:$):u===g||u===$?u=p:u===_||u===m?u=f:(u=p,o=void 0);const a=u===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";h+=u===f?s+r:d>=0?(e.push(l),s.slice(0,d)+\"$lit$\"+s.slice(d)+n+a):s+n+(-2===d?(e.push(void 0),i):a)}const c=h+(t[s]||\"\")+(2===i?\"\":\"\");return[void 0!==l?l.createHTML(c):c,e]};class N{constructor({strings:t,_$litType$:i},s){let e;this.parts=[];let l=0,r=0;const u=t.length-1,d=this.parts,[v,a]=M(t,i);if(this.el=N.createElement(v,s),E.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes)}for(;null!==(e=E.nextNode())&&d.length0){e.textContent=o?o.emptyScript:\"\";for(let s=0;s2||\"\"!==s[0]||\"\"!==s[1]?(this.H=Array(s.length-1).fill(A),this.strings=s):this.H=A}get tagName(){return this.element.tagName}I(t,i=this,s,e){const o=this.strings;let l=!1;if(void 0===o)t=S(this,t,i,0),l=!d(t)||t!==this.H&&t!==w,l&&(this.H=t);else{const e=t;let n,h;for(t=o[0],n=0;nnew n(t+\"\",e),o=new Map,r=(t,...s)=>{const r=s.reduce(((e,s,o)=>e+(t=>{if(t instanceof n)return t.cssText;if(\"number\"==typeof t)return t;throw Error(`Value passed to 'css' function must be a 'css' function result: ${t}. Use 'unsafeCSS' to pass non-literal values, but\\n take care to ensure page security.`)})(s)+t[o+1]),t[0]);let i=o.get(r);return void 0===i&&o.set(r,i=new n(r,e)),i},i=(e,n)=>{t?e.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((t=>{const n=document.createElement(\"style\");n.textContent=t.cssText,e.appendChild(n)}))},S=t?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const n of t.cssRules)e+=n.cssText;return s(e)})(t):t;export{n as CSSResult,i as adoptStyles,r as css,S as getCompatibleStyle,t as supportsAdoptingStyleSheets,s as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as i}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var s,e,h,r;const o={toAttribute(t,i){switch(i){case Boolean:t=t?\"\":null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t)}catch(t){s=null}}return s}},n=(t,i)=>i!==t&&(i==i||t==t),l={attribute:!0,type:String,converter:o,reflect:!1,hasChanged:n};class a extends HTMLElement{constructor(){super(),this.Πi=new Map,this.Πo=void 0,this.Πl=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.Πh=null,this.u()}static addInitializer(t){var i;null!==(i=this.v)&&void 0!==i||(this.v=[]),this.v.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this.Πp(s,i);void 0!==e&&(this.Πm.set(e,s),t.push(e))})),t}static createProperty(t,i=l){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s=\"symbol\"==typeof t?Symbol():\"__\"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e)}}static getPropertyDescriptor(t,i,s){return{get(){return this[i]},set(e){const h=this[t];this[i]=e,this.requestUpdate(t,h,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||l}static finalize(){if(this.hasOwnProperty(\"finalized\"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this.Πm=new Map,this.hasOwnProperty(\"properties\")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(i){const s=[];if(Array.isArray(i)){const e=new Set(i.flat(1/0).reverse());for(const i of e)s.unshift(t(i))}else void 0!==i&&s.push(t(i));return s}static Πp(t,i){const s=i.attribute;return!1===s?void 0:\"string\"==typeof s?s:\"string\"==typeof t?t.toLowerCase():void 0}u(){var t;this.Πg=new Promise((t=>this.enableUpdating=t)),this.L=new Map,this.Π_(),this.requestUpdate(),null===(t=this.constructor.v)||void 0===t||t.forEach((t=>t(this)))}addController(t){var i,s;(null!==(i=this.ΠU)&&void 0!==i?i:this.ΠU=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t))}removeController(t){var i;null===(i=this.ΠU)||void 0===i||i.splice(this.ΠU.indexOf(t)>>>0,1)}Π_(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this.Πi.set(i,this[i]),delete this[i])}))}createRenderRoot(){var t;const s=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return i(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)})),this.Πl&&(this.Πl(),this.Πo=this.Πl=void 0)}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)})),this.Πo=new Promise((t=>this.Πl=t))}attributeChangedCallback(t,i,s){this.K(t,s)}Πj(t,i,s=l){var e,h;const r=this.constructor.Πp(t,s);if(void 0!==r&&!0===s.reflect){const n=(null!==(h=null===(e=s.converter)||void 0===e?void 0:e.toAttribute)&&void 0!==h?h:o.toAttribute)(i,s.type);this.Πh=t,null==n?this.removeAttribute(r):this.setAttribute(r,n),this.Πh=null}}K(t,i){var s,e,h;const r=this.constructor,n=r.Πm.get(t);if(void 0!==n&&this.Πh!==n){const t=r.getPropertyOptions(n),l=t.converter,a=null!==(h=null!==(e=null===(s=l)||void 0===s?void 0:s.fromAttribute)&&void 0!==e?e:\"function\"==typeof l?l:null)&&void 0!==h?h:o.fromAttribute;this.Πh=n,this[n]=a(i,t.type),this.Πh=null}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||n)(this[t],i)?(this.L.has(t)||this.L.set(t,i),!0===s.reflect&&this.Πh!==t&&(void 0===this.Πk&&(this.Πk=new Map),this.Πk.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this.Πg=this.Πq())}async Πq(){this.isUpdatePending=!0;try{for(await this.Πg;this.Πo;)await this.Πo}catch(t){Promise.reject(t)}const t=this.performUpdate();return null!=t&&await t,!this.isUpdatePending}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this.Πi&&(this.Πi.forEach(((t,i)=>this[i]=t)),this.Πi=void 0);let i=!1;const s=this.L;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this.ΠU)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this.Π$()}catch(t){throw i=!1,this.Π$(),t}i&&this.E(s)}willUpdate(t){}E(t){var i;null===(i=this.ΠU)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}Π$(){this.L=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.Πg}shouldUpdate(t){return!0}update(t){void 0!==this.Πk&&(this.Πk.forEach(((t,i)=>this.Πj(i,this[i],t))),this.Πk=void 0),this.Π$()}updated(t){}firstUpdated(t){}}a.finalized=!0,a.shadowRootOptions={mode:\"open\"},null===(e=(s=globalThis).reactiveElementPlatformSupport)||void 0===e||e.call(s,{ReactiveElement:a}),(null!==(h=(r=globalThis).reactiveElementVersions)&&void 0!==h?h:r.reactiveElementVersions=[]).push(\"1.0.0-rc.1\");export{a as ReactiveElement,o as defaultConverter,n as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var i,l,o,s,n,a;const c=t;(null!==(i=(a=globalThis).litElementVersions)&&void 0!==i?i:a.litElementVersions=[]).push(\"3.0.0-rc.1\");class h extends t{constructor(){super(...arguments),this.renderOptions={host:this},this.Φt=void 0}createRenderRoot(){var t,e;const r=super.createRenderRoot();return null!==(t=(e=this.renderOptions).renderBefore)&&void 0!==t||(e.renderBefore=r.firstChild),r}update(t){const r=this.render();super.update(t),this.Φt=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this.Φt)||void 0===t||t.setConnected(!1)}render(){return r}}h.finalized=!0,h._$litElement$=!0,null===(o=(l=globalThis).litElementHydrateSupport)||void 0===o||o.call(l,{LitElement:h}),null===(n=(s=globalThis).litElementPlatformSupport)||void 0===n||n.call(s,{LitElement:h});const u={K:(t,e,r)=>{t.K(e,r)},L:t=>t.L};export{h as LitElement,c as UpdatingElement,u as _Φ};\n//# sourceMappingURL=lit-element.js.map\n","\"use strict\";var u=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(t,a)=>{for(var l in a)u(t,l,{get:a[l],enumerable:!0})},o=(t,a,l,r)=>{if(a&&typeof a==\"object\"||typeof a==\"function\")for(let i of s(a))!p.call(t,i)&&i!==l&&u(t,i,{get:()=>a[i],enumerable:!(r=n(a,i))||r.enumerable});return t};var T=t=>o(u({},\"__esModule\",{value:!0}),t);var b={};c(b,{Maybe:()=>e});module.exports=T(b);var e=class{constructor(a){this.value=a}static of(a){return new e(a)}map(a){return this.isEmpty()?e.of(null):e.of(a(this.value))}chain(a){let l=this.map(a).join();return l===null?e.of(null):l}getOrElse(a){return this.isEmpty()?a:this.value}join(){return this.value}isEmpty(){return this.value===null||this.value===void 0}};0&&(module.exports={Maybe});\n//# sourceMappingURL=index.js.map","import { _ } from \"./gettext\";\n\n/*** NUMBER UTILITIES BEGIN ***/\n\nexport function forceInRange(num, min, max) {\n if (typeof min == \"undefined\" && typeof max == \"undefined\") return num;\n if (typeof min == \"undefined\") return Math.min(max, num);\n if (typeof max == \"undefined\") return Math.max(min, num);\n if (min === max) return min;\n return Math.max(Math.min(max, num), min);\n}\n\nexport const Numerals = (function () {\n /**\n * Create a getter for array, consuming items, repeating the last one\n * indefinitely.\n *\n * @param {Array} arr The array to make a repeater for\n * @return {Function()} Gets next item in arr, repeating last item indefinitely\n */\n function makeLastItemRepeater(arr) {\n var _a = arr.slice();\n var _last;\n return function getIter() {\n _last = _a.shift() || _last;\n return _last;\n };\n }\n /**\n * Create a formatting function for (arabic-hindu) numerals.\n *\n * @param {String} radixPoint String (character) used as radix point.\n * @param {String} groupingChar String (character) used for grouping\n * digits before the radix point.\n * @param {Array} groupingRules (optional) Array defining\n * grouping rules. Each element in this array stands for a group,\n * tracking leftwards from the radix point. When no more elements\n * remain, the last element will be repeated indefinitely.\n *\n * Most language use [3] (the default). For Indian, use [3,2]; for Chinese (and\n * Japanese?), use [4].\n *\n * Besides these rules, the special case of formatting\n * four digits in a row without grouping and no\n * fractional part is supported, and cannot be overruled.\n *\n * @return {Function()} Formatting function.\n */\n function makeFormatter(radixPoint, groupingChar, groupingRules) {\n return function formatter(num) {\n var idx = makeLastItemRepeater(groupingRules || [3]);\n var split = num.toString().split(\".\");\n var integralPart = split[0];\n var fractionalPart = split[1];\n var neg = (integralPart[0] === \"-\" && \"-\") || \"\";\n if (neg) integralPart = integralPart.substr(1);\n var th,\n out = \"\";\n if (integralPart) {\n // The four-digit exception rule (such as in years):\n if (!fractionalPart && integralPart.length === 4) out = integralPart;\n else {\n integralPart = integralPart.split(\"\").reverse();\n while ((th = integralPart.splice(0, idx()))[0]) {\n out = th.reverse().join(\"\") + (out ? groupingChar : \"\") + out;\n }\n }\n }\n if (fractionalPart) return neg + out + radixPoint + fractionalPart;\n return neg + out;\n };\n }\n function makeParser(radixPoint, groupingChar) {\n /**\n * Match anything not a digit or negative sign\n */\n var thre = /[^0-9-]/g;\n /**\n * Match only optional leading minus digits,\n * radixPoint, groupingChar and space characters.\n */\n var testre = new RegExp(\"^s?-?[0-9 \" + radixPoint + groupingChar + \"]*$\");\n\n return function parser(s) {\n if (!testre.test(s)) throw new Error(_(\"Invalid number\"));\n var split = s.split(radixPoint);\n var integralPart = split[0].replace(thre, \"\");\n if (!/^-?[0-9]*$/.test(integralPart))\n throw new Error(_(\"Invalid number\"));\n var fractionalPart = split[1];\n if (fractionalPart) fractionalPart = fractionalPart.replace(/\\s/g, \"\");\n if (!fractionalPart) fractionalPart = \"0\";\n if (!/^[0-9]*$/.test(fractionalPart))\n throw new Error(_(\"Invalid number\"));\n // Room for errors here.\n return new Number(integralPart + \".\" + fractionalPart) + 0;\n };\n }\n\n return {\n parser: makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n ),\n formatter: makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n ),\n makeFormatter: makeFormatter,\n makeParse: makeParser,\n refresh: () => {\n // console.log(this);\n Numerals.parser = makeParser(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\")\n );\n Numerals.formatter = makeFormatter(\n _(\"__radixpoint__\", \".\"),\n _(\"__digitgroupingchar__\", \",\"),\n _(\"__digitgroupingrules__\", [3])\n );\n }\n };\n})();\n/*** NUMBER UTILITIES END ***/\n","import { fromApiServer } from \"./location.js\";\nimport Vars from \"./vars.js\";\n\nif (!window.location.origin) {\n window.location.origin =\n window.location.protocol +\n \"//\" +\n window.location.hostname +\n (window.location.port ? \":\" + window.location.port : \"\");\n}\n\n/*** URL UTILITIES BEGIN ***/\nexport const urlutils = (function () {\n var mimetypes = {\n xsl: \"text/html\",\n html: \"text/html\",\n docx: \"application/msword\",\n pdf: \"application/pdf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n rtf: \"application/rtf\",\n doc: \"application/msword\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\"\n };\n function caseReport(casus) {\n return fromApiServer(\"report?\" + Vars.querify(Vars.SESSION_KEYS, casus));\n }\n function getFiles(casus) {\n return \"getfiles?\" + Vars.querify(Vars.SESSION_KEYS, casus);\n }\n function isJS(url) {\n return url.match(/javascript:/);\n }\n function isEmptyish(url) {\n return url[0] === \"?\";\n }\n var JSAlertMessage =\n \"ALERT:\\nIt looks like someone is trying to eavesdrop on you,\" +\n \" trying to evaluate JavaScript code. \" +\n \"This person may want to steal private information \" +\n \"from you or other persons. \" +\n \"For your safety and that of others, \" +\n \"please contact this website \" +\n \"to report this message.\";\n return {\n isJS,\n isEmptyish,\n JSAlertMessage,\n getFiles,\n caseReport,\n mimetype: function (url) {\n const absoluteURL = new URL(\n fromApiServer(url),\n `${location.protocol}${location.host}${location.pathname}`\n );\n const filename = absoluteURL.pathname.endsWith(\"/getfile\")\n ? new URLSearchParams(absoluteURL.search).get(\"filename\")\n : absoluteURL.pathname.split(\"/\").pop();\n if (!filename) return null;\n const ext = filename.match(/\\.([^?.]+)$/),\n mimetype = ext && mimetypes[ext[1]];\n if (!mimetype) return null;\n return {\n mimetype: mimetype,\n ext: ext[1]\n };\n }\n };\n})();\n/*** URL UTILITIES END ***/\n","/* global $ */\nimport { html, render } from \"lit\";\nimport { Maybe } from \"@cahmoraes93/maybe\";\nimport { A11y, observeDatepickers } from \"./a11y.js\";\nimport { conf, propFinder } from \"./conf.js\";\nimport { wControl, getControl } from \"./control.js\";\nimport { quotable } from \"./quotable.js\";\nimport {\n isLabel,\n isOption,\n isQuestion,\n isReadOnly,\n renderAttribs,\n setAttribs\n} from \"./control-helpers.js\";\nimport { checkDate, onChangeDate, parseDate, leadWithZeroes } from \"./dates.js\";\nimport { escapeHTML } from \"./escape.js\";\nimport { registerWidget } from \"./form-widgets.js\";\nimport {\n allPass,\n always,\n applyTo,\n both,\n compose,\n chain,\n dec,\n dissoc,\n find,\n F,\n gt,\n head,\n has,\n ifElse,\n inc,\n join,\n map,\n mergeLeft,\n path,\n propEq,\n when,\n pathEq,\n reverse,\n pipe,\n lensPath,\n lensProp,\n over,\n append,\n assoc,\n infichain,\n toLower,\n omit,\n nth,\n prop,\n propOr,\n equals,\n tap\n} from \"./functional.js\";\n\nimport { _ } from \"./gettext.js\";\nimport { fromApiServer } from \"./location.js\";\nimport { forceInRange, Numerals } from \"./numerals.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { urlutils } from \"./url-utils.js\";\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n\nfunction disconnectValue({ input, value, filter = x => x }) {\n input.setAttribute(\"data-server-value\", value);\n $(input).on(\"change\", function () {\n try {\n var newVal = filter(input.value, input);\n } catch (e) {\n //\n } finally {\n if (typeof newVal !== \"undefined\") {\n input.setAttribute(\"data-server-value\", newVal);\n }\n }\n });\n}\n\nconst noAttribs = always({});\n\nconst omitName = dissoc(\"name\");\nconst omitRequired = dissoc(\"aria-required\");\n\nconst emptyTag = (tagName, attribs) => {\n const elt = document.createElement(tagName);\n setAttribs(elt, attribs);\n return elt;\n};\nconst valueInside = (control, attribs, tagName) => {\n const elt = emptyTag(tagName, attribs);\n if (tagName === \"textarea\") {\n elt.value = control.value;\n } else {\n elt.innerHTML =\n control.text || escapeHTML(control.value).replace(/\\r?\\n/g, \"
\");\n }\n return elt;\n};\n\nconst checkbox = {\n name: \"checkbox\",\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n {\n type: \"checkbox\"\n },\n //Interface already has got a value server-side, so not\n //sending it back poses no problem.\n control.value && { checked: true }\n ),\n setValue: (input, value, requestor) => {\n input.checked = value;\n },\n layout: \"inline\"\n};\n\nregisterWidget(checkbox);\n\nconst picture = {\n name: \"picture\",\n render: (control, group, attribs) => emptyTag(\"img\", attribs),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n alt: control.alttext,\n src: fromApiServer(control.filename)\n })\n};\n\nregisterWidget(picture);\n\nexport const edit = {\n name: \"edit\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"text\",\n autocomplete: \"off\",\n value: control.value\n }),\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n setValue: (input, value) => {\n input.value = value;\n },\n layout: \"aside\"\n};\n\nregisterWidget(edit);\n\nconst memo = {\n name: \"memo\",\n attribs: (attr, control, enabled) => {\n // const attribs = [\"name\", control.name];\n // if (control.width && control.height && control[\"font-size\"]) {\n // attribs.cols= parseInt(control.width / (control[\"font-size\"] * 0.75))\n // attribs.rows = parseInt(control.height / (control[\"font-size\"] * 1.5))\n // }\n // return [...attr, ...attribs];\n return attr;\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"textarea\");\n },\n setValue: edit.setValue,\n layout: \"below\"\n};\n\nregisterWidget(memo);\n\nconst label = {\n name: \"label\",\n fixup: control => {\n control.value = (control.value || \"\").replace(/\\r\\n/g, \"\\n\"); // Normalize Windows-style (typewriter) newlines\n return control;\n },\n attribs: (attr, control, enabled) =>\n Object.assign(\n omitName(attr),\n enabled && control.isFor && { for: control.isFor },\n {\n class: `${\n control.isfor || has(\"colname\", control) ? \"bb-label\" : \"bb-text\"\n } bb-md-able`\n }\n ),\n render: (control, group, attribs) => {\n return valueInside(\n control,\n attribs,\n control._subtype === \"heading\"\n ? \"h\" + Math.min(6, control._level || 2)\n : control.isFor\n ? \"label\"\n : \"div\"\n );\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n }\n};\n\nregisterWidget(label);\n\nexport const linklabel = {\n name: \"linklabel\",\n fixup: control => {\n control.value = control.value.trim();\n // Fix 'empty' or JS-links\n if (urlutils.isEmptyish(control.url) || urlutils.isJS(control.url)) {\n if (urlutils.isJS(control.url)) control.value = urlutils.JSAlertMessage;\n delete control.url;\n }\n return control;\n },\n attribs: (attr, control, enabled) => {\n let linkClassName = \"\";\n\n if (control.url) {\n attr[\"href\"] = fromApiServer(control.url);\n if (control.url.match(/mailto:/)) {\n attr[\"type\"] = \"email\";\n linkClassName = \"mail\";\n } else {\n linkClassName = \"bb-external\";\n if (control.isreport) linkClassName += \" report\";\n var mimetype = control.mimetype || urlutils.mimetype(control.url);\n if (mimetype) {\n attr[\"type\"] = mimetype.mimetype;\n linkClassName += \" \" + mimetype.ext;\n }\n }\n if (control.url[0] !== \"#\") attr[\"target\"] = \"_blank\";\n }\n linkClassName += \" bb-text\";\n attr[\"class\"] = linkClassName;\n return omitName(attr);\n },\n render: (control, group, attribs) => {\n return valueInside(control, attribs, \"a\");\n },\n setValue: (input, value) => {\n input.innerHTML = escapeHTML(value).replace(/\\r?\\n/g, \"
\");\n },\n layout: \"below\"\n};\n\nregisterWidget(linklabel);\n\nconst listlabel = {\n name: \"listlabel\",\n attribs: compose(\n omitName,\n omitRequired,\n mergeLeft({\n type: \"listlabel\",\n class: \"listlabel\"\n })\n ),\n item: item =>\n `
  • ${escapeHTML(item).replace(/\\\\n/g, \"
    \")}
  • `,\n render: (control, group, attribs) => {\n const value = control.value;\n const items = compose(join(\"\"), map(listlabel.item))(value);\n const widget = `
      \n${items}
    `;\n return $(widget);\n },\n setValue: (input, value, requestor) => {\n input.innerHTML = compose(join(\"\"), map(listlabel.item))(value);\n $.fn.showdown && $(input).find(\"li\").showdown();\n },\n layout: \"below\"\n};\n\nregisterWidget(listlabel);\n\nconst optionbox = {\n render: (control, group, attribs) => {\n const value = control.value;\n const widget = $(``);\n // Set head of drop-down list to an empty item.\n // If value[0].value is already the empty string, the server\n // has already done this for us (pre 4.7 or dataset-based\n // drop-down).\n // If one of the options has already been selected, do *not*\n // add this empty option.\n // @todo: remove this code once server release 4.7 or higher\n // runs everywhere.\n if (\n control.controltype === \"combobox\" &&\n value.length > 0 &&\n value[0].value !== \"\" &&\n !value.some(function (value) {\n return value.selected === true;\n })\n ) {\n value.unshift({ option: \"\", value: \"\" });\n }\n optionbox.setValue(widget.get(0), value);\n return widget;\n },\n setValue: (input, value) => {\n const options = [...input.querySelectorAll(\"option\")];\n const len = options.length;\n const newLen = value.length;\n const newOptions = input.append ? [] : null;\n let selectedValue = \"\";\n for (let i = 0; i < newLen; i++) {\n const option = value[i];\n const optionElt = options[i] || document.createElement(\"option\");\n optionElt.value = option.value;\n optionElt.textContent =\n value[i].value === \"\" ? _(\"Choose...\") : option.option;\n optionElt.classList.toggle(\"bb-valueless\", option.value === \"\");\n if (option.selected) {\n selectedValue = option.value;\n }\n if (i > len - 1) {\n if (newOptions) {\n newOptions.push(optionElt);\n } else {\n input.appendChild(optionElt);\n }\n }\n }\n if (newOptions.length) {\n input.append(...newOptions);\n } else if (newLen < len) {\n [...input.querySelectorAll(`option:nth-child(1n+${newLen + 1})`)].forEach(\n input => input.parentNode.removeChild(input)\n );\n }\n input.value = selectedValue;\n }\n};\n\nconst combobox = {\n name: \"combobox\",\n // fixup: control => {\n // if (control.freetext === true) {\n // control.controltype = \"edit\";\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n // }\n // return control;\n // },\n fixup: control => {\n if (control.freetext === true) {\n control.controltype = \"freebox\";\n\n // control.datalist = control.value.map(({ option }) => option);\n // control.placeholder = _(\"Choose or type...\");\n // let val = control.value.find(v => v.selected);\n // if (val) control.value = val.option;\n // else control.value = \"\";\n }\n return control;\n },\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: 1\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(combobox);\n\nconst listbox = {\n name: \"listbox\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length\n }),\n render: optionbox.render,\n setValue: optionbox.setValue,\n layout: \"below\"\n};\n\nregisterWidget(listbox);\n\nconst multilist = {\n name: \"multilist\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n name: control.name,\n size: control.value.length,\n multiple: \"multiple\"\n }),\n render: optionbox.render,\n setValue: (input, value, requestor) => {\n const selected = value.find(option => option.selected === true);\n input.value = selected.value;\n },\n layout: \"below\"\n};\n\nregisterWidget(multilist);\n\nconst optionlist = {\n render: (control, group, attribs) => {\n const value = control.value;\n if (value.length === 0) return null;\n const widget = $(`
      `);\n for (let i = 0; i < value.length; i++) {\n let id = control.id + \"-\" + i;\n var option = $(`\n
    • \n \n
    • \n `);\n widget.append(option);\n widget.find(\"input:last\").val(value[i].value);\n }\n return widget;\n },\n onrequired: (input, required) => {\n // $(input).find(\"input\").attr(\"aria-required\", required);\n },\n onreadonly: (list, readonly) => {\n list.classList.toggle(\"bb-disabled\", readonly);\n [...list.querySelectorAll(\"input\")].forEach(input => {\n input.disabled = readonly;\n });\n }\n};\n\nconst checklist = {\n name: \"checkmultilist\",\n attribs: compose(omitRequired, assoc(\"class\", \"checklist bb-option-list\")),\n render: optionlist.render,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n allowUpdatingSelf: true,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n value.forEach(({ selected }, index) => {\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n if (!option) return;\n if (option.checked !== selected) option.checked = selected;\n $(option).trigger(\"programmatically-changed\");\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(checklist);\n\nconst radiolist = {\n name: \"radio\",\n attribs: compose(omitRequired, assoc(\"class\", \"radiogroup bb-option-list\")),\n render: optionlist.render,\n allowUpdatingSelf: true,\n onrequired: optionlist.onrequired,\n onreadonly: optionlist.onreadonly,\n setValue: (input, value, requestor) => {\n const control = $(input).data(\"control\");\n const index = value.findIndex(option => option.selected === true);\n if (index === -1) {\n input.querySelectorAll(`[id|=\"${control.id}\"]`).forEach(i => {\n i.checked = false;\n i.closest(\".bb-option\").classList.remove(\"checked\");\n });\n return;\n }\n const option = input.querySelector(`[id=\"${control.id}-${index}\"]`);\n option.checked = true;\n $(option).trigger(\"programmatically-changed\");\n },\n layout: \"below\"\n};\n\nregisterWidget(radiolist);\n\nconst datepicker = {\n name: \"datetimepicker\",\n couldWrap: true,\n fixup: control => {\n control.placeholder = _(\"dateplaceholder\");\n return control;\n },\n serverToWidgetValue: value =>\n $.datepicker.formatDate(\n $.datepicker._defaults.dateFormat,\n parseDate(value)\n ),\n widgetToServerValue: input =>\n leadWithZeroes(\n $.datepicker.formatDate(\"yy-mm-dd\", $(input).datepicker(\"getDate\"))\n ),\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n value: datepicker.serverToWidgetValue(control.value),\n autocomplete: \"off\",\n placeholder: _(\"dateplaceholder\", _(\"select date\")),\n type: \"text\"\n }),\n render: (control, group, attribs) => {\n return emptyTag(\"input\", attribs);\n },\n afterRender: (widget, control) => {\n if (!control.originalreadonly || control.dynamic) {\n widget.datepicker();\n observeDatepickers();\n\n control._elt.addEventListener(\"change\", onChangeDate);\n control._elt.addEventListener(\n \"keydown\",\n when(propEq(\"key\", \"Enter\"), () => {\n const ev = new InputEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n view: window\n });\n control._elt.dispatchEvent(ev);\n })\n );\n\n disconnectValue({\n input: widget.get(0),\n filter: function (value, input) {\n return datepicker.widgetToServerValue(input);\n },\n value: control.value\n });\n widget.datepicker(\"widget\").hide();\n }\n },\n setValue: (input, value) => {\n input.setAttribute(\"data-server-value\", value);\n input.value = datepicker.serverToWidgetValue(value);\n },\n validate: (control, value) => {\n if (!control.notnull && (value || \"\").trim() === \"\") {\n // Side effect\n $($(control.$elt).datepicker(\"option\", \"altField\")).attr(\"value\", \"\");\n }\n return checkDate(control, value);\n },\n layout: \"aside\"\n};\n\nregisterWidget(datepicker);\n\nconst numedit = {\n name: \"numedit\",\n couldWrap: true,\n getMaxChars: control => {\n var max, min;\n if (has(\"maximum\", control))\n max = Numerals.formatter(\n control.maximum.toFixed(control.precision)\n ).length;\n if (has(\"minimum\", control))\n min = Numerals.formatter(\n control.minimum.toFixed(control.precision)\n ).length;\n if (typeof min === \"undefined\") return max;\n if (typeof max === \"undefined\") return undefined;\n return Math.max(max, min);\n },\n serverToWidgetValue: value => Numerals.formatter(value),\n // widgetToServerValue: input => input.value,\n attribs: (attr, control, enabled) => {\n const maxchars = numedit.getMaxChars(control);\n return Object.assign(\n {},\n attr,\n {\n type: \"text\",\n class: \"numedit\",\n autocomplete: \"off\",\n name: control.name, // Prevent bug (in JSON grid) (see mantis#5416)\n // value = control.value = parseFloat(control.value || 0);\n value: parseFloat(control.value || 0).toFixed(control.precision)\n },\n // maxchars -- not to be confused with maxlength, which used\n // for validation. This is just to aid layout decisions.\n maxchars && { \"data-maxchars\": maxchars }\n );\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n widget.data(\"anchor\", widget.spinner(control));\n },\n setValue: (input, value) => {\n const control = $.data(input, \"control\");\n input.value = numedit.serverToWidgetValue(\n parseFloat(value || 0).toFixed(control.precision)\n );\n },\n validate: function (control, value) {\n if (control.controltype !== \"numedit\")\n throw \"_validateNumber called on something not a number\";\n const metadata = control.metadata || {};\n var val;\n try {\n val = Numerals.parser(value);\n } catch (e) {\n throw new Error(\n format(\n metadata.errnuminvalid || _(\"Invalid number\"),\n compose(assoc(\"value\", value), numedit.quotable)(control)\n )\n );\n }\n control.hasMax = has(\"maximum\", control);\n control.hasMin = has(\"minimum\", control);\n try {\n if (typeof val !== \"number\")\n throw metadata.errnuminvalid || _(\"Invalid number\");\n if (control.hasMax && control.hasMin) {\n if (val < control.minimum || val > control.maximum) {\n throw (\n metadata.errnumnotinrange ||\n _(\"Value has to lie between {minimum} and {maximum}\")\n );\n }\n } else if (control.hasMax) {\n if (val > control.maximum) {\n if (control.maximum === 0)\n throw (\n metadata.errnumnotnegativeorzero ||\n _(\"Negative number or zero expected\")\n );\n else if (control.maximum === -1)\n throw metadata.errnumnotnegative || _(\"Negative number expected\");\n else\n throw (\n metadata.errnumabovemaximum ||\n _(\"Value has to lie below {maximum}\")\n );\n }\n } else if (control.hasMin) {\n if (val < control.minimum) {\n if (control.minimum === 0)\n throw (\n metadata.errnumnotpositiveorzero ||\n _(\"Positive number or zero expected\")\n );\n else if (control.minimum === 1)\n throw metadata.errnumnotpositive || _(\"Positive number expected\");\n else\n throw (\n metadata.errnumbelowminimum ||\n _(\"Value has to lie above {minimum}\")\n );\n }\n }\n } catch (e) {\n throw formatPlus(\n e,\n compose(assoc(\"value\", value), numedit.quotable)(control)\n );\n }\n\n return true;\n },\n quotable: compose(\n when(has(\"minimum\"), over(lensProp(\"minimum\"), Numerals.formatter)),\n when(has(\"maximum\"), over(lensProp(\"maximum\"), Numerals.formatter)),\n when(\n has(\"minimum\"),\n chain(assoc(\"minimum-1\"), compose(dec, prop(\"minimum\")))\n ),\n when(\n has(\"maximum\"),\n chain(assoc(\"maximum+1\"), compose(inc, prop(\"maximum\")))\n ),\n quotable\n ),\n layout: \"aside\"\n};\n\nregisterWidget(numedit);\n\nconst freebox = {\n name: \"freebox\",\n couldWrap: true,\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n \"type\": \"text\",\n \"data-type\": control.controltype,\n \"list\": `${control.id}-list`,\n \"placeholder\": _(\"Choose...\"),\n \"value\": freebox._realValue(control.value)\n }),\n _realValue: compose(propOr(\"\", \"option\"), find(prop(\"selected\"))),\n setValue: function (input, value, requestor) {\n input.value = freebox._realValue(value);\n },\n render: (control, group, attribs) => emptyTag(\"input\", attribs),\n afterRender: (widget, control) => {\n control._elt.insertAdjacentHTML(\n \"afterEnd\",\n `\n${control.value\n .map(({ option }) => `\n`\n );\n },\n layout: \"aside\"\n};\n\nregisterWidget(freebox);\n\nconst _radioButtonWidget = {\n name: \"radiobutton\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"radio\", value: control.value },\n control.selected && { checked: \"checked\" }\n ),\n render: $.noop\n};\n\nregisterWidget(_radioButtonWidget);\n\nconst _rangeWidget = {\n name: \"range\",\n tagName: \"input\",\n attribs: (attr, control, enabled) =>\n Object.assign({}, attr, {\n type: \"range\",\n value: control.value\n }),\n render: $.noop,\n layout: \"aside\"\n};\n\nregisterWidget(_rangeWidget);\n\nconst _buttonWidget = {\n name: \"button\",\n attribs: (attr, control, enabled) =>\n Object.assign(\n {},\n attr,\n { type: \"submit\", value: control.value },\n control.label && { \"aria-label\": control.label }\n ),\n render: (control, group, attribs) => valueInside(control, attribs, \"button\"),\n setValue: (elt, value, requestor, Updates) => {\n if (has(\"text\", Updates)) elt.innerHTML = Updates.text.to;\n if (has(\"value\", Updates)) elt.value = Updates.value.to;\n elt.classList.toggle(\"bb-record-del\", Updates.value.to.endsWith(\"-\"));\n elt.classList.toggle(\"bb-record-add\", Updates.value.to.endsWith(\"+\"));\n }\n};\n\nregisterWidget(_buttonWidget);\n\nconst _legendWidget = {\n name: \"legend\",\n tagName: \"legend\",\n attribs: noAttribs,\n\n render: function (control, widget, group) {\n var level;\n if (!conf.a11y.strictlegends && control._subtype === \"heading\") {\n level = Math.min(6, control._level || 2);\n // Trim value and control.value itself as well.\n widget.html(\n \"' +\n escapeHTML(control.value.trim()) +\n \"\"\n );\n } else {\n widget.text(control.value);\n widget.addClass(\"bb-md-able\");\n }\n }\n};\n\nregisterWidget(_legendWidget);\n\nconst _captionWidget = {\n name: \"caption\",\n tagName: \"caption\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value.trim());\n widget.addClass(\"bb-md-able\");\n }\n};\n\nregisterWidget(_captionWidget);\n\nconst _alertWidget = {\n name: \"alert\",\n tagName: \"p\",\n attribs: noAttribs,\n render: function (control, widget, group) {\n widget.text(control.value);\n // Yup, this widget exists mainly for this\n // side-effect -- setting role=\"alert\",\n // aria-live=\"assertive\" does not do the\n // trick - and forcing focus looks ugly too.\n A11y.log(control.value);\n }\n};\n\nregisterWidget(_alertWidget);\n\nexport const grid = {\n name: \"grid\",\n attribs: compose(omitRequired, omitName),\n item: item =>\n `
    • ${escapeHTML(item).replace(/\\\\n/g, \"
      \")}
    • `,\n renderable: control => {\n const copy = assoc(\n \"addPlacement\",\n !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\",\n control\n );\n return pipe(\n when(\n propEq(\"addPlacement\", \"insert\"),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n text: `${\n (control.metadata && control.metadata.insertbuttontext) ||\n _(\"insert row\")\n }+`,\n name: \"update\",\n className: \"bb-record-add\",\n readonly: false,\n label: _(\"insert row\")\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name +\n \".\" +\n ((control.offset || 0) + i + 1) +\n \".\" +\n \"+\"\n },\n row\n )\n )\n )\n )\n ),\n when(\n propEq(\"deleteallowed\", true),\n compose(\n over(\n lensProp(\"columns\"),\n append({\n controltype: \"button\",\n name: \"update\",\n className: \"bb-record-del\",\n readonly:\n !control.notnull ||\n control.value.length > 1 ||\n (control.showcolumns && control.addallowed)\n ? false\n : true,\n text: `${\n (control.metadata && control.metadata.deletebuttontext) ||\n _(\"delete row\")\n }-`\n })\n ),\n over(\n lensProp(\"value\"),\n map((row, i) =>\n append(\n {\n value:\n control.name + \".\" + ((control.offset || 0) + i) + \".\" + \"-\"\n },\n row\n )\n )\n )\n )\n ),\n infichain([\n prop(\"columns\"),\n (columns, grid) => {\n return over(\n lensProp(\"value\"),\n map((row, row_i) =>\n map((cell, cell_i) =>\n compose(\n when(\n both(prop(\"colname\"), isQuestion),\n assoc(\"aria\", { labelledby: `${control.id}-col-${cell_i}` })\n ),\n when(prop(\"colname\"), cell =>\n assoc(\"meta\", { label: cell.colname }, cell)\n ),\n cell =>\n Object.assign(\n {},\n columns[cell_i],\n {\n id:\n control.id +\n \"-\" +\n ((control.offset || 0) + row_i) +\n \"-\" +\n cell_i\n },\n cell\n ),\n assoc(\"_row_index\", (control.offset || 0) + row_i),\n assoc(\"_cell_index\", cell_i)\n )(cell)\n )(row)\n ),\n grid\n );\n }\n ]),\n over(\n lensProp(\"columns\"),\n map((col, col_i) => assoc(\"id\", `${control.id}-col-${col_i}`, col))\n ),\n over(\n lensProp(\"value\"),\n map(\n map((cell, cell_i, cells) =>\n compose(\n assoc(\"_tag\", grid.cellTag(cell, cells)),\n when(\n allPass([\n isLabel,\n pipe(prop(\"_cell_index\"), gt, applyTo(0)),\n () => isOption(cells[cell_i - 1])\n ]),\n cell => assoc(\"isFor\", cells[cell_i - 1].id, cell)\n ),\n when(\n allPass([\n isOption,\n propEq(\"_cell_index\", 0),\n () => isLabel(cells[cell_i + 1])\n ]),\n cell =>\n over(\n lensPath([\"aria\", \"labelledby\"]),\n col_id => `${cells[cell_i + 1].id} ${col_id || \"\"}`,\n cell\n )\n )\n )(cell)\n )\n )\n )\n )(copy);\n },\n cellTag: (cell, row) => {\n return cell.value === null\n ? null\n : cell._rowspan && cell._cell_index === 0 && row.length > 1\n ? \"th\"\n : \"td\";\n },\n columnheader: column => {\n const header = document.createElement(\"th\");\n header.classList.add(\"bb-md-able\");\n header.setAttribute(\"data-rowtype\", column.controltype);\n header.setAttribute(\"data-rowreadonly\", Boolean(column.readonly));\n if (has(\"colname\", column)) {\n header.innerText = column.colname;\n header.id = column.id;\n }\n return header;\n },\n colheaderids: ifElse(\n prop(\"showcolumns\"),\n compose(\n map(ifElse(propEq(\"controltype\", \"button\"), F, prop(\"id\"))),\n prop(\"columns\")\n ),\n compose(map(F), prop(\"columns\"))\n ),\n rowheaderid: (rows, i) => {\n const rows_up_to_here = rows.slice(0, i + 1);\n return compose(\n prop(\"value\"),\n map(compose(id => `${id}--cell`, prop(\"id\"), head)),\n Maybe.of,\n find(pathEq([0, \"_tag\"], \"th\")),\n reverse\n )(rows_up_to_here);\n },\n cell: cell => {\n const tag = cell._tag;\n const e_cell =\n tag === null\n ? document.createComment(\"empty cell\")\n : document.createElement(tag);\n if (tag === \"th\") {\n e_cell.id = `${cell.id}--cell`;\n }\n return e_cell;\n },\n cellSetAttributes: (e_cell, cell) => {\n if (cell._tag === null) return e_cell;\n if (cell._tag === \"th\") e_cell.setAttribute(\"scope\", \"row\");\n if (cell._rowspan > 1) e_cell.setAttribute(\"rowspan\", cell._rowspan);\n else e_cell.removeAttribute(\"rowspan\");\n if (cell.headers) e_cell.setAttribute(\"headers\", cell.headers);\n else e_cell.removeAttribute(\"headers\");\n if (typeof cell.colname !== \"undefined\")\n e_cell.setAttribute(\"data-column\", cell.colname);\n else e_cell.removeAttribute(\"data-column\");\n e_cell.classList.add(\"nth-child-\" + (cell._cell_index + 1));\n if (cell.value === \"\")\n e_cell.classList.toggle(\n \"empty\",\n cell.controltype === \"label\" && cell.value === \"\"\n ); // IE8 does not support :empty\n\n e_cell.classList.add(\"bb-celltype-\" + cell.controltype);\n return e_cell;\n },\n render: (control, group, attribs) => {\n const widget = $(`
      `);\n control = grid.renderable(control);\n if (control.value.length === 0) {\n widget.addClass(\"bb-empty\");\n }\n if (control.caption) {\n wControl(\n control.caption,\n group,\n widget //append hereto\n );\n }\n if (control.showcolumns) {\n // widget.append($(\"\".repeat(control.columns.length)));\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n thead.append(tr);\n widget.append(thead);\n if (control.value.length > 0)\n tr.append(...control.columns.map(grid.columnheader));\n }\n const e_body = document.createElement(\"tbody\");\n widget.append(e_body);\n const colheaders = grid.colheaderids(control);\n control.value.forEach(function (row, i, rows) {\n // NOTE: control.offset is set by global plugin split-grid.\n // const i = idx + (control.offset || 0);\n const last_spanning_cell_id = grid.rowheaderid(rows, i);\n const e_row = document.createElement(\"tr\");\n if (row.length === 0) return;\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n e_body.appendChild(e_row);\n row.forEach(function (cell, icol) {\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n if (cell.value !== null) {\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(\n cell,\n control._group,\n e_cell //append hereto\n );\n } else {\n e_row.appendChild(document.createComment(\"empty cell\"));\n }\n });\n });\n\n return $(widget);\n },\n afterRender: (widget, control) => {\n const addPlacement = !control.addallowed\n ? \"none\"\n : control.value.length === 0 ||\n arbitraryCoreProp(\"putAddRowButtonBelowGrid\")\n ? \"below\"\n : \"insert\";\n if (addPlacement === \"below\") {\n const gridAddButton = ``;\n widget.get(0).insertAdjacentHTML(\"afterEnd\", gridAddButton);\n // $(widget.in.append(widget, gridAddButton);\n }\n },\n setValue: (e_grid, value, requestor, updates) => {\n // if (grid.contains(requestor))\n const control = $.data(e_grid, \"control\");\n const old = compose(\n grid.renderable,\n assoc(\"value\", updates[\"value\"].from),\n assoc(\"columns\", updates[\"columns\"].from)\n )(control);\n\n const now = grid.renderable(control);\n // Remove spurious row\n [\n ...e_grid.querySelectorAll(\n `tbody tr:nth-child(1n + ${now.value.length + 1})`\n )\n ].forEach(row => row.remove());\n // Remove spurious 'cells' (also empty cell comments)\n [...e_grid.querySelectorAll(`tbody tr`)].forEach(row => {\n let cell;\n while (((cell = row.childNodes[now.columns.length]), cell)) {\n cell.remove();\n }\n });\n\n if (\n !equals(old.columns, now.columns) ||\n (old.value.length === 0 && now.value.length !== 0) ||\n (old.value.length !== 0 && now.value.length === 0)\n ) {\n // Remove ALL column headers (re-created)\n [...e_grid.querySelectorAll(`thead tr th`)].forEach(colheader =>\n colheader.remove()\n );\n\n if (now.showcolumns && now.value.length > 0)\n now.columns // .slice(old.columns.length)\n .forEach(function (column) {\n e_grid.querySelector(\"thead tr\").append(grid.columnheader(column));\n });\n }\n\n const colheaders = grid.colheaderids(now);\n now.value.forEach((row, irow, rows) => {\n let e_row = e_grid.querySelector(`tbody tr:nth-child(${irow + 1})`);\n if (e_row === null) {\n e_row = document.createElement(\"tr\");\n e_grid.tBodies[0].append(e_row);\n }\n e_row.classList.toggle(\"bb-newscope\", row[0]._tag === \"th\");\n const last_spanning_cell_id = grid.rowheaderid(rows, irow);\n row.forEach((cell, icol) => {\n const cellInput = e_grid.querySelector(`[id=\"${cell.id}\"]`);\n const oldcell = old.value[irow] && old.value[irow][icol];\n const rowheader = cell._tag === \"td\" ? last_spanning_cell_id : false;\n const headers = [rowheader, colheaders[icol]].filter(Boolean).join(\" \");\n const cellWithHeaders = {\n ...cell,\n headers\n };\n const spot = e_row.childNodes[icol];\n if (!spot) {\n // NEW => Add at end\n const e_cell = grid.cell(cell);\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n e_row.appendChild(e_cell);\n wControl(cell, control._group, e_cell);\n return;\n }\n if (\n cell.controltype !== oldcell.controltype ||\n cell._tag !== oldcell._tag\n ) {\n // REPLACE\n let e_cell;\n if (cell._tag !== oldcell._tag) {\n e_cell = grid.cell(cell);\n spot.replaceWith(e_cell);\n } else {\n // Re-use old cell\n e_cell = spot;\n if (cell._tag !== null) {\n e_cell.classList.remove(\"bb-celltype-\" + oldcell.controltype);\n e_cell.innerHTML = \"\";\n }\n }\n if (cell._tag !== null) {\n grid.cellSetAttributes(e_cell, cellWithHeaders);\n wControl(cell, control._group, e_cell);\n }\n return;\n }\n if (cell._tag === null) return;\n // UPDATE\n grid.cellSetAttributes(spot, cellWithHeaders);\n const cellControl = $.data(cellInput, \"control\");\n if (!cellControl) return;\n if (cell.value !== cellControl.value) {\n $(cellInput).updateControl(\n [\n Object.assign({}, cellControl, {\n value: cell.value,\n text: cell.text\n })\n ],\n requestor\n );\n }\n });\n });\n },\n onrequired: (grid, required) => {},\n onreadonly: (grid, readonly) => {\n grid.classList.toggle(\"bb-disabled\", readonly);\n [...grid.querySelectorAll(\"input, textarea, button\")].forEach(input => {\n input.disabled =\n readonly || compose(ifElse(Boolean, isReadOnly, F), getControl)(input);\n });\n },\n layout: \"below\"\n};\n\nregisterWidget(grid);\n\n$.fn.extend({\n /**\n * Widgetize as numedit\n */\n spinner: function (control) {\n control = control || {};\n var _interval = 250,\n interval = _interval,\n timer = null,\n me = this,\n val = Numerals.formatter(me.val()),\n $this = $(this),\n $anchor = $this;\n\n function mustAddButtons() {\n return !(arbitraryCoreProp(\"skipNumButtons\") === true);\n }\n\n function addButtons($input, control) {\n var buttontemplate =\n '
      ' +\n '
      ' +\n '
      ' +\n \"
      \";\n $input\n .wrapAll('
      ')\n .after(buttontemplate);\n $input.parents(\".bb-num\").data(\"control\", control);\n $input\n .next()\n .find(\".bb-num-down, .bb-num-up\")\n .on(\"click\", adjustOnce)\n .on(\"mousedown\", keepAdjusting)\n .on(\"mouseup mouseout\", stopAdjusting);\n\n return $input.parent();\n }\n\n function adjust(diff) {\n var parsed, val;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n $this.validate(); // Let validate() handle\n // showing of errors\n }\n if (typeof parsed === \"undefined\") return;\n // A diff of 0 is just used for the sake of formatting - so do\n // not force the number to be in range.\n val = (\n diff === 0\n ? parseFloat(parsed - diff)\n : forceInRange(\n parseFloat(parsed - diff),\n control.minimum,\n control.maximum\n )\n ).toFixed(control.precision || 0);\n\n me.val(Numerals.formatter(val));\n\n //if (val == \"NaN\") val = \"\";\n $this.validate(); // Validate just for the sake\n // of getting away the error\n // message\n if (me.data(\"orgval\") !== me.val()) me.trigger(\"change\");\n $this.data(\"orgval\", $this.val());\n }\n\n $this\n .data(\"orgval\", val) // Remember the original value\n .val(val)\n .on(\"keydown\", function (e) {\n var key = e.keyCode;\n if (key === 38 || key === 40) {\n var diff = key === 38 ? -1 : 1;\n adjust(diff);\n }\n if (key === 13) {\n adjust(0);\n }\n })\n .on(\"click\", function () {\n let parsed;\n try {\n parsed = Numerals.parser(me.val());\n } catch (err) {\n //\n } finally {\n if (parsed === 0) $this.val(\"\");\n }\n })\n .on(\"blur\", function () {\n let orgval = $this.val();\n adjust(0);\n if ($this.val() !== orgval) {\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n // Set orgval for future changes.\n $this.data(\"orgval\", $this.val());\n });\n\n function keepAdjusting() {\n var thing = $(this);\n var diff = thing.hasClass(\"bb-num-down\") ? 1 : -1;\n timer = window.setTimeout(function () {\n adjust(diff);\n if (interval > 20) interval = interval - 10;\n thing.trigger(\"mousedown\");\n }, interval);\n }\n\n function adjustOnce() {\n var diff = $(this).hasClass(\"bb-num-down\") ? 1 : -1;\n adjust(diff);\n }\n\n function stopAdjusting() {\n window.clearTimeout(timer);\n interval = _interval;\n return false; // prevent text selection\n }\n\n if (mustAddButtons()) $anchor = addButtons($this, control);\n\n disconnectValue({\n input: $this.get(0),\n filter: Numerals.parser,\n value: control.value\n });\n $this.on(\"change\", function (_event, data) {\n if (!prop(\"programmatically\", data)) $this.validate();\n });\n return $anchor;\n }\n});\n","import { compose, find, propEq, prop, map, filter } from \"./functional\";\n\nexport const collectAttributes = (prefix, elt) =>\n compose(\n Object.fromEntries,\n map(({ name, value }) => [name.substr(prefix.length), value]),\n filter(({ name, value }) => name.startsWith(prefix)),\n x => [...x]\n )(elt.attributes);\n\nexport const currentGroup = compose(\n find(propEq(\"current\", true)),\n prop(\"groups\")\n);\n","import { escapeHTML } from \"./escape.js\";\nimport {\n choose,\n compose,\n equals,\n findIndex,\n T,\n identity,\n slice\n} from \"$json/lib/functional.js\";\n\nconst times = (string, integer) => string.repeat(integer);\n\n/*** JUMPLIST BEGIN ***/\nfunction hasselectedbelowlevel(jumplist, level) {\n if (jumplist.length == 0) return false;\n if (jumplist[0].level <= level) return false;\n if (jumplist[0].status == \"selected\") return true;\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\nfunction hasselectedbelow(jumplist) {\n return hasselectedbelowlevel(jumplist.slice(1), jumplist[0].level);\n}\n\nconst ariaCurrentAttrib = jumplist =>\n jumplist.status === \"selected\" ? ` aria-current=\"step\"` : \"\";\n\nconst chapterDataAttrib = jumplist =>\n !jumplist.ischapter ? \"\" : `data-chapterstatus=${jumplist.chapterstatus}`;\n\nfunction bakeInnerList(jumplist, level = 0, containsselection) {\n if (!(jumplist instanceof Array)) {\n return (\n (jumplist.level > level\n ? times(\n `<${Jumplist.type}>
    • `,\n jumplist.level - level\n )\n : jumplist.level < level\n ? times(`
    • `, level - jumplist.level) +\n `
    • `\n : `
    • `) +\n `${escapeHTML(\n jumplist.screentitle.trim()\n )}`\n );\n }\n if (jumplist.length == 0)\n return \"
    • \" + times(``, level);\n return (\n bakeInnerList(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeInnerList(jumplist.slice(1), jumplist[0].level)\n );\n}\nexport const bakeAsListitems = jumplist => {\n let html = bakeInnerList(jumplist);\n // Odd case of indentation sans parent:\n if ([\"u\", \"o\"].includes(html.charAt(1)))\n return '
    • ' + html + \"
    • \";\n return html;\n};\nfunction bakeAsDropDown(jumplist, level = 0, containsselection) {\n // Implemented recursively so we can make the 'chapter' selected\n if (!(jumplist instanceof Array)) {\n return (\n \"\" +\n times(\" \", level * 2) +\n escapeHTML(jumplist.screentitle.trim()) +\n \"\"\n );\n }\n if (jumplist.length == 0) return \"\";\n return (\n bakeAsDropDown(\n jumplist[0],\n level,\n hasselectedbelow(jumplist, jumplist[0].level)\n ) + bakeAsDropDown(jumplist.slice(1), jumplist[0].level)\n );\n}\n\nconst findCurrentIndex = compose(\n i => (i === -1 ? Infinity : i),\n findIndex(({ status }) => status === \"future\")\n);\n\nexport var Jumplist = new (function () {\n var _jumplist = []; //Save last jumplist\n this.type = \"ul\";\n this.draw = function draw(jumplist) {\n jumplist = jumplist || _jumplist;\n if (jumplist) _jumplist = jumplist;\n $(\n `.bb-jumplist ${Jumplist.type}, .bb-jumplist li, .bb-jumplist-dropdown select`\n ).remove();\n if (jumplist.length) {\n if (\n $(\".bb-jumplist:visible, .bb-jumplist-dropdown:visible\").length === 0\n ) {\n // If we can't rely on CSS to decide the appropriate type\n // of jumplist (happens sometimes onload), draw them both\n drawAsList(jumplist);\n drawAsDropDown(jumplist);\n } else {\n // Draw our standard list:\n if ($(\".bb-jumplist\").is(\":visible\")) drawAsList(jumplist);\n // Also draw the dropdown:\n if ($(\".bb-jumplist-dropdown\").is(\":visible\")) drawAsDropDown(jumplist);\n }\n }\n };\n\n function drawAsList(jumplist) {\n const currentIndex = findCurrentIndex(jumplist);\n $(\".bb-jumplist\").map((i, l) => {\n const slicetype = l.dataset[\"slice\"];\n const itemizer = choose([\n [equals(\"before\"), slice(0, currentIndex)],\n [equals(\"after\"), slice(currentIndex, Infinity)],\n [T, identity]\n ])(slicetype);\n\n const html = bakeAsListitems(itemizer(jumplist));\n $(l).append(\n `<${Jumplist.type} aria-describedby=\"a-jumplist-title\">${html}`\n );\n });\n $(\".bb-jumplist a:last\").addClass(\"last\");\n $(\".bb-jumplist li:last-child\").addClass(\"last-child\"); // aid older browsers\n }\n function drawAsDropDown(jumplist) {\n if (jumplist.length) {\n var html = bakeAsDropDown(jumplist, 0);\n $(\".bb-jumplist-dropdown\").append(\"\");\n }\n }\n\n return this;\n})();\n","import { getVar } from \"./vars.js\";\n\nexport const userinfo = () => getVar(\"userinfo\") || {};\n","import { userinfo } from \"./user-info.js\";\nimport {\n compose,\n either,\n includes,\n prop,\n strictDifference\n} from \"./functional.js\";\n\nexport const PERM_ACCESSALLMODELS = \"accessallmodels\",\n // Allow to access all models\n PERM_ALLOWACCESSCASES = \"allowaccesscases\",\n // Allow to access to all the cases on the server\n PERM_ALLOWACCESSCASESFROMDOMAIN = \"allowaccesscasesfromdomain\",\n // Allow to access all the cases in the same domain on the server\n PERM_ALLOWALLCASEOVERVIEWDOMAIN = \"allowallcaseoverviewdomain\",\n // Allow to see all the cases in same domain on the server\n PERM_ALLOWALLCASESOVERVIEW = \"allowallcasesoverview\",\n // Allow to see all the cases made on the server\n PERM_ALLOWCASEOVERVIEW = \"allowcaseoverview\",\n // Allow to see the cases made by the user on the server\n PERM_ALLOWDOWNLOADCASE = \"allowdownloadcase\",\n // Allow user to download a case from the server\n PERM_ALLOWIPLOGTOUSER = \"allowiplogtouser\",\n // Allow the IP log to be send to the user\n PERM_ALLOWLOGTOUSER = \"allowlogtouser\",\n // Allow the WHOLE log of the server to be send to the user\n\n PERM_ALLOWMISALL = \"allowmisall\",\n // Allow all the MIS data to be shown\n PERM_ALLOWMISDOCUMENTS = \"allowmisdocuments\",\n // Allow the documents of the case to be opened\n PERM_ALLOWMISDOMAIN = \"allowmisdomain\",\n // Allow the MIS data within the same domain to be shown\n PERM_ALLOWMISOWNCASES = \"allowmisowncases\",\n // Allow the MIS data of the own cases to be shown\n\n PERM_ALLOWSAVECASE = \"allowsavecase\",\n // Allow to save a case on the server\n PERM_ALLOWSESSIONLOGTOUSER = \"allowsessionlogtouser\",\n // Allow the log concerning a case to be send to the user\n\n PERM_ALLOWSTARTCASES = \"allowstartcases\",\n // Allow to create a new case on the server\n PERM_PUBLISHMODEL = \"publishmodel\",\n // Allow to publish models to the server\n PERM_SAASCLIENTLOGICWRITABLE = \"saasclientlogicwritable\",\n // Allow users to change texts and logic in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASCLIENTWRITABLE = \"saasclientwritable\",\n // Allow users to change texts of the model in SAAS\tNeeds either updatemodels or updateownmodel to have effect\n PERM_SAASMANAGEPUBLISHINGSERVERS = \"saasmanagepublishingservers\",\n // Allow management of the publishing servers in server\n PERM_UPDATEDOMAINS = \"updatedomains\",\n // Allow to update or delete all the domains on the server (needs update users and models)\n PERM_UPDATEMODELS = \"updatemodels\",\n // Allow to update or delete all the models on the server\n PERM_UPDATEOWNMODEL = \"updateownmodel\",\n // Allow update or delete the models owned by user\n PERM_UPDATEOWNUSER = \"updateownuser\",\n // Allow to update the own user on the server, need this for webadmin access\n PERM_UPDATEROLES = \"updateroles\",\n // Allow to update or delete all the roles on the server\n PERM_UPDATESETTINGS = \"updatesettings\",\n // Allow to update the settings of the server\n PERM_UPDATEUSERS = \"updateusers\",\n // Allow to update or delete all the users on the server\n PERM_GETDATASOURCELIST = \"getdatasourcelist\",\n // Allow retrieving a sparse list of datasources\n PERM_MANAGEDATASOURCES = \"managedatasources\";\n// Allow retrieving, posting, updating, and deleting datasource specs and file\n\n// 4.12 equivalents\nconst oldperms = {\n guest: [PERM_ALLOWSTARTCASES],\n user: [\n PERM_PUBLISHMODEL,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE\n ],\n administrator: [\n PERM_PUBLISHMODEL,\n PERM_ACCESSALLMODELS,\n PERM_UPDATEOWNMODEL,\n PERM_UPDATEDOMAINS,\n PERM_UPDATESETTINGS,\n PERM_UPDATEMODELS,\n PERM_UPDATEUSERS,\n // PERM_UPDATEROLES,\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSTARTCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES,\n PERM_ALLOWMISDOCUMENTS,\n // PERM_SAASCLIENTWRITABLE,\n // PERM_SAASCLIENTLOGICWRITABLE,\n // PERM_SAASMANAGEPUBLISHINGSERVERS,\n // PERM_SAASCLIENTWRITABLE,\n PERM_ALLOWDOWNLOADCASE // ,\n // PERM_MANAGEDATASOURCES\n ],\n viewer: [PERM_ALLOWMISDOMAIN],\n manager: [\n PERM_UPDATEOWNUSER,\n PERM_ALLOWCASEOVERVIEW,\n PERM_ALLOWACCESSCASESFROMDOMAIN,\n PERM_ALLOWACCESSCASES,\n PERM_ALLOWSAVECASE,\n PERM_ALLOWMISOWNCASES // ,\n // PERM_SAASCLIENTWRITABLE\n ],\n vieweradmin: [PERM_ALLOWMISALL, PERM_ALLOWMISDOMAIN, PERM_ALLOWMISDOCUMENTS],\n any: []\n};\n\nexport const permissions = () =>\n compose(\n either(\n prop(\"permissions\"),\n compose(role => oldperms[role] || oldperms[\"any\"], prop(\"role\"))\n ),\n userinfo\n )(null);\n\nexport const hasPermission = perm =>\n perm instanceof Array\n ? strictDifference(perm, permissions()).length === 0\n : includes(perm, permissions());\n\nexport const webadminMakesSense = permissions =>\n permissions.some(perm => perm.startsWith(\"update\"));\n","/* global $, URLSearchParams */\n\nif (\"bb\" in window) {\n throw \"bb was already loaded\";\n}\nimport \"./lib/polyfills/url-search-params.js\";\nimport * as Errors from \"./lib/errors.js\";\nimport { token } from \"./lib/tokens.js\";\nimport { shouldExit } from \"./lib/case-exit.js\";\nimport { A11y } from \"./lib/a11y\";\nimport { Ajax, checkJSON } from \"./lib/ajax.js\";\nimport { BBI } from \"./lib/bbi.js\";\nimport { collectWithin, serializeQuestions } from \"./lib/collect-values.js\";\nimport { conf, propFinder } from \"./lib/conf\";\nimport { wControl, getControl } from \"./lib/control.js\";\nimport { validateInput } from \"./lib/control-validation.js\";\nimport { parseDate, humanDate } from \"./lib/dates\";\nimport { escapeHTML } from \"./lib/escape.js\";\nimport {\n editPolicy,\n mustUpdate,\n canEditEarlier\n} from \"./lib/feature-queries.js\";\nimport { createFormGroup } from \"./lib/form-groups.js\";\nimport \"./lib/form-widgets-definitions.js\";\nimport { setSettled } from \"./lib/settled.js\";\nimport { collectAttributes } from \"./lib/utils\";\nimport {\n any,\n both,\n complement,\n compose,\n either,\n find,\n has,\n ifElse,\n includes,\n map,\n path,\n pathEq,\n prop,\n propEq,\n propOr,\n tap,\n when\n} from \"./lib/functional\";\nimport { doGrouping, groupOuter } from \"./lib/groupings\";\nimport { Jumplist } from \"./lib/jumplist\";\nimport { fromApiServer } from \"./lib/location.js\";\nimport { Mode } from \"./lib/mode.js\";\nimport { Numerals } from \"./lib/numerals.js\";\nimport { notify } from \"./lib/notify.js\";\nimport { permissions, webadminMakesSense } from \"./lib/permissions.js\";\nimport { _ } from \"./lib/gettext.js\";\nimport { positionalFormat } from \"./lib/text-utils\";\nimport { urlutils } from \"./lib/url-utils.js\";\nimport Vars from \"./lib/vars.js\";\nimport \"./lib/$.scrollTo.js\";\n\n$(\"html\").removeClass(\"no-js\");\n\nconst arbitraryCoreProp = propFinder(conf, \"arbitrary.core\");\n/**\n * Copyright (c) 2010 Conrad Irwin MIT license.\n * Based loosely on original: Copyright (c) 2008 mkmanning MIT license.\n *\n * Parses CGI query strings into javascript objects.\n *\n * See the README for details.\n **/\n$.parseQuery = function (options) {\n var config = { query: window.location.search || \"\" },\n params = {};\n\n if (typeof options === \"string\") {\n options = { query: options };\n }\n $.extend(config, $.parseQuery, options);\n config.query = config.query.replace(/^\\?/, \"\");\n\n $.each(config.query.split(config.separator), function (i, param) {\n var pair = param.split(\"=\"),\n key = config.decode(pair.shift(), null).toString(),\n value = config.decode(pair.length ? pair.join(\"=\") : null, key);\n\n if (\n config.array_keys.test\n ? config.array_keys.test(key)\n : config.array_keys(key)\n ) {\n params[key] = params[key] || [];\n params[key].push(value);\n } else {\n params[key] = value;\n }\n });\n delete params[\"\"];\n return params;\n};\n$.parseQuery.decode = $.parseQuery.default_decode = function (string) {\n return decodeURIComponent((string || \"\").replace(/\\+/g, \" \"));\n};\n$.parseQuery.array_keys = function () {\n return false;\n};\n$.parseQuery.separator = \"&\";\n\n// thanks http://web.enavu.com/daily-tip/maxlength-for-textarea-with-jquery/\n$(document).on(\"keyup\", \"textarea[maxlength]\", function () {\n var $this = $(this);\n //get the limit from maxlength attribute\n var limit = parseInt($this.prop(\"maxlength\"));\n //get the current text inside the textarea\n var text = $this.val();\n //count the number of characters in the text\n var chars = text.length;\n\n //check if there are more characters then allowed\n if (chars > limit) {\n //and if there are use substr to get the text before the limit\n var new_text = text.substr(0, limit);\n\n //and change the current text with the new text\n $this.val(new_text);\n $this.addClass(\"bb-programmatically-changed\");\n window.setTimeout(function () {\n $this.removeClass(\"bb-programmatically-changed\");\n }, 1000);\n }\n});\n\nlet bb = { Mode, conf };\n\n/*** TEXT UTILITIES BEGIN ***/\n\n/******* compareVersions ******/\nfunction compareVersions(a, b) {\n var i, l, d;\n\n a = a.toLowerCase().split(/(\\d+)/);\n b = b.toLowerCase().split(/(\\d+)/);\n l = Math.min(a.length, b.length);\n\n for (i = 0; i < l; i++) {\n d = a[i] - b[i];\n if (isNaN(d)) {\n if (a[i] === b[i]) d = 0;\n else if (a[i] < b[i]) {\n d = -1;\n } else d = 1;\n }\n if (d !== 0) return d;\n }\n\n return a.length - b.length;\n}\n\nfunction compareVersionsOn(prop, a, b) {\n return compareVersions(String(a[prop]), String(b[prop]));\n}\n/*** TEXT UTILITIES END ***/\n\n/*** DATEPICKER BEGIN ***/\n\n// Defaults jQuery datepicker BEGIN\n$(function () {\n $.datepicker.setDefaults(\n $.extend(\n true,\n $.datepicker._defaults,\n {\n showAnim: \"\",\n changeYear: true,\n changeMonth: true,\n yearRange: \"c-150:c+150\"\n }, // RFC\n arbitraryCoreProp(\"datepicker.defaults\") || {},\n { altFormat: \"yy-mm-dd\" }\n )\n );\n});\n// Defaults jQuery datepicker END\n\n/*** DATEPICKER END ***/\n\n/*** MISC jQUERY UTILITIES BEGIN ***/\n\n// thanks http://jqueryfordesigners.com/video.php?f=queue.flv\n$.fn.pause = function (n) {\n return this.queue(function () {\n var el = this;\n window.setTimeout(function () {\n return $(el).dequeue();\n }, n);\n });\n};\n\n$.fn.sort = function () {\n return this.pushStack($.makeArray([].sort.apply(this, arguments)));\n};\n\n$.fn.extend({\n insertAtCaret: function (myValue) {\n return this.each(function () {\n if (document.selection) {\n //For browsers like Internet Explorer\n this.focus();\n var sel = document.selection.createRange();\n sel.text = myValue;\n this.focus();\n } else if (this.selectionStart || this.selectionStart == \"0\") {\n //For browsers like Firefox and Webkit based\n var startPos = this.selectionStart;\n var endPos = this.selectionEnd;\n var scrollTop = this.scrollTop;\n this.value =\n this.value.substring(0, startPos) +\n myValue +\n this.value.substring(endPos, this.value.length);\n this.focus();\n this.selectionStart = startPos + myValue.length;\n this.selectionEnd = startPos + myValue.length;\n this.scrollTop = scrollTop;\n } else {\n this.value += myValue;\n this.focus();\n }\n return this;\n });\n },\n selectAllText: function () {\n var el = this.get(0);\n if (el) {\n if (typeof el.selectionStart === \"number\") {\n (el.selectionStart = 0), (el.selectionEnd = el.value.length);\n } else if (typeof el.createTextRange !== \"undefined\") {\n el.focus();\n var range = el.createTextRange();\n range.select();\n }\n }\n return this;\n }\n});\n\n/** Add resizeEnd event.\n *\n * Thanks Carlos Martinez on\n * http://stackoverflow.com/questions/2854407/\n * javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed\n *\n * I did put this in a closure so as not to pollute the global\n * namespace.\n */\n(function () {\n var _to = null,\n _delay = 500;\n $(window).on(\"resize\", function () {\n if (_to) window.clearTimeout(_to);\n _to = window.setTimeout(function () {\n $(this).trigger(\"resizeEnd\");\n }, _delay);\n });\n})();\n/*** MISC jQUERY UTILITIES END ***/\n\n/*** KEYMAP BEGIN ***/\nvar KEYS = {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SPACE: 32,\n ESC: 27,\n UP: 38,\n DOWN: 40,\n KP_RADIX: 110\n};\n\n// Navigation\nvar maps = {\n questions: function (ev) {\n if (!Mode.get(\"hasModel\")) return undefined;\n if (ev.originalEvent.target && ev.originalEvent.target.tagName === \"TR\") {\n if (!gridKeys(ev)) return false;\n }\n var $target = $(ev.target);\n switch (ev.keyCode) {\n case KEYS.ENTER:\n if ($target.hasClass(\"bb-prior\")) {\n step(\"prior\");\n return false;\n }\n if ($target.hasClass(\"bb-skip\")) {\n step(\"skip\");\n return false;\n }\n if (!Mode.get(\"hasNoNext\")) {\n if (\n ev.shiftKey ||\n $target.hasClass(\"bb-next\") ||\n $target.is('input[type=\"text\"]') ||\n $target.is('input[type=\"radio\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('input[type=\"checkbox\"]') ||\n $target.is('select[data-type=\"listbox\"]') ||\n $target.is(\"fieldset\")\n ) {\n step(\"next\");\n return false;\n }\n if (ev.target.tagName === \"TEXTAREA\") {\n ev.stopImmediatePropagation();\n break;\n }\n }\n if (ev.target.tagName === \"A\") {\n if (ev.target.href.substr(-1) !== \"#\")\n // A true link\n break;\n }\n break;\n case KEYS.SPACE:\n if ($target.is('[role=\"button\"]')) {\n $target.trigger(\"click\");\n return false;\n }\n break;\n case KEYS.BACKSPACE:\n return dispatchBackspace(ev);\n // Escape from modal window\n case KEYS.ESC:\n $(\".closable\").hide();\n break;\n case KEYS.KP_RADIX:\n if ($target.data(\"type\") === \"numedit\") {\n $target.insertAtCaret(_(\"__radixpoint__\", \".\"));\n return false;\n }\n }\n return undefined;\n }\n};\n\nfunction gridKeys(ev) {\n var target = ev.originalEvent.target,\n $target = $(target);\n switch (ev.keyCode) {\n case KEYS.UP:\n $(ev.target).prev().trigger(\"focus\");\n return false;\n case KEYS.DOWN:\n case KEYS.TAB:\n if ($target.find(\":input, a\").length !== 1) {\n return true;\n }\n if (\n $target.find(\n \"a, :input\" + ':not([type=\"checkbox\"])' + ':not([type=\"radio\"])'\n ).length\n ) {\n return true;\n }\n if (ev.shiftKey) $target.prev().trigger(\"focus\");\n else $target.next().trigger(\"focus\");\n return false;\n case KEYS.SPACE:\n var $inputs = $target.find(\n 'input[type=\"checkbox\"], ' + 'input[type=\"radio\"]'\n ),\n $input = $inputs.filter(\":nth(0)\");\n if ($inputs.length > 2) return true;\n else $input.prop(\"checked\", !$input.is(\":checked\"));\n return false;\n }\n return true;\n}\n\nfunction aintTheEnterKey(ev) {\n return ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER;\n}\n\nfunction dispatchBackspace(ev) {\n if (!ev.shiftKey) return true;\n if (Mode.get(\"hasNoPrior\")) return false;\n step(\"prior\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n}\n\n$(document).on(\"keydown\", maps.questions);\n\n$(document).on(\"keydown\", \".bb-btn\", function (ev) {\n if (ev.keyCode === 13) {\n // Dispatch to click handler on ENTER.\n $(this).trigger(\"click\");\n return false;\n }\n return true;\n});\n/*** KEYMAP END ***/\n\n/*** ROLES BEGIN ***/\n\nfunction setRole() {\n var userinfo = Vars.getVar(\"userinfo\") || {};\n\n Mode.toggle(\"isAdmin\", userinfo.role === \"administrator\");\n Mode.toggle(\"isUser\", userinfo.role === \"user\");\n Mode.toggle(\"isViewer\", userinfo.role === \"viewer\");\n Mode.toggle(\"isVieweradmin\", userinfo.role === \"vieweradmin\");\n Mode.toggle(\"isGuest\", userinfo.role === \"guest\");\n Mode.toggle(\"isAnonymous\", userinfo.fullname === \"anonymous\");\n const perms = permissions();\n perms.forEach(p => {\n Mode.toggle(p, true, false);\n });\n Mode.toggle(\"webadminMakesSense\", webadminMakesSense(perms), false);\n}\n\n/*** ROLES END ***/\n\n/*** INITIALIZATION BEGIN ***/\n\n$(function () {\n $(\"body\").attr(\"data-modus\", \"none\");\n\n document.addEventListener(\"submit\", function (ev) {\n var action = ev.target.getAttribute(\"action\");\n if (!action) {\n ev.preventDefault();\n return false;\n }\n return undefined;\n });\n\n $(document).on(\"submit\", \"form#bb-login\", function () {\n // Serialize form as array\n var params = $(this).serializeArray(),\n action = this.getAttribute(\"action\");\n // Trim values and set the desired format\n $.each(params, function (_, val) {\n if (val.name === \"fmt\") val.value = \"json\";\n else val.value = (val.value || \"\").trim();\n });\n $.postJSON(\n action,\n [$.param(params), window.location.search.substring(1)].join(\"&\")\n );\n return false;\n });\n\n var formfocus = window.setTimeout(function () {\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n }, 0);\n\n bb.Router = function router(params) {\n if (\n (typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\") ||\n params.uniqueid ||\n params.modelid ||\n params.modelname ||\n params.dbname ||\n params.state ||\n params.request ||\n params.bsid\n ) {\n Mode.set(\"isDeepLinked\");\n hideLogin();\n if (params.bsid) new BBI().authenticate();\n else if (!bb.autologinrewritten) {\n var action;\n if (\n typeof params.username !== \"undefined\" &&\n typeof params.password !== \"undefined\"\n )\n action = \"login\";\n if (params.uniqueid) action = \"menu\";\n // Studio deeplink\n if (typeof params.uniqueid === \"undefined\" && params.modelid)\n action = \"open\";\n if (params.uniqueid && (params.modelid || params.dbname))\n action = \"action\";\n if (params.modelname) action = \"open\";\n if (params.request) {\n action = params.request;\n delete params.request;\n }\n $.postJSON(action, $.param(params) + \"&fmt=json\").then(setSettled);\n }\n window.clearTimeout(formfocus);\n }\n };\n\n if (window.location.search.length > 1) {\n bb.Router($.parseQuery());\n } else setSettled();\n\n $(document).on(\"bb:renderQuestions\", renderGroups);\n});\n\n/**\n * Set the effect to be used when re-showing login form.\n *\n * @param {String} effect One of 'show', 'fadeIn' or 'slideDown'\n */\nfunction safeResetEffect(effect = \"slideDown\") {\n if (typeof effect !== \"string\") {\n console.warn(\"Argument effect should be a string\");\n return \"slideDown\";\n }\n if (!/^(show|fadeIn|slideDown)$/.test(effect)) {\n console.warn(\"Invalid effect: \" + effect);\n return \"slideDown\";\n }\n return effect;\n}\n\nresetLogin.effect = safeResetEffect(\n arbitraryCoreProp(\"loginResetEffect\", \"slideDown\")\n);\n\nfunction resetLogin() {\n $(\"#bb-login\")[resetLogin.effect]();\n}\n\n/*** INITIALIZATION END ***/\n/*** JUMPLIST BEGIN ***/\n$(document).on(\"change\", \".bb-jumplist-dropdown select\", function () {\n bb.gotonode($(this).val());\n});\n\n$(document).on(\"click\", \"[data-groupid]\", function () {\n var $this = $(this),\n groupid = $this.attr(\"data-groupid\");\n bb.gotonode(groupid);\n});\n\n/*** JUMPLIST END ***/\n\n/*** CASES BEGIN ***/\n$.fn.deleteme = function () {\n if (\n confirm(\n _(\"Delete\") + \" \" + (this.length == 1 ? _(\"case\") : _(\"cases\")) + \"?\"\n )\n ) {\n return this.each(function () {\n var me = $(this);\n if (me.hasClass(\"bb-case\")) {\n var casus = {\n dbname: me.data(\"dbname\"),\n sessionid: me.data(\"sessionid\")\n };\n deleteCase(casus.dbname, casus.sessionid, Vars.getVar(\"uniqueid\"));\n if (isCaseCurrent(casus)) {\n $(\"#bb-q\").empty();\n Mode.unset(\"hasModel\");\n }\n }\n });\n }\n return this;\n};\n\nvar Cases = (function () {\n var _cases = [];\n var _unfilteredcases = [];\n var _MAX = 10;\n var _idx = 0;\n var _filtertext = _(\"filter cases by name\");\n\n function update(cases) {\n _unfilteredcases = cases || [];\n _cases = cases || [];\n if (cases && cases.length > 0) {\n cases.sort(function (a, b) {\n return a.dateenter > b.dateenter ? -1 : 1;\n });\n var $controls = $(\"#bb-cases-controls\");\n if ($controls.is(\":empty\")) {\n $controls.html(\n ' ' +\n ' ' +\n ' 1-10' +\n ' ' +\n ' ' +\n ''\n );\n $controls.attr(\"data-unbound\", true);\n }\n if ($controls.attr(\"data-unbound\")) {\n $controls.removeAttr(\"data-unbound\");\n $(\"#bb-cases-prev\").click(prevSlice);\n $(\"#bb-cases-next\").click(nextSlice);\n $(\"#bb-cases-first\").click(showSlice.bind(null, 0));\n $(\"#bb-cases-last\").click(\n showSlice.bind(null, Math.floor((_cases.length - 1) / _MAX))\n );\n\n $(\"#bb-cases-filter\", $controls).keyup(function (ev) {\n if (ev.keyCode === KEYS.TAB) return true;\n var $this = $(this),\n val = ($this.val() || \"\").trim();\n if (val != \"\") {\n var re = new RegExp(val, \"i\");\n _cases = _unfilteredcases.filter(function (e) {\n return re.test(e.name);\n });\n } else _cases = _unfilteredcases;\n showSlice(0);\n return false;\n });\n }\n showSlice(0);\n } else {\n empty();\n }\n }\n function showSlice(idx) {\n _idx = idx;\n var caselen = _cases.length;\n\n $(\"#bb-cases .bb-case\").remove();\n\n $(_cases.slice(_idx * _MAX, (_idx + 1) * _MAX)).each(function (i) {\n wCasus(_cases[i + _idx * _MAX]).appendTo(\"#bb-cases-table\");\n });\n if (_cases.length) {\n $(\n '' +\n '\" +\n \"\" +\n \"\" +\n (bb.Plugins.newname\n ? '' +\n '' +\n '' +\n \"\" +\n \"\"\n : \"\") +\n \"\"\n ).prependTo(\"#bb-cases-table\");\n\n // Some browsers do leave thead and tbody in place, even when\n // $().empty-ing the table, so:\n $(\"#bb-cases-table thead~thead\").remove();\n }\n\n $(\"#bb-cases-currentslice\")\n .text(\n _idx * _MAX +\n 1 +\n \"-\" +\n Math.min(caselen, (_idx + 1) * _MAX) +\n \"/\" +\n caselen\n )\n .attr(\n \"aria-label\",\n positionalFormat(\n _(\"results {0} to {1} from {2}\"),\n _idx * _MAX + 1,\n Math.min(caselen, (_idx + 1) * _MAX),\n caselen\n )\n );\n\n $(\"#bb-cases-prev, #bb-cases-first\").prop(\"disabled\", _idx == 0);\n var hasNoNext = _idx == Math.floor((caselen - 1) / _MAX);\n $(\"#bb-cases-next, #bb-cases-last\").prop(\"disabled\", hasNoNext);\n\n $(\"#bb-cases\").trigger(\"bb:rendered\");\n }\n function nextSlice() {\n var divident = Math.floor(_cases.length / _MAX);\n showSlice(Math.min(_idx + 1, divident));\n }\n function prevSlice() {\n showSlice(Math.max(_idx - 1, 0));\n }\n function empty() {\n $(\"#bb-cases-table\").empty();\n }\n return {\n empty: empty,\n update: update\n };\n})();\n\nfunction howManyColumns() {\n var base = 2;\n return (\n $.grep([\"showreport\", \"showdeleteinmenu\", \"showcopycase\"], Vars.getVar)\n .length + base\n );\n}\n\nfunction wCasus(casus) {\n var cas = $.extend(\n {},\n casus,\n // Turn into JavaScript dates, and normalize as good as we can:\n {\n dateenter: casus.dateenter && parseDate(casus.dateenter),\n datecreate:\n Vars.getVar(\"showdatecreated\") &&\n casus.datecreate &&\n parseDate(casus.datecreate)\n },\n {\n showcopycase: Vars.getVar(\"showcopycase\"),\n showdeleteinmenu: Vars.getVar(\"showdeleteinmenu\")\n }\n );\n if (Vars.getVar(\"showreport\")) cas.reporturl = urlutils.caseReport(casus);\n // Turn into JavaScript dates, and normalize as good as we can:\n if (cas.datecreate) cas.firstrun = humanDate(cas.datecreate);\n if (cas.dateenter) cas.lastaccess = humanDate(cas.dateenter);\n var html = bb.createCaseItem(cas);\n\n var $case = $(html);\n\n $case.find(\".bb-case-name\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n sessionid: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.find(\".bb-case-copy\").bind(\"click keydown\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n Ajax.replace({\n url: \"action\",\n data: {\n dbname: casus.dbname,\n templateindex: casus.sessionid,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n }\n });\n });\n $case.data(\"sessionid\", casus.sessionid);\n $case.data(\"dbname\", casus.dbname);\n return $case;\n}\n\nbb.createCaseItem =\n bb.createCaseItem ||\n function (casus) {\n var dateTitle,\n dateSpan = \"\",\n copySpan = \"\",\n reportSpan = \"\",\n deleteSpan = \"\",\n classes = [\"bb-case\"];\n dateTitle = _(\"Last opened\") + \": \" + casus.lastaccess;\n if (Vars.getVar(\"showdatecreated\")) {\n dateTitle += \", \" + _(\"created\") + \": \" + casus.firstrun;\n }\n dateSpan =\n '' +\n casus.lastaccess +\n \"\";\n if (Vars.getVar(\"showreport\")) {\n reportSpan =\n '' +\n '' +\n ' ' +\n _(\"report\") +\n \"\";\n }\n if (Vars.getVar(\"showdeleteinmenu\")) {\n deleteSpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (Vars.getVar(\"showcopycase\")) {\n copySpan =\n \"\" +\n '\" +\n \"\";\n }\n\n if (isCaseCurrent(casus)) {\n classes.push(\"current\");\n }\n\n return (\n '' +\n \"\" +\n '\" +\n dateSpan +\n reportSpan +\n deleteSpan +\n copySpan +\n \"\"\n );\n };\n\nfunction isCaseCurrent(casus) {\n return (\n casus.sessionid == Vars.getVar(\"sessionid\") &&\n casus.dbname == Vars.getVar(\"dbname\")\n );\n}\n\nfunction deleteCase(dbname, sessionid, uniqueid) {\n // Ajax.last && Ajax.last.abort();\n // todo: voeg nieuwe waarden toe aan object.\n Ajax.post({\n url: \"delete\",\n data: {\n dbname,\n sessionid,\n uniqueid,\n fmt: \"json\"\n }\n });\n}\n\n$(document).on(\"click keydown\", \".bb-case-delete\", function (ev) {\n if (ev.type === \"keydown\" && ev.keyCode !== KEYS.ENTER) return;\n $(this).parents(\".bb-case\").deleteme();\n});\n\nfunction newcase(dbname, newname, params = {}) {\n const data = Object.assign(\n {},\n Object(params) === params && params,\n {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n step: \"open\",\n fmt: \"json\"\n },\n newname && { newname }\n );\n if (Vars.getVar(\"sessionid\"))\n step(\"exit\", function (jsondata) {\n Ajax.busy = false;\n if (jsondata.status === \"Ready\") {\n Ajax.replace({ data: data });\n }\n });\n else {\n Ajax.replace({ data: data });\n }\n}\n\n$(document).on(\"click keydown\", \".bb-newname\", function (ev) {\n if (ev.type === \"click\" || aintTheEnterKey(ev)) ev.stopPropagation();\n return true;\n});\n\n$(document).on(\"click keydown\", \".bb-newcase\", function (ev) {\n if (aintTheEnterKey(ev)) return true;\n const $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\"),\n newname = $this.find(\".bb-newname\").val(),\n params = collectAttributes(\"data-bb:params-\", this);\n newcase(dbname, newname, params);\n return false;\n});\n\n/*** CASES END ***/\n\n/*** MODELS BEGIN ***/\nvar Models = {\n selector: \"#bb-models\",\n modelitem: function (model) {\n model.uniqueid = Vars.getVar(\"uniqueid\");\n return (\n (bb.createModelItem && bb.createModelItem(model)) ||\n (function (model) {\n var dbname = model.dbname;\n return (\n '' +\n \"\" +\n '\" +\n \"\" +\n '\" +\n \"\"\n );\n })(model)\n );\n },\n // Enhance Model with extra computed properties:\n enhanceModel: function (model) {\n model._selectedclass = model.selected ? \"selected\" : \"\";\n model._nicename = model.modelname.replace(/_/g, \" \");\n if (model.lastupdate) {\n model._date = parseDate(model.lastupdate);\n model._humandate = humanDate(model._date);\n }\n if (model.modelinfo) {\n model._liner_notes = model.modelinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n if (model.authorinfo) {\n model._author_notes = model.authorinfo.split(/(?:\\r?\\n|\\\\r\\\\n|\\\\n)/);\n }\n return model;\n },\n update: function (data) {\n var models = data.models;\n models.sort(compareVersionsOn.bind(null, \"modelname\"));\n\n var explicit = models.filter(function (m) {\n return typeof m[\"order\"] === \"number\";\n });\n if (explicit[0]) {\n explicit.sort(function (a, b) {\n return (\n a[\"order\"] - b[\"order\"] ||\n compareVersions(String(a[\"order\"]), String(b[\"order\"]))\n );\n });\n models = models.filter(function (m) {\n // absent (undefined) or the empty string\n return typeof m[\"order\"] !== \"number\";\n });\n models = explicit.concat(models);\n }\n\n this.empty();\n var self = this;\n $(this.selector).append(\n $.map(models, function (model) {\n return self.modelitem(self.enhanceModel(model));\n })\n );\n },\n empty: function () {\n $(this.selector).empty();\n }\n};\n\n$(document).on(\"click keydown\", \".bb-model-cases\", function (ev) {\n if (aintTheEnterKey(ev)) return;\n var $this = $(this),\n dbname =\n this.getAttribute(\"data-bb:dbname\") ||\n $this.parents(\".bb-model\").attr(\"data-bb:dbname\");\n Ajax.replace({\n url: \"menu\",\n data: {\n dbname: dbname,\n uniqueid: Vars.getVar(\"uniqueid\"),\n fmt: \"json\"\n },\n dataType: \"json\"\n });\n});\n/*** MODELS END ***/\n\n/*** NAVIGATION, REQUESTS BEGIN ***/\n\n/**\n * Request 'action'\n *\n * @param {String} direction One of 'prior', 'next', 'exit', 'runtonode', 'gotonode', 'update' or 'updatemis'\n * @param {Function} cb Callback function to run on succes, defaults to checkJSON()\n * @param {Object} options Object, with possible keys: 'fullnodename' : 'graph.node',\n * 'groupid' : 'groupid-iteration',\n * 'sync' : Boolean\n */\nfunction step(direction, cb, options = {}) {\n Validation.reset();\n if (Ajax.busy) return;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = direction;\n Ajax.row = Ajax.direction === \"update\" && options && options.update;\n\n try {\n if (\n [\"next\", \"skip\"].includes(direction) &&\n $(\"#bb-q .group:not([disabled]) .validatable:visible\")\n .validate({ silent: false, justhide: false, requestUpdate: false })\n .filter(\"[aria-invalid=true]\").length > 0\n )\n throw new Error(\"There are errors, please double check your answers.\");\n\n const container = either(prop(\"groupElt\"), () =>\n document.querySelector(\".group.selected\")\n )(options);\n const screenid = Vars.getVar(\"screenid\");\n const groupid = $.data(container).groupid;\n Ajax.groupid = groupid;\n\n // todo: voeg nieuwe waarden toe aan object.\n if (!(direction === \"prior\" && Mode.get(\"hasNoPrior\"))) {\n const ajaxOptions = {\n async: true && (!options || !options.sync), //See noted render() as a reason for this.\n data: [\n \"step=\" + direction,\n direction === \"update\" && options && options.update\n ? \"update=\" + encodeURIComponent(options.update)\n : \"\",\n direction === \"runtonode\"\n ? \"fullnodename=\" + options.fullnodename\n : \"\",\n direction === \"gotonode\" ? \"groupid=\" + options.groupid : \"\",\n Vars.querify(Vars.SESSION_KEYS),\n \"screenid=\" + groupid,\n \"fmt=json\",\n collectWithin({\n container,\n params: new URLSearchParams(options.extraparams)\n })\n .toString()\n .replace(/\\r?\\n/g, \"%0D%0A\")\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: function (data, status, req) {\n data._direction = direction;\n data._passed = options && options.pass;\n data._isUpdate = propEq(\"isUpdate\", true, options);\n // if (direction === \"update\" && groupid !== screenid && editPolicy(conf) === \"stay\") {\n // container.classList.remove(\"unselected\");\n // container.classList.add(\"selected\");\n\n // // Do not render, just update\n // Ajax.release();\n // Vars.setVars(data);\n // updateDynProps(data);\n // } else\n\n if (groupid !== screenid && editPolicy(conf) === \"return\") {\n // Do not render, we're going back again. This would be\n // nice, but we do need some values to be rerendered -\n // warranting redraw of nodes after the edited one.\n\n Ajax.release();\n Vars.setVars(data);\n } else if (options && options.cbIsAdditional) {\n options.cbIsAdditional === \"before\" && cb && cb(data, status, req);\n checkJSON(data, status, req);\n options.cbIsAdditional !== \"before\" && cb && cb(data, status, req);\n } else {\n (cb || checkJSON)(data, status, req);\n }\n if (\n Ajax.row &&\n groupid === screenid &&\n compose(\n when(Boolean, any(propEq(\"dynamic\", true))),\n prop(\"groups\")\n )(data)\n ) {\n console.info(\n \"Requesting an extra update for dynprops. Should be handled by server instead\"\n );\n window.setTimeout(bb.update, 0);\n }\n }\n };\n\n if (\n screenid !== undefined &&\n direction !== \"update\" &&\n groupid !== screenid\n ) {\n console.warn(\n `groupid ${groupid} is not the current screenid ${screenid}, but no update was requested`\n );\n }\n if (direction === \"update\" && groupid !== screenid) {\n // Hold your breath, first go back, so as to put server pointer at the right node.\n bb.gotonode(\n // Will get the .selected\n groupid,\n data => {\n Ajax.release();\n Vars.setVars(data); // Sets screenid\n Ajax.direction = direction;\n // Is always \"update\", actually;\n Ajax.row = direction === \"update\" && options && options.update;\n Ajax.groupid = groupid;\n const req = Ajax.post(ajaxOptions); // Gets the original callback, if any.\n if (editPolicy(conf) === \"return\")\n req.then(data => {\n Ajax.release();\n Vars.setVars(data);\n\n bb.gotonode(\n screenid,\n () => {\n // The gotonode invocation just overwrote the direction and row.\n Ajax.direction = direction;\n Ajax.row =\n direction === \"update\" && options && options.update;\n if (!Ajax.row) cb && cb();\n },\n {\n cbIsAdditional: \"before\",\n groupElt: container,\n isUpdate: true\n }\n );\n });\n },\n { sync: false, cbIsAdditional: false }\n );\n } else {\n Ajax.post(ajaxOptions);\n }\n }\n } catch (e) {\n $(document).trigger(\"bb:userError\", e.message);\n A11y.log(_(e.message));\n }\n}\n\nlet lastUpdateRequest;\n\nfunction requestDynProps(input) {\n if (Ajax.busy) return;\n\n var thisUpdateRequest;\n\n Ajax.last && Ajax.last.abort();\n Ajax.direction = \"update\";\n // Ajax.row = Ajax.direction === 'update' && options && options.update;\n\n const ajaxOptions = {\n async: true,\n data: [\n \"step=update\",\n Vars.querify(Vars.NAV_KEYS),\n \"fmt=json\",\n serializeQuestions()\n ]\n .filter(Boolean)\n .join(\"&\"),\n success: (...args) => {\n if (thisUpdateRequest === lastUpdateRequest) {\n $(document).trigger(\"bb:preHandleData\", ...args);\n updateDynProps(args[0], input);\n }\n }\n };\n lastUpdateRequest = thisUpdateRequest = Ajax.post(ajaxOptions);\n}\n\n// bb:prePost handler always goes off on bb.ajax.post.\n$(document).on(\"bb:prePost\", function (event, options) {\n if (includes(options.url, [\"action\", \"open\", \"bbisreturns\"]))\n if (!includes(Ajax.direction, [\"update\", \"updatemis\"]))\n $(document).trigger(\"bb:preStep\", options);\n});\n\n// bb:preStep handler goes off after user-initiated, possibly\n// expensive, actions.\n$(document).on(\"bb:preStep\", function () {\n Ajax.busy = true;\n // Hide lingering calendars\n $(\".group.selected .hasDatepicker\").datepicker(\"hide\");\n A11y.log(\"\");\n});\n\n// Save\n$(document).on(\"click\", \".bb-save\", function () {\n step(\"save\", null);\n});\n\n// Update\n$(document).on(\"click\", \"[name=update]\", function (ev) {\n step(\"update\", null, {\n update: $(this).val(),\n groupElt: ev.target.closest(\".group\")\n });\n});\n\n// Prior\n$(document).on(\"click\", \".bb-prior\", function () {\n step(\"prior\");\n});\n\n// Next\n$(document).on(\"click\", \".bb-next\", function (ev) {\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n// Skip\n$(document).on(\"click\", \".bb-skip\", function (ev) {\n bb.skip();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n});\n\n$(document).on(\"keydown\", \".group a\", function (ev) {\n if (\n ev.shiftKey &&\n ev.keyCode === KEYS.ENTER &&\n ev.target.href.substr(-1) !== \"#\"\n ) {\n // true link BUT SHIFT + ENTER\n bb.next();\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n});\n\n// Close\n$(document).on(\"click\", \".bb-close\", function () {\n logout();\n self.close();\n $(\"body\").html(_(\"You may now safely close this window\"));\n});\n\n// Restart\n$(document).on(\"click\", \".bb-restart\", function (event) {\n if (\n \"noconfirm\" in event.currentTarget.dataset ||\n confirm(_(\"Are you sure? This will reset all values.\"))\n )\n bb.restart();\n return false;\n});\n\n/**\n * Log out\n *\n * @param {Boolean} ev Either a jQuery event or not\n * @param {Function} cb Callback function to be run after logout.\n * Supercedes default action on Ajax request. @see Ajax.post.\n */\n\nconst timedOutResponse = () => ({\n error: {\n code: 9 //Errors.CODES.cWebSessionTimeOut\n }\n});\n\nfunction logout(ev, cb) {\n if (Vars.getVar(\"uniqueid\")) {\n exit(function () {\n const options = {\n url: \"logout\",\n data: \"fmt=json&\" + Vars.querify(\"uniqueid\"),\n async: false\n };\n // When called directly, which\n if (cb instanceof Function) {\n options.success = options.error = cb;\n }\n Ajax.post(options);\n });\n } else {\n console && console.info && console.info(\"Fake logging out, ID is missing\");\n const mockResponse = timedOutResponse();\n ((cb instanceof Function && cb) || checkJSON)(mockResponse, 200, {\n responseJSON: mockResponse,\n responseText: JSON.stringify(mockResponse)\n });\n }\n return false;\n}\n\n$(document).on(\"click\", \".bb-logout\", logout);\n$(document).on(\"keydown\", \".bb-logout\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n logout(ev);\n return false;\n});\n\n/** Exit\n *\n * Exit the current case;\n * @param {Function} fun Function to execute after having exited.\n * If exiting isn't necessary, still execute fun.\n */\nfunction exit(fun, sync = true) {\n if (typeof fun !== \"function\")\n // Could be an event object on .bb-stop\n fun = undefined;\n if (shouldExit()) {\n step(\"exit\", fun, { sync });\n } else fun && fun();\n}\n\n$(document).on(\"click\", \".bb-stop\", exit);\n\n// Request 'getuserinfo'\nfunction getUserInfo() {\n $.postJSON(\"getuserinfo\", Vars.querify(\"uniqueid\") + \"&fmt=json\");\n}\n\n/*** NAVIGATION, REQUESTS END ***/\n\n/*** MENU BEGIN ***/\n\nfunction setupMenu() {\n $(\".bb-settings\").attr({ target: \"blank\" });\n}\n\n// Open WebAdmin (in new page)\nfunction openSettings() {\n var href = fromApiServer(\"webadmin\" + \"?\" + Vars.querify(\"uniqueid\"));\n window.open(href);\n return false;\n}\n\n$(document).on(\"click\", \".bb-settings\", openSettings);\n$(document).on(\"keydown\", \".bb-settings\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER && ev.keyCode !== KEYS.SPACE) return true;\n openSettings(ev);\n return false;\n});\n\n/** menu\n *\n * Open menu (model overview)\n * @param {String|Object|undefined} creds Optional credentials,\n * defaults to fmt:json and uniqueid\n */\nfunction menu(creds) {\n return $.postJSON(\n \"menu\",\n creds || {\n fmt: \"json\",\n uniqueid: Vars.getVar(\"uniqueid\")\n }\n );\n}\n\n/** exitthenmenu\n *\n * Exit a case, then open a menu\n * @param {Event} ev Optional event whose propagation will be stopped\n */\nfunction exitthenmenu(ev) {\n exit(function () {\n menu();\n });\n ev && ev.stopPropagation && ev.stopPropagation();\n}\n\n$(document).on(\"click\", \".bb-openmodels\", exitthenmenu);\n$(document).on(\"keydown\", \".bb-openmodels\", function (ev) {\n if (ev.keyCode !== KEYS.ENTER) return;\n exitthenmenu(ev);\n});\n\n/*** MENU END ***/\n\n/*** MISC UI BEGIN ***/\n\nfunction hideLogin() {\n $(\"form#bb-login\").hide();\n}\n\n/**\n * Simple class toggling to implement collapsing/expanding widgets.\n *\n * Needs CSS styling and / or Event handler registered on custom\n * jQuery 'bb:collapsing' Event.\n */\n$(document).on(\"click keydown\", \".bb-collapsable .bb-collapser\", function (ev) {\n if (aintTheEnterKey(ev) || ev.shiftKey) return true;\n $(this)\n .closest(\".bb-collapsable\")\n .toggleClass(\"bb-collapsed\")\n .trigger(\"bb:collapsing\");\n return false;\n});\n\n/*** MISC UI END ***/\n\n/*** DATA HANDLERS BEGIN ***/\n\n/**\n * Default handlers for JSON object.\n *\n * Order in which these handlers are executed are:\n *\n * bb:preHandleData\n * bb:handleData\n * bb:postHandleData\n * bb:finalHandleData\n */\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n data.groups.forEach(function (group) {\n const groupid = group.groupid;\n group.controls.forEach(function (control) {\n control._originalid = control.id;\n control.id = groupid + \"-\" + control.id;\n if (control.isfor) {\n control._originalisfor = control.isfor;\n control.isfor = groupid + \"-\" + control.isfor;\n }\n if (control.controltype === \"label\") {\n control.value = control.value.trim();\n if (control.isfor && control.value)\n control.value = control.value + \" \";\n }\n if (\n control.controltype === \"memo\" &&\n control.maxlength > 0 &&\n !control.placeholder\n ) {\n control.placeholder = positionalFormat(\n _(\"Maximum allowed characters: {0}\"),\n control.maxlength\n );\n }\n });\n });\n }\n});\n/**\n * Default handler for JSON object.\n *\n * Sets mode, variables, calls functions to update UI.\n *\n */\nfunction onHandleData(event, data) {\n // Save previous modus - it will be the next modus if unset.\n var modus = $(\"body\").attr(\"data-modus\"); // Either 'model', 'menu', or 'none'\n\n Mode.unset(\"hasMessage\");\n if (typeof data == \"undefined\") return;\n if (typeof document.selection != \"undefined\")\n try {\n document.selection.removeAllRanges();\n } catch (e) {\n // tryCatch was there for IE's sake. probably because we were\n // using Selection.empty()\n }\n\n // Fix error objects - they are a mess\n if (data.error) {\n data.error = Errors.translate(data.error);\n // Do not throw the error just yet - we may need it to\n // get in the right mode\n }\n\n Vars.setVars(data);\n\n if (data.userinfo) {\n Mode.set(\"isLoggedIn\");\n setRole();\n setupMenu();\n return;\n }\n\n if (\n data.error &&\n ([\n Errors.CODES.cWebPleaseLogin,\n Errors.CODES.cUMWrongUserNamePassword,\n Errors.CODES.cWebSessionTimeOut\n ].indexOf(data.error.code) > -1 ||\n data.error.code === \"UNAUTHORIZED\")\n ) {\n // Do nothing\n } else if (has(\"bbis\", data)) {\n // Authenticate through BBI\n new BBI(data).authenticate();\n return;\n } else if (Vars.getVar(\"uniqueid\")) {\n // We are apparently logged in\n hideLogin();\n if (!Vars.getVar(\"userinfo\")) {\n // Get user information\n getUserInfo();\n }\n }\n\n // \"DrawScreen: end\"\n /* Only set modus if this is possibly mode-changing data (e.g.\n * DON'T even go here when data.userinfo is true).\n */\n if (data.status || data.groups || data.cases || data.models || data.error) {\n if (data.groups) modus = \"model\";\n else if (\n data.models ||\n data.cases ||\n (data.status && data.status == \"Ready\")\n ) {\n modus = \"menu\";\n } else if (data.status && data.status == \"logout successful\") {\n modus = \"none\";\n } else if (data.error && data.error.code === Errors.CODES.cWebPleaseLogin) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cUMWrongUserNamePassword\n ) {\n modus = \"none\";\n } else if (\n data.error &&\n data.error.code === Errors.CODES.cWebSessionTimeOut\n ) {\n modus = \"none\";\n } else if (data.error && data.error.code === \"READY\") {\n modus = \"menu\";\n }\n $(\"body\").attr(\"data-modus\", modus);\n // Set current modus\n\n // Clean up state vars that were left over\n if (modus === \"menu\") {\n Vars.unsetVars([\"sessionid\", \"screenid\"]); // Session specific data\n }\n if (modus === \"none\") {\n const perms = permissions();\n Vars.unsetVars();\n perms.forEach(p => {\n Mode.toggle(p, false, false);\n });\n }\n\n // Will need to be seen with every control\n Mode.unset(\"hasHints\");\n\n if (!data.error)\n Mode.toggle(\"hasNoModelsShown\", modus !== \"menu\")\n\n .toggle(\"hasModel\", modus === \"model\")\n\n .toggle(\"hasMenu\", modus === \"menu\")\n\n .toggle(\n \"hasModels\",\n modus === \"menu\" && !!data.models && !!data.models.length\n )\n\n .toggle(\n \"hasCases\",\n modus === \"menu\" && !!data.cases && !!data.cases.length\n )\n\n .toggle(\n \"hasJumplist\",\n modus === \"model\" && !!data.jumplist && !!data.jumplist.length\n )\n\n .toggle(\n \"hasInformationsources\",\n modus === \"model\" &&\n data.informationsources &&\n !!data.informationsources.length\n )\n\n .toggle(\"hasNoPrior\", modus === \"model\" && !data.hasprevious)\n\n .toggle(\"hasNoNext\", modus === \"model\" && !data.hasnext);\n\n Mode.toggle(\"isLoggedIn\", modus !== \"none\");\n\n if (modus === \"none\") {\n Mode.unset(\"isDeepLinked\");\n setRole(); // Sets Mode\n }\n if (modus !== \"model\") {\n Mode.unset(\"isValidated\");\n }\n }\n\n if (\n data.error &&\n !includes(data.error.code, propOr([], \"ignoredErrorCodes\", conf))\n ) {\n notify(\n {\n keepalive: path([\"arbitrary\", \"core\", \"notify\", \"keepalive\"], conf),\n html: false\n },\n data.error\n );\n }\n\n // View updates\n if (data.modeldescription) {\n $(\".bb-modelname\")\n .text(data.modeldescription.replace(/_/g, \" \"))\n .attr(\"lang\", data.modellanguage);\n } else if (modus !== \"model\") {\n $(\".bb-modelname\").text(\"\");\n }\n\n if (modus !== \"model\") {\n $(\"#bb-q\").empty();\n }\n\n if (modus !== \"menu\") {\n Cases.empty();\n Models.empty();\n }\n\n if (modus === \"none\") {\n resetLogin();\n }\n\n if (modus === \"none\") {\n Mode.unset(\"hasModel\")\n .unset(\"hasNoModelsShown\")\n .unset(\"hasMenu\")\n .unset(\"hasModels\")\n .unset(\"hasCases\")\n .unset(\"hasJumplist\")\n .unset(\"hasInformationsources\")\n .unset(\"hasNoPrior\")\n .unset(\"hasNoNext\");\n }\n\n if (modus === \"menu\") {\n if (data.models && !!data.models.length) {\n Models.update(data);\n }\n if (data.cases && !!data.cases.length) {\n Cases.update(data.cases);\n }\n }\n\n if (modus === \"model\") {\n if (data.groups) {\n Validation.reset();\n $(document).trigger(\"bb:renderQuestions\", data);\n }\n Validation.setMode(); // Sets Mode\n\n $(\".bb-openattachments\").attr(\"href\", urlutils.getFiles());\n\n // if (data.informationsources){\n // runHook(\"informationsources\")(data.informationsources);\n // }\n if (data.jumplist) {\n Jumplist.type = arbitraryCoreProp(\"jumplist.type\") || \"ul\";\n Jumplist.draw(data.jumplist);\n }\n }\n}\n\n$(document).on(\"bb:handleData\", onHandleData);\n\n/**\n * Default final handler for JSON object.\n *\n * Runs after any DOM updates. Should only be used for focusing or non-UI stuff.\n *\n * Do not override (unless you know exactly what you are doing) --\n * just augment it if need be.\n *\n */\n$(document).on(\"bb:finalHandleData\", function () {\n bb.ajax.release();\n});\n\nlet returnfocusto, returnSelection;\n\nconst $document = $(document);\n\n$document.on(\"focus\", \":input\", ev => {\n const activeElement = ev.target;\n returnfocusto = activeElement.getAttribute(\"id\");\n if (activeElement.value)\n returnSelection = {\n selectionStart: 0,\n selectionEnd: activeElement.value.length,\n selectionDirection: \"forward\"\n };\n});\n\n$document.on(\"keydown\", \":input\", ev => {\n const activeElement = ev.target;\n const { selectionStart, selectionEnd, selectionDirection } = activeElement;\n returnSelection = { selectionStart, selectionEnd, selectionDirection };\n});\n\nfunction returnfocus() {\n try {\n let elt = document.querySelector(`[id=\"${returnfocusto}\"]`);\n if (elt) {\n elt.focus();\n if (elt.classList.contains(\"hasDatepicker\")) {\n $(elt).datepicker(\"widget\").hide();\n }\n let { selectionStart, selectionEnd, selectionDirection } =\n returnSelection;\n elt.setSelectionRange(selectionStart, selectionEnd, selectionDirection);\n }\n } catch (e) {\n // Checkbox throw an error that some object is not or no\n // longer usable. But how may we check?\n\n // Number inputs and such\n e.select && e.select();\n return true;\n }\n return false;\n}\n\nfunction focusHandler(event, data) {\n if (data.groups) {\n window.setTimeout(function () {\n const [grid, row] = (Ajax.row || \"\").split(\".\");\n var $input,\n focusstring = \":input:visible:enabled:not([readonly]):last\";\n if (row) {\n if (row === \"+\") {\n // Addbutton for entire grid\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n } else {\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n row +\n \") \" +\n focusstring\n );\n // Might've been the last row - then focus the butlast one\n if (!$input.length)\n $input = $(\n '.group [name=\"' +\n grid +\n '\"] tbody tr:nth(' +\n (parseInt(row) - 1) +\n \") \" +\n focusstring\n );\n // Empty table? Focus addbutton\n if (!$input.length)\n $input = $(`.group [name=\"update\"][value=\"${grid}.+\"]`);\n }\n if ($input.length) {\n $input.trigger(\"focus\");\n }\n } else {\n // focus was lost\n if (\n both(\n complement(propEq(\"_isUpdate\", true)),\n complement(propEq(\"_direction\", \"update\"))\n )(data) ||\n (Mode.get(\"a-keyboard-user\") &&\n document.activeElement === document.body &&\n !returnfocus())\n ) {\n $(\".group.selected\").trigger(\"focus\");\n const e_group = document.querySelector(\".group.selected\");\n if (e_group === null) return;\n e_group.focus();\n if (doScrollToSelected(conf)) {\n if (e_group.previousElementSibling) {\n e_group.scrollIntoView({\n behavior: window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n .matches\n ? \"auto\"\n : \"smooth\"\n });\n }\n }\n }\n }\n }, 0);\n return;\n }\n if (data.models && (!data.cases || !data.cases.length)) {\n $(\".bb-model-name:first\").trigger(\"focus\");\n $(\".bb-model.selected .bb-model-name:first\").trigger(\"focus\");\n return;\n }\n if (data.cases) {\n $(\"#bb-cases tbody .bb-case .bb-case-name:first\").trigger(\"focus\");\n return;\n }\n $(\"form#bb-login input[name=username]\").trigger(\"focus\");\n}\n\nfunction setupFocusHandler(event, data) {\n if (data.uniqueid) {\n $(document).on(\"bb:finalHandleData\", focusHandler);\n $(document).off(\"bb:finalHandleData\", setupFocusHandler);\n }\n}\n\n$(document).on(\"bb:finalHandleData\", setupFocusHandler);\n\nfunction updateDynProps(fulldata, input) {\n var data = {\n groups: fulldata.groups\n };\n $(document).trigger(\"bb:willUpdate\", fulldata);\n if (data && data.groups) {\n var group = data.groups.filter(function (group) {\n return group.current;\n })[0];\n let controls = sortControls(group.controls.slice(0), []);\n $(\n '.group [data-datatype^=\"datades:\"], .group [data-type=\"label\"]'\n ).updateControl(controls, input);\n Validation.setMode();\n }\n $(document).trigger(\"bb:hasUpdated\", fulldata);\n}\n\n$(document).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"visible\") > -1 && control.identifier) {\n var $parent = $widget.parents(\".bb-questionlabelgroup\");\n if (control.visible) {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.removeAttr(\"hidden\").attr(\"data-visible\", control.visible);\n }, 80);\n } else {\n $parent.attr(\"data-visible\", control.visible);\n window.setTimeout(function () {\n $parent.attr(\"hidden\", true);\n }, 80);\n }\n }\n});\n\n/*** DATA HANDLERS END ***/\n\n/*** VALIDATION BEGIN ***/\n\n/**\n * @Class Validation object.\n *\n */\nvar Validation = {\n /**\n * @member @private {Array} Stack of to-be-validated elemenents\n */\n _stack: [],\n /**\n * @member {Function}\n * @return undefined\n */\n reset: function () {\n this._stack = [];\n },\n /**\n * @member {Function}\n * @return {Element} Next Element eligible for validation\n */\n next: function () {\n return this._stack.pop();\n },\n /**\n * @member {Function}\n * @param {Element} el Element we want to be validated in due time\n */\n add: function (el) {\n this._stack.push(el);\n }\n};\n\n/**\n * Are all inputs valid?\n * @return {Boolean} Whether all inputs pass the test\n */\nValidation.allValid = function () {\n return (\n $.grep(\n $(\n '.group:not([disabled]) .validatable, .group:not([disabled]) [data-datatype^=\"datades:\"]'\n )\n .validate({ silent: true })\n .map(function () {\n return $(this).data(\"validated\");\n }),\n function (val) {\n return val === false;\n }\n ).length === 0\n );\n};\n\n/**\n * Update isValidated Mode\n * @return undefined\n */\nValidation.setMode = function () {\n Mode.toggle(\"isValidated\", Validation.allValid());\n};\n\n/**\n * Live Validation instructions\n */\n$(document).on(\"keyup change\", \"body.hasModel\", Validation.setMode);\n\n// Push the input just left onto the validation stack\n$(document).on(\"focusout\", \"#bb-q .group .validatable\", function () {\n var me = $(this);\n Validation.add(me[0]);\n});\n\n$.fn.extend({\n geterrorelt: function () {\n var $this = $(this);\n return $this.data(\"$error\") || $();\n },\n showValidation: function (options, ok, error) {\n var $this = $(this),\n node = $this.get(0);\n\n var errortext;\n if (error instanceof Error) errortext = error.message;\n else errortext = error;\n\n if (!document.body.contains(node)) {\n // console.log('Trying to validate unconnected', this)\n return;\n }\n $this.data(\"validated\", ok);\n\n if (!ok) {\n var $error = $this.geterrorelt(),\n $anchor = $this.is(\"input[type=checkbox]\")\n ? $this.next()\n : $this.data(\"anchor\");\n\n $this.attr(\"aria-invalid\", true);\n\n if ($error.length === 0) {\n if (!options.silent && !options.justhide) {\n $error = $(\n ``\n );\n $this.data(\"$error\", $error);\n }\n }\n // If there was already an error element, and the input is\n // still invalid but (reason and therefore) the errortext\n // has changed, change the error text shown to the user.\n if ($error.length > 0) {\n if ($error.data(\"lasterrortext\") !== errortext) {\n $error.data(\"lasterrortext\", errortext);\n $error.text(errortext);\n }\n }\n if (!options.silent && !options.justhide) {\n $this.addClass(\"error invalid\");\n // (re-)attach $error.\n $anchor.after($error);\n // This may be necessary:\n $(\"#bb-wrapmodel\").scrollTo($error);\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOn\", [errortext, $anchor, $error]);\n }\n } else {\n $this.attr(\"aria-invalid\", false);\n $this.geterrorelt().remove();\n $this.removeClass(\"error invalid\");\n $this.addClass(\"validated\");\n // Allow complicated widgets to fix stuff afterwards\n $this.trigger(\"bb:errorOff\");\n\n if (!options.silent && options.requestUpdate) {\n if (Mode.get(\"hasDynamicInterfaces\")) {\n requestDynProps(node);\n }\n }\n }\n },\n // Validate input\n // OPTIONS: silent, justhide\n validate: function (options) {\n if (!options) {\n options = {};\n }\n if (options.silent === undefined) {\n options.silent = false;\n }\n if (options.justhide === undefined) {\n options.justhide = false;\n }\n // requestUpdate needs to be false whenever validation is done\n // upon node navigation (next, skip), in order to avoid useless\n // server requests. Also, on validating for just showing errors\n // on tabbing away, we want not to request an update - that is\n // already taken care of by the onChange event\n if (options.requestUpdate === undefined) {\n options.requestUpdate = true;\n }\n\n // Argument noui says: do not update the ui (i.e. do not show nor hide any errors).\n return $(this).each(function () {\n var $this = $(this),\n ok = true,\n errortext;\n\n try {\n // Let actual validation be performed by other method.\n ok = validateInput($this);\n } catch (err) {\n ok = false;\n errortext = err;\n }\n\n return $this.showValidation(options, ok, errortext);\n });\n }\n});\n\n// Check when tabbing / clicking to new input - we want to show\n// validation while tabbing through, but not tabbing. onChange we want\n// to hide validation errors, but not show them immediately.\n$(document).on(\"focusin\", \":input\", function () {\n let validatable;\n while ((validatable = Validation.next())) {\n validatable = $(validatable);\n if ($(this).is(\":radio\")) {\n //Only validate when really outside of the radiogroup\n if (!$(this).parent(\".radiogroup\").has(validatable))\n validatable.validate({ requestUpdate: false });\n } else {\n if (validatable.get(0) != $(this).get(0))\n validatable.validate({ requestUpdate: false });\n }\n }\n});\n\n$(document).on(\n \"change\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n var $this = $(this),\n options = { silent: false, justhide: true };\n if ($this.is(\":radio\")) {\n // validating radio???\n $this.parents(\".radiogroup\").validate(options);\n } else {\n $this.validate(options);\n }\n }\n);\n\n// Always check checkboxes onchange\n$(document).on(\"change\", \"#bb-q .group :checkbox\", function () {\n $(this).parents(\".checklist\").validate();\n});\n\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n var callNow = immediate && !timeout;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n}\n\nconst eltControltype = compose(prop(\"controltype\"), getControl);\n\nconst doChangeOnKeyDown = elt => {\n const setting = path([\"arbitrary\", \"core\", \"update-on-typing\"])(conf);\n return (\n setting === \"always\" ||\n (setting instanceof Array && includes(eltControltype(elt), setting))\n );\n};\n\nfunction keyDown() {\n if (doChangeOnKeyDown(this)) $(this).data(\"valBefore\", $(this).val());\n}\n\n$(document).on(\n \"keydown\",\n \"#bb-q .group.selected :input:not(button)\",\n debounce(keyDown, 32, true)\n);\n\n$(document).on(\n \"keyup\",\n \"#bb-q .group.selected :input:not(button)\",\n function () {\n if (doChangeOnKeyDown(this)) {\n var $this = $(this),\n before = $this.data(\"valBefore\"),\n val = $this.val();\n if (before !== undefined && before !== val) {\n $this.trigger(\"change\");\n $this.removeData(\"valBefore\");\n }\n }\n }\n);\n/*** VALIDATION END ***/\n\n/*** HINTS, TOOLTIPS BEGIN ***/\n// Move to plugin core:tooltips\n/*** HINTS, TOOLTIPS END ***/\n\n/*** RENDERING 'ENGINE' BEGIN ***/\nconst doScrollToSelected = compose(\n val => val !== false,\n path([\"arbitrary\", \"core\", \"scrollToSelectedGroup\"])\n);\nconst setDynamicMode = tap(\n group =>\n group.current && Mode.toggle(\"hasDynamicInterfaces\", Boolean(group.dynamic))\n);\n\n/**\n * Render questions / labels (i.o.w. the main interaction\n * interface) This function is only called when there are actually\n * screens in need of rendering. Therefore, it need not check the JSON\n * object\n *\n * @param ev {Event} The event that triggered this function\n * @param data {Object} 'JSON'-object conforming to BB JSON API.\n */\nfunction renderGroups(ev, data) {\n // Save previous id\n var previd = $(\"#bb-q\" + \" .group.selected\").data(\"groupid\"),\n groups = data.groups,\n $bbq = $(\"#bb-q\");\n\n // Begin -- Only update what is new or was .selected before! There\n // is a problem with $.ajax calls when fast-clicking => therefore\n // step has {async: false}\n //\n // FIXME: when user press next, while\n // there is no next, a node too many is inserted. This can be\n // fixed now the server passes along the node id of a group.\n\n groups.forEach(setGroupTitle);\n if (![\"open\", \"exit\"].includes(Ajax.direction) && mustUpdate(conf)) {\n // Prepare DOM -- remove unneeded or to be re-rendered .groups\n for (let group of document.querySelectorAll(\".group\")) {\n if (complement(any(propEq(\"groupid\", group.dataset[\"gid\"])))(groups)) {\n // Remove a group if not in response\n group.parentNode.removeChild(group);\n } else if (Ajax.row && group.dataset[\"gid\"] === Ajax.groupid) {\n // When adding/deleting rows, safe the space where the group\n // was (entire group will be re-rendered)\n const gob = find(propEq(\"groupid\", group.dataset[\"gid\"]))(groups);\n const tempNode = document.createComment(\"group\");\n group.parentNode.replaceChild(tempNode, group);\n gob._tempNode = tempNode;\n }\n }\n compose(\n map(\n compose(\n ifElse(\n ({ groupid }) =>\n document.querySelector(`.group[data-gid=\"${groupid}\"]`),\n group => {\n updateDynProps({\n groups: [{ current: true, controls: group.controls }]\n });\n const elt = document.querySelector(\n `.group[data-gid=\"${group.groupid}\"]`\n );\n setSelectedStateAttributes(elt, group);\n },\n renderGroup\n ),\n setDynamicMode\n )\n ),\n sortGroups\n )(groups);\n } else {\n // Always remove .selected:\n $(\".group.selected\", $bbq).remove();\n if (Ajax.direction == \"next\" && groups.length > 1) {\n // Re-render only previous group and current group\n groups = groups.filter(function (group) {\n return group.current || group.groupid === previd;\n });\n } else if (\n Ajax.direction == \"prior\" &&\n $(\"#bb-q .group\").length > 0 &&\n groups.length > 1\n ) {\n // Re-render only current group\n groups = groups.filter(function (group) {\n return group.current;\n });\n } else $bbq.empty();\n // End -- Only update what is new!\n\n $bbq.hide();\n compose(map(compose(renderGroup, setDynamicMode)), sortGroups)(groups);\n }\n $bbq.attr(\"lang\", data.modellanguage).show();\n\n // Old questionlabelgroup plugin:\n if (!doGrouping(conf)) {\n (bb.questionlabelgroup || questionlabelgroup)();\n\n $('.bb-questionlabelgroup:has([data-datatype][data-visible=\"false\"])').attr(\n {\n \"data-visible\": false,\n \"hidden\": true\n }\n );\n }\n}\n\nfunction sortGroups(groups) {\n // Fix insertion order\n return groups.sort(function (a, b) {\n return a.order - b.order;\n });\n}\n\nfunction sortControls(a, b) {\n if (!a[0]) return b.reverse();\n var ac = a.shift(),\n bc = b[0];\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc._sorted === undefined &&\n bc.controltype !== \"label\" &&\n (bc.controltype !== \"linklabel\" || bc.isreport) &&\n bc.controltype !== \"checkbox\"\n ) {\n // Reverse input with label\n b.shift();\n bc._sorted = true; // Instruct next recursion not to touch the control\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = bc.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {}; // Associate input with label\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n // Associate input (group) with label.\n if (\n [\"radio\", \"checkmultilist\", \"listbox\", \"multilist\"].includes(\n bc.controltype\n )\n ) {\n if (bb.conf.a11y.optionfieldsets) {\n ac.controltype = \"legend\";\n ac.className = \"bb-label\";\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else if (bc.controltype === \"grid\") {\n if (bb.conf.a11y.captions) {\n ac.controltype = \"caption\";\n bc.caption = ac;\n } else {\n bc.aria.labelledby = ac.id;\n }\n } else {\n ac.isFor = bc.id;\n }\n return sortControls(a, [bc, ac].concat(b));\n } else {\n if (\n bc &&\n ac.controltype === \"label\" &&\n !ac.datatype && // Label with a datatype is a text interface\n bc.controltype === \"checkbox\"\n ) {\n ac.isFor = bc.id; // Associate label with checkbox (that comes before)\n if (has(\"notnull\", bc)) ac.isForNotNull = bc.notnull;\n if (has(\"readonly\", bc)) ac.readonly = bc.readonly;\n ac.dynamic = /^datades:/.test(bc.datatype);\n ac.metadata = Object.assign({}, bc.metadata, ac.metadata);\n bc.meta = bc.meta || {}; // Associate input with label\n bc.meta.label = (ac.value || \"\").trim();\n bc.aria = bc.aria || {};\n if (bc.notnull) bc.aria.required = true;\n if (ac.notnull) ac.aria.required = true;\n }\n return sortControls(a, [ac].concat(b));\n }\n}\n\nfunction setGroupTitle(group) {\n var controls = group.controls;\n // It's a title, if:\n // there are two 1st is label Not a 'text' interface 1st doesnt control any\n if (\n controls[1] &&\n controls[0].controltype === \"label\" &&\n !controls[0].datatype &&\n !controls[0].isfor\n ) {\n controls[0].controltype = \"legend\";\n group.screentitle = controls[0].value;\n }\n}\n\nconst setSelectedStateAttributes = (elt, group) => {\n elt.classList.toggle(\"selected\", group.current);\n elt.classList.toggle(\"unselected\", !group.current);\n if (group.current || canEditEarlier(conf)) {\n elt.removeAttribute(\"aria-hidden\");\n elt.removeAttribute(\"disabled\");\n } else {\n elt.setAttribute(\"aria-hidden\", true);\n elt.setAttribute(\"disabled\", \"disabled\");\n }\n};\n\nconst hasStatusRole = pathEq([\"metadata\", \"role\"], \"status\");\n\nfunction renderGroup(group) {\n var controls = group.controls,\n wGroup = $(\n '
      \"\n );\n\n // If this has a dupe, first remove the old one:\n $(\".group\").each(function () {\n if ($(this).data(\"groupid\") === group.groupid) $(this).remove();\n });\n\n const elt = wGroup.get(0);\n elt.dataset[\"gid\"] = group[\"groupid\"];\n wGroup.data(\"groupid\", group[\"groupid\"]);\n\n controls = sortControls(controls.slice(0), []);\n\n if (doGrouping(conf)) controls = groupOuter(controls);\n\n $(controls).each(function (i, c) {\n if (doGrouping(conf)) {\n elt.appendChild(createFormGroup(wControl, group, 1)(c));\n } else wControl(c, group, elt);\n });\n\n elt.classList.add(\"bb-screenmode-\" + group.screenmode);\n elt.setAttribute(\"data-node\", group.name);\n if (!bb.getVar(\"wrongOrder\")) elt.setAttribute(\"data-bb:order\", group.order);\n\n setSelectedStateAttributes(elt, group);\n\n if (group._tempNode) {\n group._tempNode.parentNode.replaceChild(elt, group._tempNode);\n delete group._tempNode;\n } else {\n if (group.screenmode == \"addtop\") $(\"#bb-q\").prepend(elt);\n else $(\"#bb-q\").append(elt);\n }\n}\n\n/**\n * Wrap questions + accompanying labels in a single group\n *\n * This function may be overriden by assigning a function to bb.questionlabelgroup\n * @see Plugin questionlabelgroup-ng\n *\n * @return undefined\n */\nfunction questionlabelgroup() {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this);\n var input = $this.next(\n \":not(label):not(a):not([type=checkbox]):not(img):not(.clearfix)\"\n );\n var itype = input.data(\"type\");\n var questionandlabel = $this.add(input);\n\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n else {\n questionandlabel = $this.prev(\"[type=checkbox]\").add(this);\n if (questionandlabel.length > 1)\n questionandlabel.wrapAll(\n '
      '\n );\n }\n questionandlabel\n .parent(\".bb-questionlabelgroup\")\n .append('
      ');\n $.each(\n questionandlabel.parent(\".bb-questionlabelgroup\").find(\"[data-type]\"),\n function () {\n var $this = $(this);\n if ($this.attr(\"class\")) {\n var classname = $this.attr(\"class\").match(/\\bbbm-[a-z0-9-]+\\b/);\n if (classname) {\n classname = classname[0].replace(/\\bbbm-/, \"bb-g-\");\n $this.parents(\".bb-questionlabelgroup\").addClass(classname);\n }\n }\n }\n );\n });\n}\n\n/*** RENDERING 'ENGINE' END ***/\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR BEGIN ***/\n\n/**\n * Radiogroup and checklist enhancements\n */\n\n$(document)\n .on(\"change programmatically-changed\", \".bb-option\", function (ev) {\n var $this = $(this);\n $this.toggleClass(\"checked\", ev.target.checked);\n if (ev.target.type === \"radio\" && ev.target.checked) {\n $this.siblings().removeClass(\"checked\");\n }\n })\n .on(\"focus\", \".bb-option\", function (ev) {\n $(this).addClass(\"focus\");\n if (ev.target.type === \"radio\") {\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n })\n .on(\"blur\", \".bb-option\", function () {\n $(this).removeClass(\"focus\");\n })\n .on(\n \"keydown\",\n \".radiogroup .bb-option\",\n // Fix the odd default behaviour of selecting upon focus\n function (ev) {\n var $other,\n chars = [37, 38, 39, 40],\n // left, up, right, down\n idx = chars.indexOf(ev.keyCode);\n if (idx === -1) return true;\n\n $other =\n idx < 2 // 'prev' chars\n ? $(this).prev().find('input[type=\"radio\"]')\n : $(this).next().find('input[type=\"radio\"]');\n\n // At beginning or end... go around (Edge selects otherwise...).\n if (!$other.length) {\n $other =\n idx < 2 // 'prev' chars\n ? $(this).siblings().last().find('input[type=\"radio\"]')\n : $(this).siblings().first().find('input[type=\"radio\"]');\n }\n if ($other.length) {\n $other.trigger(\"focus\");\n ev.preventDefault();\n ev.stopImmediatePropagation();\n return false;\n }\n return true;\n }\n );\n\n/*** 'COMPLEX' WIDGET BEHAVIOUR END ***/\n\n/*** LINKS BEGIN ***/\n\n/**\n * Original code moved to plugin rewrite-links\n *\n */\n\n/*** LINKS END ***/\n\n/*** TOKENCHANNEL BEGIN ***/\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:preHandleData\", (_, data) => {\n // document.body.dispatchEvent(new customEvent(\"bb:storeToken\", { bubbles: true, })\n if (has(\"uniqueid\", data)) {\n token.setToken(prop(\"uniqueid\", data));\n }\n});\n\n$(document).on(\"bb:mode:isLoggedIn\", (_event, bool) => {\n if (!bool) {\n token\n .getHash()\n .then(tokenHash => token.postMessage({ tokenHash, type: \"loggedOut\" }));\n }\n});\n\ntoken.addEventListener(\"message\", message => {\n token.getHash().then(hash => {\n if (message.data.tokenHash === hash) {\n if (message.data.type === \"loggedOut\") window.close() || logout();\n }\n });\n});\n\n/*** TOKENCHANNEL END ***/\n\n/*** EXPORTS BEGIN ***/\n\nbb.escapeHTML = escapeHTML;\nbb.exit = exit;\nbb.deleteCase = deleteCase;\nbb.logout = logout;\nbb.menu = menu;\n\nbb.authenticate = token => Vars.setVars({ uniqueid: token });\nbb.newcase = newcase;\nbb.step = step;\nbb.restart = function restart() {\n newcase(Vars.getVar(\"dbname\"));\n};\nbb.rewind = function rewind(cb, options) {\n step(\"rewind\", cb, options);\n};\nbb.update = function update(cb, options) {\n step(\"update\", cb, options);\n};\nbb.updatemis = function updatemis(options) {\n step(\"updatemis\", $.noop, options);\n};\nbb.next = function next(cb, options) {\n step(\"next\", cb, options);\n};\nbb.prior = function prior(cb, options) {\n step(\"prior\", cb, options);\n};\nbb.skip = function skip(cb, options) {\n step(\"skip\", cb, options);\n};\nbb.gotonode = function gotonode(groupid, cb, options = null) {\n step(\"gotonode\", cb, Object.assign({}, { groupid }, options));\n};\nbb.runtonode = function runtonode(nodename, cb) {\n step(\"runtonode\", cb, { fullnodename: nodename });\n};\nbb.getVar = Vars.getVar;\nbb.notify = notify.bind(null, {});\nbb.ajax = {\n replace: Ajax.replace,\n busy: function () {\n return Ajax.busy;\n },\n release: Ajax.release,\n post: Ajax.post,\n direction: function () {\n return Ajax.direction;\n }\n};\nbb.URL = urlutils;\nbb.Numerals = Numerals;\nbb.Plugins = bb.Plugins || {};\nbb.Validation = Validation;\nbb.positionalFormat = positionalFormat;\nbb.humanDate = humanDate;\nbb.propFinder = propFinder;\nbb.requestDynProps = requestDynProps;\n// Window-export some stuff used in bookmarklets.\nwindow.bb = {\n restart: bb.restart,\n getVar: bb.getVar,\n requestDynProps: bb.requestDynProps,\n Mode,\n menu\n};\n\n/*** EXPORTS END ***/\n\nexport { bb, _, _ as gt };\n","/**\n * https://github.com/flesler/jquery.scrollTo\n * Copyright (c) 2007-2013 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com\n * Dual licensed under MIT and GPL.\n * @author Ariel Flesler\n * @version 1.4.6\n */\n(function ($) {\n var h = ($.scrollTo = function (a, b, c) {\n $(window).scrollTo(a, b, c);\n });\n h.defaults = {\n axis: \"xy\",\n duration: parseFloat($.fn.jquery) >= 1.3 ? 0 : 1,\n limit: true\n };\n h.window = function (a) {\n return $(window)._scrollable();\n };\n $.fn._scrollable = function () {\n return this.map(function () {\n var a = this,\n isWin =\n !a.nodeName ||\n $.inArray(a.nodeName.toLowerCase(), [\n \"iframe\",\n \"#document\",\n \"html\",\n \"body\"\n ]) != -1;\n if (!isWin) return a;\n var b = (a.contentWindow || a).document || a.ownerDocument || a;\n return /webkit/i.test(navigator.userAgent) || b.compatMode == \"BackCompat\"\n ? b.body\n : b.documentElement;\n });\n };\n $.fn.scrollTo = function (e, f, g) {\n if (typeof f == \"object\") {\n g = f;\n f = 0;\n }\n if (typeof g == \"function\") g = { onAfter: g };\n if (e == \"max\") e = 9e9;\n g = $.extend({}, h.defaults, g);\n f = f || g.duration;\n g.queue = g.queue && g.axis.length > 1;\n if (g.queue) f /= 2;\n g.offset = both(g.offset);\n g.over = both(g.over);\n return this._scrollable()\n .each(function () {\n if (e == null) return;\n var d = this,\n $elem = $(d),\n targ = e,\n toff,\n attr = {},\n win = $elem.is(\"html,body\");\n switch (typeof targ) {\n case \"number\":\n case \"string\":\n if (/^([+-]=?)?\\d+(\\.\\d+)?(px|%)?$/.test(targ)) {\n targ = both(targ);\n break;\n }\n targ = $(targ, this);\n if (!targ.length) return;\n case \"object\":\n if (targ.is || targ.style) toff = (targ = $(targ)).offset();\n }\n $.each(g.axis.split(\"\"), function (i, a) {\n var b = a == \"x\" ? \"Left\" : \"Top\",\n pos = b.toLowerCase(),\n key = \"scroll\" + b,\n old = d[key],\n max = h.max(d, a);\n if (toff) {\n attr[key] = toff[pos] + (win ? 0 : old - $elem.offset()[pos]);\n if (g.margin) {\n attr[key] -= parseInt(targ.css(\"margin\" + b)) || 0;\n attr[key] -= parseInt(targ.css(\"border\" + b + \"Width\")) || 0;\n }\n attr[key] += g.offset[pos] || 0;\n if (g.over[pos])\n attr[key] += targ[a == \"x\" ? \"width\" : \"height\"]() * g.over[pos];\n } else {\n var c = targ[pos];\n attr[key] =\n c.slice && c.slice(-1) == \"%\" ? (parseFloat(c) / 100) * max : c;\n }\n if (g.limit && /^\\d+$/.test(attr[key]))\n attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);\n if (!i && g.queue) {\n if (old != attr[key]) animate(g.onAfterFirst);\n delete attr[key];\n }\n });\n animate(g.onAfter);\n function animate(a) {\n $elem.animate(\n attr,\n f,\n g.easing,\n a &&\n function () {\n a.call(this, targ, g);\n }\n );\n }\n })\n .end();\n };\n h.max = function (a, b) {\n var c = b == \"x\" ? \"Width\" : \"Height\",\n scroll = \"scroll\" + c;\n if (!$(a).is(\"html,body\")) return a[scroll] - $(a)[c.toLowerCase()]();\n var d = \"client\" + c,\n html = a.ownerDocument.documentElement,\n body = a.ownerDocument.body;\n return Math.max(html[scroll], body[scroll]) - Math.min(html[d], body[d]);\n };\n function both(a) {\n return typeof a == \"object\" ? a : { top: a, left: a };\n }\n})(jQuery);\n","/* global $ */\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n always,\n assoc,\n either,\n tap,\n cond,\n path,\n propEq,\n T\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { listtypes } from \"./types.js\";\nimport { compose } from \"./functional.js\";\nimport { quotable } from \"./quotable.js\";\n\n// Validate actual input, return true if it's ok, throw an error otherwise.\nexport function validateInput(node) {\n const $node = $(node),\n control = $node.data(\"control\");\n let ok = true,\n re,\n errortext,\n val,\n category;\n\n if (control === undefined) {\n throw \"Not a BB widget\";\n }\n\n if (control.visible === false) {\n return true;\n }\n category = listtypes[control.controltype];\n\n val = $node.val();\n\n if (control.stringmask) {\n re = new RegExp(control.stringmask);\n if (!re.test(val))\n throw format(\n control.errortext,\n compose(assoc(\"value\", val), quotable)(control)\n );\n }\n if (control.notnull) {\n if (category === \"LIST\") {\n ok = $node.is(\":has(:checked)\");\n } else if (category === \"BOX\") {\n // There could be a faux, checked, option telling us to\n // fill in the field. That is the second check here.\n ok = val !== null && val !== \"\";\n } else if (control.controltype == \"checkbox\") {\n ok = $node.is(\":checked\");\n } else if (control.controltype === \"grid\") {\n if (control.addallowed === false) {\n const checkable = control.columns.find(\n either(\n propEq(\"controltype\", \"radiobutton\"),\n propEq(\"controltype\", \"checkbox\")\n )\n );\n if (checkable) {\n ok = $node.is(\":has(:checked)\");\n }\n } else {\n // A required grid should have at least one row.\n // But if no rows **can** be added it would be rude and confusing to complain to the end-user.\n ok = control.value.length > 0 || control.addallowed === false;\n }\n } else {\n re = /\\S/;\n ok = re.test(val);\n }\n if (!ok) {\n throw cond([\n [path([\"metadata\", \"errrequired\"]), path([\"metadata\", \"errrequired\"])],\n [\n propEq(\"controltype\", \"datetimepicker\"),\n compose(c => formatPlus(_(\"Date required\"), c), quotable)\n ],\n [\n always([\"BOX\", \"LIST\"].indexOf(category) > -1),\n compose(c => format(_(\"Choice required\"), c), quotable)\n ],\n [T, compose(c => format(_(\"Field required\"), c), quotable)]\n ])(control);\n }\n }\n if (control.maxlength && control.maxlength > 0) {\n ok = val.length <= control.maxlength;\n if (!ok) {\n throw format(\n path([\"metadata\", \"errtexttoolong\"])(control) ||\n _(\"Text length exceeds the maximum of {maxlength} characters\"),\n quotable(control)\n );\n }\n }\n if (getWidget(control.controltype).validate) {\n return getWidget(control.controltype).validate(control, val);\n }\n return true;\n}\n","/* a11y-describedby:\n *\n * - Describe group with all its standard remarks\n * - Describe input by any non-standard remark labels directly\n * preceding it\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport { tap, when, compose, prop, path, find } from \"$json/lib/functional\";\n\n$(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (_, group) {\n var remarks = [],\n pretexts = [];\n $.each(group.controls, function (idx, control) {\n if (control[\"font-class\"].toLowerCase() === \"standard remark\") {\n remarks.push(control.id);\n } else if (control.datatype && control.controltype === \"label\") {\n pretexts.push(control.id);\n }\n const explicitId = path([\"metadata\", \"describedby\"], control);\n if (explicitId) {\n compose(\n when(\n Boolean,\n compose(id => pretexts.push(id), prop(\"id\"))\n ),\n find(c => c.identifier && c.identifier.endsWith(`.${explicitId}`)),\n prop(\"controls\")\n )(group);\n }\n if (control.datatype && control.controltype !== \"label\") {\n maybeSetDescription(control, pretexts);\n pretexts = [];\n }\n });\n maybeSetDescription(group, remarks);\n });\n }\n});\n\nfunction maybeSetDescription(thing, description_ids) {\n if (description_ids.length) {\n thing.aria = thing.aria || {};\n thing.aria.describedby = description_ids.join(\" \");\n }\n}\n","/* array.groupby:\n *\n * Extend Array prototype with _groupby(function) method.\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nArray.prototype._groupby = function (hash) {\n var _hash = hash\n ? hash\n : function (o) {\n return o;\n };\n\n var _map = {};\n var put = function (map, key, value) {\n if (!map[_hash(key)]) {\n map[_hash(key)] = [];\n }\n map[_hash(key)].push(value);\n };\n\n this.map(function (obj) {\n put(_map, obj, obj);\n });\n\n var out = [];\n for (var key in _map) {\n out.push(_map[key]);\n }\n return out;\n};\n","/* asterisk:\n *\n * Add asterisk to labels for required fields\n *\n * Author: Niels Giesen\n * Copyright 2015 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n function appendAsterisk(child) {\n if (child.nodeType === 3 /* Node.TEXT_NODE */) {\n var val = child.nodeValue,\n space = \"\",\n words = val.split(\" \"),\n lastword = words.pop();\n // json.js adds a space for visual purposes\n if (lastword === \"\") {\n space = \" \";\n lastword = words.pop();\n }\n child.nodeValue = words.join(\" \");\n child.parentNode.insertAdjacentHTML(\n \"beforeEnd\",\n ' ' +\n lastword +\n ` *` +\n \"\" +\n space\n );\n } else if (child.nodeType === 1 /* Node.ELEMENT_NODE */) {\n if (child.lastChild) appendAsterisk(child.lastChild);\n }\n }\n\n $(doc).on(\"bb:updated\", function (event, $widget, control, updates) {\n if (updates.indexOf(\"isForNotNull\") > -1) {\n if (control.isForNotNull) {\n appendAsterisk($widget.get(0).lastChild);\n } else {\n const $stick = $widget.find(\".bb-p-asterisk-stick\");\n if (!$stick.get(0)) return;\n $stick.find(\"sup\").remove();\n const textnode = $stick.get(0).childNodes[0];\n if (textnode) $(textnode).unwrap();\n }\n }\n });\n})(jQuery, window, document);\n","/*!\n * mustache.js - Logic-less {{mustache}} templates with JavaScript\n * http://github.com/janl/mustache.js\n */\n\n/*global define: false Mustache: true*/\n\nfunction mustacheFactory(mustache) {\n var objectToString = Object.prototype.toString;\n var isArray =\n Array.isArray ||\n function isArrayPolyfill(object) {\n return objectToString.call(object) === \"[object Array]\";\n };\n\n function isFunction(object) {\n return typeof object === \"function\";\n }\n\n /**\n * More correct typeof string handling array\n * which normally returns typeof 'object'\n */\n function typeStr(obj) {\n return isArray(obj) ? \"array\" : typeof obj;\n }\n\n function escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n }\n\n /**\n * Null safe way of checking whether or not an object,\n * including its prototype, has a given property\n */\n function hasProperty(obj, propName) {\n return obj != null && typeof obj === \"object\" && propName in obj;\n }\n\n // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577\n // See https://github.com/janl/mustache.js/issues/189\n var regExpTest = RegExp.prototype.test;\n function testRegExp(re, string) {\n return regExpTest.call(re, string);\n }\n\n var nonSpaceRe = /\\S/;\n function isWhitespace(string) {\n return !testRegExp(nonSpaceRe, string);\n }\n\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n };\n\n function escapeHtml(string) {\n return String(string).replace(/[&<>\"'`=\\/]/g, function fromEntityMap(s) {\n return entityMap[s];\n });\n }\n\n var whiteRe = /\\s*/;\n var spaceRe = /\\s+/;\n var equalsRe = /\\s*=/;\n var curlyRe = /\\s*\\}/;\n var tagRe = /#|\\^|\\/|>|\\{|&|=|!/;\n\n /**\n * Breaks up the given `template` string into a tree of tokens. If the `tags`\n * argument is given here it must be an array with two string values: the\n * opening and closing tags used in the template (e.g. [ \"<%\", \"%>\" ]). Of\n * course, the default is to use mustaches (i.e. mustache.tags).\n *\n * A token is an array with at least 4 elements. The first element is the\n * mustache symbol that was used inside the tag, e.g. \"#\" or \"&\". If the tag\n * did not contain a symbol (i.e. {{myValue}}) this element is \"name\". For\n * all text that appears outside a symbol this element is \"text\".\n *\n * The second element of a token is its \"value\". For mustache tags this is\n * whatever else was inside the tag besides the opening symbol. For text tokens\n * this is the text itself.\n *\n * The third and fourth elements of the token are the start and end indices,\n * respectively, of the token in the original template.\n *\n * Tokens that are the root node of a subtree contain two more elements: 1) an\n * array of tokens in the subtree and 2) the index in the original template at\n * which the closing tag for that section begins.\n */\n function parseTemplate(template, tags) {\n if (!template) return [];\n\n var sections = []; // Stack to hold section tokens\n var tokens = []; // Buffer to hold the tokens\n var spaces = []; // Indices of whitespace tokens on the current line\n var hasTag = false; // Is there a {{tag}} on the current line?\n var nonSpace = false; // Is there a non-space char on the current line?\n\n // Strips all whitespace tokens array for the current line\n // if there was a {{#tag}} on it and otherwise only space.\n function stripSpace() {\n if (hasTag && !nonSpace) {\n while (spaces.length) delete tokens[spaces.pop()];\n } else {\n spaces = [];\n }\n\n hasTag = false;\n nonSpace = false;\n }\n\n var openingTagRe, closingTagRe, closingCurlyRe;\n function compileTags(tagsToCompile) {\n if (typeof tagsToCompile === \"string\")\n tagsToCompile = tagsToCompile.split(spaceRe, 2);\n\n if (!isArray(tagsToCompile) || tagsToCompile.length !== 2)\n throw new Error(\"Invalid tags: \" + tagsToCompile);\n\n openingTagRe = new RegExp(escapeRegExp(tagsToCompile[0]) + \"\\\\s*\");\n closingTagRe = new RegExp(\"\\\\s*\" + escapeRegExp(tagsToCompile[1]));\n closingCurlyRe = new RegExp(\n \"\\\\s*\" + escapeRegExp(\"}\" + tagsToCompile[1])\n );\n }\n\n compileTags(tags || mustache.tags);\n\n var scanner = new Scanner(template);\n\n var start, type, value, chr, token, openSection;\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match any text between tags.\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (var i = 0, valueLength = value.length; i < valueLength; ++i) {\n chr = value.charAt(i);\n\n if (isWhitespace(chr)) {\n spaces.push(tokens.length);\n } else {\n nonSpace = true;\n }\n\n tokens.push([\"text\", chr, start, start + 1]);\n start += 1;\n\n // Check for whitespace on the current line.\n if (chr === \"\\n\") stripSpace();\n }\n }\n\n // Match the opening tag.\n if (!scanner.scan(openingTagRe)) break;\n\n hasTag = true;\n\n // Get the tag type.\n type = scanner.scan(tagRe) || \"name\";\n scanner.scan(whiteRe);\n\n // Get the tag value.\n if (type === \"=\") {\n value = scanner.scanUntil(equalsRe);\n scanner.scan(equalsRe);\n scanner.scanUntil(closingTagRe);\n } else if (type === \"{\") {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(curlyRe);\n scanner.scanUntil(closingTagRe);\n type = \"&\";\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n // Match the closing tag.\n if (!scanner.scan(closingTagRe))\n throw new Error(\"Unclosed tag at \" + scanner.pos);\n\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n\n if (type === \"#\" || type === \"^\") {\n sections.push(token);\n } else if (type === \"/\") {\n // Check section nesting.\n openSection = sections.pop();\n\n if (!openSection)\n throw new Error('Unopened section \"' + value + '\" at ' + start);\n\n if (openSection[1] !== value)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + start\n );\n } else if (type === \"name\" || type === \"{\" || type === \"&\") {\n nonSpace = true;\n } else if (type === \"=\") {\n // Set the tags for the next time around.\n compileTags(value);\n }\n }\n\n // Make sure there are no open sections when we're done.\n openSection = sections.pop();\n\n if (openSection)\n throw new Error(\n 'Unclosed section \"' + openSection[1] + '\" at ' + scanner.pos\n );\n\n return nestTokens(squashTokens(tokens));\n }\n\n /**\n * Combines the values of consecutive text tokens in the given `tokens` array\n * to a single token.\n */\n function squashTokens(tokens) {\n var squashedTokens = [];\n\n var token, lastToken;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === \"text\" && lastToken && lastToken[0] === \"text\") {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n /**\n * Forms the given array of `tokens` into a nested tree structure where\n * tokens that represent a section have two additional items: 1) an array of\n * all tokens that appear in that section and 2) the index in the original\n * template that represents the end of that section.\n */\n function nestTokens(tokens) {\n var nestedTokens = [];\n var collector = nestedTokens;\n var sections = [];\n\n var token, section;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n token = tokens[i];\n\n switch (token[0]) {\n case \"#\":\n case \"^\":\n collector.push(token);\n sections.push(token);\n collector = token[4] = [];\n break;\n case \"/\":\n section = sections.pop();\n section[5] = token[2];\n collector =\n sections.length > 0\n ? sections[sections.length - 1][4]\n : nestedTokens;\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n /**\n * A simple string scanner that is used by the template parser to find\n * tokens in template strings.\n */\n function Scanner(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n /**\n * Returns `true` if the tail is empty (end of string).\n */\n Scanner.prototype.eos = function eos() {\n return this.tail === \"\";\n };\n\n /**\n * Tries to match the given regular expression at the current position.\n * Returns the matched text if it can match, the empty string otherwise.\n */\n Scanner.prototype.scan = function scan(re) {\n var match = this.tail.match(re);\n\n if (!match || match.index !== 0) return \"\";\n\n var string = match[0];\n\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n\n return string;\n };\n\n /**\n * Skips all text until the given regular expression can be matched. Returns\n * the skipped string, which is the entire tail if no match can be made.\n */\n Scanner.prototype.scanUntil = function scanUntil(re) {\n var index = this.tail.search(re),\n match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = \"\";\n break;\n case 0:\n match = \"\";\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n\n return match;\n };\n\n /**\n * Represents a rendering context by wrapping a view object and\n * maintaining a reference to the parent context.\n */\n function Context(view, parentContext) {\n this.view = view;\n this.cache = { \".\": this.view };\n this.parent = parentContext;\n }\n\n /**\n * Creates a new context using the given view with this context\n * as the parent.\n */\n Context.prototype.push = function push(view) {\n return new Context(view, this);\n };\n\n /**\n * Returns the value of the given name in this context, traversing\n * up the context hierarchy if the value is absent in this context's view.\n */\n Context.prototype.lookup = function lookup(name) {\n var cache = this.cache;\n\n var value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n var context = this,\n names,\n index,\n lookupHit = false;\n\n while (context) {\n if (name.indexOf(\".\") > 0) {\n value = context.view;\n names = name.split(\".\");\n index = 0;\n\n /**\n * Using the dot notion path in `name`, we descend through the\n * nested objects.\n *\n * To be certain that the lookup has been successful, we have to\n * check if the last object in the path actually has the property\n * we are looking for. We store the result in `lookupHit`.\n *\n * This is specially necessary for when the value has been set to\n * `undefined` and we want to avoid looking up parent contexts.\n **/\n while (value != null && index < names.length) {\n if (index === names.length - 1)\n lookupHit = hasProperty(value, names[index]);\n\n value = value[names[index++]];\n }\n } else {\n value = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n\n if (lookupHit) break;\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n return value;\n };\n\n /**\n * A Writer knows how to take a stream of tokens and render them to a\n * string, given a context. It also maintains a cache of templates to\n * avoid the need to parse the same template twice.\n */\n function Writer() {\n this.cache = {};\n }\n\n /**\n * Clears all cached templates in this writer.\n */\n Writer.prototype.clearCache = function clearCache() {\n this.cache = {};\n };\n\n /**\n * Parses and caches the given `template` and returns the array of tokens\n * that is generated from the parse.\n */\n Writer.prototype.parse = function parse(template, tags) {\n var cache = this.cache;\n var tokens = cache[template];\n\n if (tokens == null)\n tokens = cache[template] = parseTemplate(template, tags);\n\n return tokens;\n };\n\n /**\n * High-level method that is used to render the given `template` with\n * the given `view`.\n *\n * The optional `partials` argument may be an object that contains the\n * names and templates of partials that are used in the template. It may\n * also be a function that is used to load partial templates on the fly\n * that takes a single argument: the name of the partial.\n */\n Writer.prototype.render = function render(template, view, partials) {\n var tokens = this.parse(template);\n var context = view instanceof Context ? view : new Context(view);\n return this.renderTokens(tokens, context, partials, template);\n };\n\n /**\n * Low-level method that renders the given array of `tokens` using\n * the given `context` and `partials`.\n *\n * Note: The `originalTemplate` is only ever used to extract the portion\n * of the original template that was contained in a higher-order section.\n * If the template doesn't use higher-order sections, this argument may\n * be omitted.\n */\n Writer.prototype.renderTokens = function renderTokens(\n tokens,\n context,\n partials,\n originalTemplate\n ) {\n var buffer = \"\";\n\n var token, symbol, value;\n for (var i = 0, numTokens = tokens.length; i < numTokens; ++i) {\n value = undefined;\n token = tokens[i];\n symbol = token[0];\n\n if (symbol === \"#\")\n value = this.renderSection(token, context, partials, originalTemplate);\n else if (symbol === \"^\")\n value = this.renderInverted(token, context, partials, originalTemplate);\n else if (symbol === \">\")\n value = this.renderPartial(token, context, partials, originalTemplate);\n else if (symbol === \"&\") value = this.unescapedValue(token, context);\n else if (symbol === \"name\") value = this.escapedValue(token, context);\n else if (symbol === \"text\") value = this.rawValue(token);\n\n if (value !== undefined) buffer += value;\n }\n\n return buffer;\n };\n\n Writer.prototype.renderSection = function renderSection(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var self = this;\n var buffer = \"\";\n var value = context.lookup(token[1]);\n\n // This function is used to render an arbitrary template\n // in the current context by higher-order sections.\n function subRender(template) {\n return self.render(template, context, partials);\n }\n\n if (!value) return;\n\n if (isArray(value)) {\n for (var j = 0, valueLength = value.length; j < valueLength; ++j) {\n buffer += this.renderTokens(\n token[4],\n context.push(value[j]),\n partials,\n originalTemplate\n );\n }\n } else if (\n typeof value === \"object\" ||\n typeof value === \"string\" ||\n typeof value === \"number\"\n ) {\n buffer += this.renderTokens(\n token[4],\n context.push(value),\n partials,\n originalTemplate\n );\n } else if (isFunction(value)) {\n if (typeof originalTemplate !== \"string\")\n throw new Error(\n \"Cannot use higher-order sections without the original template\"\n );\n\n // Extract the portion of the original template that the section contains.\n value = value.call(\n context.view,\n originalTemplate.slice(token[3], token[5]),\n subRender\n );\n\n if (value != null) buffer += value;\n } else {\n buffer += this.renderTokens(\n token[4],\n context,\n partials,\n originalTemplate\n );\n }\n return buffer;\n };\n\n Writer.prototype.renderInverted = function renderInverted(\n token,\n context,\n partials,\n originalTemplate\n ) {\n var value = context.lookup(token[1]);\n\n // Use JavaScript's definition of falsy. Include empty arrays.\n // See https://github.com/janl/mustache.js/issues/186\n if (!value || (isArray(value) && value.length === 0))\n return this.renderTokens(token[4], context, partials, originalTemplate);\n };\n\n Writer.prototype.renderPartial = function renderPartial(\n token,\n context,\n partials\n ) {\n if (!partials) return;\n\n var value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null)\n return this.renderTokens(this.parse(value), context, partials, value);\n };\n\n Writer.prototype.unescapedValue = function unescapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return value;\n };\n\n Writer.prototype.escapedValue = function escapedValue(token, context) {\n var value = context.lookup(token[1]);\n if (value != null) return mustache.escape(value);\n };\n\n Writer.prototype.rawValue = function rawValue(token) {\n return token[1];\n };\n\n mustache.name = \"mustache.js\";\n mustache.version = \"2.2.1\";\n mustache.tags = [\"{{\", \"}}\"];\n\n // All high-level mustache.* functions use this writer.\n var defaultWriter = new Writer();\n\n /**\n * Clears all cached templates in the default writer.\n */\n mustache.clearCache = function clearCache() {\n return defaultWriter.clearCache();\n };\n\n /**\n * Parses and caches the given template in the default writer and returns the\n * array of tokens it contains. Doing this ahead of time avoids the need to\n * parse templates on the fly as they are rendered.\n */\n mustache.parse = function parse(template, tags) {\n return defaultWriter.parse(template, tags);\n };\n\n /**\n * Renders the `template` with the given `view` and `partials` using the\n * default writer.\n */\n mustache.render = function render(template, view, partials) {\n if (typeof template !== \"string\") {\n throw new TypeError(\n 'Invalid template! Template should be a \"string\" ' +\n 'but \"' +\n typeStr(template) +\n '\" was given as the first ' +\n \"argument for mustache#render(template, view, partials)\"\n );\n }\n\n return defaultWriter.render(template, view, partials);\n };\n\n // This is here for backwards compatibility with 0.4.x.,\n /*eslint-disable */ // eslint wants camel cased function name\n mustache.to_html = function to_html(template, view, partials, send) {\n /*eslint-enable*/\n\n var result = mustache.render(template, view, partials);\n\n if (isFunction(send)) {\n send(result);\n } else {\n return result;\n }\n };\n\n // Export the escaping function so that the user may override it.\n // See https://github.com/janl/mustache.js/issues/244\n mustache.escape = escapeHtml;\n\n // Export these mainly for testing, but also for advanced usage.\n mustache.Scanner = Scanner;\n mustache.Context = Context;\n mustache.Writer = Writer;\n}\n\nlet Mustache = {};\n\nmustacheFactory(Mustache);\n\nexport default Mustache;\nexport { Mustache };\n","/* case-template:\n *\n * Use a template to render a case element\n *\n * Author: Niels Giesen\n * Copyright 2014 Berkeley Bridge\n *\n */\n\nimport { Mustache } from \"$mustache\";\nimport { bb } from \"$json\";\n\n(function ($, win, doc) {\n var tmpl;\n\n bb.createCaseItem = function (cas) {\n return Mustache.render(tmpl, cas);\n };\n\n $(function () {\n tmpl = $(\"#bb-p-case-template\").html();\n Mustache.tags = [\"[[\", \"]]\"];\n });\n})(jQuery, window, document);\n","import { bb } from \"$json\";\n/* change-nav-text:\n *\n * Change the nav button text\n * (and class if desired) in any node.\n *\n * Based on config.template.nav-text arr. e.g:\n\n NB: Array MUST include a default that can be\n be used to reset the states of any button\n which could have been changed.\n\n \"nav-text\": [\n {\n \"main.introductie\": {\n \"bb-next\": {\n \"class\": \"bb-next extra-class\", // Must contain orig. class(es).\n \"text\": \"Start\"\n }\n }\n },\n {\n \"default\": {\n \"bb-next\": {\n \"class\": \"bb-next\",\n \"text\": \"Volgende\"\n }\n }\n }\n ]\n\n * The plugin will look for a .text element inside the button, in case the layer uses SVGs\n * which would otherwise be removed.\n *\n * Author: Tim Bauwens\n * Copyright 2019\n *\n */\n\n(function ($, win, doc) {\n $(function () {\n let navText = bb.propFinder(bb.conf, \"template\")(\"nav-text\", false);\n\n const adjustBtn = (btn, change) => {\n let $btn = $(`.${btn}`);\n if (typeof change !== \"object\" || !$btn.length) return false;\n let $newbtn = $btn.clone();\n let $affect = $newbtn.find(\".text\").length\n ? $newbtn.find(\".text\")\n : $newbtn;\n $affect.html(change.text);\n $newbtn.attr(\"class\", change.class);\n\n return $newbtn;\n };\n\n if (navText)\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n // Before doing anything, reset the state to default.\n navText.forEach(node => {\n if (node.default !== undefined) {\n $.each(node.default, (btn, change) => {\n let $newbtn = adjustBtn(btn, change);\n if ($newbtn) {\n $(`.${btn}`).replaceWith($newbtn);\n }\n });\n }\n });\n let currentNode = $(\"fieldset.group:last-of-type\").attr(\"data-node\");\n navText.forEach(node => {\n if (node[currentNode] !== undefined) {\n $.each(node[currentNode], (btn, change) => {\n let $newbtn = adjustBtn(btn, change);\n if ($newbtn) {\n $(`.${btn}`).replaceWith($newbtn);\n }\n });\n }\n });\n });\n });\n})(jQuery, window, document);\n","/* close-caselist:\n *\n * Adds closing cross on the case list\n *\n * Author: Annegreet Olijve\n *\n * Copyright (C) 2014, 2015 by Berkeley Bridge\n *\n */\nimport { gt, _ } from \"$json\";\n\nvar translations = {\n \"Close case overview\": {\n nl: \"Sluit casusoverzicht\",\n fr: \"Fermez le table des cas\",\n de: \"Casusübersicht schließen\",\n ru: \"Всклучите резюме сессии\"\n }\n};\n\n$(function () {\n gt.addTranslations(translations);\n});\n\n$(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.cases && data.models && data.models.length != 0) {\n // Server always selects model if there is but one model.\n var origcolspan = $(\"#bb-cases tr.wcasus td\").first().attr(\"colspan\");\n var newcolspan = origcolspan - 1;\n\n $(\"#bb-cases tr.wcasus td\").first().attr({\n colspan: newcolspan,\n tabindex: 0\n });\n $(\"#bb-cases tr.wcasus\")\n .first()\n .append(\n '' +\n \"\"\n );\n $(\"#bb-cases thead\").first().removeAttr(\"tabindex\");\n }\n});\n","/* has-no-next:\n *\n * Set body.hasNoNext when the current screen title matches a\n * predefined regular expression, and unsets it when does not.\n *\n * Author: Niels Giesen\n *\n * Copyright (C) 2011, 2012 by Berkeley Bridge\n *\n */\n\nimport { bb } from \"$json\";\n\n(function ($) {\n // Regular expression to test absolute screentitles against:\n var re = /^(Einde)$/;\n\n $(document).on(\"bb:postHandleData\", function (event, data, status, req) {\n if (data && data.jumplist)\n bb.Mode.toggle(\n \"hasNoNext\",\n data.hasnext == false ||\n $.grep(data.jumplist, function (group) {\n return (\n group.status == \"selected\" && re.test($.trim(group.screentitle))\n );\n }).length > 0\n );\n });\n})(jQuery);\n","import { bb } from \"$json\";\n/* headings:\n *\n * Turn labels whose font class (as provided the JSON object) match the\n * regular expression /^Standard title$|^Heading[^1-6]*([1-6]?)/ into headings.\n *\n * If the class has no numbering (e.g. 'Standard Title' instead of\n * 'Heading 2'), level 1 will be presumed.\n *\n * Since a model can run anywhere, it is possible to set a base level\n * for headings in arbitrary.headings.baseLevel (in\n * conf.json).\n *\n * If you want to force titles in 'addtobottom' nodes to duck below\n * the top ('cleared') node, declare arbitrary.headings.duck = true in\n * conf.json\n *\n * Author: Niels Giesen\n * Copyright 2016, 2018 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n var duck = false,\n baseLevel,\n topLevel,\n re = /^Standard title$|^Heading[^1-6]*([1-6]?)/;\n\n $(function () {\n try {\n baseLevel = bb.conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n duck = bb.conf.arbitrary.headings.duck;\n } catch (err) {}\n\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups && data.groups.length) {\n $.each(data.groups, function (_, group) {\n $.each(group.controls, function (_, ctl) {\n var klass = ctl[\"font-class\"],\n _level,\n m;\n if (ctl.controltype === \"label\" && ((m = klass.match(re)), m)) {\n _level = Number(m[1]) || 1;\n ctl._subtype = \"heading\";\n ctl._level =\n duck && group.screenmode !== \"clear\"\n ? _level + 1 + topLevel\n : _level + topLevel;\n }\n });\n });\n }\n });\n });\n})(jQuery, window, document);\n","/* history:\n *\n * Manage history using the html5 history api and sessionStorage\n *\n * Could have support for crunchbang ( #!modelname=thisandthat )\n *\n * Author: Niels Giesen\n * Copyright 2013, 2014, 2015 Berkeley Bridge\n *\n */\nimport { bb, _ } from \"$json\";\nimport { has } from \"$json/lib/functional\";\nimport { setSettled } from \"$json/lib/settled\";\n\n(function ($, win, history, location) {\n var crunchbang = false;\n\n if (history && history.pushState) {\n if (!location.origin) {\n location.origin =\n location.protocol +\n \"//\" +\n location.hostname +\n (location.port ? \":\" + location.port : \"\");\n }\n\n $(function () {\n var apinav,\n storage,\n params = $.parseQuery(location.hash.slice(2)),\n _title_sep = \" \",\n _title = document.title;\n\n try {\n storage = window.sessionStorage;\n } catch (err) {\n storage = null;\n }\n\n function directory(loc) {\n return loc.origin + loc.pathname.replace(/[^/]+$/, \"\");\n }\n\n function restoreState(state) {\n if (state.sessionid) {\n // restore case\n bb.ajax\n .post({\n url: \"action\",\n data: state\n })\n .then(setSettled);\n } else if (bb.getVar(\"sessionid\")) {\n // exit running case and restore model view\n bb.exit(() => bb.menu(state).then(setSettled));\n } else {\n // restore model view\n bb.menu(state).then(setSettled);\n }\n }\n\n function ditchState() {\n storage && storage.removeItem(\"state\");\n history.replaceState(null, null, null);\n setSettled();\n }\n\n if (location.search !== \"\") ditchState();\n\n var initial_state =\n history.state || (storage && JSON.parse(storage.getItem(\"state\")));\n\n if (initial_state) {\n // Detect explicit edit of the crunchbang - this should\n // override the dbname parameter and instead use the modelname\n if (params.modelname && params.modelname !== initial_state.modelname) {\n initial_state.modelname = params.modelname;\n delete initial_state.dbname;\n delete initial_state.sessionid;\n }\n\n if (initial_state.directory === directory(location)) {\n bb.Mode.set(\"isLoggedIn\"); // Yes, just an assumption it will go allright.\n restoreState(initial_state);\n } else {\n ditchState();\n }\n } else if (params.modelname) {\n // Bookmarked with crunchbang, but no state\n bb.Router(params);\n } else {\n setSettled();\n }\n\n $(document).on(\"bb:jsonError\", ditchState);\n\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.uniqueid) {\n var title,\n state = {\n fmt: \"json\",\n uniqueid: data.uniqueid,\n // Save the 'directory part'\n directory: directory(location)\n };\n if (has(\"dbname\", data) && data.sessionid) {\n state.dbname = data.dbname;\n state.sessionid = data.sessionid;\n state.modelname = data.modelname; // Needed to get interpret explicit change to location\n\n if (data.modeldescription) {\n title = [_title, data.modeldescription.replace(/_/g, \" \")].join(\n _title_sep\n );\n }\n } else if (data.models) {\n var model = $.grep(data.models, function (m) {\n return m.selected;\n })[0],\n dbname = model ? model.dbname : null;\n if (dbname !== null) {\n state.dbname = dbname;\n title = [_title, model.modelname, \"-\", _(\"overview\")].join(\n _title_sep\n );\n } else {\n title = [_title, _(\"Your models\")].join(_title_sep);\n }\n }\n if (!apinav) {\n try {\n storage && storage.setItem(\"state\", JSON.stringify(state));\n } catch (e) {\n // Guard against QuotaExceededError (which always happens on Safari Private Browsing on iOS)\n }\n if (history.state && history.state.sessionid && state.sessionid) {\n history.replaceState(\n state,\n null,\n location.origin +\n location.pathname +\n ((crunchbang && \"#!modelname=\" + data.modelname) || \"\")\n );\n } else {\n if (data.modelname && crunchbang) {\n history.pushState(\n state,\n null,\n location.origin +\n location.pathname +\n \"#!modelname=\" +\n data.modelname\n );\n } else {\n history.pushState(\n state,\n null,\n location.origin + location.pathname\n );\n }\n }\n }\n if (title && document.title !== title) {\n document.title = title;\n }\n }\n // Something went miserably wrong. Clear history to get out of this mess.\n if (\n data &&\n ((data.error && data.error.summary) ||\n (data.groups && !data.groups.length) ||\n data.status === \"logout successful\")\n ) {\n // Extra check - may be we are but updating\n if (\n data &&\n data.error &&\n data.error.code &&\n data.error.code === 14 && // Error loading case\n data.error.subcode === 1002\n )\n // Updating\n return;\n ditchState();\n }\n apinav = false;\n });\n\n win.addEventListener(\"popstate\", function (e) {\n apinav = true;\n if (e.state) {\n if (e.state.directory === directory(location)) restoreState(e.state);\n else ditchState();\n }\n });\n });\n }\n})(jQuery, window, window.history, window.location);\n","//\n// showdown.js -- A javascript port of Markdown.\n//\n// Copyright (c) 2007 John Fraser.\n//\n// Original Markdown Copyright (c) 2004-2005 John Gruber\n// \n//\n// Redistributable under a BSD-style open source license.\n// See license.txt for more information.\n//\n// The full source distribution is at:\n//\n//\t\t\t\tA A L\n//\t\t\t\tT C A\n//\t\t\t\tT K B\n//\n// \n//\n\n//\n// Wherever possible, Showdown is a straight, line-by-line port\n// of the Perl version of Markdown.\n//\n// This is not a normal parser design; it's basically just a\n// series of string substitutions. It's hard to read and\n// maintain this way, but keeping Showdown close to the original\n// design makes it easier to port new features.\n//\n// More importantly, Showdown behaves like markdown.pl in most\n// edge cases. So web applications can do client-side preview\n// in Javascript, and then build identical HTML on the server.\n//\n// This port needs the new RegExp functionality of ECMA 262,\n// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers\n// should do fine. Even with the new regular expression features,\n// We do a lot of work to emulate Perl's regex functionality.\n// The tricky changes in this file mostly have the \"attacklab:\"\n// label. Major or self-explanatory changes don't.\n//\n// Smart diff tools like Araxis Merge will be able to match up\n// this file with markdown.pl in a useful way. A little tweaking\n// helps: in a copy of markdown.pl, replace \"#\" with \"//\" and\n// replace \"$text\" with \"text\". Be sure to ignore whitespace\n// and line endings.\n//\n\n//\n// Showdown usage:\n//\n// var text = \"Markdown *rocks*.\";\n//\n// var converter = new Showdown.converter();\n// var html = converter.makeHtml(text);\n//\n// alert(html);\n//\n// Note: move the sample code to the bottom of this\n// file before uncommenting it.\n//\n\n//\n// Showdown namespace\n//\nvar Showdown = {};\n\n//\n// converter\n//\n// Wraps all \"globals\" so that the only thing\n// exposed is makeHtml().\n//\nShowdown.converter = function () {\n //\n // Globals:\n //\n\n // Global hashes, used by various utility routines\n var g_urls;\n var g_titles;\n var g_html_blocks;\n\n // Used to track when we're inside an ordered or unordered list\n // (see _ProcessListItems() for details):\n var g_list_level = 0;\n\n this.makeHtml = function (text, inline_only) {\n //\n // Main function. The order in which other subs are called here is\n // essential. Link and image substitutions need to happen before\n // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the \n // and tags get encoded.\n //\n\n // Clear the global hashes. If we don't clear these, you get conflicts\n // from other articles when generating a page which contains more than\n // one article (e.g. an index page that shows the N most recent\n // articles):\n g_urls = new Array();\n g_titles = new Array();\n g_html_blocks = new Array();\n\n // attacklab: Replace ~ with ~T\n // This lets us use tilde as an escape char to avoid md5 hashes\n // The choice of character is arbitray; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/~/g, \"~T\");\n\n // attacklab: Replace $ with ~D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, \"~D\");\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, \"\\n\"); // DOS to Unix\n text = text.replace(/\\r/g, \"\\n\"); // Mac to Unix\n\n // Make sure text begins and ends with a couple of newlines:\n text = \"\\n\\n\" + text + \"\\n\\n\";\n\n // Convert all tabs to spaces.\n text = _Detab(text);\n\n // Strip any lines consisting only of spaces and tabs.\n // This makes subsequent regexen easier to write, because we can\n // match consecutive blank lines with /\\n+/ instead of something\n // contorted like /[ \\t]*\\n+/ .\n text = text.replace(/^[ \\t]+$/gm, \"\");\n\n // Turn block-level HTML blocks into hash entries\n text = _HashHTMLBlocks(text);\n\n // Strip link definitions, store in hashes.\n text = _StripLinkDefinitions(text);\n\n if (inline_only) text = _RunSpanGamut(text);\n else text = _RunBlockGamut(text);\n\n text = _UnescapeSpecialChars(text);\n\n // attacklab: Restore dollar signs\n text = text.replace(/~D/g, \"$$\");\n\n // attacklab: Restore tildes\n text = text.replace(/~T/g, \"~\");\n\n return text;\n };\n\n var _StripLinkDefinitions = function (text) {\n //\n // Strips link definitions from text, stores the URLs and titles in\n // hash references.\n //\n\n // Link defs are in the form: ^[id]: url \"optional title\"\n\n /*\n var text = text.replace(/\n ^[ ]{0,3}\\[(.+)\\]: // id = $1 attacklab: g_tab_width - 1\n [ \\t]*\n \\n?\t\t\t\t// maybe *one* newline\n [ \\t]*\n ?\t\t\t// url = $2\n [ \\t]*\n \\n?\t\t\t\t// maybe one newline\n [ \\t]*\n (?:\n (\\n*)\t\t\t\t// any lines skipped = $3 attacklab: lookbehind removed\n [\"(]\n (.+?)\t\t\t\t// title = $4\n [\")]\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n (?:\\n+|$)\n /gm,\n function(){...});\n */\n var text = text.replace(\n /^[ ]{0,3}\\[(.+)\\]:[ \\t]*\\n?[ \\t]*?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"(](.+?)[\")][ \\t]*)?(?:\\n+|\\Z)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n m1 = m1.toLowerCase();\n g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive\n if (m3) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return m3 + m4;\n } else if (m4) {\n g_titles[m1] = m4.replace(/\"/g, \""\");\n }\n\n // Completely remove the definition from the text\n return \"\";\n }\n );\n\n return text;\n };\n\n var _HashHTMLBlocks = function (text) {\n // attacklab: Double up blank lines to reduce lookaround\n text = text.replace(/\\n/g, \"\\n\\n\");\n\n // Hashify HTML blocks:\n // We only want to do this for block-level HTML tags, such as headers,\n // lists, and tables. That's because we still want to wrap

      s around\n // \"paragraphs\" that are wrapped in non-block-level tags, such as anchors,\n // phrase emphasis, and spans. The list of tags we're looking for is\n // hard-coded:\n var block_tags_a =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del\";\n var block_tags_b =\n \"p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math\";\n\n // First, look for nested blocks, e.g.:\n //

      \n //
      \n // tags for inner block must be indented.\n //
      \n //
      \n //\n // The outermost tags must start at the left margin for this to match, and\n // the inner nested divs must be indented.\n // We need to do this before the next, more liberal match, because the next\n // match will start at the first `
      ` and stop at the first `
      `.\n\n // attacklab: This regex can be expensive when it fails.\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_a)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\\n\t\t\t// any number of lines, minimally matching\n \t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\\b[^\\r]*?\\n<\\/\\2>[ \\t]*(?=\\n+))/gm,\n hashElement\n );\n\n //\n // Now match more liberally, simply from `\\n` to `\\n`\n //\n\n /*\n var text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n ^\t\t\t\t\t// start of line (with /m)\n <($block_tags_b)\t// start tag = $2\n \\b\t\t\t\t\t// word break\n // attacklab: hack around khtml/pcre bug...\n [^\\r]*?\t\t\t\t// any number of lines, minimally matching\n .*\t\t\t\t// the matching end tag\n [ \\t]*\t\t\t\t// trailing spaces/tabs\n (?=\\n+)\t\t\t\t// followed by a newline\n )\t\t\t\t\t\t// attacklab: there are sentinel newlines at end of document\n /gm,function(){...}};\n */\n text = text.replace(\n /^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\\b[^\\r]*?.*<\\/\\2>[ \\t]*(?=\\n+)\\n)/gm,\n hashElement\n );\n\n // Special case just for
      . It was easier to make a special case than\n // to make the other regex more complicated.\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\n (<(hr)\t\t\t\t// start tag = $2\n \\b\t\t\t\t\t// word break\n ([^<>])*?\t\t\t//\n \\/?>)\t\t\t\t// the matching end tag\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n[ ]{0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // Special case for standalone HTML comments:\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// save in $1\n \\n\\n\t\t\t\t// Starting after a blank line\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n \n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(\\n\\n[ ]{0,3}[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n\n /*\n text = text.replace(/\n (?:\n \\n\\n\t\t\t\t// Starting after a blank line\n )\n (\t\t\t\t\t\t// save in $1\n [ ]{0,3}\t\t\t// attacklab: g_tab_width - 1\n (?:\n <([?%])\t\t\t// $2\n [^\\r]*?\n \\2>\n )\n [ \\t]*\n (?=\\n{2,})\t\t\t// followed by a blank line\n )\n /g,hashElement);\n */\n text = text.replace(\n /(?:\\n\\n)([ ]{0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n hashElement\n );\n\n // attacklab: Undo double lines (see comment at top of this function)\n text = text.replace(/\\n\\n/g, \"\\n\");\n return text;\n };\n\n var hashElement = function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, \"\\n\");\n blockText = blockText.replace(/^\\n/, \"\");\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, \"\");\n\n // Replace the element text with a marker (\"~KxK\" where x is its key)\n blockText = \"\\n\\n~K\" + (g_html_blocks.push(blockText) - 1) + \"K\\n\\n\";\n\n return blockText;\n };\n\n var _RunBlockGamut = function (text) {\n //\n // These are all the transformations that form block-level\n // tags like paragraphs, headers, and list items.\n //\n text = _DoHeaders(text);\n\n // Do Horizontal Rules:\n var key = hashBlock(\"
      \");\n text = text.replace(/^[ ]{0,2}([ ]?\\*[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\-[ ]?){3,}[ \\t]*$/gm, key);\n text = text.replace(/^[ ]{0,2}([ ]?\\_[ ]?){3,}[ \\t]*$/gm, key);\n\n text = _DoLists(text);\n text = _DoCodeBlocks(text);\n text = _DoBlockQuotes(text);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

      tags around block-level tags.\n text = _HashHTMLBlocks(text);\n text = _FormParagraphs(text);\n\n return text;\n };\n\n var _RunSpanGamut = function (text) {\n //\n // These are all the transformations that occur *within* block-level\n // tags like paragraphs, headers, and list items.\n //\n\n text = _DoCodeSpans(text);\n text = _EscapeSpecialCharsWithinTagAttributes(text);\n text = _EncodeBackslashEscapes(text);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = _DoImages(text);\n text = _DoAnchors(text);\n\n // Make links out of things like ``\n // Must come after _DoAnchors(), because you can use < and >\n // delimiters in inline links like [this]().\n text = _DoAutoLinks(text);\n text = _EncodeAmpsAndAngles(text);\n text = _DoItalicsAndBold(text);\n\n // Do hard breaks:\n text = text.replace(/ +\\n/g, \"
      \\n\");\n\n return text;\n };\n\n var _EscapeSpecialCharsWithinTagAttributes = function (text) {\n //\n // Within tags -- meaning between < and > -- encode [\\ ` * _] so they\n // don't conflict with their use in Markdown for code, italics and strong.\n //\n\n // Build a regex to find HTML tags and comments. See Friedl's\n // \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\n var regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|)/gi;\n\n text = text.replace(regex, function (wholeMatch) {\n var tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g, \"$1`\");\n tag = escapeCharacters(tag, \"\\\\`*_\");\n return tag;\n });\n\n return text;\n };\n\n var _DoAnchors = function (text) {\n //\n // Turn Markdown link shortcuts into XHTML
      tags.\n //\n //\n // First, handle reference-style links: [link text] [id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t\t// allow brackets nested one level\n |\n [^\\[]\t\t\t// or anything else\n )*\n )\n \\]\n\n [ ]?\t\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t\t// pad remaining backreferences\n /g,_DoAnchors_callback);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeAnchorTag\n );\n\n //\n // Next, inline-style links: [link text](url \"optional title\")\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n \\[\n (\n (?:\n \\[[^\\]]*\\]\t// allow brackets nested one level\n |\n [^\\[\\]]\t\t\t// or anything else\n )\n )\n \\]\n \\(\t\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t\t// href = $4\n [ \\t]*\n (\t\t\t\t\t\t// $5\n (['\"])\t\t\t\t// quote char = $6\n (.*?)\t\t\t\t// Title = $7\n \\6\t\t\t\t\t// matching quote\n [ \\t]*\t\t\t\t// ignore any spaces/tabs between closing quote and )\n )?\t\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeAnchorTag);\n */\n text = text.replace(\n /(\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeAnchorTag\n );\n\n //\n // Last, handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n //\n\n /*\n text = text.replace(/\n ( // wrap whole match in $1\n \\[\n ([^\\[\\]]+)\t\t\t\t// link text = $2; can't contain '[' or ']'\n \\]\n )()()()()()\t\t\t\t\t// pad rest of backreferences\n /g, writeAnchorTag);\n */\n text = text.replace(/(\\[([^\\[\\]]+)\\])()()()()()/g, writeAnchorTag);\n\n return text;\n };\n\n var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n if (m7 == undefined) m7 = \"\";\n var whole_match = m1;\n var link_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = link_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n if (whole_match.search(/\\(\\s*\\)$/m) > -1) {\n // Special case for explicit empty url\n url = \"\";\n } else {\n return whole_match;\n }\n }\n }\n\n url = escapeCharacters(url, \"*_\");\n var result = '\" + _EncodeBackslashEscapes(link_text) + \"\";\n\n return result;\n };\n\n var _DoImages = function (text) {\n //\n // Turn Markdown image shortcuts into tags.\n //\n\n //\n // First, handle reference-style labeled images: ![alt text][id]\n //\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n\n [ ]?\t\t\t\t// one optional space\n (?:\\n[ ]*)?\t\t\t// one optional newline followed by spaces\n\n \\[\n (.*?)\t\t\t\t// id = $3\n \\]\n )()()()()\t\t\t\t// pad rest of backreferences\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\][ ]?(?:\\n[ ]*)?\\[(.*?)\\])()()()()/g,\n writeImageTag\n );\n\n //\n // Next, handle inline images: ![alt text](url \"optional title\")\n // Don't forget: encode * and _\n\n /*\n text = text.replace(/\n (\t\t\t\t\t\t// wrap whole match in $1\n !\\[\n (.*?)\t\t\t\t// alt text = $2\n \\]\n \\s?\t\t\t\t\t// One optional whitespace character\n \\(\t\t\t\t\t// literal paren\n [ \\t]*\n ()\t\t\t\t\t// no id, so leave $3 empty\n ?\t\t\t// src url = $4\n [ \\t]*\n (\t\t\t\t\t// $5\n (['\"])\t\t\t// quote char = $6\n (.*?)\t\t\t// title = $7\n \\6\t\t\t\t// matching quote\n [ \\t]*\n )?\t\t\t\t\t// title is optional\n \\)\n )\n /g,writeImageTag);\n */\n text = text.replace(\n /(!\\[(.*?)\\]\\s?\\([ \\t]*()?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n writeImageTag\n );\n\n return text;\n };\n\n var writeImageTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n var whole_match = m1;\n var alt_text = m2;\n var link_id = m3.toLowerCase();\n var url = m4;\n var title = m7;\n\n if (!title) title = \"\";\n\n if (url == \"\") {\n if (link_id == \"\") {\n // lower-case and turn embedded newlines into spaces\n link_id = alt_text.toLowerCase().replace(/ ?\\n/g, \" \");\n }\n url = \"#\" + link_id;\n\n if (g_urls[link_id] != undefined) {\n url = g_urls[link_id];\n if (g_titles[link_id] != undefined) {\n title = g_titles[link_id];\n }\n } else {\n return whole_match;\n }\n }\n\n alt_text = alt_text.replace(/\"/g, \""\");\n url = escapeCharacters(url, \"*_\");\n var result = '\"'\";\n\n return result;\n };\n\n var _DoHeaders = function (text) {\n // Setext-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n text = text.replace(\n /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n function (wholeMatch, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n text = text.replace(\n /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm,\n function (matchFound, m1) {\n return hashBlock(\"

      \" + _RunSpanGamut(m1) + \"

      \");\n }\n );\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n\n /*\n text = text.replace(/\n ^(\\#{1,6})\t\t\t\t// $1 = string of #'s\n [ \\t]*\n (.+?)\t\t\t\t\t// $2 = Header text\n [ \\t]*\n \\#*\t\t\t\t\t\t// optional closing #'s (not counted)\n \\n+\n /gm, function() {...});\n */\n\n text = text.replace(\n /^(\\#{1,6})[ \\t]*(.+?)[ \\t]*\\#*\\n+/gm,\n function (wholeMatch, m1, m2) {\n var h_level = m1.length;\n return hashBlock(\n \"\" + _RunSpanGamut(m2) + \"\"\n );\n }\n );\n\n return text;\n };\n\n // This declaration keeps Dojo compressor from outputting garbage:\n var _ProcessListItems;\n\n var _DoLists = function (text) {\n //\n // Form HTML ordered (numbered) and unordered (bulleted) lists.\n //\n\n // attacklab: add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += \"~0\";\n\n // Re-usable pattern to match any entirel ul or ol list:\n\n /*\n var whole_list = /\n (\t\t\t\t\t\t\t\t\t// $1 = whole list\n (\t\t\t\t\t\t\t\t// $2\n [ ]{0,3}\t\t\t\t\t// attacklab: g_tab_width - 1\n ([*+-]|\\d+[.])\t\t\t\t// $3 = first list item marker\n [ \\t]+\n )\n [^\\r]+?\n (\t\t\t\t\t\t\t\t// $4\n ~0\t\t\t\t\t\t\t// sentinel for workaround; should be $\n |\n \\n{2,}\n (?=\\S)\n (?!\t\t\t\t\t\t\t// Negative lookahead for another list item marker\n [ \\t]*\n (?:[*+-]|\\d+[.])[ \\t]+\n )\n )\n )/g\n */\n var whole_list =\n /^(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm;\n\n if (g_list_level) {\n text = text.replace(whole_list, function (wholeMatch, m1, m2) {\n var list = m1;\n var list_type = m2.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n\n // Trim any trailing whitespace, to put the closing ``\n // up on the preceding line, to get it past the current stupid\n // HTML block parser. This is a hack to work around the terrible\n // hack that is the HTML block parser.\n result = result.replace(/\\s+$/, \"\");\n result = \"<\" + list_type + \">\" + result + \"\\n\";\n return result;\n });\n } else {\n whole_list =\n /(\\n\\n|^\\n?)(([ ]{0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/g;\n text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) {\n var runup = m1;\n var list = m2;\n\n var list_type = m3.search(/[*+-]/g) > -1 ? \"ul\" : \"ol\";\n // Turn double returns into triple returns, so that we can make a\n // paragraph for the last item in a list, if necessary:\n var list = list.replace(/\\n{2,}/g, \"\\n\\n\\n\");\n var result = _ProcessListItems(list);\n result =\n runup + \"<\" + list_type + \">\\n\" + result + \"\\n\";\n return result;\n });\n }\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n _ProcessListItems = function (list_str) {\n //\n // Process the contents of a single ordered or unordered list, splitting it\n // into individual list items.\n //\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n\n g_list_level++;\n\n // trim trailing blank lines:\n list_str = list_str.replace(/\\n{2,}$/, \"\\n\");\n\n // attacklab: add sentinel to emulate \\z\n list_str += \"~0\";\n\n /*\n list_str = list_str.replace(/\n (\\n)?\t\t\t\t\t\t\t// leading line = $1\n (^[ \\t]*)\t\t\t\t\t\t// leading whitespace = $2\n ([*+-]|\\d+[.]) [ \\t]+\t\t\t// list marker = $3\n ([^\\r]+?\t\t\t\t\t\t// list item text = $4\n (\\n{1,2}))\n (?= \\n* (~0 | \\2 ([*+-]|\\d+[.]) [ \\t]+))\n /gm, function(){...});\n */\n list_str = list_str.replace(\n /(\\n)?(^[ \\t]*)([*+-]|\\d+[.])[ \\t]+([^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var item = m4;\n var leading_line = m1;\n var leading_space = m2;\n\n if (leading_line || item.search(/\\n{2,}/) > -1) {\n item = _RunBlockGamut(_Outdent(item));\n } else {\n // Recursion for sub-lists:\n item = _DoLists(_Outdent(item));\n item = item.replace(/\\n$/, \"\"); // chomp(item)\n item = _RunSpanGamut(item);\n }\n\n return \"
    • \" + item + \"
    • \\n\";\n }\n );\n\n // attacklab: strip sentinel\n list_str = list_str.replace(/~0/g, \"\");\n\n g_list_level--;\n return list_str;\n };\n\n var _DoCodeBlocks = function (text) {\n //\n // Process Markdown `
      ` blocks.\n    //\n\n    /*\n    text = text.replace(text,\n      /(?:\\n\\n|^)\n      (\t\t\t\t\t\t\t\t// $1 = the code block -- one or more lines, starting with a space/tab\n        (?:\n          (?:[ ]{4}|\\t)\t\t\t// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width\n          .*\\n+\n        )+\n      )\n      (\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))\t// attacklab: g_tab_width\n    /g,function(){...});\n  */\n\n    // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n    text += \"~0\";\n\n    text = text.replace(\n      /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g,\n      function (wholeMatch, m1, m2) {\n        var codeblock = m1;\n        var nextChar = m2;\n\n        codeblock = _EncodeCode(_Outdent(codeblock));\n        codeblock = _Detab(codeblock);\n        codeblock = codeblock.replace(/^\\n+/g, \"\"); // trim leading newlines\n        codeblock = codeblock.replace(/\\n+$/g, \"\"); // trim trailing whitespace\n\n        codeblock = \"
      \" + codeblock + \"\\n
      \";\n\n return hashBlock(codeblock) + nextChar;\n }\n );\n\n // attacklab: strip sentinel\n text = text.replace(/~0/, \"\");\n\n return text;\n };\n\n var hashBlock = function (text) {\n text = text.replace(/(^\\n+|\\n+$)/g, \"\");\n return \"\\n\\n~K\" + (g_html_blocks.push(text) - 1) + \"K\\n\\n\";\n };\n\n var _DoCodeSpans = function (text) {\n //\n // * Backtick quotes are used for spans.\n //\n // * You can use multiple backticks as the delimiters if you want to\n // include literal backticks in the code span. So, this input:\n //\n // Just type ``foo `bar` baz`` at the prompt.\n //\n // Will translate to:\n //\n //

      Just type foo `bar` baz at the prompt.

      \n //\n //\tThere's no arbitrary limit to the number of backticks you\n //\tcan use as delimters. If you need three consecutive backticks\n //\tin your code, use four for delimiters, etc.\n //\n // * You can use spaces to get literal backticks at the edges:\n //\n // ... type `` `bar` `` ...\n //\n // Turns to:\n //\n // ... type `bar` ...\n //\n\n /*\n text = text.replace(/\n (^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\n (`+)\t\t\t\t\t\t// $2 = Opening run of `\n (\t\t\t\t\t\t\t// $3 = The code block\n [^\\r]*?\n [^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\n )\n \\2\t\t\t\t\t\t\t// Matching closer\n (?!`)\n /gm, function(){...});\n */\n\n text = text.replace(\n /(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3, m4) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, \"\"); // leading whitespace\n c = c.replace(/[ \\t]*$/g, \"\"); // trailing whitespace\n c = _EncodeCode(c);\n return m1 + \"\" + c + \"\";\n }\n );\n\n return text;\n };\n\n var _EncodeCode = function (text) {\n //\n // Encode/escape certain characters inside Markdown code runs.\n // The point is that in code, these characters are literals,\n // and lose their special Markdown meanings.\n //\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text.replace(/&/g, \"&\");\n\n // Do the angle bracket song and dance:\n text = text.replace(//g, \">\");\n\n // Now, escape characters that are magic in Markdown:\n text = escapeCharacters(text, \"*_{}[]\\\\\", false);\n\n // jj the line above breaks this:\n //---\n\n //* Item\n\n // 1. Subitem\n\n // special char: *\n //---\n\n return text;\n };\n\n var _DoItalicsAndBold = function (text) {\n // must go first:\n text = text.replace(\n /(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g,\n \"$2\"\n );\n\n text = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g, \"$2\");\n\n return text;\n };\n\n var _DoBlockQuotes = function (text) {\n /*\n text = text.replace(/\n (\t\t\t\t\t\t\t\t// Wrap whole match in $1\n (\n ^[ \\t]*>[ \\t]?\t\t\t// '>' at the start of a line\n .+\\n\t\t\t\t\t// rest of the first line\n (.+\\n)*\t\t\t\t\t// subsequent consecutive lines\n \\n*\t\t\t\t\t\t// blanks\n )+\n )\n /gm, function(){...});\n */\n\n text = text.replace(\n /((^[ \\t]*>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm,\n function (wholeMatch, m1) {\n var bq = m1;\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, \"~0\"); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/~0/g, \"\");\n\n bq = bq.replace(/^[ \\t]+$/gm, \"\"); // trim whitespace-only lines\n bq = _RunBlockGamut(bq); // recurse\n\n bq = bq.replace(/(^|\\n)/g, \"$1 \");\n // These leading spaces screw with
       content, so we need to fix that:\n        bq = bq.replace(\n          /(\\s*
      [^\\r]+?<\\/pre>)/gm,\n          function (wholeMatch, m1) {\n            var pre = m1;\n            // attacklab: hack around Konqueror 3.5.4 bug:\n            pre = pre.replace(/^  /gm, \"~0\");\n            pre = pre.replace(/~0/g, \"\");\n            return pre;\n          }\n        );\n\n        return hashBlock(\"
      \\n\" + bq + \"\\n
      \");\n }\n );\n return text;\n };\n\n var _FormParagraphs = function (text) {\n //\n // Params:\n // $text - string to process with html

      tags\n //\n\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, \"\");\n text = text.replace(/\\n+$/g, \"\");\n\n var grafs = text.split(/\\n{2,}/g);\n var grafsOut = new Array();\n\n //\n // Wrap

      tags.\n //\n var end = grafs.length;\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n\n // if this is an HTML marker, copy it\n if (str.search(/~K(\\d+)K/g) >= 0) {\n grafsOut.push(str);\n } else if (str.search(/\\S/) >= 0) {\n str = _RunSpanGamut(str);\n str = str.replace(/^([ \\t]*)/g, \"

      \");\n str += \"

      \";\n grafsOut.push(str);\n }\n }\n\n //\n // Unhashify HTML blocks\n //\n end = grafsOut.length;\n for (var i = 0; i < end; i++) {\n // if this is a marker for an html block...\n while (grafsOut[i].search(/~K(\\d+)K/) >= 0) {\n var blockText = g_html_blocks[RegExp.$1];\n blockText = blockText.replace(/\\$/g, \"$$$$\"); // Escape any dollar signs\n grafsOut[i] = grafsOut[i].replace(/~K\\d+K/, blockText);\n }\n }\n\n return grafsOut.join(\"\\n\\n\");\n };\n\n var _EncodeAmpsAndAngles = function (text) {\n // Smart processing for ampersands and angle brackets that need to be encoded.\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, \"&\");\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?\\$!])/gi, \"<\");\n\n return text;\n };\n\n var _EncodeBackslashEscapes = function (text) {\n //\n // Parameter: String.\n // Returns:\tThe string, with after processing the following backslash\n // escape sequences.\n //\n\n // attacklab: The polite way to do this is with the new\n // escapeCharacters() function:\n //\n // text = escapeCharacters(text,\"\\\\\",true);\n // text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n //\n // ...but we're sidestepping its use of the (slow) RegExp constructor\n // as an optimization for Firefox. This function gets called a LOT.\n\n text = text.replace(/\\\\(\\\\)/g, escapeCharacters_callback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g, escapeCharacters_callback);\n return text;\n };\n\n var _DoAutoLinks = function (text) {\n text = text.replace(\n /<((https?|ftp|dict):[^'\">\\s]+)>/gi,\n '$1'\n );\n\n // Email addresses: \n\n /*\n text = text.replace(/\n <\n (?:mailto:)?\n (\n [-.\\w]+\n \\@\n [-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+\n )\n >\n /gi, _DoAutoLinks_callback());\n */\n text = text.replace(\n /<(?:mailto:)?([-.\\w]+\\@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n function (wholeMatch, m1) {\n return _EncodeEmailAddress(_UnescapeSpecialChars(m1));\n }\n );\n\n return text;\n };\n\n var _EncodeEmailAddress = function (addr) {\n //\n // Input: an email address, e.g. \"foo@example.com\"\n //\n // Output: the email address as a mailto link, with each character\n //\tof the address encoded as either a decimal or hex entity, in\n //\tthe hopes of foiling most address harvesting spam bots. E.g.:\n //\n //\tfoo\n // @example.com\n //\n // Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\n // mailing list: \n //\n\n // attacklab: why can't javascript speak hex?\n function char2hex(ch) {\n var hexDigits = \"0123456789ABCDEF\";\n var dec = ch.charCodeAt(0);\n return hexDigits.charAt(dec >> 4) + hexDigits.charAt(dec & 15);\n }\n\n var encode = [\n function (ch) {\n return \"&#\" + ch.charCodeAt(0) + \";\";\n },\n function (ch) {\n return \"&#x\" + char2hex(ch) + \";\";\n },\n function (ch) {\n return ch;\n }\n ];\n\n addr = \"mailto:\" + addr;\n\n addr = addr.replace(/./g, function (ch) {\n if (ch == \"@\") {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else if (ch != \":\") {\n // leave ':' alone (to spot mailto: later)\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch);\n }\n return ch;\n });\n\n addr = '' + addr + \"\";\n addr = addr.replace(/\">.+:/g, '\">'); // strip the mailto: from the visible part\n\n return addr;\n };\n\n var _UnescapeSpecialChars = function (text) {\n //\n // Swap back in all the special characters we've hidden.\n //\n text = text.replace(/~E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n return text;\n };\n\n var _Outdent = function (text) {\n //\n // Remove one level of line-leading tabs or spaces\n //\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n\n text = text.replace(/^(\\t|[ ]{1,4})/gm, \"~0\"); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/~0/g, \"\");\n\n return text;\n };\n\n var _Detab = function (text) {\n // attacklab: Detab's completely rewritten for speed.\n // In perl we could fix it by anchoring the regexp with \\G.\n // In javascript we're less fortunate.\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, \" \"); // attacklab: g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, \"~A~B\");\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1, m2) {\n var leadingText = m1;\n var numSpaces = 4 - (leadingText.length % 4); // attacklab: g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) leadingText += \" \";\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/~A/g, \" \"); // attacklab: g_tab_width\n text = text.replace(/~B/g, \"\");\n\n return text;\n };\n\n //\n // attacklab: Utility functions\n //\n\n var escapeCharacters = function (text, charsToEscape, afterBackslash) {\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString =\n \"([\" + charsToEscape.replace(/([\\[\\]\\\\])/g, \"\\\\$1\") + \"])\";\n\n if (afterBackslash) {\n regexString = \"\\\\\\\\\" + regexString;\n }\n\n var regex = new RegExp(regexString, \"g\");\n text = text.replace(regex, escapeCharacters_callback);\n\n return text;\n };\n\n var escapeCharacters_callback = function (wholeMatch, m1) {\n var charCodeToEscape = m1.charCodeAt(0);\n return \"~E\" + charCodeToEscape + \"E\";\n };\n}; // end of Showdown.converter\n\nexport default Showdown;\n","import { default as Showdown } from \"$showdown\";\nexport { converter };\n\nconst converter = new Showdown.converter();\n\nconst orig = converter.makeHtml.bind(converter);\nconverter.makeHtml = (text, inline) =>\n orig(text, inline).replace(/ getQuestionLabelGroup(elt) || elt);\n }\n\n function getMatchingChildOrSelf(elt, match) {\n var tw = document.createTreeWalker(\n elt,\n nf.SHOW_ELEMENT,\n matcher(match),\n false\n );\n tw.nextNode();\n return tw.currentNode;\n }\n\n function render(srcs) {\n var src = srcs[0],\n multiple = srcs.length > 1;\n if (!src.widgets) return;\n for (let widget of src.widgets) {\n let container = widget.nextElementSibling,\n infogroups,\n id,\n contents = Mustache.render(tmpl, {\n sources: srcs.map(function (src) {\n return prepareSource(src);\n }),\n multiple: multiple\n });\n\n if (!container || container.className !== \"bb-p-info-inline-block\") {\n id = \"bb-p-info-inline-\" + genid();\n widget.insertAdjacentHTML(\n buttonplacement(conf),\n \"' +\n '' +\n _(\"more info about this question\") +\n \"\" +\n \"\\n\"\n );\n\n var after = blockafterlabel(conf)\n ? getMatchingChildOrSelf(widget, '[data-type=\"label\"]')\n : widget;\n\n after.insertAdjacentHTML(\n \"afterEnd\",\n \"\" +\n \"
        \" +\n contents +\n \"
      \" +\n \"' +\n _(\"close\") +\n \"\" +\n \"
      \"\n );\n } else {\n infogroups = container.getAttribute(\"data-info-inline-groups\");\n if (infogroups.indexOf(src.groupguid) < -1) {\n container.children[0].insertAdjacentHTML(\"beforeEnd\", contents);\n container.setAttribute(\n \"data-info-inline-groups\",\n infogroups + src.groupguid\n );\n }\n }\n }\n }\n\n function toggleInfo() {\n var id = this.getAttribute(\"aria-controls\");\n setInfo(id);\n }\n\n function removeAgain(group) {\n return function () {\n $(group).removeClass(\"bb-p-info-inline-block-again\");\n };\n }\n\n function setInfo(id, show) {\n var group = document.getElementById(id);\n var hidden = group.style.display === \"none\";\n if (show === undefined) show = hidden;\n if (show && !hidden) {\n $(group).addClass(\"bb-p-info-inline-block-again\");\n var removal = removeAgain(group);\n group.addEventListener(\"webkitAnimationEnd\", removal);\n group.addEventListener(\"animationend\", removal);\n return;\n }\n $('.bb-p-info-inline-link[aria-controls=\"' + id + '\"]').toggleClass(\n \"bb-p-info-inline-expanded\",\n show\n );\n document\n .querySelector(`.bb-p-info-inline-link[aria-controls=\"${id}\"]`)\n .setAttribute(\"aria-selected\", show);\n $(group).slideToggle(show);\n if (show) {\n win.setTimeout(\n group =>\n group.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\"\n }),\n 400,\n group\n );\n } else {\n // infobtn is the '?' button, and a good marker of where to scroll back to.\n let infobtn = doc.querySelector(\n `.bb-p-info-inline-link[aria-controls=\"${id}\"]`\n );\n infobtn.scrollIntoView({\n behavior: \"smooth\",\n block: \"center\",\n inline: \"center\"\n });\n }\n }\n\n function matcher(selector) {\n return function (node) {\n return (node.matches || node.msMatchesSelector).bind(node)(selector)\n ? nf.FILTER_ACCEPT\n : nf.FILTER_SKIP;\n };\n }\n\n $(doc).on(\"click\", 'a[href^=\"bb:info\"]', function (ev) {\n ev.preventDefault();\n var tw = document.createTreeWalker(\n document.body,\n nf.SHOW_ELEMENT,\n matcher(\".bb-p-info-inline-link\"),\n false\n );\n tw.currentNode = this;\n if (tw.previousNode())\n setInfo(tw.currentNode.getAttribute(\"aria-controls\"), true);\n return false;\n });\n\n $(doc).on(\"click\", \".bb-p-info-inline-link\", toggleInfo);\n $(doc).on(\"click\", \".bb-p-info-inline-close\", toggleInfo);\n });\n})(jQuery, window, document, window.NodeFilter);\n","import { converter } from \"$md-converter\";\nimport { conf } from \"$json/lib/conf\";\nimport { updateLabels } from \"$json/lib/feature-queries\";\nimport { isLabel } from \"$json/lib/control-helpers\";\nimport { has } from \"$json/lib/functional\";\n\n/* md-labels.js:\n * Markdown all labels after insertion into the DOM\n *\n *\n *\n * Author: Niels Giesen\n * Copyright 2013, 2015, 2019 Berkeley Bridge\n *\n */\n\n(function ($) {\n $(function () {\n var topLevel, policy;\n\n try {\n var baseLevel = conf.arbitrary.headings.baseLevel;\n if (baseLevel === undefined) throw \"baseLevel is not defined\";\n topLevel = baseLevel - 1;\n } catch (err) {\n topLevel = 0;\n }\n\n try {\n policy = conf.arbitrary.showdown.policy;\n if ([\"legacy\"].indexOf(policy) === -1)\n throw \"showdown.policy is not 'legacy'\";\n } catch (err) {}\n\n const newline = conf.plugins.includes(\"showdown\") ? \"\\n\\n\" : \"\\n\";\n const newlineGlobRe = new RegExp(newline, \"g\");\n\n /**\n * Regular expression for paragraph open/end tags.\n * We don't want them.\n *\n **/\n var br_re = /
      /gi,\n onlyPhrasingInside = [\n \"P\",\n \"H1\",\n \"H2\",\n \"H3\",\n \"H4\",\n \"H5\",\n \"H6\",\n \"SPAN\",\n \"LABEL\",\n \"LEGEND\",\n \"CAPTION\"\n ];\n\n if (policy === \"legacy\") {\n onlyPhrasingInside.splice(9);\n }\n\n $.fn.showdown = function () {\n return this.each(function (i, e) {\n if (e.classList.contains(\"bb-p-showdown-labels\")) return;\n e = $(e);\n var html_in, html_out;\n var onlyPhrasing = allowOnlyPhrasing(e);\n let newline = \"\\n\";\n\n html_in = e.html().replace(br_re, newline);\n html_out = converter.makeHtml(html_in, onlyPhrasing);\n if (onlyPhrasing)\n html_out = html_out.trim().replace(newlineGlobRe, \"
      \");\n\n if (topLevel !== 0)\n html_out = html_out.replace(/(<\\/?h)([1-6])/g, demoteHeading);\n\n e.html(html_out).addClass(\"bb-p-showdown-labels\");\n });\n };\n\n function allowOnlyPhrasing(e) {\n return (\n onlyPhrasingInside.indexOf(e.get(0).nodeName) > -1 ||\n (policy !== \"legacy\" && e.hasClass(\"bb-label\"))\n );\n }\n\n function demoteHeading(m, m1, m2) {\n return m1 + Math.min(6, topLevel + Number(m2));\n }\n\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.groups) {\n $(\".bb-md-able\").showdown();\n $(document).trigger(\"bb:md-done\");\n $(document).trigger(\"bb:resized\");\n }\n });\n });\n\n document.addEventListener(\n \"bb:updatedControl\",\n ({ detail: { control, Updates } }) => {\n if (has(\"value\", Updates) && isLabel(control) && updateLabels(conf)) {\n control._elt.classList.remove(\"bb-p-showdown-labels\");\n control.$elt.showdown();\n }\n if (\n has(\"value\", Updates) &&\n control.controltype === \"grid\" &&\n updateLabels(conf)\n ) {\n control.$elt.find(\".bb-md-able\").showdown();\n }\n }\n );\n})(jQuery);\n","/* model-filter:\n *\n * Filter models by name\n *\n * Author: Niels Giesen\n * Copyright 2013, 2016 Berkeley Bridge\n *\n */\n(function ($, doc) {\n var $filter;\n\n $(function () {\n var $doc = $(doc);\n $filter = $(\"#bb-p-model-filter\");\n\n $doc\n .on(\"bb:postHandleData\", filter)\n .on(\"keyup\", \"#bb-p-model-filter\", filter)\n .on(\"click touchstart\", \"#bb-p-model-filter-clear\", clear);\n\n $filter.on(\"keydown\", function (ev) {\n if (ev.keyCode === 13) {\n var $filtered = $(\".bb-model:visible\");\n if ($filtered.length === 1)\n $filtered.find(\".bb-newcase\").addBack().last().trigger(\"click\");\n }\n });\n });\n\n function filter() {\n $(\"#bb-p-model-filter-nomatches\").hide();\n var val = $.trim($filter.val());\n var hasmatch = false;\n if (val.length >= 3) {\n var re = new RegExp(val, \"i\");\n $(\".bb-model\").each(function () {\n var $this = $(this);\n // Find the description in the child or -- when absent -- as\n // the text content itself\n var text = $this.find(\".bb-model-name\").text() || $this.text();\n var ismatch = val.length < 3 || re.test(text);\n hasmatch = hasmatch || ismatch;\n $this.toggle(ismatch);\n });\n }\n $filter.toggleClass(\"bb-p-model-filter-has-no-match\", !hasmatch);\n if (!hasmatch) {\n $(\".bb-model\").show();\n }\n }\n\n function clear() {\n $filter.val(\"\").trigger(\"keyup\").trigger(\"focus\");\n }\n})(jQuery, document);\n","/* modelinfo:\n *\n * Get info for current model\n *\n * @dependencies: mustache\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\nimport Mustache from \"$mustache\";\nimport { fromApiServer } from \"$json/lib/location.js\";\nimport { has } from \"$json/lib/functional.js\";\n(function ($, win, doc) {\n var _info = [],\n infoNodes,\n hash = {},\n lastId;\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && has(\"modelid\", data))\n if (!_info[data.modelid]) {\n $.get(\n fromApiServer(\n \"api/models/\" + data.modelid + \"?uniqueid=\" + data.uniqueid\n )\n ).then(function (res) {\n var model = new Model(res);\n _info[data.modelid] = model;\n model.replace();\n });\n } else {\n _info[data.modelid].replace();\n }\n });\n\n Mustache.tags = [\"[[\", \"]]\"];\n // templates = $('.bb-p-modelinfo-template');\n infoNodes = document.querySelectorAll(\".p-modelinfo\");\n\n // if (!(templates && infoNodes))\n // return false;\n\n function Model(res) {\n for (var prop in res) {\n if (has(prop, res)) this[prop] = res[prop];\n }\n this.author = {\n name: res.authorname,\n info: res.authorinfo\n };\n this.model = {\n info: res.extramodelinfo\n };\n this.setInfo(\"author\");\n this.setInfo(\"model\");\n return this;\n }\n\n Model.prototype.setInfo = function (prop) {\n var info = String(this[prop].info).split(/\\n/);\n info.map(\n function (line) {\n var kv = line.split(/\\:/),\n k = kv[0],\n v = kv.slice(1).join(\":\");\n this[prop][k] = v;\n }.bind(this)\n );\n delete this[prop].info;\n };\n\n Model.prototype.replace = function () {\n if (lastId !== this.id) $(doc).trigger(\"bb-p:modelinfo\", this);\n lastId = this.id;\n // The following could be conditional upon lastId !== this.id too, probably.\n for (var i = 0; i < infoNodes.length; ++i) {\n var infoNode = infoNodes[i];\n if (infoNode.getAttribute(\"data-p-modelinfo-id\") === String(this.id)) {\n // no need to replace\n } else {\n var tmpl = $(\n \"#\" + infoNode.getAttribute(\"data-p-modelinfo-template\")\n ).html();\n var contents = Mustache.render(tmpl, this);\n infoNode.innerHTML = contents;\n infoNode.setAttribute(\"data-p-modelinfo-id\", this.id);\n }\n }\n };\n\n return true;\n });\n})(jQuery, window, document);\n","import { escapeHTML } from \"$json/lib/escape\";\nimport { positionalFormat } from \"$json/lib/text-utils\";\nimport { _ } from \"$json/lib/gettext\";\nimport { bb } from \"$json\";\n\nbb.createModelItem = function (model) {\n return (\n '
      ' +\n '
      ' +\n escapeHTML(model._nicename) +\n \"
      \" +\n '\" +\n (model.caselistingallowed && model.casecount\n ? '\"\n : \"\") +\n \"
      \"\n );\n};\n","import { bb } from \"$json\";\n/*\n * reset-password:\n *\n * This global plugin gives the theme\n * a reset link below the login form\n * which will link to the live/ html\n * - a theme ambiguous simple layer\n * handling all aspects of resulting\n * password changing methods.\n *\n * NB: Dependencies:\n *\n * There needs to be a plugin-specific\n * link hard-coded into the theme, e.g.:\n *\n\n {{#plugins.reset-password}}\n \n \n \n I forgot my password...\n
      \n \n \n {{/plugins.reset-password}}\n\n * Author: Tim Bauwens\n * Copyright 2018 Berkeley Bridge\n *\n */\n\n(function ($, win, doc) {\n $(doc).ready(function () {\n try {\n var lang = bb.conf.lang;\n var helpdesk =\n bb.conf.arbitrary &&\n bb.conf.arbitrary.resetpasswordHelpdesk != undefined\n ? bb.conf.arbitrary.resetpasswordHelpdesk\n : \"\";\n var theme =\n self == top ? window.location.href : \"iframe+\" + document.referrer;\n var href =\n \"plugins/reset-password/live/newpwd.html\" +\n \"?theme=\" +\n encodeURIComponent(theme) +\n \"&lang=\" +\n lang +\n \"&helpdesk=\" +\n encodeURIComponent(helpdesk);\n $(\"#p-reset-password-link\").attr(\"href\", href);\n } catch (e) {\n /*\n If we couldn't determine the theme or lang,\n it's not worth sending the user\n potentially back to the wrong place.\n */\n $(\"#p-reset-password-link\").hide();\n }\n });\n})(jQuery, window, document);\n","/* global $ */\nimport { _ } from \"$json\";\nimport { quotable } from \"$json/lib/quotable.js\";\nimport { format } from \"$json/lib/text-utils.js\";\n/* show-server-side-validation:\n *\n * Show errors after server-side validation.\n *\n * Copyright (C) 2011, 2017 by Berkeley Bridge\n *\n */\nconst options = {\n silent: false,\n justhide: false\n};\n\n$(document).on(\"bb:postHandleData\", function (event, data) {\n if (data && data.lasterrors && data.lasterrors.length > 0) {\n var error;\n for (var i = 0, len = data.lasterrors.length; i < len; i++) {\n error = data.lasterrors[i];\n const control = data.groups\n .find(({ current }) => current)\n .controls.find(({ id }) => id === `${data.screenid}-${error.name}`);\n\n $(`[id=\"${data.screenid}-${error.name}\"]`).showValidation(\n options,\n false,\n format(map(error.errortext), quotable(control))\n );\n }\n }\n});\n\nfunction map(errortext) {\n switch (errortext) {\n case \"Input mandatory\":\n return _(\"Input required\");\n case \"E4004:Choice is mandatory\":\n return _(\"Choice required\");\n default:\n return _(errortext);\n }\n}\n"],"names":["jQuery","$","datepicker","regional","nl","closeText","prevText","nextText","currentText","monthNames","monthNamesShort","dayNames","dayNamesShort","dayNamesMin","weekHeader","dateFormat","firstDay","isRTL","showMonthAfterYear","yearSuffix","setDefaults","dicts","dict","_","s","fb","tagged","strings","values","reduce","acc","cur","idx","taggedWithin","prefix","set","ob","lang","key","val","Object","entries","addTranslations","translations","term","hasOwnProperty","freeze","new","Delete","case","cases","created","report","Sun","Mon","Tue","Wed","Thu","Fri","Sat","Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec","Yesterday","Feedback","send","cUMWrongUserNamePassword","cWebCaseIsRunning","password","load","open","copy","__digitgroupingchar__","__radixpoint__","__digitgroupingrules__","attachments","dateplaceholder","cancel","self","window","URLSearchParams","plus","get","q","toString","String","isArray","create","defineProperty","find","findPercentSign","replace","proto","append","value","appendTo","this","_ungap","delete","has","getAll","slice","forEach","callback","thisArg","invoke","call","toJSON","query","encoded","encode","i","length","push","join","prototype","configurable","writable","charAt","pairs","split","index","indexOf","decode","addEach","res","str","decodeURIComponent","encodeURIComponent","replacer","match","Array","positionalFormat","args","arguments","num","undefined","parseInt","format","sub","URLSearchParamsProto","iterable","Symbol","iterator","o_O","items","next","shift","done","names","name","keys","sort","entry","dP","gOPD","getOwnPropertyDescriptor","updateSearchParams","sp","_usp","search","verifySearchParams","obj","Class","TypeError","upgradeClass","createSearchParams","polluteSearchParams","ClassProto","searchParams","href","del","createSearchParamsPollute","defineProperties","_searchParams","HTMLAnchorElement","test","URL","meh","formatPlus","CODES","cException","cHTMLFormLoadCaseNotFound","cHTMLMenuFileNotFound","cWebModelIDDifferent","cWebPleaseLogin","cGetFileNotAllowed","cGetDocumentNotFound","cWebSessionTimeOut","cWebNoModelID","cWebIllegalAccess","cWebModelNotFound","cEngineLoadCaseFailed","cEngineUpgrading","cEngineNoInterfacesToShow","cEngineLoadCaseFailedNotFound","cEngineLoadCaseFailedWrongType","cEngineLoadCaseFailedWrongData","cWebOpenIsCalledWithUniqueID","cTechGraphVizNotInstalled","cGraphVizSessionNotFound","cUMUserNotFound","cUMModelNotFound","cUMCaseNotFound","cWebAdminNotAllowed","cEngineGotoNodeFailed","cPreviewNoCaseFound","cTechUploadedFileToLarge","cWebSaveCaseNotAllowed","cWebSaveCaseFailed","cInvalidUpload","CODESREV","fromEntries","map","_token","tokenChannel","BroadcastChannel","token","addEventListener","removeEventListener","getHash","async","message","msgUint8","TextEncoder","hashBuffer","crypto","subtle","digest","from","Uint8Array","b","padStart","digestMessage","setToken","postMessage","then","tokenHash","tokenize","parse","rules","input","tokenized","regex","exec","type","rest","Error","JSON","stringify","tokenizer","ast","parents","Number","parentAst","pop","Identity","x","fn","Const","lens","getter","setter","functor","target","focus","over","view","_apply","dec","arg","identity","isNil","not","a","pipe","fns","compose","reduceRight","curry","args2","sep","arr","reverse","always","F","T","propOr","or","prop","ifElse","pathOr","pathArg","path","tail","_nth","head","cond","choose","any","_findIndex","findIndex","_eqBy","_equals","_all","_append","_test","string","_match","a_value","b_value","_eqProps","_hasPath","p","_assoc","result","_assocPath","nextObj","isInteger","assocPath","concat","assoc","_consume","argN","_propEq","_pathEq","_has","complement","_tryCatch","tryer","catcher","e","_filter","filter","_when","predicate","whenTrueFn","_ifElse","whenFalseFn","_either","fn1","fn2","_allPass","mem","_both","_complement","_includes","item","c","includes","_lte","first","second","_lt","_gte","_gt","_tap","_groupWith","_groupBy","lensProp","_omit","props","_pickBy","pred","k","_pick","_pickAll","_dissoc","_mergeRight","ob1","ob2","assign","_mergeLeft","_strictWithout","list","_unary","_binary","arg1","arg2","_slice","to","toLower","toLowerCase","toUpper","toUpperCase","_applySpec","specs","Function","out","all","n","promise","Promise","resolve","apply","anyPass","both","chain","f","g","list1","list2","Set","s1","s2","add","dissoc","equals","hasPath","juxt","propEq","when","either","allPass","infichain","rest1","mergeLeft","pathEq","gt","into","groupWith","tap","Lenses.lens","Lenses.over","Lenses.set","Lenses.view","lensPath","stringSaysDo","bucket","astSaysDo","L.compose","L.all","L.tail","L.any","L.not","BooleanBucket","constructor","booleans","toggle","unset","bool","Mode","mode","reflect","console","warn","changedOrAdded","bool2","super","document","trigger","toggleClass","querySelectorAll","elt","hidden","hideWhen","dataset","ATTR_SNAME","ATTR_SVALUE","INPUT_SELECTOR","joiner","inputsOf","container","isEmptyRadioValue","isEmptyCheckboxValue","isCheckedCheckboxValue","collectWithin","params","flavor","querySelector","omitFn","changeFn","collector","nodeList","node","valueOf","getAttribute","_collectAll","hasAttribute","checked","serializeQuestions","_vars","SESSION_KEYS","NAV_KEYS","setValueInVars","data","getVar","extend","collect","FormData","Vars","querify","setVars","version","unsetVars","shouldExit","Boolean","onEnd","navigator","sendBeacon","usp","setKeyboardUser","setMouseUser","openingMatch","mouse","opener","body","className","on","matches","A11y","logdiv","getElementById","innerHTML","observeDatepickers","init","picker","MutationObserver","records","instance","infocus","activeElement","text","observe","attributes","escapeHTML","entityMap","re","RegExp","notify","options","keepalive","html","notification","error","area","textContent","setTimeout","bind","propFinder","fallback","leafs","leaf","conf","a11y","captions","optionfieldsets","strictlegends","fromApiServer","startsWith","apiserver","Ajax","busy","last","direction","defaultOptions","dataType","url","cache","success","checkJSON","err","release","responseText","statusText","trim","post","_options","ajax","abort","postJSON","stopDispatches","awaiting","status","req","responseJSON","setSettled","BBI","redirect_uri","location","pathname","template","returnurl","origin","param","bbis","server","extraparams","authid","state","stage","parseQuery","fmt","authenticate","isVisible","isLabel","isOption","isLink","isTextual","isPicture","isQuestion","isReadOnly","isValidatable","renderAttribs","attr","fieldDesignators","datetimepicker","numedit","radio","checkmultilist","customlist","combobox","listbox","multilist","fieldKey","controltype","generic","genericQuoted","quotable","Date","toHoursAndMinutes","hours","getHours","minutes","getMinutes","dateTimeRe","pureDateRe","date","parseDate","thing","leadWithZeroes","valueToDate","yyyycleanformat","clean","yearindex","adjustment","year","substr","cutoffyear","_defaults","shortYearCutoff","getYear","century","getFullYear","month","Math","max","dom","setFullYear","setMonth","setDate","getMonth","getDate","onChangeDate","ev","formatDate","humanDate","now","hour0","setHours","hour24","dayinms","thisyear","daysofweek","day","monthsofyear","hm","ms","isToday","isYesterday","isLastWeek","getDay","isThisYear","editPolicy","canEditEarlier","isLabelValueDynamic","preferUpdate","mustUpdate","updateLabels","_Widgets","registerWidget","getWidget","Dynprops","$widget","control","Updates","requestor","oldval","updates","definition","removeData","isForNotNull","placeholder","identifier","visible","removeAttr","setValue","readonly","onreadonly","minimum","maximum","maxlength","addClass","programmatically","removeClass","onrequired","notnull","id","event","CustomEvent","detail","bubbles","dispatchEvent","updateControl","controls","each","$this","update","Hooks","Map","arbitraryCoreProp","wControl","group","wGroup","_group","widget","attribs","enabled","current","$elt","datatype","meta","d","escape","metadata","aria","wdef","tagName","render","_elt","_originalid","autocomplete","hint","dynprops","dynpropsforus","ii","afterRender","prelabel","postlabel","shouldWrap","anchor","wraptag","nodeName","wrapAll","parent","prepend","setAttribute","wrapInlineInput","tag","getControl","listtypes","pathGroup","areOfOneQuestion","isfor","indexOfOrInfinity","Infinity","baseGroup","tailGroup","groupOuter","doGrouping","normalize","GROUPING_CLASS","GROUPING_PREFIX_TYPE","GROUPING_DATA_NAME","GROUPING_DATA_LEVEL","ITEM_PREFIX_AUTHORCLASS","QUESTION_CLASS","QUESTION_PREFIX_TYPE","QUESTION_PREFIX_PROPERTY","QUESTION_DATA_LAYOUT","QUESTION_PREFIX_AUTHORSTYLE","QUESTION_CLASS_NOLABEL","nameDefaults","pathToNames","propArg","doTopLevel","doLegends","getGroupName","questionGroupClass","n.QUESTION_PREFIX_AUTHORSTYLE","extraClasses","areAllInvisible","areAllReadonly","areAllNotNull","updateClassWhen","classList","setReadonlyFGClass","n.GROUPING_PREFIX_TYPE","setEmptyFGClass","setRequiredFGClass","setReadonlyQClass","n.QUESTION_PREFIX_PROPERTY","setEmptyQClass","setRequiredQClass","createFormGroup","level","formGroup","groupName","createElement","n.GROUPING_CLASS","n.GROUPING_DATA_LEVEL","n.GROUPING_DATA_NAME","asciify","createDocumentFragment","cWithin","appendChild","answer","classes","n.QUESTION_CLASS","n.QUESTION_PREFIX_TYPE","n.ITEM_PREFIX_AUTHORCLASS","n.QUESTION_CLASS_NOLABEL","qlg","n.QUESTION_DATA_LAYOUT","_layout","getLayout","t","o","globalThis","trustedTypes","l","createPolicy","createHTML","random","h","r","u","createComment","v","m","y","w","for","A","P","WeakMap","E","createTreeWalker","N","_$litType$","parts","lastIndex","M","el","currentNode","content","firstChild","remove","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","ctor","I","L","R","H","removeAttribute","emptyScript","static","S","_$litDirective$","O","D","creationScope","importNode","C","nextSibling","z","B","setConnected","parentNode","startNode","endNode","insertBefore","previousSibling","createTextNode","V","element","fill","W","capture","once","passive","handleEvent","host","litHtmlPlatformSupport","litHtmlVersions","ShadowRoot","ShadyCSS","nativeShadow","Document","CSSStyleSheet","cssText","styleSheet","replaceSync","adoptedStyleSheets","cssRules","toAttribute","fromAttribute","attribute","converter","hasChanged","HTMLElement","isUpdatePending","hasUpdated","observedAttributes","finalize","elementProperties","noAccessor","getPropertyDescriptor","requestUpdate","enumerable","finalized","getPrototypeOf","properties","getOwnPropertyNames","getOwnPropertySymbols","createProperty","elementStyles","finalizeStyles","styles","flat","unshift","enableUpdating","addController","renderRoot","isConnected","hostConnected","removeController","splice","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","K","getPropertyOptions","reject","performUpdate","shouldUpdate","willUpdate","hostUpdate","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","reactiveElementPlatformSupport","ReactiveElement","reactiveElementVersions","litElementVersions","renderOptions","renderBefore","_$litPart$","_$litElement$","litElementHydrateSupport","LitElement","litElementPlatformSupport","Maybe","module","isEmpty","of","getOrElse","Numerals","makeFormatter","radixPoint","groupingChar","groupingRules","_last","_a","makeLastItemRepeater","integralPart","fractionalPart","neg","th","makeParser","thre","testre","parser","formatter","makeParse","refresh","protocol","hostname","port","urlutils","mimetypes","xsl","docx","pdf","odt","rtf","doc","jpg","jpeg","png","isJS","isEmptyish","JSAlertMessage","getFiles","casus","caseReport","mimetype","absoluteURL","filename","ext","disconnectValue","newVal","noAttribs","omitName","omitRequired","emptyTag","setAttribs","valueInside","layout","alt","alttext","src","edit","couldWrap","fixup","isFor","class","_subtype","min","_level","linkClassName","isreport","listlabel","showdown","optionbox","some","selected","option","len","newLen","newOptions","selectedValue","optionElt","removeChild","freetext","size","multiple","optionlist","labelledby","required","disabled","allowUpdatingSelf","radiolist","closest","serverToWidgetValue","widgetToServerValue","originalreadonly","dynamic","InputEvent","cancelable","hide","validate","spec","UIFormat","mindate","maxdate","errdateinvalid","errrequired","fmindate","fmaxdate","quotableDate","errdatebeforemimimum","errdatenotinrange","errdateaftermaximum","checkDate","getMaxChars","toFixed","precision","maxchars","parseFloat","spinner","errnuminvalid","hasMax","hasMin","errnumnotinrange","errnumnotnegativeorzero","errnumnotnegative","errnumabovemaximum","errnumnotpositiveorzero","errnumnotpositive","errnumbelowminimum","freebox","_realValue","insertAdjacentHTML","noop","label","grid","renderable","addallowed","insertbuttontext","row","offset","showcolumns","deletebuttontext","columns","row_i","cell","cell_i","colname","col","col_i","cells","cellTag","col_id","_rowspan","_cell_index","columnheader","column","header","innerText","colheaderids","rowheaderid","rows","rows_up_to_here","_tag","e_cell","cellSetAttributes","headers","caption","thead","tr","e_body","colheaders","last_spanning_cell_id","e_row","icol","cellWithHeaders","gridAddButton","encodeURI","addbuttontext","e_grid","old","colheader","irow","tBodies","cellInput","oldcell","spot","replaceWith","cellControl","interval","timer","me","$anchor","adjust","diff","parsed","keepAdjusting","hasClass","adjustOnce","stopAdjusting","clearTimeout","keyCode","orgval","$input","after","addButtons","_event","times","integer","repeat","hasselectedbelowlevel","jumplist","hasselectedbelow","ariaCurrentAttrib","chapterDataAttrib","ischapter","chapterstatus","bakeInnerList","containsselection","Jumplist","groupid","screentitle","bakeAsListitems","bakeAsDropDown","findCurrentIndex","_jumplist","drawAsList","currentIndex","slicetype","itemizer","drawAsDropDown","draw","is","userinfo","PERM_ALLOWACCESSCASES","PERM_ALLOWACCESSCASESFROMDOMAIN","PERM_ALLOWCASEOVERVIEW","PERM_ALLOWMISDOCUMENTS","PERM_ALLOWMISDOMAIN","PERM_ALLOWMISOWNCASES","PERM_ALLOWSAVECASE","PERM_ALLOWSTARTCASES","PERM_PUBLISHMODEL","PERM_UPDATEOWNMODEL","PERM_UPDATEOWNUSER","oldperms","guest","user","administrator","viewer","manager","vieweradmin","permissions","role","scrollTo","top","left","defaults","axis","duration","jquery","limit","_scrollable","inArray","contentWindow","ownerDocument","userAgent","compatMode","documentElement","onAfter","queue","toff","$elem","targ","win","style","pos","margin","css","animate","onAfterFirst","easing","end","scroll","config","separator","pair","array_keys","default_decode","new_text","bb","compareVersions","isNaN","compareVersionsOn","_to","showAnim","changeYear","changeMonth","yearRange","altFormat","pause","dequeue","pushStack","makeArray","insertAtCaret","myValue","selection","createRange","selectionStart","startPos","endPos","selectionEnd","scrollTop","substring","selectAllText","createTextRange","select","KEYS","maps","originalEvent","$target","prev","shiftKey","$inputs","gridKeys","step","stopImmediatePropagation","preventDefault","dispatchBackspace","aintTheEnterKey","setRole","fullname","perms","perm","webadminMakesSense","resetLogin","effect","serializeArray","action","formfocus","Router","username","uniqueid","modelid","modelname","dbname","request","bsid","hideLogin","autologinrewritten","renderGroups","safeResetEffect","gotonode","deleteme","confirm","sessionid","deleteCase","isCaseCurrent","empty","Cases","_cases","_unfilteredcases","_MAX","_idx","_filtertext","showSlice","caselen","cas","dateenter","datecreate","showcopycase","showdeleteinmenu","reporturl","firstrun","lastaccess","createCaseItem","$case","templateindex","wCasus","howManyColumns","Plugins","newname","prependTo","hasNoNext","floor","nextSlice","divident","prevSlice","$controls","click","keyup","grep","newcase","jsondata","dateTitle","dateSpan","copySpan","reportSpan","deleteSpan","stopPropagation","Models","selector","modelitem","model","createModelItem","_selectedclass","yours","_nicename","enhanceModel","lastupdate","_date","_humandate","modelinfo","_liner_notes","authorinfo","_author_notes","models","explicit","cb","Validation","reset","silent","justhide","screenid","ajaxOptions","sync","fullnodename","_direction","_passed","pass","_isUpdate","cbIsAdditional","info","groupElt","isUpdate","lastUpdateRequest","requestDynProps","thisUpdateRequest","updateDynProps","skip","logout","close","currentTarget","restart","exit","mockResponse","code","fun","openSettings","menu","creds","exitthenmenu","returnfocusto","returnSelection","groups","_originalisfor","modus","removeAllRanges","_error","subcode","summary","Errors.translate","Errors.CODES","informationsources","hasprevious","hasnext","modeldescription","modellanguage","setMode","$document","focusHandler","focusstring","contains","selectionDirection","setSelectionRange","returnfocus","e_group","doScrollToSelected","previousElementSibling","scrollIntoView","behavior","matchMedia","fulldata","sortControls","setupFocusHandler","off","$parent","_stack","allValid","geterrorelt","showValidation","ok","errortext","$error","$node","category","stringmask","validateInput","validatable","eltControltype","doChangeOnKeyDown","setting","func","wait","immediate","timeout","context","later","callNow","before","setDynamicMode","previd","$bbq","setGroupTitle","gob","tempNode","replaceChild","_tempNode","setSelectedStateAttributes","renderGroup","sortGroups","show","questionlabelgroup","order","ac","bc","_sorted","hasStatusRole","describedby","screenmode","itype","questionandlabel","classname","maybeSetDescription","description_ids","siblings","$other","hash","rewind","updatemis","prior","runtonode","nodename","remarks","pretexts","explicitId","_groupby","_hash","_map","put","appendAsterisk","child","space","words","nodeValue","lastword","lastChild","$stick","textnode","unwrap","Mustache","mustache","objectToString","object","isFunction","escapeRegExp","hasProperty","propName","regExpTest","nonSpaceRe","isWhitespace","testRegExp","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","Scanner","Context","parentContext","Writer","eos","scan","scanUntil","lookup","lookupHit","clearCache","tags","tokens","openingTagRe","closingTagRe","closingCurlyRe","sections","spaces","hasTag","nonSpace","stripSpace","compileTags","tagsToCompile","start","chr","openSection","scanner","valueLength","nestedTokens","numTokens","nestTokens","lastToken","squashedTokens","squashTokens","parseTemplate","partials","renderTokens","originalTemplate","symbol","buffer","renderSection","renderInverted","renderPartial","unescapedValue","escapedValue","rawValue","j","defaultWriter","to_html","mustacheFactory","tmpl","navText","adjustBtn","btn","change","$btn","$newbtn","clone","default","fr","de","ru","newcolspan","colspan","tabindex","baseLevel","topLevel","duck","arbitrary","headings","ctl","klass","history","pushState","apinav","storage","_title","title","sessionStorage","directory","loc","restoreState","ditchState","removeItem","replaceState","initial_state","getItem","setItem","Showdown","g_urls","g_titles","g_html_blocks","g_list_level","makeHtml","inline_only","_Detab","_HashHTMLBlocks","_StripLinkDefinitions","_RunSpanGamut","_RunBlockGamut","_UnescapeSpecialChars","_ProcessListItems","wholeMatch","m1","m2","m3","m4","_EncodeAmpsAndAngles","hashElement","blockText","_DoHeaders","hashBlock","_DoLists","_DoCodeBlocks","_DoBlockQuotes","_FormParagraphs","_DoCodeSpans","_EscapeSpecialCharsWithinTagAttributes","_EncodeBackslashEscapes","_DoImages","_DoAnchors","_DoAutoLinks","_DoItalicsAndBold","escapeCharacters","writeAnchorTag","m5","m6","m7","whole_match","link_text","link_id","writeImageTag","alt_text","matchFound","h_level","whole_list","list_type","runup","list_str","_Outdent","codeblock","nextChar","_EncodeCode","bq","pre","grafs","grafsOut","$1","escapeCharacters_callback","_EncodeEmailAddress","addr","ch","charCodeAt","hexDigits","char2hex","charCodeToReplace","fromCharCode","leadingText","numSpaces","charsToEscape","afterBackslash","regexString","orig","inline","nf","buttonplacement","blockafterlabel","genid","interesting","associateEltWithFirst","srcs","elts","belongsto","widgets","parentElement","getQuestionLabelGroup","getMatchingChildOrSelf","tw","SHOW_ELEMENT","matcher","infogroups","nextElementSibling","contents","sources","source","isurl","groupguid","children","toggleInfo","setInfo","display","removal","removeAgain","slideToggle","block","msMatchesSelector","FILTER_ACCEPT","FILTER_SKIP","previousNode","NodeFilter","policy","newline","plugins","newlineGlobRe","br_re","onlyPhrasingInside","demoteHeading","html_in","html_out","onlyPhrasing","allowOnlyPhrasing","$filter","hasmatch","ismatch","clear","$doc","$filtered","addBack","infoNodes","lastId","_info","Model","author","authorname","extramodelinfo","line","kv","infoNode","caselistingallowed","casecount","ready","helpdesk","resetpasswordHelpdesk","theme","referrer","lasterrors"],"mappings":"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"}