{"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/control-validation.js","js/lib/groupings.js","js/lib/font-classes.js","js/lib/names.js","js/lib/form-groups.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","plugins/Dialogue/Dialogue.js","plugins/a11y-describedby/a11y-describedby.js","plugins/asterisk/asterisk.js","plugins/bb-input-wrap-and-unit/bb-input-wrap-and-unit.js","plugins/custom-checkboxes/custom-checkboxes.js","custom/rvr/plugins/final-node/final-node.js","plugins/has-required/has-required.js","plugins/heading2-3/heading2-3.js","plugins/high-on-info-tb/high-on-info-tb.js","plugins/history/history.js","plugins/showdown/showdown.js","plugins/showdown-converter/showdown-converter.js","plugins/md-labels/md-labels.js","plugins/model-filter/model-filter.js","plugins/modelitem/modelitem.js","plugins/mustache/mustache.js","plugins/non-indenting-jumplist/non-indenting-jumplist.js","custom/nta/plugins/proxymap/proxymap.js","plugins/optional/optional.js","plugins/piwik-pro/piwik-pro.js","plugins/progressbar/progressbar.js","plugins/questionlabelgroup-ng/questionlabelgroup-ng.js","plugins/reset-password/reset-password.js","plugins/selected-model/selected-model.js","plugins/show-server-side-validation/show-server-side-validation.js","plugins/xsl-to-pdf/xsl-to-pdf.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 {maxlength} 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 \"cWebIllegalAccess\": \"Je mag deze casus niet starten of openen.\",\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 \"There does not seem to be an open session.\":\n \"Er lijkt geen lopende sessie te zijn.\"\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\n/** Function that count occurrences of a substring in a string;\n * @param {String} subString The sub string to search for\n * @param {String} string The string\n *\n * Based on https://gist.github.com/victornpb/7736865\n */\nexport function occurrences(subString, string) {\n string += \"\";\n subString += \"\";\n if (subString.length <= 0) return string.length + 1;\n\n var n = 0,\n pos = 0,\n step = subString.length;\n\n while (true) {\n pos = string.indexOf(subString, pos);\n if (pos >= 0) {\n ++n;\n pos += step;\n } else break;\n }\n return 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 pipe() in that the first function in the compose\n chain may be called with more than one argument.\n */\nexport const pipeX =\n (...fns) =>\n (...value) =>\n fns.reduce((acc, cur) => [cur.apply(null, 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\nconst _uniqBy = (fn, arr) =>\n Object.values(\n arr.reduce((acc, cur) => {\n const key = fn(cur);\n return _has(key, acc) ? acc : { ...acc, [key]: cur };\n }, {})\n );\n\nexport const uniqBy = curry(_uniqBy);\n\nexport const uniq = uniqBy(_equals);\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\nexport const range = curry((start, end) => {\n let arr = [];\n let i = start;\n while (i++ <= end) {\n arr.push(i);\n }\n return 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\nexport const equals = curry(_equals);\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 _pathSatisfies = (fn, key, ob) => fn(path(key, ob));\n\nconst _pathEq = (key, value, ob) => _pathSatisfies(equals(value), key, ob);\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\n// Copied verbatim from Ramda\nconst _is = function is(Ctor, val) {\n return (\n val instanceof Ctor ||\n (val != null &&\n (val.constructor === Ctor ||\n (Ctor.name === \"Object\" && typeof val === \"object\")))\n );\n};\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\nconst _partial = (fn, args) => fn.bind(null, ...args);\n\nexport const all = curry(_all),\n partial = curry(_partial),\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 filter = curry(_filter),\n has = curry(_has),\n hasPath = curry(_hasPath),\n is = curry(_is),\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 pathSatisfies = curry(_pathSatisfies),\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 is: _is,\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 partial: _partial,\n strictWithout: _strictWithout,\n unary: _unary,\n binary: _binary,\n slice: _slice,\n findIndex: _findIndex,\n toLower,\n toUpper,\n uniqBy: _uniqBy,\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 ***/\n\nconst isLiveRegion = area =>\n area.role === \"alert\" ||\n [\"assertive\", \"polite\"].includes(area.getAttribute(\"aria-live\"));\n\nconst LIVE_REGION_SELECTOR = \"#a-logdiv\";\n\nconst _liveRegion = document.querySelector(LIVE_REGION_SELECTOR);\n\nif (!_liveRegion) {\n console.warn(\n `Live errors and such will not be announced to screen readers, as there is no ${LIVE_REGION_SELECTOR} at pageLoad!`\n );\n}\n\nif (_liveRegion && !isLiveRegion(_liveRegion)) {\n console.warn(`${LIVE_REGION_SELECTOR} is not actually an aria-live region.`);\n}\n\nconst liveRegion = _liveRegion;\n\nexport const A11y = {\n log: function (message, html = false) {\n if (!liveRegion) {\n return;\n }\n if (liveRegion && !liveRegion.isConnected) {\n console.warn(`${LIVE_REGION_SELECTOR} is not connected`);\n return;\n }\n if (html) {\n liveRegion.innerHTML = message;\n } else liveRegion.textContent = message;\n const textContent = liveRegion.textContent;\n setTimeout(() => {\n if (liveRegion.textContent === textContent) liveRegion.textContent = \"\";\n }, 500);\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\";\nimport { A11y } from \"./a11y.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 A11y.log(text, options.html);\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 window.setTimeout(\n () =>\n document\n .querySelectorAll(\".bb-notification\")\n .forEach(area => (area.textContent = \"\")),\n timeout\n );\n }\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 (data.responseText.trim() === \"\") {\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 $ */\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 isButton = propEq(\"controltype\", \"button\");\n\nexport const isQuestion = complement(anyPass([isTextual, isPicture, isButton]));\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, pathOr, 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(\n pathOr(\"readonly\", [\"template\", \"readonly-prop\"], conf),\n readonly\n );\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","/* global $ */\nimport { occurrences } from \"$json/lib/text-utils.js\";\nimport { getWidget } from \"./form-widgets.js\";\nimport {\n always,\n assoc,\n compose,\n cond,\n curry,\n either,\n path,\n propEq,\n T,\n tap\n} from \"./functional.js\";\nimport { _ } from \"./gettext.js\";\nimport { quotable } from \"./quotable.js\";\nimport { format, formatPlus } from \"./text-utils.js\";\nimport { listtypes } from \"./types.js\";\n\nconst numofnewlines = curry(occurrences)(\"\\n\");\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 + numofnewlines(val) <= 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","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) => {\n if (a.isfor === undefined && b.isfor === undefined) return false;\n return a.isfor === b.id || b.isfor === a.id;\n};\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","\"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 pathOr,\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 readonlyprop = pathOr(\"readonly\", [\"template\", \"readonly-prop\"], conf);\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 onreadonly: (input, readonly) => {\n if (readonlyprop === \"disabled\") {\n input.disabled = readonly;\n } else {\n input.ariaDisabled = readonly;\n }\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 if (input.type === \"checkbox\" || input.type === \"radio\") {\n checkbox.onreadonly(input, readonly);\n } else input[readonlyprop] = 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 const computedReadonly =\n readonly || compose(ifElse(Boolean, isReadOnly, F), getControl)(input);\n if (input.type === \"checkbox\" || input.type === \"radio\") {\n checkbox.onreadonly(input, readonly);\n } else input[readonlyprop] = computedReadonly;\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, when } 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 when(Boolean, 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 $ */\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\nfunction resetLogin() {\n $(\"#bb-login\")[resetLogin.effect]();\n}\n\nresetLogin.effect = safeResetEffect(\n arbitraryCoreProp(\"loginResetEffect\", \"slideDown\")\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(\n \"click\",\n \"[data-groupid]:not([data-chapterstatus='forbidden'])\",\n function () {\n var $this = $(this),\n groupid = $this.attr(\"data-groupid\");\n bb.gotonode(groupid);\n }\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, ...rest) {\n Ajax.busy = false;\n if (jsondata.status === \"Ready\") {\n Ajax.replace({ data: data });\n } else {\n checkJSON(jsondata, ...rest);\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 const container = either(prop(\"groupElt\"), () =>\n document.querySelector(\".group.selected\")\n )(options);\n if (container === null) {\n throw new Error(\"There does not seem to be an open session.\");\n }\n\n if (\n [\"next\", \"skip\"].includes(direction) &&\n $(\"#bb-q .group:not([disabled]) .validatable:visible\")\n .validate({\n silent: false,\n justhide: false,\n requestUpdate: false,\n batched: true\n })\n .filter(\"[aria-invalid=true]\").length > 0\n )\n throw new Error(\"There are errors, please double check your answers.\");\n\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: !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});\n\n// Save\n$(document).on(\"click\", \".bb-save\", function () {\n step(\"save\", null);\n});\n\n// Update - from grids (+/- a row), or from dynamically added buttons (e.g. plugin\n// metadata-add-update-button)\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$(document).on(\"click\", 'input[aria-disabled=\"true\"]', function (event) {\n event.preventDefault();\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 // eslint-disable-next-line no-empty, no-unused-vars -- tryCatch was there for IE's sake. probably because we were using Selection.empty()\n } catch (e) {}\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 // When going from logged out to logged in:\n if (\n // Mode.get(\"isLoggedIn\") &&\n modus === \"none\"\n ) {\n bb.onBeforeLogout();\n } else 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 === \"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$(document).on(\"bb:errorOn\", (_event, message, _input, _error, options) => {\n if (!options.batched) A11y.log(message);\n});\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, options]);\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\", [options]);\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, a\", 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 resetLogin();\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 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;\nbb.onBeforeLogout = () => {\n Mode.unset(\"isLoggedIn\");\n};\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","import { _ } from \"$json\";\n\nconst DICTIONARY = {\n \"close this infomation box\": {\n \"en\": \"close this infomation box\",\n \"nl\": \"sluit dit informatievak\",\n \"en-GB\": \"close this infomation box\"\n },\n \"Send link popup\": {\n \"en\": \"Send link popup\",\n \"nl\": \"Pop-up voor koppeling verzenden\",\n \"en-GB\": \"Send link popup\"\n }\n};\n\n_.addTranslations(DICTIONARY);\n\nclass Listener {\n constructor(id) {\n this[id] = event => {\n if (event.isComposing || event.keyCode !== 27) {\n return;\n } else {\n // No need to be specific, just destroy the most recent one.\n Array.from(document.querySelectorAll(\".p-dialogue-container\"))\n .pop()\n .click();\n }\n };\n }\n}\n\nexport default class Dialogue {\n constructor(props = {}, parent) {\n this.id = `dialogue-${Date.now()}-${Math.floor(Math.random() * 10000)}`;\n this.parent =\n parent !== undefined && typeof parent === \"object\" && \"nodeType\" in parent\n ? parent\n : document.getElementsByTagName(\"body\")[0];\n this.elemprops = props;\n this.rtnfocus = document.children[0];\n }\n\n destroy(human = true) {\n let me = document.getElementById(this.id);\n if (me) this.parent.removeChild(me);\n\n // Remove keyup listener\n this.handler &&\n document.removeEventListener(`keyup`, this.handler[this.id], false);\n\n // Untrap focus\n document.querySelectorAll(\"[data-hushed-by-dialogue]\").forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"tabindex\");\n if (prev !== \"none\") {\n elem.setAttribute(\"tabindex\", prev);\n }\n elem.removeAttribute(\"data-previous-tabindex\");\n elem.removeAttribute(\"data-hushed-by-tabindex\");\n });\n\n // Unhide ARIA\n document\n .querySelectorAll(\"[data-aria-hidden-by-dialogue]\")\n .forEach(elem => {\n let prev = elem.getAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"aria-hidden\");\n if (prev !== \"none\") {\n elem.setAttribute(\"aria-hidden\", prev);\n }\n elem.removeAttribute(\"data-previous-aria\");\n elem.removeAttribute(\"data-aria-hidden-by-dialogue\");\n });\n\n // Return focus, but not if this was called by the render method,\n // otherwise we will override the activeElement with the initial\n // rtnfocus value (document.children[0])\n human && this.rtnfocus.focus();\n }\n\n render(elem) {\n // Remove dialogue if it already exists.\n this.destroy(false);\n\n // Remove all other focusable elements from tabindex on the DOM,\n // so we can truly trap the focus for all users w/o trapping\n // keyboard user out of the browser controls.\n document\n .querySelectorAll(\n \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]\"\n )\n .forEach(elem => {\n elem.setAttribute(\"data-hushed-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-tabindex\",\n elem.getAttribute(\"tabindex\") || \"none\"\n );\n elem.setAttribute(\"tabindex\", \"-1\");\n });\n\n // ARIA hide everything to avoid screen readers keyboard\n // shortcuts gaining access outside of the dialogue.\n document.querySelectorAll(\"*:not(body):not(html)\").forEach(elem => {\n elem.setAttribute(\"data-aria-hidden-by-dialogue\", true);\n elem.setAttribute(\n \"data-previous-aria\",\n elem.getAttribute(\"aria-hidden\") || \"none\"\n );\n elem.setAttribute(\"aria-hidden\", \"true\");\n });\n\n // Create elements.\n let container = document.createElement(\"div\");\n container.className = \"p-dialogue-container\";\n container.style.cssText = `\n background-color: rgba(0,0,0,.5);\n height: 100%;\n left: 0;\n position: fixed;\n text-align: center;\n top: 0;\n width: 100%;\n z-index: 100;\n `;\n container.id = this.id;\n container.setAttribute(\"role\", \"dialog\");\n // container.setAttribute(\"aria-label\", \"dialog\"); // BAD A11Y - more accessible label should be given by class caller.\n Object.keys(this.elemprops).forEach(prop => {\n prop === \"class\"\n ? (container.className += \" \" + this.elemprops[prop])\n : container.setAttribute(prop, this.elemprops[prop]);\n });\n container.addEventListener(\"click\", e => {\n this.destroy();\n });\n\n let inner = document.createElement(\"div\");\n inner.className = \"inner\";\n inner.style.cssText = `\n display: inline-block;\n margin: 10vh 25px auto 25px;\n overflow: auto;\n `;\n inner.addEventListener(\"click\", e => {\n e.stopPropagation();\n });\n\n let closer = document.createElement(\"button\");\n let x = document.createTextNode(\"+\");\n closer.append(x);\n closer.className = \"dialogue-close\";\n closer.style.cssText = `\n font-size: 2.2rem;\n line-height: 1.2rem;\n padding: 5px;\n position: absolute;\n right: 5px;\n top: 5px;\n transform-origin: top;\n transform: rotate(45deg);\n `;\n closer.addEventListener(\"click\", e => this.destroy());\n closer.setAttribute(\"aria-label\", _(\"close this infomation box\"));\n\n // Add to DOM\n inner.appendChild(closer);\n inner.appendChild(elem);\n container.appendChild(inner);\n this.parent.appendChild(container);\n\n // Set the rtnfocus, then focus inside dialogue.\n this.rtnfocus = document.activeElement;\n inner.focus();\n\n this.handler = new Listener(this.id);\n\n document.addEventListener(`keyup`, this.handler[this.id], false);\n }\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","/* 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","(function ($) {\n $(document).on(\"bb:errorOn\", \".bb-input-wrap\", adderrorclass);\n $(document).on(\"bb:errorOff\", \".bb-input-wrap\", rmerrorclass);\n\n function adderrorclass(ev) {\n $(ev.currentTarget).addClass(\"bb-input-wrap--error\");\n }\n\n function rmerrorclass(ev) {\n $(ev.currentTarget).removeClass(\"bb-input-wrap--error\");\n }\n\n $(document).on(\"click\", \".selected .bb-input-wrap\", focus);\n\n function notAnInput(node) {\n return node.form === undefined; // With form inputs, this will\n // be either the form or null\n }\n function focus(ev) {\n if (notAnInput(ev.target)) {\n ev.currentTarget.querySelector(\"input, select, textarea\").focus();\n }\n }\n})(jQuery);\n","/* global jQuery */\n// custom-checkboxes.js\n\n/*\n * A simple plugin to replace\n * checkboxes with a custom design.\n * Cross-browser and working with all\n * forms of output; grids, checklists\n * and mutli-checklists\n *\n * Author: Tim Bauwens\n * Copyright Berkeley Bridge 2019\n *\n */\n\n((doc, $) => {\n const addCustomCheckbox = checkbox => {\n checkbox.className += \" a-offscreen p-custom-checkboxes\";\n checkbox.insertAdjacentHTML(\n \"afterEnd\",\n `\n \n `\n );\n };\n\n const addCheckBoxes = () => {\n // If there are any checkboxes, deal with them\n const checkboxes = $(\"#bb-q\").find(\n 'input[type=\"checkbox\"]:not(.p-custom-checkboxes)'\n );\n checkboxes.each((_, checkbox) => {\n addCustomCheckbox(checkbox);\n });\n };\n\n $(doc).on(\"bb:postHandleData\", (_, data) => {\n if (!data || !data.groups) return;\n addCheckBoxes();\n });\n\n $(doc).on(\"bb:updated\", (_, $widget, { controltype }) => {\n if (controltype === \"grid\" || controltype === \"checkmultilist\") {\n const checkboxes = $widget.find(\n 'input[type=\"checkbox\"]:not(.p-custom-checkboxes)'\n );\n checkboxes.each((_, checkbox) => {\n addCustomCheckbox(checkbox);\n });\n }\n });\n})(document, jQuery);\n","// final-node.js\n\n/*\n A plugin to target the final node and\n make a report and feedback buttons, similar\n to nta:three-in-one.\n*/\n\n((doc, $) => {\n var reportURL;\n $(doc).on(\"bb:preHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length > 0) {\n if (data.groups[0].name === \"main.document\") {\n // Grab the doc url, and remove it from the controls.\n data.groups[0].controls.forEach((control, i) => {\n if (control.controltype === \"linklabel\") {\n reportURL = control.url;\n data.groups[0].controls.splice(i, 1);\n }\n });\n }\n }\n });\n $(doc).on(\"bb:postHandleData\", (e, data) => {\n if (data && data.groups && data.groups.length > 0) {\n if (data.groups[0].name === \"main.document\") {\n // Create the container for the functions.\n var $container = $('
      ');\n\n // Make a download report button\n var $download = $('
      ');\n $download.append(`\n \n Samenvatting als PDF downloaden\n
      `);\n $container.append($download);\n\n // Make the feedback buttons.\n var $feedback = $(\n '
      '\n );\n $feedback\n .append(\"\")\n .append(\n ''\n )\n .append(\n ''\n );\n\n // Handler\n var group;\n if (data && data.userinfo) $feedback.data(\"userinfo\", data.userinfo);\n group = data.groups.filter(function (g) {\n return g.current;\n })[0];\n $feedback.data(\"nodename\", group.name);\n if (data && data.modelname) $feedback.data(\"modelname\", data.modelname);\n if (data && data.modelversion)\n $feedback.data(\"modelversion\", data.modelversion);\n $(doc).off(\".three-in-one-events\", \".feedback-button\");\n $(doc).one(\n \"click.three-in-one-events\",\n \".feedback-button\",\n function (e) {\n var vote =\n $(e.target).data(\"value\") !== undefined\n ? $(e.target).data(\"value\")\n : $(e.target).parents(\"button\").data(\"value\");\n // Send the vote to the feedback model and update the inner text\n $.getJSON(\"open?\", {\n \"modelname\": \"Feedback\",\n \"username\": \"feedback\",\n \"password\": \"feedback\",\n \"fmt\": \"json\",\n \"fdbk:f\": vote,\n \"fdbk:n\": $feedback.data(\"nodename\"),\n \"fdbk:u\": $feedback.data(\"userinfo\")\n ? $feedback.data(\"userinfo\")[\"fullname\"]\n : \"\",\n \"fdbk:m\": $feedback.data(\"modelname\"),\n \"fdbk:v\": bb.getVar(\"version\") && bb.getVar(\"version\").join(\".\"),\n \"fdbk:a\":\n [\n bb.getVar(\"replyserveraddress\"),\n bb.getVar(\"replyserverport\")\n ].join(\":\") +\n \"/\" +\n bb.getVar(\"proxyredirect\"),\n \"fdbk:s\": bb.getVar(\"sessionid\"),\n \"fdbk:d\": location.href.replace(/(password=)(?:[^&]+)/, \"$1***\"),\n \"fdbk:b\": navigator.userAgent\n });\n\n // Add the vote to the hiddden interface.\n $(\"input.bbm-feedback-vote\").attr(\"value\", vote);\n $feedback.html(\"\");\n }\n );\n\n $container.append($feedback);\n\n // Reveal\n\n $(\"#bb-q\").prepend($container);\n $(\"html,body\").animate({ scrollTop: 0 });\n setTimeout(function () {\n $container.toggleClass(\"showing\");\n }, 800);\n }\n }\n });\n})(document, jQuery);\n","import { bb } from \"$json\";\nimport { canEditEarlier } from \"$json/lib/feature-queries\";\nimport { conf } from \"$json/lib/conf\";\n/* has-required:\n *\n * Note whether there is any required question currently\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n var req = data.groups.some(function (group) {\n return (\n (canEditEarlier(conf) || group.current) &&\n group.controls.some(function (control) {\n return control.notnull;\n })\n );\n });\n bb.Mode.toggle(\"hasRequired\", req);\n }\n });\n });\n})(jQuery, window, document);\n","/* heading2-3:\n *\n * Turn first top label into heading level 2, and any subsequent to level 3.\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n var level = 2;\n\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups && data.groups.length) {\n var topdone = false;\n $.each(data.groups, function (_, group) {\n var ctl;\n if (\n group.controls &&\n ((ctl = group.controls[0]), ctl) &&\n ctl.controltype === \"label\" &&\n ctl[\"font-class\"].toLowerCase().indexOf(\"title\") > -1\n ) {\n ctl._subtype = \"heading\";\n ctl._level = topdone ? level + 1 : level;\n topdone = true;\n }\n });\n }\n });\n });\n})(jQuery, window, document);\n","/*\n * high-on-info-tb.js\n *\n * As a simpler replacement to other\n * renditions of high-on-info.\n *\n */\n\nimport { bb } from \"$json\";\nimport Dialogue from \"$Dialogue\";\n\n((doc, $) => {\n function createClickable(textNode, descriptor, dialogue) {\n /*\n Take this text node and make three elements;\n one for the text before,\n one for the clickable\n one for thr rest of the text.\n */\n try {\n let text = textNode.textContent;\n let clickTextLength = descriptor.length;\n let clickTextPos = text.indexOf(descriptor);\n\n let preText = text.slice(0, clickTextPos);\n let clickText = doc.createTextNode(descriptor);\n let postText = text.slice(clickTextPos + clickTextLength, text.length);\n\n let container = doc.createElement(\"span\");\n\n let pre = doc.createTextNode(preText);\n\n let link = doc.createElement(\"a\");\n link.href = \"\";\n link.appendChild(clickText);\n link.className = \"p-high-on-info-tb-link\";\n link.addEventListener(\"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n let inner = doc.createElement(\"div\");\n\n let title = doc.createElement(\"h2\");\n let titleTxt = doc.createTextNode(descriptor);\n title.append(titleTxt);\n let content = doc.createElement(\"div\");\n let contentTxt = doc.createTextNode(dialogue.content);\n content.append(contentTxt);\n // In case markdown is active, use it.\n try {\n $(content).showdown();\n } catch (e) {\n window.console && window.console.warn(e);\n }\n inner.append(title, content);\n dialogue.render(inner);\n });\n\n let post = doc.createTextNode(postText);\n\n container.appendChild(pre);\n container.appendChild(link);\n container.appendChild(post);\n\n return container;\n } catch (err) {\n return doc.createElement(\"span\");\n }\n }\n\n $(doc).on(\"bb:finalHandleData\", (e, data) => {\n if (data && data.informationsources) {\n // Create a map of info source descriptors.\n let descriptors = new Map();\n data.informationsources.forEach(info => {\n if (!info.isurl) {\n let dialogue = new Dialogue();\n dialogue.content = info.content;\n\n descriptors.set(info.description, {\n belongsto: info.belongsto,\n dialogue: dialogue\n });\n }\n });\n // For each descriptor, walk the element who owns the info source and replace the node.\n let cb = (source, descriptor, map) => {\n if (descriptor.length) {\n let tw = doc.createTreeWalker(\n doc.querySelector(`.group [data-id=\"${source.belongsto}\"]`),\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n\n var node = tw.nextNode(); // Move to first child.\n while (node) {\n // Must call nextNode before altering the currentNode. Otherwise, the tw returns no nextNode.\n let handlenode = tw.currentNode;\n node = tw.nextNode();\n if (handlenode.textContent.includes(descriptor)) {\n let replacement = createClickable(\n handlenode,\n descriptor,\n source.dialogue\n );\n handlenode.replaceWith(replacement);\n }\n }\n }\n };\n descriptors.forEach(cb);\n }\n });\n})(document, jQuery);\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(//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","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","/*!\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","/* non-indenting-jumplist:\n *\n * Throw away indentation level information of the jumplist, so that a\n * flat jumplist will be created.\n *\n * This can be useful for horizontally layed-out jumplists.\n *\n * Copyright (C) 2010, 2011, 2015 by Berkeley Bridge\n *\n */\n\n(function ($) {\n $(document).on(\"bb:preHandleData\", function (event, data) {\n if (data.jumplist) {\n $.each(data.jumplist, function (group) {\n data.jumplist[group].level = 0;\n data.jumplist[group].screentitle =\n data.jumplist[group].screentitle.trim();\n });\n }\n });\n})(jQuery);\n","import { bb } from \"$json\";\n\nvar arbitrary = bb.propFinder(bb.conf, \"arbitrary\");\n/**\n * Get the part of pathname with which we can match our model,\n * case-insensitively\n *\n * @param {String} pathname\n *\n * @return {String} (when found)\n * @return {undefined} (when not found)\n */\nfunction getIdentifyingPartOfPath(pathname) {\n var chunks = pathname.split(\"/\"),\n path,\n i = 0;\n while (\n ((path = chunks.pop()), typeof path !== undefined && /(\\.|^$)/.test(path))\n );\n return (path && path.toLowerCase()) || arbitrary(\"proxymap.default\");\n}\n\n/**\n * Export the Usabilla function\n */\n\nexport function getSetting(key, fallback) {\n return arbitrary(\n [\"proxymap\", getIdentifyingPartOfPath(window.location.pathname), key]\n .filter(Boolean)\n .join(\".\"),\n fallback\n );\n}\n\nexport function getProxyString() {\n return getIdentifyingPartOfPath(window.location.pathname);\n}\n","import { _ } from \"$json/lib/gettext.js\";\nimport { isOptional } from \"$json/lib/control-helpers\";\n/* optional:\n *\n * Set placeholder to '(Optional)' on non-required fields\n *\n * Author: Niels Giesen\n * Copyright 2015 Berkeley Bridge\n *\n * @todo: support textareas and grid fields\n */\n(function ($, win, doc) {\n var translations = {\n \"(Optional)\": {\n nl: \"(Optioneel)\",\n de: \"(Fakultativ)\",\n fr: \"(Facultatif)\",\n ru: \"(Необязательный)\",\n pt: \"(Opcional)\",\n es: \"(Opcional)\"\n }\n };\n\n $(function () {\n _.addTranslations(translations);\n\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (__, group) {\n if (group.current) {\n $.each(group.controls, function (__, control) {\n if (\n !control.placeholder &&\n (control.controltype === \"edit\" ||\n control.controltype === \"memo\") &&\n isOptional(control)\n ) {\n control.placeholder = _(\"(Optional)\");\n }\n });\n }\n });\n }\n });\n });\n})(jQuery, window, document);\n","import { bb } from \"$json\";\n// import { has } from \"$json/functional.js\";\nimport { getSetting } from \"$proxymap\";\n\nvar arbitrary = bb.propFinder(bb.conf, \"arbitrary\");\n\nfunction piwik(config) {\n let dataLayerName = \"dataLayer\";\n (window[dataLayerName] = window[dataLayerName] || []),\n window[dataLayerName].push({\n start: new Date().getTime(),\n event: \"stg.start\"\n });\n var scripts = document.getElementsByTagName(\"script\")[0],\n tags = document.createElement(\"script\");\n function stgCreateCookie(a, b, c) {\n var d = \"\",\n f = \"\";\n if (c) {\n var e = new Date();\n e.setTime(e.getTime() + 24 * c * 60 * 60 * 1e3),\n (d = \"; expires=\" + e.toUTCString());\n f = \"; SameSite=Strict\";\n }\n document.cookie = a + \"=\" + b + d + f + \"; path=/\";\n }\n var isStgDebug =\n (window.location.href.match(\"stg_debug\") ||\n document.cookie.match(\"stg_debug\")) &&\n !window.location.href.match(\"stg_disable_debug\");\n stgCreateCookie(\"stg_debug\", isStgDebug ? 1 : \"\", isStgDebug ? 14 : -1);\n var qP = [];\n dataLayerName !== \"dataLayer\" && qP.push(\"data_layer_name=\" + dataLayerName),\n isStgDebug && qP.push(\"stg_debug\");\n var qPString = qP.length > 0 ? \"?\" + qP.join(\"&\") : \"\";\n (tags.async = !0),\n (tags.src = config.endpoint + config.code + \".js\" + qPString),\n scripts.parentNode.insertBefore(tags, scripts);\n !(function (a, n, i) {\n a[n] = a[n] || {};\n for (var c = 0; c < i.length; c++)\n !(function (i) {\n (a[n][i] = a[n][i] || {}),\n (a[n][i].api =\n a[n][i].api ||\n function () {\n var a = [].slice.call(arguments, 0);\n \"string\" == typeof a[0] &&\n window[dataLayerName].push({\n event: n + \".\" + i + \":\" + a[0],\n parameters: [].slice.call(arguments, 1)\n });\n });\n })(i[c]);\n })(window, \"ppms\", [\"tm\", \"cm\"]);\n}\n\n// The default config:\nvar config = {\n code: undefined,\n endpoint: undefined\n};\n\n// Override per config fallback.\nvar fallback = arbitrary(\"piwik.fallback\", false);\nif (fallback) {\n config = Object.assign(config, fallback);\n}\n\n// Override per proxymapped model.\nvar modelSpecific = getSetting(\"piwik\", false);\nif (modelSpecific) {\n config = Object.assign(config, modelSpecific);\n}\n\nif (config.code !== undefined && config.endpoint !== undefined) piwik(config);\n","/* progressbar:\n *\n * Show progressbar after step=next\n *\n * Author: Niels Giesen\n * Copyright 2011, 2013, 2015 Berkeley Bridge\n *\n */\n\nimport { bb } from \"$json\";\n(function ($) {\n var timer;\n\n $(document).on(\"bb:preStep\", function (event, _) {\n document.body.setAttribute(\"aria-busy\", true);\n timer = window.setTimeout(function () {\n if (bb.ajax.busy()) {\n $(\".progress\").fadeIn();\n bb.Mode.set(\"busy\");\n }\n }, 700);\n });\n\n $(document).on(\"bb:postHandleData bb:jsonError\", function (event, data) {\n window.clearTimeout(timer);\n $(\".progress\").fadeOut(100);\n document.body.setAttribute(\"aria-busy\", false);\n bb.Mode.unset(\"busy\");\n });\n})(jQuery);\n","import { bb } from \"$json\";\n/* questionlabelgroup-ng:\n *\n * Next-generation questionlabelgroup plugin.\n *\n * It will eventually probably replace the default implementation.\n *\n * Author: Niels Giesen\n * Copyright 2013 Berkeley Bridge\n *\n */\n(function ($) {\n $(document).off(\"bb:questionlabelgroup\");\n\n bb.questionlabelgroup = function () {\n $(\".group:not(:has(.bb-questionlabelgroup))>.bb-label\").each(function () {\n var $this = $(this),\n input = $this.prev(\"[type=checkbox]\"),\n itype,\n control = $(this).data(\"control\"),\n fieldset =\n bb.conf.a11y.optionfieldsets && control.controltype === \"legend\",\n $inner,\n $outer,\n classNames;\n\n if (!input.length)\n input = $this.nextUntil(\n \".bb-label, .bb-text, a, [type=checkbox], img, .clearfix,\" +\n \"*[data-datatype]+ul\" +\n (bb.conf.a11y.captions ? \", table\" : \"\")\n );\n\n itype = input.data(\"type\");\n $inner = $this.add(input);\n\n $outer = $(document.createElement(fieldset ? \"fieldset\" : \"div\"));\n\n if ($inner.length > 1) {\n classNames = [\n \"bb-questionlabelgroup\",\n \"bb-itype-\" + itype,\n \"bb-fields-\" + $inner.length\n ];\n\n // Direct children\n $.each($inner.filter(\"[data-type]\"), 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 classNames.push(classname);\n }\n }\n });\n\n // Further offspring\n $.each($inner.find(\"[data-type]\"), 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 classNames.push(classname);\n }\n }\n });\n\n // Propagate tags of immediate children to $outer\n $.each($inner, function (_, elt) {\n $.each($(elt).data(\"tags\") || [], function (_, tag) {\n classNames.push(\"bb-child-tagged-\" + tag);\n });\n });\n\n $outer.addClass(classNames.join(\" \"));\n $inner.wrapAll($outer);\n }\n });\n };\n})(jQuery);\n","/* global jQuery */\nimport { conf } from \"$json/lib/conf.js\";\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(function ($) {\n $(document).on(\"click\", \"#p-reset-password-link\", event => {\n try {\n const lang = conf.lang;\n const helpdesk =\n conf.arbitrary && conf.arbitrary.resetpasswordHelpdesk != undefined\n ? conf.arbitrary.resetpasswordHelpdesk\n : \"\";\n const theme =\n self === top ? window.location.href : \"iframe+\" + document.referrer;\n const url = new URL(location);\n // Strip filenames, leave directory (proxystring)\n url.pathname = url.pathname.replace(/[^/]+$/, \"\");\n url.pathname += \"plugins/reset-password/live/newpwd.html\";\n const search = new URLSearchParams({ theme, lang, helpdesk });\n url.search = search;\n event.preventDefault();\n location = url.toString();\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);\n","/* selected-model:\n *\n * Set data.modeldescription to data.models[{selected:true}].modelname\n *\n * Author: Niels Giesen\n * Copyright 2015, 2017 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.models) {\n var selected = $.grep(data.models, function (model) {\n return model.selected;\n });\n if (selected[0]) data.modeldescription = selected[0].modelname;\n }\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","/* xsl-to-pdf:\n *\n * Request server to serve pdf variant of generated xsl or html\n * document instead of the original by adding &fmt=pdf to the end and\n * setting the mimetype.\n *\n * Note this only gives the desired effect with server >= 4.1\n *\n * Author: Niels Giesen\n * Copyright 2016 Berkeley Bridge\n *\n */\n(function ($, win, doc) {\n $(function () {\n $(doc).on(\"bb:preHandleData\", function (event, data) {\n if (data && data.groups) {\n $.each(data.groups, function (_, group) {\n $.each(group.controls, function (_, control) {\n if (\n control.controltype === \"linklabel\" &&\n control.isreport &&\n /^[^?]+\\.(xsl|html)\\?/.test(control.url)\n ) {\n control.url += \"&fmt=pdf\";\n control.mimetype = {\n mimetype: \"application/pdf\",\n ext: \"pdf\"\n };\n }\n });\n });\n }\n });\n });\n})(jQuery, window, document);\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","cWebIllegalAccess","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","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","_uniqBy","_has","uniqBy","_equals","any","start","end","_findIndex","findIndex","_eqBy","_all","_append","_test","string","_match","a_value","b_value","equals","_eqProps","_hasPath","p","_assoc","result","_assocPath","nextObj","isInteger","assocPath","concat","assoc","_consume","argN","_propEq","_pathSatisfies","_pathEq","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","_is","Ctor","constructor","toLower","toLowerCase","toUpper","toUpperCase","_applySpec","specs","Function","out","_partial","bind","all","n","promise","Promise","resolve","apply","anyPass","both","chain","f","g","list1","list2","Set","s1","s2","add","dissoc","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","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","LIVE_REGION_SELECTOR","_liveRegion","area","role","liveRegion","A11y","html","isConnected","innerHTML","textContent","setTimeout","observeDatepickers","init","picker","getElementById","MutationObserver","records","instance","infocus","activeElement","text","observe","attributes","escapeHTML","entityMap","re","RegExp","notify","options","keepalive","notification","error","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","isOptional","isVisible","isLabel","isOption","isLink","isTextual","isPicture","isButton","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","numofnewlines","subString","pos","step","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","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","u","getOwnPropertyNames","l","enumerable","Maybe","module","r","o","static","isEmpty","of","getOrElse","Numerals","makeFormatter","radixPoint","groupingChar","groupingRules","_last","_a","makeLastItemRepeater","integralPart","fractionalPart","neg","th","splice","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","host","filename","endsWith","ext","readonlyprop","disconnectValue","newVal","noAttribs","omitName","omitRequired","emptyTag","setAttribs","valueInside","checkbox","disabled","ariaDisabled","layout","alt","alttext","src","edit","couldWrap","fixup","isFor","for","class","_subtype","min","_level","linkClassName","isreport","listlabel","showdown","optionbox","some","selected","unshift","option","len","newLen","newOptions","selectedValue","optionElt","parentNode","removeChild","freetext","size","multiple","optionlist","labelledby","required","allowUpdatingSelf","closest","remove","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","createComment","cellSetAttributes","removeAttribute","headers","caption","thead","tr","e_body","colheaders","last_spanning_cell_id","e_row","icol","cellWithHeaders","gridAddButton","encodeURI","addbuttontext","e_grid","old","childNodes","colheader","irow","tBodies","cellInput","oldcell","spot","replaceWith","cellControl","computedReadonly","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","h","scrollTo","top","left","defaults","axis","duration","jquery","limit","_scrollable","inArray","contentWindow","ownerDocument","userAgent","compatMode","documentElement","onAfter","queue","toff","$elem","targ","win","style","margin","css","animate","onAfterFirst","easing","scroll","config","separator","pair","array_keys","default_decode","new_text","bb","compareVersions","isNaN","compareVersionsOn","_to","showAnim","changeYear","changeMonth","yearRange","altFormat","pause","el","dequeue","pushStack","makeArray","insertAtCaret","myValue","selection","createRange","selectionStart","startPos","endPos","selectionEnd","scrollTop","substring","selectAllText","createTextRange","select","KEYS","maps","originalEvent","$target","prev","shiftKey","$inputs","gridKeys","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","m","cb","Validation","reset","silent","justhide","requestUpdate","batched","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","onBeforeLogout","modeldescription","modellanguage","setMode","$document","focusHandler","focusstring","contains","selectionDirection","setSelectionRange","returnfocus","e_group","doScrollToSelected","previousElementSibling","scrollIntoView","behavior","matchMedia","fulldata","sortControls","setupFocusHandler","off","$parent","_stack","allValid","_input","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","siblings","$other","hash","rewind","updatemis","prior","runtonode","nodename","en","Listener","isComposing","Dialogue","random","getElementsByTagName","elemprops","rtnfocus","children","destroy","human","handler","elem","cssText","inner","closer","createTextNode","maybeSetDescription","description_ids","remarks","pretexts","explicitId","appendAsterisk","child","nodeType","space","words","nodeValue","lastword","lastChild","$stick","textnode","unwrap","form","addCustomCheckbox","reportURL","$container","$download","$feedback","modelversion","one","vote","getJSON","topdone","ctl","createClickable","textNode","descriptor","dialogue","clickTextLength","clickTextPos","preText","clickText","postText","pre","link","title","titleTxt","content","contentTxt","descriptors","isurl","description","belongsto","source","tw","createTreeWalker","NodeFilter","SHOW_TEXT","nextNode","handlenode","currentNode","replacement","history","pushState","apinav","storage","_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","grafs","grafsOut","$1","escapeCharacters_callback","_EncodeEmailAddress","addr","ch","charCodeAt","hexDigits","char2hex","charCodeToReplace","fromCharCode","leadingText","numSpaces","charsToEscape","afterBackslash","regexString","converter","orig","inline","topLevel","policy","baseLevel","arbitrary","headings","newline","plugins","newlineGlobRe","br_re","onlyPhrasingInside","demoteHeading","html_in","html_out","onlyPhrasing","allowOnlyPhrasing","$filter","hasmatch","ismatch","clear","$doc","$filtered","addBack","caselistingallowed","casecount","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","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","getIdentifyingPartOfPath","chunks","de","fr","ru","pt","es","__","endpoint","modelSpecific","getSetting","dataLayerName","getTime","scripts","isStgDebug","cookie","setTime","toUTCString","stgCreateCookie","qP","qPString","insertBefore","api","parameters","piwik","fadeIn","fadeOut","$inner","$outer","classNames","fieldset","nextUntil","helpdesk","resetpasswordHelpdesk","theme","referrer","lasterrors"],"mappings":"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"}