{"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/mustache/mustache.js","plugins/previews/previews.js","plugins/showdown/showdown.js","plugins/showdown-converter/showdown-converter.js","plugins/md-labels/md-labels.js","custom/hacks/plugins/preview-md/preview-md.js","custom/hacks/plugins/preview-path/preview-path.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/model-filter/model-filter.js","plugins/modelitem/modelitem.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","/*!\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","/*\n * Show preview documents\n *\n * See readme.md in this directory.\n *\n * Author: Niels Giesen\n * Copyright (C) 2014-2019 by Berkeley Bridge\n *\n */\nimport { fromApiServer } from \"$json/lib/location\";\nimport { gt, _, bb } from \"$json\";\nimport Mustache from \"$mustache\";\nlet $ = jQuery;\nconst config = bb.propFinder(bb.conf, \"arbitrary.previews\");\n\n// Text that may be shown when there is no default preview available.\nconst fallBackText = config(\"fallbacktext\");\nlet _snips = [];\n\nconst styleElt = config => {\n let s = document.createElement(\"style\");\n s.textContent = `\nhtml {\n height: 100%;\n}\n${config(\n \"iframe.style\",\n `\nhtml {\n background-color: transparent;\n}\n.bb-path {\n box-shadow: none;\n padding: 0;\n max-width: 100%;\n}\n.bb-p-preview-new {\n border-left: 10px solid #189bd8;\n padding-left: 10px;\n}`\n)}\n`;\n return s;\n};\n\nlet iframeStyle = styleElt(config);\n\nlet uncached = url => url + \"&_nocache=\" + new Date().getTime();\n\ngt.addTranslations({\n // Actually means no preview could be loaded (not in the correct format or some other error).\n \"no preview available\": {\n nl: \"geen preview beschikbaar\",\n fr: \"aucune prévisualisation disponible\",\n de: \"keine Vorschau verfügbar\",\n ru: \"предварительный просмотр недоступен\"\n },\n \"open this preview in a new window\": {\n nl: \"open deze preview in een apart venster\",\n fr: \"ouvrir cette prévisualisation dans une autre fenêtre\",\n de: \"öffne diese Vorschau in einem neuem Fenster\",\n ru: \"откройте предварительный просмотр в новом окне\"\n }\n});\n\nfunction compareSnippets($container, _snips) {\n const snippets = $container.find(\"h1,h2,h3,h4,h5,h6,p,ul\");\n let num = 0;\n const tmpsnips = [];\n $.each(snippets, function () {\n let snip = this.innerHTML;\n if (_snips.indexOf(snip) === -1) {\n this.classList.add(\"bb-p-preview-new\");\n if (++num == 1) $container.scrollTo(this);\n }\n tmpsnips.push(snip);\n });\n return tmpsnips;\n}\n\nconst removeEmptyItems = node => {\n let items = node.querySelectorAll(\"li, p\");\n for (let i = items.length; i > 0; --i) {\n let item = items[i - 1];\n if ($.trim(item.textContent) === \"\") {\n if (!item.nextElementSibling && !item.previousElementSibling)\n item.parentNode.parentNode.removeChild(item.parentNode);\n else item.parentNode.removeChild(item);\n }\n }\n};\n\nconst onLoadHandler = (iframe, portion, config) => () => {\n const doc = iframe.contentDocument;\n if (!doc.querySelector(portion)) {\n bb.Mode.unset(\"hasTextInside\");\n } else {\n bb.Mode.set(\"hasText\");\n bb.Mode.set(\"hasTextInside\");\n removeEmptyItems(doc.body);\n doc.head.appendChild(iframeStyle);\n if (config(\"showChanges\")) {\n _snips = compareSnippets($(doc), _snips);\n }\n if (config(\"iframe.resize\") && \"IntersectionObserver\" in window) {\n let options = {\n root: doc.body.parentElement,\n rootMargin: \"0px\",\n threshold: 1.0\n };\n var callback = function (entries, observer) {\n entries.forEach(entry => {\n if (entry.isIntersecting && entry.intersectionRatio == 1) {\n } else {\n let rect = doc.body.getBoundingClientRect();\n if (rect.height) iframe.style.height = `${rect.height + 200}px`;\n }\n });\n };\n let observer = new IntersectionObserver(callback, options);\n observer.observe(doc.body);\n }\n // Previews.trigger('reloaded', [ doc, iframe ]);\n }\n};\n\n(function (win, doc) {\n $(function () {\n var _document; // which document?\n var _textURL; // which url?\n var _outside = false;\n var $container = $(\"#bb-p-preview\");\n let iframe;\n\n if (config(\"iframe.on\")) {\n iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\"class\", \"p-previews-frame\");\n }\n\n /* Remove all notion of current preview\n */\n function cleanUp(all) {\n bb.Mode.unset(\"hasText\");\n bb.Mode.unset(\"hasTextInside\");\n // Following line seems to have been too blunt:\n all && bb.Mode.unset(\"hasPreviews\");\n $container.empty();\n _textURL = undefined;\n _document = undefined;\n }\n\n /* reload\n * @param (String) href: (optional) URL, Will use cached URL if omitted.\n * @param (Srting) document: (optional) Template name. Cache it so\n * we can check its validity later on.\n */\n function reload(url, document, portion) {\n if (url) _textURL = url;\n if (document) _document = document;\n if (_textURL) loadDoc(_textURL, portion);\n }\n\n let loadInside = config(\"iframe.on\")\n ? (url, portion) => {\n bb.Mode.set(\"hasTextInside\");\n $container.empty();\n $container.append(iframe);\n iframe.src = uncached(url);\n var handler = onLoadHandler(iframe, portion, config);\n iframe.onload = handler;\n }\n : (url, portion) => {\n $container.load(\n url + \"&_nocache=\" + new Date().getTime() + ` ${portion}`,\n function (responseText) {\n // If container is empty, loading has apparently failed.\n if ($container.find(portion).length === 0) {\n // cleanUp()\n $container.text(_(\"no preview available\"));\n bb.Mode.unset(\"hasTextInside\");\n } else {\n bb.Mode.set(\"hasTextInside\");\n var btn = $(outsidebutton);\n $container.prepend(btn);\n btn.on(\"click\", function () {\n loadOutside(url);\n });\n if (config(\"showChanges\")) {\n _snips = compareSnippets($container, _snips);\n }\n removeEmptyItems($container.get(0));\n $(doc).trigger(\"bb-p:previews-rendered\", {\n $container,\n responseText\n });\n }\n }\n );\n };\n\n function loadDoc(url, portion) {\n if (!url) return;\n if (!portion) portion = \"#preview\";\n bb.Mode.set(\"hasText\");\n\n $('#bb-p-previews a[href=\"' + url + '\"]')\n .addClass(\"selected\")\n .siblings()\n .removeClass(\"selected\");\n\n if (!_outside) {\n loadInside(fromApiServer(url), portion);\n }\n if (_outside) {\n loadOutside(fromApiServer(url));\n }\n }\n\n function loadOutside(url) {\n _outside = true;\n bb.Mode.unset(\"hasTextInside\");\n $container.empty();\n\n var w = win.open(\n url + \"&_nocache=\" + new Date().getTime(),\n \"Preview\",\n \"resizable=yes,scrollbars=yes\",\n true\n );\n if (!w.closed)\n var watchClose = win.setInterval(function () {\n try {\n if (w.closed) {\n win.clearTimeout(watchClose);\n //Do something here...\n _outside = false;\n bb.Mode.set(\"hasTextInside\");\n reload();\n }\n } catch (e) {}\n }, 200);\n }\n\n $(document).on(\"click\", \"#bb-p-previews a\", function () {\n if (!$container.length) return true;\n reload(this.getAttribute(\"href\"), this.getAttribute(\"data-document\"));\n return false;\n });\n\n var tmpl = $(\"#bb-p-previews-template\").html() || \"\";\n var outsidetmpl = $(\"#bb-p-preview-outside-template\").html();\n if (!outsidetmpl) {\n outsidetmpl =\n '\";\n }\n Mustache.tags = [\"[[\", \"]]\"];\n var outsidebutton = Mustache.render(outsidetmpl, {\n title: _(\"open this preview in a new window\")\n });\n\n // Each navigatory action w/ documents re-renders links and fetches the document.\n $(document).on(\"bb:postHandleData\", function (event, data) {\n if (!data.documents) {\n if (\n (data && data.status && data.status === \"logout successful\") ||\n (data.models && data.models.length > 0)\n ) {\n cleanUp(true);\n }\n return;\n } else {\n if (data.documents.length > 0) {\n bb.Mode.set(\"hasPreviews\");\n // Some plugins used to remove all but the first document => config option 'singular'.\n if (config(\"singular\") === true) {\n data.documents = [data.documents[0]];\n }\n }\n var gHD = getHref(data);\n var selected = data.documents.find(function (doc) {\n return _document === doc.document;\n // The following is more expensive:\n // return (_textURL === (doc.href && doc.href() || gHD.bind(doc)()))\n });\n // autoload: true: load first model-level document.\n // autoload: 'any': load first document, period (could be audit trail).\n if (!selected && config(\"autoload\")) {\n selected = data.documents.find(function (doc) {\n if (config(\"autoload\") === \"any\") return true;\n if (config(\"autoload\") === true) return !doc.href; // Set by previews-include-audit-trail.\n });\n }\n if (selected) {\n selected.selected = true;\n _document = selected.document;\n _textURL = (selected.href && selected.href()) || gHD.bind(selected)();\n } else {\n cleanUp();\n if (fallBackText) $container.text(fallBackText);\n }\n\n var templatedata = {\n documents: data.documents,\n name: function () {\n return this.document.replace(/_/g, \" \");\n },\n breakablename: function () {\n return this.document.replace(/_/g, \" \");\n },\n href: getHref(data)\n };\n $(\"#bb-p-previews\").html(Mustache.render(tmpl, templatedata));\n\n if (selected) {\n reload();\n }\n }\n });\n\n function getHref(data) {\n return function () {\n return (\n \"preview?\" +\n \"dbname=\" +\n data.dbname +\n \"&sessionid=\" +\n data.sessionid +\n \"&uniqueid=\" +\n data.uniqueid +\n \"&template=\" +\n this.document\n );\n };\n }\n\n /**\n * Export loadDoc function\n */\n bb.Plugins = $.extend({}, bb.Plugins, {\n previews: {\n loadDoc: loadDoc,\n reload: reload\n }\n });\n });\n})(window, document);\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","// Explicit dependencies\nimport \"$previews\";\nimport \"$md-labels\"; // Adds $.fn.showdown()\n\nimport { consume } from \"$json/lib/functional\";\n\nlet $container;\n\nconst fix = ({ $container }) => {\n $container.find(\"li, p\").showdown();\n};\n\n$(document).on(\"bb-p:previews-rendered\", consume(fix, 1));\n","/* global $ */\n\nimport { bb } from \"$json\";\n\nconst props = bb.propFinder(bb.conf, \"arbitrary.previews\");\n\nfunction fixPreviews(data) {\n if (data && data.documents) {\n const group = data.groups.find(group => group.current);\n const setting = props(`only.${data.modelname}.${group.name}`);\n if (!setting) data.documents = [];\n // else (e.g. if true) leave intact\n }\n}\n\n$(document).on(\"bb:preHandleData\", (_, data) => fixPreviews(data));\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","/* 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","/* 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","consume","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","Mustache","mustache","objectToString","object","isFunction","escapeRegExp","hasProperty","propName","regExpTest","nonSpaceRe","isWhitespace","testRegExp","whiteRe","spaceRe","equalsRe","curlyRe","tagRe","Scanner","Context","parentContext","Writer","eos","scan","scanUntil","lookup","lookupHit","clearCache","tags","tokens","openingTagRe","closingTagRe","closingCurlyRe","sections","spaces","hasTag","nonSpace","stripSpace","compileTags","tagsToCompile","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","fallBackText","_snips","iframeStyle","styleElt","compareSnippets","snippets","tmpsnips","snip","fr","de","ru","removeEmptyItems","nextElementSibling","_document","_textURL","_outside","iframe","cleanUp","reload","portion","loadDoc","loadInside","getTime","uncached","contentDocument","root","parentElement","rootMargin","threshold","IntersectionObserver","observer","isIntersecting","intersectionRatio","rect","getBoundingClientRect","height","onLoadHandler","onload","btn","outsidebutton","loadOutside","w","closed","watchClose","setInterval","tmpl","outsidetmpl","title","getHref","documents","gHD","templatedata","breakablename","previews","Showdown","g_urls","g_titles","g_html_blocks","g_list_level","makeHtml","inline_only","_Detab","_HashHTMLBlocks","_StripLinkDefinitions","_RunSpanGamut","_RunBlockGamut","_UnescapeSpecialChars","_ProcessListItems","wholeMatch","m1","m2","m3","m4","_EncodeAmpsAndAngles","hashElement","blockText","_DoHeaders","hashBlock","_DoLists","_DoCodeBlocks","_DoBlockQuotes","_FormParagraphs","_DoCodeSpans","_EscapeSpecialCharsWithinTagAttributes","_EncodeBackslashEscapes","_DoImages","_DoAnchors","_DoAutoLinks","_DoItalicsAndBold","escapeCharacters","writeAnchorTag","m5","m6","m7","whole_match","link_text","link_id","writeImageTag","alt_text","matchFound","h_level","whole_list","list_type","runup","list_str","_Outdent","codeblock","nextChar","_EncodeCode","bq","pre","grafs","grafsOut","$1","escapeCharacters_callback","_EncodeEmailAddress","addr","ch","charCodeAt","hexDigits","char2hex","charCodeToReplace","fromCharCode","leadingText","numSpaces","charsToEscape","afterBackslash","regexString","converter","orig","inline","topLevel","policy","baseLevel","arbitrary","headings","newline","plugins","newlineGlobRe","br_re","onlyPhrasingInside","demoteHeading","html_in","html_out","onlyPhrasing","allowOnlyPhrasing","fixPreviews","topdone","ctl","createClickable","textNode","descriptor","dialogue","clickTextLength","clickTextPos","preText","clickText","postText","link","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","$filter","hasmatch","ismatch","clear","$doc","$filtered","addBack","caselistingallowed","casecount","getIdentifyingPartOfPath","chunks","pt","es","__","endpoint","modelSpecific","getSetting","dataLayerName","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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"}