1 line
838 KiB
Plaintext
1 line
838 KiB
Plaintext
{"version":3,"sources":["../controller/creator/areaBroker.js","../controller/creator/config/defaults.js","../controller/creator/helpers/baseType.js","../controller/creator/helpers/cardinality.js","../controller/creator/helpers/outcomeValidator.js","../controller/creator/helpers/qtiElement.js","../controller/creator/helpers/outcome.js","../controller/creator/helpers/category.js","../controller/creator/modelOverseer.js","../controller/creator/qtiTestCreator.js","../provider/testItems.js","../controller/creator/views/item.js","../controller/creator/templates/testpart!tpl","../controller/creator/templates/section!tpl","../controller/creator/templates/rubricblock!tpl","../controller/creator/templates/itemref!tpl","../controller/creator/templates/outcomes!tpl","tpl!taoQtiTest/controller/creator/templates/test-props","tpl!taoQtiTest/controller/creator/templates/testpart-props","tpl!taoQtiTest/controller/creator/templates/section-props","tpl!taoQtiTest/controller/creator/templates/itemref-props","tpl!taoQtiTest/controller/creator/templates/itemref-props-weight","tpl!taoQtiTest/controller/creator/templates/rubricblock-props","tpl!taoQtiTest/controller/creator/templates/category-presets","../controller/creator/templates/index.js","../controller/creator/views/property.js","../controller/creator/views/actions.js","../controller/creator/helpers/categorySelector.js","../controller/creator/helpers/sectionCategory.js","../controller/creator/helpers/qtiTest.js","../controller/creator/views/itemref.js","../controller/creator/encoders/dom2qti.js","../controller/creator/qtiContentCreator.js","../controller/creator/views/rubricblock.js","../controller/creator/helpers/sectionBlueprints.js","../controller/creator/views/section.js","../controller/creator/views/testpart.js","../controller/creator/views/test.js","../controller/creator/helpers/processingRule.js","../controller/creator/helpers/scoring.js","../controller/creator/helpers/changeTracker.js","../controller/creator/creator.js","../controller/creator/helpers/ckConfigurator.js","../controller/routes.js","css!taoQtiTestCss/new-test-runner","../controller/runner/runner.js","../testRunner/actionBarHook.js","../testRunner/actionBarTools.js","../testRunner/tpl/navigator!tpl","../testRunner/tpl/navigatorTree!tpl","../testRunner/testReview.js","../testRunner/progressUpdater.js","../testRunner/testMetaData.js","../controller/runtime/testRunner.js","onLayerEnd0.js","module-create.js","/home/maria/project/nfer-enot/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technlogies SA\n *\n */\n\n/**\n *\n * Defines the test creator areas\n *\n * @author Christophe Noël <christophe@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/areaBroker',[\n 'lodash',\n 'ui/areaBroker'\n], function (_, areaBroker) {\n 'use strict';\n\n var requireAreas = [\n 'creator',\n 'itemSelectorPanel',\n 'contentCreatorPanel',\n 'propertyPanel',\n 'elementPropertyPanel'\n ];\n\n /**\n * Creates an area broker with the required areas for the item creator\n *\n * @see ui/areaBroker\n *\n * @param {jQueryElement|HTMLElement|String} $container - the main container\n * @param {Object} mapping - keys are the area names, values are jQueryElement\n * @returns {broker} the broker\n * @throws {TypeError} without a valid container\n */\n return _.partial(areaBroker, requireAreas);\n\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 (original work) Open Assessment Technologies SA;\n *\n * @author Sergei Mikhailov <sergei.mikhailov@taotesting.com>\n */\n\ndefine('taoQtiTest/controller/creator/config/defaults',[\n 'lodash',\n 'module',\n], function(\n _,\n module\n) {\n 'use strict';\n\n return (config = {}) => _.defaults({}, module.config(), config);\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * The BaseType enumeration (port of \\qtism\\common\\enums\\BaseType).\n *\n * From IMS QTI:\n *\n * A base-type is simply a description of a set of atomic values (atomic to this specification).\n * Note that several of the baseTypes used to define the runtime data model have identical\n * definitions to those of the basic data types used to define the values for attributes\n * in the specification itself. The use of an enumeration to define the set of baseTypes\n * used in the runtime model, as opposed to the use of classes with similar names, is\n * designed to help distinguish between these two distinct levels of modelling.\n *\n * @author Jérôme Bogaerts <jerome@taotesting.com>\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/baseType',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * The list of QTI base types\n * @type {Object}\n */\n var baseTypeEnum = {\n /**\n * From IMS QTI:\n *\n * The set of identifier values is the same as the set of values\n * defined by the identifier class.\n *\n * @type {Number}\n */\n IDENTIFIER: 0,\n\n /**\n * From IMS QTI:\n *\n * The set of boolean values is the same as the set of values defined\n * by the boolean class.\n *\n * @type {Number}\n */\n BOOLEAN: 1,\n\n /**\n * From IMS QTI:\n *\n * The set of integer values is the same as the set of values defined\n * by the integer class.\n *\n * @type {Number}\n */\n INTEGER: 2,\n\n /**\n * From IMS QTI:\n *\n * The set of float values is the same as the set of values defined by the\n * float class.\n *\n * @type {Number}\n */\n FLOAT: 3,\n\n /**\n * From IMS QTI:\n *\n * The set of string values is the same as the set of values defined by the\n * string class.\n *\n * @type {Number}\n */\n STRING: 4,\n\n /**\n * From IMS QTI:\n *\n * A point value represents an integer tuple corresponding to a graphic point.\n * The two integers correspond to the horizontal (x-axis) and vertical (y-axis)\n * positions respectively. The up/down and left/right senses of the axes are\n * context dependent.\n *\n * @type {Number}\n */\n POINT: 5,\n\n /**\n * From IMS QTI:\n *\n * A pair value represents a pair of identifiers corresponding to an association\n * between two objects. The association is undirected so (A,B) and (B,A) are equivalent.\n *\n * @type {Number}\n */\n PAIR: 6,\n\n /**\n * From IMS QTI:\n *\n * A directedPair value represents a pair of identifiers corresponding to a directed\n * association between two objects. The two identifiers correspond to the source\n * and destination objects.\n *\n * @type {Number}\n */\n DIRECTED_PAIR: 7,\n\n /**\n * From IMS QTI:\n *\n * A duration value specifies a distance (in time) between two time points.\n * In other words, a time period as defined by [ISO8601], but represented as\n * a single float that records time in seconds. Durations may have a fractional\n * part. Durations are represented using the xsd:double datatype rather than\n * xsd:dateTime for convenience and backward compatibility.\n *\n * @type {Number}\n */\n DURATION: 8,\n\n /**\n * From IMS QTI:\n *\n * A file value is any sequence of octets (bytes) qualified by a content-type and an\n * optional filename given to the file (for example, by the candidate when uploading\n * it as part of an interaction). The content type of the file is one of the MIME\n * types defined by [RFC2045].\n *\n * @type {Number}\n */\n FILE: 9,\n\n /**\n * From IMS QTI:\n *\n * A URI value is a Uniform Resource Identifier as defined by [URI].\n *\n * @type {Number}\n */\n URI: 10,\n\n /**\n * From IMS QTI:\n *\n * An intOrIdentifier value is the union of the integer baseType and\n * the identifier baseType.\n *\n * @type {Number}\n */\n INT_OR_IDENTIFIER: 11,\n\n /**\n * In qtism, we consider an extra 'coords' baseType.\n *\n * @type {Number}\n */\n COORDS: 12,\n\n /**\n * Express that the operands can have any BaseType from the BaseType enumeration and\n * can be different.\n *\n * @type {Number}\n */\n ANY: 12,\n\n /**\n * Express that all the operands must have the same\n * baseType.\n *\n * @type {Number}\n */\n SAME: 13\n };\n\n var baseTypeHelper = _({\n /**\n * Gets the the list of QTI base types\n * @returns {Object}\n */\n asArray: function asArray() {\n return baseTypeEnum;\n },\n\n /**\n * Gets a valid type or the default\n * @param {String|Number} type\n * @param {String|Number} [defaultType]\n * @returns {*}\n */\n getValid: function getValid(type, defaultType) {\n if (_.isFinite(type)) {\n if (!baseTypeHelper.getNameByConstant(type)) {\n type = false;\n }\n } else {\n type = baseTypeHelper.getConstantByName(type);\n }\n\n if (false === type) {\n if (!_.isUndefined(defaultType) && defaultType !== -1) {\n type = baseTypeHelper.getValid(defaultType, -1);\n } else {\n type = -1;\n }\n }\n\n return type;\n },\n\n /**\n * Adjusts a value with respect to the type\n * @param {String|Number} type\n * @param {*} value\n * @returns {*}\n */\n getValue: function getValue(type, value) {\n if (_.isString(type)) {\n type = baseTypeHelper.getConstantByName(type);\n }\n\n switch (type) {\n case baseTypeEnum.URI:\n case baseTypeEnum.STRING:\n case baseTypeEnum.IDENTIFIER:\n return value + '';\n\n case baseTypeEnum.BOOLEAN:\n if (_.isString(value)) {\n switch (value.toLowerCase()) {\n case 'true':\n return true;\n case 'false':\n return false;\n }\n }\n return !!value;\n\n case baseTypeEnum.INTEGER:\n return parseInt(value, 10) || 0;\n\n case baseTypeEnum.FLOAT:\n return parseFloat(value) || 0;\n\n case baseTypeEnum.INT_OR_IDENTIFIER:\n if (!_.isNaN(parseInt(value, 10))) {\n return parseInt(value, 10) || 0;\n } else {\n return '' + value;\n }\n }\n\n return value;\n },\n\n /**\n * Get a constant value from the BaseType enumeration by baseType name.\n *\n * * 'identifier' -> baseTypes.IDENTIFIER\n * * 'boolean' -> baseTypes.BOOLEAN\n * * 'integer' -> baseTypes.INTEGER\n * * 'float' -> baseTypes.FLOAT\n * * 'string' -> baseTypes.STRING\n * * 'point' -> baseTypes.POINT\n * * 'pair' -> baseTypes.PAIR\n * * 'directedPair' -> baseTypes.DIRECTED_PAIR\n * * 'duration' -> baseTypes.DURATION\n * * 'file' -> baseTypes.FILE\n * * 'uri' -> baseTypes.URI\n * * 'intOrIdentifier' -> baseTypes.INT_OR_IDENTIFIER\n * * extra 'coords' -> baseTypes.COORDS\n *\n * @param {String} name The baseType name.\n * @return {Number|Boolean} The related enumeration value or `false` if the name could not be resolved.\n */\n getConstantByName: function getConstantByName(name) {\n switch (String(name).trim().toLowerCase()) {\n case 'identifier':\n return baseTypeEnum.IDENTIFIER;\n\n case 'boolean':\n return baseTypeEnum.BOOLEAN;\n\n case 'integer':\n return baseTypeEnum.INTEGER;\n\n case 'float':\n return baseTypeEnum.FLOAT;\n\n case 'string':\n return baseTypeEnum.STRING;\n\n case 'point':\n return baseTypeEnum.POINT;\n\n case 'pair':\n return baseTypeEnum.PAIR;\n\n case 'directedpair':\n return baseTypeEnum.DIRECTED_PAIR;\n\n case 'duration':\n return baseTypeEnum.DURATION;\n\n case 'file':\n return baseTypeEnum.FILE;\n\n case 'uri':\n return baseTypeEnum.URI;\n\n case 'intoridentifier':\n return baseTypeEnum.INT_OR_IDENTIFIER;\n\n case 'coords':\n return baseTypeEnum.COORDS;\n\n case 'any':\n return baseTypeEnum.ANY;\n\n case 'same':\n return baseTypeEnum.SAME;\n\n default:\n return false;\n }\n },\n\n /**\n * Get the QTI name of a BaseType.\n *\n * @param {Number} constant A constant value from the BaseType enumeration.\n * @param {Boolean} [operator] A flag that allow to switch between operator an value types to prevent duplicate name issue\n * @return {String|Boolean} The QTI name or false if not match.\n */\n getNameByConstant: function getNameByConstant(constant, operator) {\n switch (constant) {\n case baseTypeEnum.IDENTIFIER:\n return 'identifier';\n\n case baseTypeEnum.BOOLEAN:\n return 'boolean';\n\n case baseTypeEnum.INTEGER:\n return 'integer';\n\n case baseTypeEnum.FLOAT:\n return 'float';\n\n case baseTypeEnum.STRING:\n return 'string';\n\n case baseTypeEnum.POINT:\n return 'point';\n\n case baseTypeEnum.PAIR:\n return 'pair';\n\n case baseTypeEnum.DIRECTED_PAIR:\n return 'directedPair';\n\n case baseTypeEnum.DURATION:\n return 'duration';\n\n case baseTypeEnum.FILE:\n return 'file';\n\n case baseTypeEnum.URI:\n return 'uri';\n\n case baseTypeEnum.INT_OR_IDENTIFIER:\n return 'intOrIdentifier';\n\n case baseTypeEnum.COORDS:\n case baseTypeEnum.ANY:\n if (operator) {\n return 'any';\n } else {\n return 'coords';\n }\n\n case baseTypeEnum.SAME:\n return 'same';\n\n default:\n return false;\n }\n }\n }).assign(baseTypeEnum).value();\n\n return baseTypeHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * The Cardinality enumeration (port of \\qtism\\common\\enums\\Cardinality).\n *\n * From IMS QTI:\n *\n * An expression or itemVariable can either be single-valued or multi-valued. A multi-valued\n * expression (or variable) is called a container. A container contains a list of values,\n * this list may be empty in which case it is treated as NULL. All the values in a multiple\n * or ordered container are drawn from the same value set, however, containers may contain\n * multiple occurrences of the same value. In other words, [A,B,B,C] is an acceptable value\n * for a container. A container with cardinality multiple and value [A,B,C] is equivalent\n * to a similar one with value [C,B,A] whereas these two values would be considered distinct\n * for containers with cardinality ordered. When used as the value of a response variable\n * this distinction is typified by the difference between selecting choices in a multi-response\n * multi-choice task and ranking choices in an order objects task. In the language of [ISO11404]\n * a container with multiple cardinality is a \"bag-type\", a container with ordered cardinality\n * is a \"sequence-type\" and a container with record cardinality is a \"record-type\".\n *\n * The record container type is a special container that contains a set of independent values\n * each identified by its own identifier and having its own base-type. This specification\n * does not make use of the record type directly however it is provided to enable\n * customInteractions to manipulate more complex responses and customOperators to\n * return more complex values, in addition to the use for detailed information about\n * numeric responses described in the stringInteraction abstract class.\n *\n * @author Jérôme Bogaerts <jerome@taotesting.com>\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/cardinality',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * The list of QTI cardinalities\n * @type {Object}\n */\n var cardinalityEnum = {\n /**\n * Single term cardinality\n *\n * @type {Number}\n */\n SINGLE: 0,\n\n /**\n * Multiple terms cardinality\n *\n * @type {Number}\n */\n MULTIPLE: 1,\n\n /**\n * Ordered terms cardinality\n *\n * @type {Number}\n */\n ORDERED: 2,\n\n /**\n * Record term cardinality\n *\n * @type {Number}\n */\n RECORD: 3,\n\n /**\n * Express that all the expressions involved in an operator have\n * the same cardinality.\n *\n * @type {Number}\n */\n SAME: 4,\n\n /**\n * Express that all the expressions involved in an operator may\n * have any cardinality.\n *\n * @type {Number}\n */\n ANY: 5\n };\n\n var cardinalityHelper = _({\n /**\n * Gets the the list of QTI cardinalities\n * @returns {Object}\n */\n asArray: function asArray() {\n return cardinalityEnum;\n },\n\n /**\n * Gets a valid cardinality or the default\n * @param {String|Number} cardinality\n * @param {String|Number} [defaultCardinality]\n * @returns {*}\n */\n getValid: function getValid(cardinality, defaultCardinality) {\n if (_.isFinite(cardinality)) {\n if (!cardinalityHelper.getNameByConstant(cardinality)) {\n cardinality = false;\n }\n } else {\n cardinality = cardinalityHelper.getConstantByName(cardinality);\n }\n\n if (false === cardinality) {\n if (!_.isUndefined(defaultCardinality) && defaultCardinality !== cardinalityEnum.SINGLE) {\n cardinality = cardinalityHelper.getValid(defaultCardinality, cardinalityEnum.SINGLE);\n } else {\n cardinality = cardinalityEnum.SINGLE;\n }\n }\n\n return cardinality;\n },\n\n /**\n * Get a constant value from its name.\n *\n * @param {String} name The name of the constant, as per QTI spec.\n * @return {Number|Boolean} The constant value or `false` if not found.\n */\n getConstantByName: function getConstantByName(name) {\n switch (String(name).trim().toLowerCase()) {\n case 'single':\n return cardinalityEnum.SINGLE;\n\n case 'multiple':\n return cardinalityEnum.MULTIPLE;\n\n case 'ordered':\n return cardinalityEnum.ORDERED;\n\n case 'record':\n return cardinalityEnum.RECORD;\n\n case 'same':\n return cardinalityEnum.SAME;\n\n case 'any':\n return cardinalityEnum.ANY;\n\n default:\n return false;\n }\n },\n\n /**\n * Get the name of a constant from its value.\n *\n * @param {Number} constant The constant value to search the name for.\n * @return {String|Boolean} The name of the constant or false if not found.\n */\n getNameByConstant: function getNameByConstant(constant) {\n switch (constant) {\n case cardinalityEnum.SINGLE:\n return 'single';\n\n case cardinalityEnum.MULTIPLE:\n return 'multiple';\n\n case cardinalityEnum.ORDERED:\n return 'ordered';\n\n case cardinalityEnum.RECORD:\n return 'record';\n\n case cardinalityEnum.SAME:\n return 'same';\n\n case cardinalityEnum.ANY:\n return 'any';\n\n default:\n return false;\n }\n }\n }).assign(cardinalityEnum).value();\n\n return cardinalityHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/outcomeValidator',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * The RegEx that validates outcome identifiers\n * @type {RegExp}\n */\n var identifierValidator = /^[a-zA-Z_][a-zA-Z0-9_\\.-]*$/;\n\n /**\n * Checks the validity of an identifier\n * @param {String} identifier\n * @returns {Boolean}\n */\n function validateIdentifier(identifier) {\n return !!(identifier && _.isString(identifier) && identifierValidator.test(identifier));\n }\n\n /**\n * Checks if an object is a valid outcome\n * @param {Object} outcome\n * @param {Boolean} [checkIdentifier]\n * @param {String||String[]} [allowedTypes]\n * @returns {Boolean}\n */\n function validateOutcome(outcome, checkIdentifier, allowedTypes) {\n var validOutcome = _.isPlainObject(outcome) && validateIdentifier(outcome['qti-type']);\n var validIdentifier = !checkIdentifier || (outcome && validateIdentifier(outcome.identifier));\n\n if (allowedTypes) {\n allowedTypes = !_.isArray(allowedTypes) ? [allowedTypes] : allowedTypes;\n validOutcome = validOutcome && _.indexOf(allowedTypes, outcome['qti-type']) >= 0;\n }\n\n return !!(validOutcome && validIdentifier);\n }\n\n /**\n * Checks if an array contains valid outcomes\n * @param {Array} outcomes\n * @param {Boolean} [checkIdentifier]\n * @param {String||String[]} [allowedTypes]\n * @returns {Boolean}\n */\n function validateOutcomes(outcomes, checkIdentifier, allowedTypes) {\n var valid = _.isArray(outcomes);\n _.forEach(outcomes, function(outcome) {\n if (!validateOutcome(outcome, checkIdentifier, allowedTypes)) {\n valid = false;\n return false;\n }\n });\n return valid;\n }\n\n return {\n validateIdentifier: validateIdentifier,\n validateOutcomes: validateOutcomes,\n validateOutcome: validateOutcome\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/qtiElement',[\n 'lodash',\n 'taoQtiTest/controller/creator/helpers/outcomeValidator'\n], function (_, outcomeValidator) {\n 'use strict';\n\n var qtiElementHelper = {\n /**\n * Creates a QTI element\n * @param {String} type - The QTI type of the element to create\n * @param {String|Object} [identifier] - An optional identifier, or a list of properties\n * @param {Object} [properties] - A list of additional properties\n * @returns {Object}\n * @throws {TypeError} if the type or the identifier is not valid\n */\n create: function create(type, identifier, properties) {\n var element = {\n 'qti-type': type\n };\n\n if (!outcomeValidator.validateIdentifier(type)) {\n throw new TypeError('You must provide a valid QTI type!');\n }\n\n if (_.isPlainObject(identifier)) {\n properties = identifier;\n identifier = null;\n }\n\n if (identifier) {\n if (!outcomeValidator.validateIdentifier(identifier)) {\n throw new TypeError('You must provide a valid identifier!');\n }\n element.identifier = identifier;\n }\n\n return _.assign(element, properties || {});\n },\n\n /**\n * Finds a QTI element in a collection, by its type.\n * The collection may also be a single object.\n * @param {Array|Object} collection\n * @param {Array|String} type\n * @returns {Object}\n */\n find: function find(collection, type) {\n var found = null;\n var types = forceArray(type);\n\n function checkType(qtiElement) {\n if (types.indexOf(qtiElement['qti-type']) >= 0) {\n found = qtiElement;\n return false;\n }\n }\n\n if (_.isArray(collection)) {\n _.forEach(collection, checkType);\n } else if (collection) {\n checkType(collection);\n }\n\n return found;\n },\n\n /**\n * Finds an element from a tree.\n * The path to the element is based on QTI types.\n * @param {Object} tree - The root of the tree from which get the property\n * @param {String|String[]} path - The path to the element, with QTI types separated by dot, like: \"setOutcomeValue.gte.baseValue\"\n * @param {String|String[]} nodeName - The name of the nodes that may contain subtrees\n * @returns {*}\n */\n lookupElement: function lookupElement(tree, path, nodeName) {\n var steps = _.isArray(path) ? path : path.split('.');\n var nodeNames = forceArray(nodeName);\n var len = steps.length;\n var i = 0;\n var key;\n\n while (tree && i < len) {\n tree = qtiElementHelper.find(tree, steps[i++]);\n if (tree && i < len) {\n key = _.find(nodeNames, _.partial(_.has, tree));\n tree = key && tree[key];\n }\n }\n\n return tree || null;\n },\n\n /**\n * Finds a property from a tree.\n * The path to the property is based on QTI types.\n * @param {Object} tree - The root of the tree from which get the property\n * @param {String|String[]} path - The path to the property, with QTI types separated by dot, like: \"setOutcomeValue.gte.baseValue.value\"\n * @param {String|String[]} nodeName - The name of the nodes that may contain subtrees\n * @returns {*}\n */\n lookupProperty: function lookupProperty(tree, path, nodeName) {\n var result = null;\n var steps = _.isArray(path) ? path : path.split('.');\n var propertyName = steps.pop();\n var element = qtiElementHelper.lookupElement(tree, steps, nodeName);\n\n if (element && element[propertyName]) {\n result = element[propertyName];\n }\n\n return result;\n }\n };\n\n /**\n * Ensures a value is an array\n * @param {*} value\n * @returns {Array}\n */\n function forceArray(value) {\n if (!value) {\n value = [];\n }\n if (!_.isArray(value)) {\n value = [value];\n }\n return value;\n }\n\n return qtiElementHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * Basic helper that is intended to manage outcomes inside a test model.\n *\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/outcome',[\n 'lodash',\n 'taoQtiTest/controller/creator/helpers/outcomeValidator',\n 'taoQtiTest/controller/creator/helpers/qtiElement',\n 'taoQtiTest/controller/creator/helpers/baseType',\n 'taoQtiTest/controller/creator/helpers/cardinality'\n], function (_, outcomeValidator, qtiElementHelper, baseTypeHelper, cardinalityHelper) {\n 'use strict';\n\n var outcomeHelper = {\n /**\n * Gets a property from an outcome rule expression.\n * The path to the property is based on QTI types.\n * @param {Object} outcomeRule - The outcome rule from which get the property\n * @param {String|String[]} path - The path to the property, with QTI types separated by dot, like: \"setOutcomeValue.gte.baseValue\"\n * @returns {*}\n */\n getProcessingRuleExpression: function getProcessingRuleExpression(outcomeRule, path) {\n return qtiElementHelper.lookupElement(outcomeRule, path, ['expression', 'expressions']);\n },\n\n /**\n * Gets a property from an outcome rule expression.\n * The path to the property is based on QTI types.\n * @param {Object} outcomeRule - The outcome rule from which get the property\n * @param {String|String[]} path - The path to the property, with QTI types separated by dot, like: \"setOutcomeValue.gte.baseValue.value\"\n * @returns {*}\n */\n getProcessingRuleProperty: function getProcessingRuleProperty(outcomeRule, path) {\n return qtiElementHelper.lookupProperty(outcomeRule, path, ['expression', 'expressions']);\n },\n\n /**\n * Gets the identifier of an outcome\n * @param {Object|String} outcome\n * @returns {String}\n */\n getOutcomeIdentifier: function getOutcomeIdentifier(outcome) {\n return String(_.isObject(outcome) ? outcome.identifier : outcome);\n },\n\n /**\n * Gets the list of outcome declarations\n * @param {Object} testModel\n * @returns {Array}\n */\n getOutcomeDeclarations: function getOutcomeDeclarations(testModel) {\n var outcomes = testModel && testModel.outcomeDeclarations;\n return outcomes || [];\n },\n\n /**\n * Gets the list of outcome processing rules\n * @param {Object} testModel\n * @returns {Array}\n */\n getOutcomeProcessingRules: function getOutcomeProcessingRules(testModel) {\n var rules = testModel && testModel.outcomeProcessing && testModel.outcomeProcessing.outcomeRules;\n return rules || [];\n },\n\n /**\n * Applies a function on each outcome declarations\n * @param {Object} testModel\n * @param {Function} cb\n */\n eachOutcomeDeclarations: function eachOutcomeDeclarations(testModel, cb) {\n _.forEach(outcomeHelper.getOutcomeDeclarations(testModel), cb);\n },\n\n /**\n * Applies a function on each outcome processing rules. Does not take care of sub-expressions.\n * @param {Object} testModel\n * @param {Function} cb\n */\n eachOutcomeProcessingRules: function eachOutcomeProcessingRules(testModel, cb) {\n _.forEach(outcomeHelper.getOutcomeProcessingRules(testModel), cb);\n },\n\n /**\n * Applies a function on each outcome processing rules, take care of each sub expression.\n * @param {Object} testModel\n * @param {Function} cb\n */\n eachOutcomeProcessingRuleExpressions: function eachOutcomeProcessingRuleExpressions(testModel, cb) {\n function browseExpressions(processingRule) {\n if (_.isArray(processingRule)) {\n _.forEach(processingRule, browseExpressions);\n } else if (processingRule) {\n cb(processingRule);\n\n if (processingRule.expression) {\n browseExpressions(processingRule.expression);\n } else if (processingRule.expressions) {\n browseExpressions(processingRule.expressions);\n }\n }\n }\n\n browseExpressions(outcomeHelper.getOutcomeProcessingRules(testModel));\n },\n\n /**\n * Lists all outcomes identifiers. An optional callback allows to filter the list\n * @param {Object} testModel\n * @param {Function} [cb]\n * @returns {Array}\n */\n listOutcomes: function listOutcomes(testModel, cb) {\n var outcomes = [];\n if (!_.isFunction(cb)) {\n cb = null;\n }\n outcomeHelper.eachOutcomeDeclarations(testModel, function (outcome) {\n if (!cb || cb(outcome)) {\n outcomes.push(outcomeHelper.getOutcomeIdentifier(outcome));\n }\n });\n return outcomes;\n },\n\n /**\n * Removes the specified outcomes from the provided test model\n * @param {Object} testModel - The test model to clean up\n * @param {Function|String[]} outcomes - The list of outcomes identifiers to remove,\n * or a callback that will match each outcome to remove\n */\n removeOutcomes: function removeOutcomes(testModel, outcomes) {\n var declarations = outcomeHelper.getOutcomeDeclarations(testModel);\n var rules = outcomeHelper.getOutcomeProcessingRules(testModel);\n var check;\n\n if (_.isFunction(outcomes)) {\n check = outcomes;\n } else {\n outcomes = _.indexBy(_.isArray(outcomes) ? outcomes : [outcomes], function (outcome) {\n return outcome;\n });\n\n check = function checkIdentifier(outcome) {\n return !!outcomes[outcomeHelper.getOutcomeIdentifier(outcome)];\n };\n }\n\n if (declarations) {\n _.remove(declarations, check);\n }\n\n if (rules) {\n _.remove(rules, check);\n }\n },\n\n /**\n * Creates an outcome declaration\n * @param {String} identifier\n * @param {String|Number|Boolean} [type] - The data type of the outcome, FLOAT by default\n * @param {Number} [cardinality] - The variable cardinality, default 0\n * @returns {Object}\n * @throws {TypeError} if the identifier is empty or is not a string\n */\n createOutcome: function createOutcome(identifier, type, cardinality) {\n\n if (!outcomeValidator.validateIdentifier(identifier)) {\n throw new TypeError('You must provide a valid identifier!');\n }\n\n return qtiElementHelper.create('outcomeDeclaration', identifier, {\n views: [],\n interpretation: '',\n longInterpretation: '',\n normalMaximum: false,\n normalMinimum: false,\n masteryValue: false,\n cardinality: cardinalityHelper.getValid(cardinality, cardinalityHelper.SINGLE),\n baseType: baseTypeHelper.getValid(type, baseTypeHelper.FLOAT)\n });\n },\n\n /**\n * Adds a processing rule into the test model\n *\n * @param {Object} testModel\n * @param {Object} processingRule\n * @returns {Object}\n * @throws {TypeError} if the processing rule is not valid\n */\n addOutcomeProcessing: function createOutcomeProcessing(testModel, processingRule) {\n var outcomeProcessing = testModel.outcomeProcessing;\n\n if (!outcomeValidator.validateOutcome(processingRule)) {\n throw new TypeError('You must provide a valid outcome processing rule!');\n }\n\n if (!outcomeProcessing) {\n outcomeProcessing = qtiElementHelper.create('outcomeProcessing', {\n outcomeRules: []\n });\n testModel.outcomeProcessing = outcomeProcessing;\n } else if (!outcomeProcessing.outcomeRules) {\n outcomeProcessing.outcomeRules = [];\n }\n\n outcomeProcessing.outcomeRules.push(processingRule);\n return processingRule;\n },\n\n /**\n * Creates an outcome and adds it to the declarations\n * @param {Object} testModel\n * @param {Object} outcome - The outcome to add\n * @param {Object} [processingRule] - The processing rule attached to the outcome\n * @returns {Object}\n * @throws {TypeError} if one of the outcome or the processing rule is not valid\n */\n addOutcome: function addOutcome(testModel, outcome, processingRule) {\n var declarations = testModel.outcomeDeclarations;\n\n if (!outcomeValidator.validateOutcome(outcome, true, 'outcomeDeclaration')) {\n throw new TypeError('You must provide a valid outcome!');\n }\n\n if (processingRule) {\n if (!outcomeValidator.validateOutcome(processingRule) || processingRule.identifier !== outcome.identifier) {\n throw new TypeError('You must provide a valid outcome processing rule!');\n }\n\n outcomeHelper.addOutcomeProcessing(testModel, processingRule);\n }\n\n if (!declarations) {\n declarations = [];\n testModel.outcomeDeclarations = declarations;\n }\n\n declarations.push(outcome);\n return outcome;\n },\n\n /**\n * Replaces the outcomes in a test model\n * @param {Object} testModel\n * @param {Object} outcomes\n * @throws {TypeError} if one of the outcomes or the processing rules are not valid\n */\n replaceOutcomes: function replaceOutcomes(testModel, outcomes) {\n if (_.isPlainObject(outcomes)) {\n if (_.isArray(outcomes.outcomeDeclarations)) {\n if (!outcomeValidator.validateOutcomes(outcomes.outcomeDeclarations, true, 'outcomeDeclaration')) {\n throw new TypeError('You must provide valid outcomes!');\n }\n\n testModel.outcomeDeclarations = [].concat(outcomes.outcomeDeclarations);\n }\n if (outcomes.outcomeProcessing && _.isArray(outcomes.outcomeProcessing.outcomeRules)) {\n if (!outcomeValidator.validateOutcomes(outcomes.outcomeProcessing.outcomeRules)) {\n throw new TypeError('You must provide valid processing rules!');\n }\n\n if (!testModel.outcomeProcessing) {\n testModel.outcomeProcessing = qtiElementHelper.create('outcomeProcessing');\n }\n testModel.outcomeProcessing.outcomeRules = [].concat(outcomes.outcomeProcessing.outcomeRules);\n }\n }\n }\n };\n\n return outcomeHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * Helper that provides a way to browse all categories attached to a test model at the item level.\n *\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/category',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * Checks if a category is an option\n *\n * @param {String} category\n * @returns {Boolean}\n */\n function isCategoryOption(category) {\n return category && category.indexOf('x-tao-') === 0;\n }\n\n /**\n * Calls a function for each category in the test model\n * @param {Object} testModel\n * @param {Function} cb\n */\n function eachCategories(testModel, cb) {\n _.forEach(testModel.testParts, function (testPart) {\n _.forEach(testPart.assessmentSections, function (assessmentSection) {\n _.forEach(assessmentSection.sectionParts, function (itemRef) {\n _.forEach(itemRef.categories, function(category) {\n cb(category, itemRef);\n });\n });\n });\n });\n }\n\n return {\n /**\n * Calls a function for each category in the test model\n * @function eachCategories\n * @param {Object} testModel\n * @param {Function} cb\n */\n eachCategories: eachCategories,\n\n /**\n * Gets the list of categories assigned to the items.\n * Discards special purpose categories like 'x-tao-...'\n *\n * @param {Object} testModel\n * @returns {Array}\n */\n listCategories: function listCategories(testModel) {\n var categories = {};\n eachCategories(testModel, function(category) {\n if (!isCategoryOption(category)) {\n categories[category] = true;\n }\n });\n return _.keys(categories);\n },\n\n /**\n * Gets the list of options assigned to the items (special purpose categories like 'x-tao-...').\n *\n * @param {Object} testModel\n * @returns {Array}\n */\n listOptions: function listOptions(testModel) {\n var options = {};\n eachCategories(testModel, function(category) {\n if (isCategoryOption(category)) {\n options[category] = true;\n }\n });\n return _.keys(options);\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/modelOverseer',[\n 'lodash',\n 'core/eventifier',\n 'core/statifier',\n 'taoQtiTest/controller/creator/helpers/baseType',\n 'taoQtiTest/controller/creator/helpers/cardinality',\n 'taoQtiTest/controller/creator/helpers/outcome',\n 'taoQtiTest/controller/creator/helpers/category'\n], function (_, eventifier, statifier, baseTypeHelper, cardinalityHelper, outcomeHelper, categoryHelper) {\n 'use strict';\n\n /**\n * Wraps the test model in a manager, provides API to handle events and states\n * @param {Object} model\n * @param {Object} [config]\n * @returns {Object}\n */\n function modelOverseerFactory(model, config) {\n var modelOverseer = {\n /**\n * Gets the nested model\n * @returns {Object}\n */\n getModel: function getModel() {\n return model;\n },\n\n /**\n * Sets the nested model\n *\n * @param {Object} newModel\n * @returns {modelOverseer}\n * @fires setmodel\n */\n setModel: function setModel(newModel) {\n model = newModel;\n\n /**\n * @event modelOverseer#setmodel\n * @param {String} model\n */\n modelOverseer.trigger('setmodel', model);\n return this;\n },\n\n /**\n * Gets the config set\n * @returns {Object}\n */\n getConfig: function getConfig() {\n return config;\n },\n\n\n\n /**\n * Gets the list of defined outcomes for the nested model. A descriptor is built for each outcomes:\n * {\n * name: {String},\n * type: {String},\n * cardinality: {String}\n * }\n * @returns {Object[]}\n */\n getOutcomesList: function getOutcomesList() {\n return _.map(outcomeHelper.getOutcomeDeclarations(model), function(declaration) {\n return {\n name: declaration.identifier,\n type: baseTypeHelper.getNameByConstant(declaration.baseType),\n cardinality: cardinalityHelper.getNameByConstant(declaration.cardinality)\n };\n });\n },\n\n /**\n * Gets the names of the defined outcomes for the nested model\n * @returns {Array}\n */\n getOutcomesNames: function getOutcomesNames() {\n return _.map(outcomeHelper.getOutcomeDeclarations(model), function(declaration) {\n return declaration.identifier;\n });\n },\n\n /**\n * Gets the list of defined categories for the nested model\n * @returns {Array}\n */\n getCategories: function getCategories() {\n return categoryHelper.listCategories(model);\n },\n\n /**\n * Gets the list of defined options for the nested model\n * @returns {Array}\n */\n getOptions: function getOptions() {\n return categoryHelper.listOptions(model);\n }\n };\n\n config = _.isPlainObject(config) ? config : _.assign({}, config);\n\n return statifier(eventifier(modelOverseer));\n }\n\n return modelOverseerFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n/**\n * This object holds a shared context for all of the test creator modules and allow them to communicate via events.\n * Its lifecycle is bound to the creator controller.\n *\n * @author Christophe Noël <christophe@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/qtiTestCreator',[\n 'jquery',\n 'core/eventifier',\n 'taoQtiTest/controller/creator/areaBroker',\n 'taoQtiTest/controller/creator/modelOverseer'\n], function($, eventifier, areaBrokerFactory, modelOverseerFactory) {\n 'use strict';\n\n /**\n * @param {jQuery} $creatorContainer - root DOM element containing the creator\n * @param {Object} config - options that will be forwareded to the modelOverseer Factory\n * @returns {Object}\n */\n function testCreatorFactory($creatorContainer, config) {\n var testCreator;\n\n var $container,\n model,\n areaBroker,\n modelOverseer;\n\n /**\n * Create the model overseer with the given model\n * @returns {modelOverseer}\n */\n function loadModelOverseer() {\n if (! modelOverseer && model) {\n modelOverseer = modelOverseerFactory(model, config);\n }\n return modelOverseer;\n }\n\n /**\n * Set up the areaBroker mapping from the actual DOM\n * @returns {areaBroker} already mapped\n */\n function loadAreaBroker(){\n if (! areaBroker) {\n areaBroker = areaBrokerFactory($container, {\n 'creator': $container,\n 'itemSelectorPanel': $container.find('.test-creator-items'),\n 'contentCreatorPanel': $container.find('.test-creator-content'),\n 'propertyPanel': $container.find('.test-creator-props'),\n 'elementPropertyPanel': $container.find('.qti-widget-properties')\n });\n }\n return areaBroker;\n }\n\n if (! ($creatorContainer instanceof $)) {\n throw new TypeError('a valid $container must be given');\n }\n\n $container = $creatorContainer;\n\n testCreator = {\n setTestModel: function setTestModel(m) {\n model = m;\n },\n\n getAreaBroker: function getAreaBroker() {\n return loadAreaBroker();\n },\n\n getModelOverseer: function getModelOverseer() {\n return loadModelOverseer();\n }\n };\n return eventifier(testCreator);\n }\n\n return testCreatorFactory;\n});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n\n/**\n * The testItem data provider\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/provider/testItems',[\n 'lodash',\n 'i18n',\n 'util/url',\n 'core/dataProvider/request'\n], function (_, __, urlUtil, request) {\n 'use strict';\n\n /**\n * Per function requests configuration.\n */\n var defaultConfig = {\n getItemClasses : {\n url : urlUtil.route('getItemClasses', 'Items', 'taoQtiTest')\n },\n getItems : {\n url : urlUtil.route('getItems', 'Items', 'taoQtiTest')\n },\n getItemClassProperties : {\n url : urlUtil.route('create', 'RestFormItem', 'taoItems')\n }\n };\n\n /**\n * Creates a configured testItem provider\n *\n * @param {Object} [config] - to override the default config\n * @returns {testItemProvider} the new provider\n */\n return function testItemProviderFactory(config){\n\n config = _.defaults(config || {}, defaultConfig);\n\n /**\n * @typedef {testItemProvider}\n */\n return {\n\n /**\n * Get the list of Items classes and sub classes\n * @returns {Promise} that resolves with the classes\n */\n getItemClasses: function getItemClasses(){\n return request(config.getItemClasses.url);\n },\n\n /**\n * Get QTI Items in different formats\n * @param {Object} [params] - the parameters to pass through the request\n * @returns {Promise} that resolves with the classes\n */\n getItems : function getItems(params){\n return request(config.getItems.url, params);\n },\n\n /**\n * Get the properties of a the given item class\n * @param {String} classUri - the item class URI\n * @returns {Promise} that resolves with the classes\n */\n getItemClassProperties: function getItemClassProperties(classUri) {\n return request(config.getItemClassProperties.url, { classUri : classUri });\n }\n };\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/item',[\n 'module',\n 'jquery',\n 'i18n',\n 'core/logger',\n 'taoQtiTest/provider/testItems',\n 'ui/resource/selector',\n 'ui/feedback'\n], function (module, $, __, loggerFactory, testItemProviderFactory, resourceSelectorFactory, feedback) {\n 'use strict';\n\n /**\n * Create a dedicated logger\n */\n const logger = loggerFactory('taoQtiTest/creator/views/item');\n\n /**\n * Let's you access the data\n */\n const testItemProvider = testItemProviderFactory();\n\n /**\n * Handles errors\n * @param {Error} err\n */\n const onError = function onError(err) {\n logger.error(err);\n feedback().error(err.message || __('An error occured while retrieving items'));\n };\n\n const ITEM_URI = 'http://www.tao.lu/Ontologies/TAOItem.rdf#Item';\n\n /**\n * The ItemView setup items related components\n * @exports taoQtiTest/controller/creator/views/item\n * @param {jQueryElement} $container - where to append the view\n */\n return function itemView($container) {\n const filters = module.config().BRS || false; // feature flag BRS (search by metadata) in Test Authoring\n const selectorConfig = {\n type: __('items'),\n selectionMode: resourceSelectorFactory.selectionModes.multiple,\n selectAllPolicy: resourceSelectorFactory.selectAllPolicies.visible,\n classUri: ITEM_URI,\n classes: [\n {\n label: 'Item',\n uri: ITEM_URI,\n type: 'class'\n }\n ],\n filters\n };\n\n //set up the resource selector with one root class Item in classSelector\n const resourceSelector = resourceSelectorFactory($container, selectorConfig)\n .on('render', function () {\n $container.on('itemselected.creator', () => {\n this.clearSelection();\n });\n })\n .on('query', function (params) {\n //ask the server the item from the component query\n testItemProvider\n .getItems(params)\n .then(items => {\n //and update the item list\n this.update(items, params);\n })\n .catch(onError);\n })\n .on('classchange', function (classUri) {\n //by changing the class we need to change the\n //properties filters\n testItemProvider\n .getItemClassProperties(classUri)\n .then(filters => {\n this.updateFilters(filters);\n })\n .catch(onError);\n })\n .on('change', function (values) {\n /**\n * We've got a selection, triggered on the view container\n *\n * TODO replace jquery events by the eventifier\n *\n * @event jQuery#itemselect.creator\n * @param {Object[]} values - the selection\n */\n $container.trigger('itemselect.creator', [values]);\n });\n\n //load the classes hierarchy\n testItemProvider\n .getItemClasses()\n .then(function (classes) {\n selectorConfig.classes = classes;\n selectorConfig.classUri = classes[0].uri;\n })\n .then(function () {\n //load the class properties\n return testItemProvider.getItemClassProperties(selectorConfig.classUri);\n })\n .then(function (filters) {\n //set the filters from the properties\n selectorConfig.filters = filters;\n })\n .then(function () {\n // add classes in classSelector\n selectorConfig.classes[0].children.forEach(node => {\n resourceSelector.addClassNode(node, selectorConfig.classUri);\n });\n resourceSelector.updateFilters(selectorConfig.filters);\n })\n .catch(onError);\n };\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/testpart', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"<div id=\\\"\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"testpart clearfix\\\">\\n\\n <h1><span data-bind=\\\"identifier\\\">\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\\n <div class=\\\"actions\\\">\\n <div class=\\\"tlb\\\">\\n <div class=\\\"tlb-top\\\">\\n <span class=\\\"tlb-box\\\">\\n <span class=\\\"tlb-bar\\\">\\n <span class=\\\"tlb-start\\\"></span>\\n <span class=\\\"tlb-group\\\">\\n <a href=\\\"#\\\" class=\\\"tlb-button-off property-toggler\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test Part Properties\", options) : helperMissing.call(depth0, \"__\", \"Test Part Properties\", options)))\n + \"\\\" data-testid=\\\"test-part-properties\\\"><span class=\\\"icon-settings\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-up\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Up\", options) : helperMissing.call(depth0, \"__\", \"Move Up\", options)))\n + \"\\\" data-testid=\\\"move-up-test-part\\\"><span class=\\\"icon-up\\\"></span></a>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-down\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Down\", options) : helperMissing.call(depth0, \"__\", \"Move Down\", options)))\n + \"\\\" data-testid=\\\"move-down-test-part\\\"><span class=\\\"icon-down\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Remove Test Part\", options) : helperMissing.call(depth0, \"__\", \"Remove Test Part\", options)))\n + \"\\\" data-delete=\\\"#\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" data-testid=\\\"remove-test-part\\\"><span class=\\\"icon-bin\\\"></span></a>\\n </span>\\n <span class=\\\"tlb-end\\\"></span>\\n </span>\\n </span>\\n </div>\\n </div>\\n </div>\\n <a href=\\\"#\\\" class=\\\"toggler opened\\\" data-toggle=\\\"#testpart-content-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"></a>\\n </h1>\\n <div id=\\\"testpart-content-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"testpart-content\\\">\\n\\n <!-- assessmentTest/testPart/assessmentSections -->\\n <div class=\\\"sections\\\" data-bind-each=\\\"assessmentSections\\\" data-bind-tmpl=\\\"section\\\" data-bind-filter=\\\"isSection\\\"></div>\\n\\n <button class=\\\"btn-info small section-adder\\\" data-testid=\\\"add-section\\\">\\n <span class=\\\"icon-add\\\"></span>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"New section\", options) : helperMissing.call(depth0, \"__\", \"New section\", options)))\n + \"\\n </button>\\n </div>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/section', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"<div id=\\\"\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"section\\\">\\n\\n<!-- assessmentTest/testPart/assessmentSection/title -->\\n <h2><span data-bind=\\\"title\\\">\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\\n <div class=\\\"actions\\\">\\n <div class=\\\"tlb\\\">\\n <div class=\\\"tlb-top\\\">\\n <span class=\\\"tlb-box\\\">\\n <span class=\\\"tlb-bar\\\">\\n <span class=\\\"tlb-start\\\"></span>\\n <span class=\\\"tlb-group\\\">\\n <a href=\\\"#\\\" class=\\\"tlb-button-off rub-toggler\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Manage Rubric Blocks\", options) : helperMissing.call(depth0, \"__\", \"Manage Rubric Blocks\", options)))\n + \"\\\" data-toggle=\\\"#rublocks-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" data-testid=\\\"manage-rubric-blocks\\\"><span class=\\\"icon-rubric\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off property-toggler\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Section Properties\", options) : helperMissing.call(depth0, \"__\", \"Section Properties\", options)))\n + \"\\\" data-testid=\\\"section-properties\\\"><span class=\\\"icon-settings\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-up disabled\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Up\", options) : helperMissing.call(depth0, \"__\", \"Move Up\", options)))\n + \"\\\" data-testid=\\\"move-up-section\\\"><span class=\\\"icon-up\\\"></span></a>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-down disabled\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Down\", options) : helperMissing.call(depth0, \"__\", \"Move Down\", options)))\n + \"\\\" data-testid=\\\"move-down-section\\\"><span class=\\\"icon-down\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off disabled\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Remove Section\", options) : helperMissing.call(depth0, \"__\", \"Remove Section\", options)))\n + \"\\\" data-delete=\\\":parent .section\\\" data-testid=\\\"remove-section\\\"><span class=\\\"icon-bin\\\"></span></a>\\n </span>\\n <span class=\\\"tlb-end\\\"></span>\\n </span>\\n </span>\\n </div>\\n </div>\\n </div>\\n </h2>\\n\\n <div id=\\\"rublocks-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"rublocks clearfix toggled\\\">\\n <h3>\\n <span class=\\\"title\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Rubric Blocks\", options) : helperMissing.call(depth0, \"__\", \"Rubric Blocks\", options)))\n + \"</span>\\n </h3>\\n <ol class=\\\"rubricblocks decimal\\\" data-bind-each=\\\"rubricBlocks\\\" data-bind-tmpl=\\\"rubricblock\\\"></ol>\\n <button class=\\\"btn-info small rublock-adder\\\" data-testid=\\\"add-rubric-block\\\">\\n <span class=\\\"icon-add\\\"></span>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"New Rubric Block\", options) : helperMissing.call(depth0, \"__\", \"New Rubric Block\", options)))\n + \"\\n </button>\\n </div>\\n <div class=\\\"itemrefs-wrapper\\\">\\n <h3>\\n <span class=\\\"title\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Items\", options) : helperMissing.call(depth0, \"__\", \"Items\", options)))\n + \"</span>\\n </h3>\\n <ol class=\\\"itemrefs decimal clearfix\\\" data-bind-each=\\\"sectionParts\\\" data-bind-tmpl=\\\"itemref\\\" data-bind-filter=\\\"isItemRef\\\" data-msg=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Add selected item(s) here.\", options) : helperMissing.call(depth0, \"__\", \"Add selected item(s) here.\", options)))\n + \"\\\"></ol>\\n <div class=\\\"itemref-placeholder\\\" data-testid=\\\"add-items\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Add selected item(s) here.\", options) : helperMissing.call(depth0, \"__\", \"Add selected item(s) here.\", options)))\n + \"\\n </div>\\n </div>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/rubricblock', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"<li class=\\\"rubricblock\\\">\\n <div class=\\\"actions\\\">\\n <div class=\\\"tlb\\\">\\n <div class=\\\"tlb-top\\\">\\n <span class=\\\"tlb-box\\\">\\n <span class=\\\"tlb-bar\\\">\\n <span class=\\\"tlb-start\\\"></span>\\n <span class=\\\"tlb-group\\\">\\n <a href=\\\"#\\\" class=\\\"tlb-button-off property-toggler\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Rubric Block Properties\", options) : helperMissing.call(depth0, \"__\", \"Rubric Block Properties\", options)))\n + \"\\\" data-testid=\\\"rubric-block-properties\\\"><span class=\\\"icon-settings\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Remove Rubric Block\", options) : helperMissing.call(depth0, \"__\", \"Remove Rubric Block\", options)))\n + \"\\\" data-delete=\\\":parent .rubricblock\\\" data-testid=\\\"remove-rubric-block\\\"><span class=\\\"icon-bin\\\"></span></a>\\n </span>\\n <span class=\\\"tlb-end\\\"></span>\\n </span>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"rubricblock-content\\\"></div>\\n</li>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/itemref', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"<li id='\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"' data-uri='\";\n if (helper = helpers.href) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.href); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"' class='itemref'>\\n <span class='title truncate'>\";\n stack1 = (helper = helpers.dompurify || (depth0 && depth0.dompurify),options={hash:{},data:data},helper ? helper.call(depth0, (depth0 && depth0.label), options) : helperMissing.call(depth0, \"dompurify\", (depth0 && depth0.label), options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"</span>\\n <div class=\\\"actions\\\">\\n <div class=\\\"tlb\\\">\\n <div class=\\\"tlb-top\\\">\\n <span class=\\\"tlb-box\\\">\\n <span class=\\\"tlb-bar\\\">\\n <span class=\\\"tlb-start\\\"></span>\\n <span class=\\\"tlb-group\\\">\\n <a href=\\\"#\\\" class=\\\"tlb-button-off property-toggler\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Reference Properties\", options) : helperMissing.call(depth0, \"__\", \"Item Reference Properties\", options)))\n + \"\\\" data-testid=\\\"item-properties\\\"><span class=\\\"icon-settings\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-up\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Up\", options) : helperMissing.call(depth0, \"__\", \"Move Up\", options)))\n + \"\\\" data-testid=\\\"move-up-item\\\"><span class=\\\"icon-up\\\"></span></a>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off move-down\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Move Down\", options) : helperMissing.call(depth0, \"__\", \"Move Down\", options)))\n + \"\\\" data-testid=\\\"move-down-item\\\"><span class=\\\"icon-down\\\"></span></a>\\n <span class=\\\"tlb-separator\\\"></span>\\n <a href=\\\"#\\\" class=\\\"tlb-button-off\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Remove Item Reference\", options) : helperMissing.call(depth0, \"__\", \"Remove Item Reference\", options)))\n + \"\\\" data-delete=\\\":parent .itemref\\\" data-testid=\\\"remove-item\\\"><span class=\\\"icon-bin\\\"></span></a>\\n </span>\\n <span class=\\\"tlb-end\\\"></span>\\n </span>\\n </span>\\n </div>\\n </div>\\n </div>\\n</li>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/outcomes', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-6 line\\\">\";\n if (helper = helpers.name) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.name); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</div>\\n <div class=\\\"col-3 line\\\">\";\n if (helper = helpers.type) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.type); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</div>\\n <div class=\\\"col-3 line\\\">\";\n if (helper = helpers.cardinality) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.cardinality); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</div>\\n </div>\\n\";\n return buffer;\n }\n\nfunction program3(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-12 line\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"no outcome declaration found\", options) : helperMissing.call(depth0, \"__\", \"no outcome declaration found\", options)))\n + \"</div>\\n </div>\\n\";\n return buffer;\n }\n\n buffer += \"<div class=\\\"grid-row\\\">\\n <div class=\\\"col-6 header\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \"</div>\\n <div class=\\\"col-3 header\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Type\", options) : helperMissing.call(depth0, \"__\", \"Type\", options)))\n + \"</div>\\n <div class=\\\"col-3 header\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Cardinality\", options) : helperMissing.call(depth0, \"__\", \"Cardinality\", options)))\n + \"</div>\\n</div>\\n\";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.outcomes), {hash:{},inverse:self.program(3, program3, data),fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/test-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n <div class=\\\"test-scoring toggled\\\">\\n\\n<!-- assessmentTest/scoring/outcomeProcessing -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-outcome-processing\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Outcome processing\", options) : helperMissing.call(depth0, \"__\", \"Outcome processing\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <select name=\\\"test-outcome-processing\\\" class=\\\"select2\\\" data-bind=\\\"scoring.outcomeProcessing\\\" data-bind-encoder=\\\"string\\\" data-has-search=\\\"false\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.modes), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </select>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Select the way the responses of your test should be processed\", options) : helperMissing.call(depth0, \"__\", \"Select the way the responses of your test should be processed\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/scoring/categoryScore -->\\n <div class=\\\"grid-row test-category-score\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-category-score\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Category score\", options) : helperMissing.call(depth0, \"__\", \"Category score\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"test-category-score\\\" value=\\\"true\\\" data-bind=\\\"scoring.categoryScore\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Also compute the score per categories\", options) : helperMissing.call(depth0, \"__\", \"Also compute the score per categories\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/scoring/cutScore -->\\n <div class=\\\"grid-row test-cut-score\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-cut-score\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Cut score (pass ratio)\", options) : helperMissing.call(depth0, \"__\", \"Cut score (pass ratio)\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"test-cut-score\\\" value=\\\"0\\\" data-bind=\\\"scoring.cutScore\\\" data-bind-encoder=\\\"float\\\" data-validate=\\\"$numeric;\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the cut score (or pass score ratio) associated to the test. It must be a float between 0 and 1.\", options) : helperMissing.call(depth0, \"__\", \"Set the cut score (or pass score ratio) associated to the test. It must be a float between 0 and 1.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/scoring/weightIdentifier -->\\n <div class=\\\"grid-row test-weight-identifier\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-weight-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Weight\", options) : helperMissing.call(depth0, \"__\", \"Weight\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"test-weight-identifier\\\" data-bind=\\\"scoring.weightIdentifier\\\" data-validate=\\\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\\\.-]*)?$);\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the weight identifier used to process the score\", options) : helperMissing.call(depth0, \"__\", \"Set the weight identifier used to process the score\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/scoring/description -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-12\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.modes), {hash:{},inverse:self.noop,fn:self.program(5, program5, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </div>\\n </div>\\n </div>\\n\";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <option value=\\\"\";\n if (helper = helpers.key) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.key); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.selected), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \">\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</option>\\n \";\n return buffer;\n }\nfunction program3(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\nfunction program5(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <div class=\\\"feedback-info test-outcome-processing-description\\\" data-key=\\\"\";\n if (helper = helpers.key) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.key); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"icon-info\\\"></span>\\n \";\n if (helper = helpers.description) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.description); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n </div>\\n \";\n return buffer;\n }\n\n buffer += \"<div class=\\\"test-props props clearfix\\\">\\n\\n <!-- test properties -->\\n <h3 data-bind=\\\"title\\\"></h3>\\n\\n<!-- assessmentTest/identifier -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"test-identifier\\\" data-bind=\\\"identifier\\\" data-validate=\\\"$notEmpty; $testIdFormat; $testIdAvailable;\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The principle identifier of the test.\", options) : helperMissing.call(depth0, \"__\", \"The principle identifier of the test.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/title -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-title\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Title\", options) : helperMissing.call(depth0, \"__\", \"Title\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"test-title\\\" data-bind=\\\"title\\\" data-validate=\\\"$notEmpty\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The test title.\", options) : helperMissing.call(depth0, \"__\", \"The test title.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .test-time-limits\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/timeLimits -->\\n <div class=\\\"test-time-limits toggled\\\">\\n\\n\\n\\n<!-- assessmentTest/timeLimits/maxTime -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"test-max-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum Duration\", options) : helperMissing.call(depth0, \"__\", \"Maximum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" name=\\\"max-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.maxTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for the all test.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for the all test.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/timeLimits/allowLateSubmission -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Late submission allowed\", options) : helperMissing.call(depth0, \"__\", \"Late submission allowed\", options)))\n + \"\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"test-allow-late-submission\\\" value=\\\"true\\\" data-bind=\\\"timeLimits.allowLateSubmission\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration should still be accepted.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .test-scoring\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Scoring\", options) : helperMissing.call(depth0, \"__\", \"Scoring\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/scoring -->\\n\";\n stack1 = helpers['with'].call(depth0, (depth0 && depth0.scoring), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .test-outcome-declarations\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Outcome declarations\", options) : helperMissing.call(depth0, \"__\", \"Outcome declarations\", options)))\n + \"</h4>\\n\\n <!-- assessmentTest/outcomeDeclarations -->\\n <div class=\\\"test-outcome-declarations panel toggled\\\">\\n <div class=\\\"grid-row test-outcomes-generate\\\">\\n <div class=\\\"col-12 align-right\\\">\\n <button class=\\\"btn-info small\\\" data-action=\\\"generate-outcomes\\\"><span class=\\\"icon icon-reset\\\"></span>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Regenerate\", options) : helperMissing.call(depth0, \"__\", \"Regenerate\", options)))\n + \"</button>\\n </div>\\n </div>\\n <div class=\\\"outcome-declarations\\\"></div>\\n </div>\\n\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/testpart-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \"checked\";\n }\n\n buffer += \"<div id=\\\"testpart-props-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"testpart-props props clearfix\\\">\\n <h3>\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</h3>\\n\\n <form autocomplete=\\\"off\\\">\\n\\n<!-- assessmentTest/testPart/identifier -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" id=\\\"testpart-identifier\\\" data-bind=\\\"identifier\\\" data-validate=\\\"$notEmpty; $idFormat; $testIdAvailable;\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The test part identifier.\", options) : helperMissing.call(depth0, \"__\", \"The test part identifier.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/navigationMode -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Navigation\", options) : helperMissing.call(depth0, \"__\", \"Navigation\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input\\n type=\\\"radio\\\"\\n name=\\\"testpart-navigation-mode\\\"\\n \";\n stack1 = (helper = helpers.equal || (depth0 && depth0.equal),options={hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data},helper ? helper.call(depth0, (depth0 && depth0.navigationMode), 0, options) : helperMissing.call(depth0, \"equal\", (depth0 && depth0.navigationMode), 0, options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n value=\\\"0\\\"\\n data-bind=\\\"navigationMode\\\"\\n data-bind-encoder=\\\"number\\\"\\n />\\n <span class=\\\"icon-radio\\\"></span>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Linear\", options) : helperMissing.call(depth0, \"__\", \"Linear\", options)))\n + \"\\n </label>\\n <label>\\n <input\\n type=\\\"radio\\\"\\n name=\\\"testpart-navigation-mode\\\"\\n \";\n stack1 = (helper = helpers.equal || (depth0 && depth0.equal),options={hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data},helper ? helper.call(depth0, (depth0 && depth0.navigationMode), 1, options) : helperMissing.call(depth0, \"equal\", (depth0 && depth0.navigationMode), 1, options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n value=\\\"1\\\"\\n />\\n <span class=\\\"icon-radio\\\"></span>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Non Linear\", options) : helperMissing.call(depth0, \"__\", \"Non Linear\", options)))\n + \"\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.\", options) : helperMissing.call(depth0, \"__\", \"The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/submissionMode -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Submission\", options) : helperMissing.call(depth0, \"__\", \"Submission\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input\\n type=\\\"radio\\\"\\n name=\\\"testpart-submission-mode\\\"\\n \";\n stack1 = (helper = helpers.equal || (depth0 && depth0.equal),options={hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data},helper ? helper.call(depth0, (depth0 && depth0.submissionMode), 0, options) : helperMissing.call(depth0, \"equal\", (depth0 && depth0.submissionMode), 0, options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n value=\\\"0\\\"\\n data-bind=\\\"submissionMode\\\"\\n data-bind-encoder=\\\"number\\\"\\n />\\n <span class=\\\"icon-radio\\\"></span>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Individual\", options) : helperMissing.call(depth0, \"__\", \"Individual\", options)))\n + \"\\n </label>\\n <label>\\n <input\\n type=\\\"radio\\\"\\n name=\\\"testpart-submission-mode\\\"\\n \";\n stack1 = (helper = helpers.equal || (depth0 && depth0.equal),options={hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data},helper ? helper.call(depth0, (depth0 && depth0.submissionMode), 1, options) : helperMissing.call(depth0, \"equal\", (depth0 && depth0.submissionMode), 1, options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n value=\\\"1\\\"\\n />\\n <span class=\\\"icon-radio\\\"></span>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Simultaneous\", options) : helperMissing.call(depth0, \"__\", \"Simultaneous\", options)))\n + \"\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.\", options) : helperMissing.call(depth0, \"__\", \"The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .testpart-item-session-control\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"</h4>\\n\\n\\n<!-- assessmentTest/testPart/itemSessionControl -->\\n <div class=\\\"testpart-item-session-control toggled\\\">\\n\\n<!-- assessmentTest/testPart/itemSessionControl/maxAttempts -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-max-attempts\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Max Attempts\", options) : helperMissing.call(depth0, \"__\", \"Max Attempts\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input\\n id=\\\"testpart-max-attempts\\\"\\n type=\\\"text\\\"\\n data-increment=\\\"1\\\"\\n data-min=\\\"0\\\"\\n data-max=\\\"151\\\"\\n value=\\\"\";\n if (helper = helpers.maxAttempts) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.maxAttempts); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n data-bind=\\\"itemSessionControl.maxAttempts\\\"\\n data-bind-encoder=\\\"number\\\"\\n />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/itemSessionControl/showFeedback -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-show-feedback\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Show Feedback\", options) : helperMissing.call(depth0, \"__\", \"Show Feedback\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"testpart-show-feedback\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.showFeedback\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n\\n\\n\\n\\n<!-- assessmentTest/testPart/itemSessionControl/allowComment -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-allow-comment\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Comment\", options) : helperMissing.call(depth0, \"__\", \"Allow Comment\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"testpart-allow-comment\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.allowComment\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/itemSessionControl/allowSkipping -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-allow-skipping\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Skipping\", options) : helperMissing.call(depth0, \"__\", \"Allow Skipping\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"testpart-allow-skipping\\\" value=\\\"true\\\" checked=\\\"checked\\\" data-bind=\\\"itemSessionControl.allowSkipping\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response (default is true).\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response (default is true).\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/itemSessionControl/validateResponses -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-validate-responses\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Validate Responses\", options) : helperMissing.call(depth0, \"__\", \"Validate Responses\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"testpart-validate-responses\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.validateResponses\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The candidate is not allowed to submit invalid responses.\", options) : helperMissing.call(depth0, \"__\", \"The candidate is not allowed to submit invalid responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .testpart-time-limits\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/testPart/timeLimits/minTime -->\\n <div class=\\\"testpart-time-limits toggled\\\">\\n\\n\\n\\n<!-- assessmentTest/testPart/timeLimits/maxTime -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-max-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum Duration\", options) : helperMissing.call(depth0, \"__\", \"Maximum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" id=\\\"testpart-max-time\\\" name=\\\"max-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.maxTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this test part.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this test part.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/timeLimits/allowLateSubmission -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"testpart-allow-late-submission\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Late submission allowed\", options) : helperMissing.call(depth0, \"__\", \"Late submission allowed\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-allow-late-submission\\\" value=\\\"true\\\" data-bind=\\\"timeLimits.allowLateSubmission\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n </form>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/section-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-blueprint\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Associate Blueprint\", options) : helperMissing.call(depth0, \"__\", \"Associate Blueprint\", options)))\n + \"</label>\\n </div>\\n\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" id=\\\"section-blueprint\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Associate a blueprint to a section allow you to validate this section against the specified blueprint.\", options) : helperMissing.call(depth0, \"__\", \"Associate a blueprint to a section allow you to validate this section against the specified blueprint.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n \";\n return buffer;\n }\n\n buffer += \"<div id=\\\"section-props-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"section-props props clearfix\\\">\\n <h3>\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</h3>\\n\\n<!-- assessmentTest/testPart/assessmentSection/identifier -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" id=\\\"section-identifier\\\" data-bind=\\\"identifier\\\" data-validate=\\\"$notEmpty; $idFormat; $testIdAvailable;\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The identifier of the section.\", options) : helperMissing.call(depth0, \"__\", \"The identifier of the section.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/title -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-title\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Title\", options) : helperMissing.call(depth0, \"__\", \"Title\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" id=\\\"section-title\\\" data-bind=\\\"title\\\" data-validate=\\\"$notEmpty\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The section title.\", options) : helperMissing.call(depth0, \"__\", \"The section title.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n\\n\\n\\n\\n<!-- assessmentTest/testPart/assessmentSection/visible -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-visible\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Visible\", options) : helperMissing.call(depth0, \"__\", \"Visible\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-visible\\\" value=\\\"true\\\" checked=\\\"checked\\\" data-bind=\\\"visible\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"A visible section is one that is identifiable by the candidate.\", options) : helperMissing.call(depth0, \"__\", \"A visible section is one that is identifiable by the candidate.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/keepTogether -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-keep-together\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Keep Together\", options) : helperMissing.call(depth0, \"__\", \"Keep Together\", options)))\n + \"</label>\\n </div>\\n\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-keep-together\\\" value=\\\"true\\\" checked=\\\"checked\\\" data-bind=\\\"keepTogether\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.\", options) : helperMissing.call(depth0, \"__\", \"An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.hasBlueprint), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\\n <div class=\\\"categories\\\">\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"category-custom\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Categories\", options) : helperMissing.call(depth0, \"__\", \"Categories\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" id=\\\"category-custom\\\" name=\\\"category-custom\\\"/>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.\", options) : helperMissing.call(depth0, \"__\", \"Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <!-- some user features (Test Navigation, Test Taker Tools, etc.) are in fact implemented as categories. They will appear here: -->\\n <div class=\\\"category-presets\\\"></div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .section-selection\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Selection\", options) : helperMissing.call(depth0, \"__\", \"Selection\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/testPart/assessmentSection/selection -->\\n <div class=\\\"section-selection toggled\\\">\\n\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-enable-selection\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Enable selection\", options) : helperMissing.call(depth0, \"__\", \"Enable selection\", options)))\n + \"</label>\\n </div>\\n\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-enable-selection\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/selection/select -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-select\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Select\", options) : helperMissing.call(depth0, \"__\", \"Select\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input id=\\\"section-select\\\" name=\\\"section-select\\\" type=\\\"text\\\" data-increment=\\\"1\\\" data-min=\\\"0\\\" value=\\\"0\\\" data-bind=\\\"selection.select\\\" data-bind-encoder=\\\"number\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The number of child elements to be selected.\", options) : helperMissing.call(depth0, \"__\", \"The number of child elements to be selected.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/selection/withReplacement -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-with-replacement\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"With Replacement\", options) : helperMissing.call(depth0, \"__\", \"With Replacement\", options)))\n + \"</label>\\n </div>\\n\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-with-replacement\\\" value=\\\"true\\\" data-bind=\\\"selection.withReplacement\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"When selecting child elements each element is normally eligible for selection once only.\", options) : helperMissing.call(depth0, \"__\", \"When selecting child elements each element is normally eligible for selection once only.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .section-ordering\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Ordering\", options) : helperMissing.call(depth0, \"__\", \"Ordering\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/testPart/assessmentSection/ordering -->\\n <div class=\\\"section-ordering toggled\\\">\\n<!-- assessmentTest/testPart/assessmentSection/ordering/shuffle -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-shuffle\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Shuffle\", options) : helperMissing.call(depth0, \"__\", \"Shuffle\", options)))\n + \"</label>\\n </div>\\n\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-shuffle\\\" value=\\\"true\\\" data-bind=\\\"ordering.shuffle\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.\", options) : helperMissing.call(depth0, \"__\", \"If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .section-item-session-control\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl -->\\n <div class=\\\"section-item-session-control toggled\\\">\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/maxAttempts -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-max-attempts\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Max Attempts\", options) : helperMissing.call(depth0, \"__\", \"Max Attempts\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input\\n id=\\\"section-max-attempts\\\"\\n type=\\\"text\\\"\\n data-increment=\\\"1\\\"\\n data-min=\\\"0\\\"\\n data-max=\\\"151\\\"\\n value=\\\"\";\n if (helper = helpers.maxAttempts) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.maxAttempts); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n data-bind=\\\"itemSessionControl.maxAttempts\\\"\\n data-bind-encoder=\\\"number\\\"\\n />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/showFeedback -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-show-feedback\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Show Feedback\", options) : helperMissing.call(depth0, \"__\", \"Show Feedback\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-show-feedback\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.showFeedback\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n\\n\\n\\n\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/allowComment -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-allow-comment\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Comment\", options) : helperMissing.call(depth0, \"__\", \"Allow Comment\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-allow-comment\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.allowComment\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/allowSkipping -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-allow-skipping\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Skipping\", options) : helperMissing.call(depth0, \"__\", \"Allow Skipping\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-allow-skipping\\\" value=\\\"true\\\" checked=\\\"checked\\\" data-bind=\\\"itemSessionControl.allowSkipping\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response (default is true).\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response (default is true).\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/itemSessionControl/validateResponses -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-validate-responses\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Validate Responses\", options) : helperMissing.call(depth0, \"__\", \"Validate Responses\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-validate-responses\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.validateResponses\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The candidate is not allowed to submit invalid responses.\", options) : helperMissing.call(depth0, \"__\", \"The candidate is not allowed to submit invalid responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .section-time-limits\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/timeLimits -->\\n <div class=\\\"section-time-limits toggled\\\">\\n\\n\\n\\n\\n<!-- assessmentTest/testPart/assessmentSection/timeLimits/maxTime -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-max-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum Duration\", options) : helperMissing.call(depth0, \"__\", \"Maximum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" id=\\\"section-max-time\\\" name=\\\"max-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.maxTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this section.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this section.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/timeLimits/allowLateSubmission -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"section-allow-late-submission\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Late submission allowed\", options) : helperMissing.call(depth0, \"__\", \"Late submission allowed\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"section-allow-late-submission\\\" value=\\\"true\\\" data-bind=\\\"timeLimits.allowLateSubmission\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/itemref-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing, self=this;\n\nfunction program1(depth0,data) {\n \n \n return \"hidden\";\n }\n\n buffer += \"<div id=\\\"itemref-props-\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" class=\\\"itemref-props props clearfix\\\">\\n\\n <h3>\";\n stack1 = (helper = helpers.dompurify || (depth0 && depth0.dompurify),options={hash:{},data:data},helper ? helper.call(depth0, (depth0 && depth0.label), options) : helperMissing.call(depth0, \"dompurify\", (depth0 && depth0.label), options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"</h3>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/identifier -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"itemref-identifier\\\" data-bind=\\\"identifier\\\" data-validate=\\\"$notEmpty; $testIdFormat; $testIdAvailable;\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The identifier of the item reference.\", options) : helperMissing.call(depth0, \"__\", \"The identifier of the item reference.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/href -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-href\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Reference\", options) : helperMissing.call(depth0, \"__\", \"Reference\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"itemref-href\\\" data-bind=\\\"href\\\" readonly=\\\"readonly\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The reference.\", options) : helperMissing.call(depth0, \"__\", \"The reference.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/required -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-required\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required\", options) : helperMissing.call(depth0, \"__\", \"Required\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-required\\\" value=\\\"true\\\" data-bind=\\\"required\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If required it must appear (at least once) in the selection.\", options) : helperMissing.call(depth0, \"__\", \"If required it must appear (at least once) in the selection.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/fixed -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-fixed\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Fixed\", options) : helperMissing.call(depth0, \"__\", \"Fixed\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-fixed\\\" value=\\\"true\\\" data-bind=\\\"fixed\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Not shuffled, the position remains fixed.\", options) : helperMissing.call(depth0, \"__\", \"Not shuffled, the position remains fixed.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"categories\\\">\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"category-custom\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Categories\", options) : helperMissing.call(depth0, \"__\", \"Categories\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"custom categories\", options) : helperMissing.call(depth0, \"__\", \"custom categories\", options)))\n + \"\\\" name=\\\"category-custom\\\"/>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Items can optionally be assigned to one or more categories.\", options) : helperMissing.call(depth0, \"__\", \"Items can optionally be assigned to one or more categories.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <!-- assessmentTest/testPart/assessmentSection/sectionPart/category -->\\n <textarea title=\\\"categories\\\" class=\\\"hidden\\\" type=\\\"text\\\" name=\\\"itemref-category\\\" data-bind=\\\"categories\\\" data-bind-encoder=\\\"str2array\\\"></textarea>\\n\\n <!-- some user features (Test Navigation, Test Taker Tools, etc.) are in fact implemented as categories. They will appear here: -->\\n <div class=\\\"category-presets\\\"></div>\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .itemref-weights\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Weights\", options) : helperMissing.call(depth0, \"__\", \"Weights\", options)))\n + \"</h4>\\n\\n <div class=\\\"itemref-weights toggled\\\">\\n <div class=\\\"grid-row \\\">\\n <div class=\\\"col-9\\\">\\n <strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \"</strong>\\n </div>\\n <div class=\\\"col-2\\\">\\n <strong>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Value\", options) : helperMissing.call(depth0, \"__\", \"Value\", options)))\n + \"</strong>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the contribution of an individual item score to the overall test score.\", options) : helperMissing.call(depth0, \"__\", \"Controls the contribution of an individual item score to the overall test score.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/weights -->\\n <div data-bind-each=\\\"weights\\\" data-bind-tmpl=\\\"itemrefweight\\\"></div>\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-12\\\">\\n <a class=\\\"itemref-weight-add\\\"><span class=\\\"icon-add\\\"></span> \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"add a new weight\", options) : helperMissing.call(depth0, \"__\", \"add a new weight\", options)))\n + \"</a>\\n </div>\\n </div>\\n </div>\\n\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .itemref-item-session-control\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl -->\\n <div class=\\\"itemref-item-session-control toggled\\\">\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/maxAttempts -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-max-attempts\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Max Attempts\", options) : helperMissing.call(depth0, \"__\", \"Max Attempts\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input\\n name=\\\"itemref-max-attempts\\\"\\n type=\\\"text\\\"\\n data-increment=\\\"1\\\"\\n data-min=\\\"0\\\"\\n data-max=\\\"151\\\"\\n value=\\\"\";\n if (helper = helpers.maxAttempts) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.maxAttempts); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n data-bind=\\\"itemSessionControl.maxAttempts\\\"\\n data-bind-encoder=\\\"number\\\"\\n />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/showFeedback -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-show-feedback\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Show Feedback\", options) : helperMissing.call(depth0, \"__\", \"Show Feedback\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-show-feedback\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.showFeedback\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n\\n\\n\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/allowComment -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-allow-comment\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Comment\", options) : helperMissing.call(depth0, \"__\", \"Allow Comment\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-allow-comment\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.allowComment\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/allowSkipping -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-allow-skipping\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Allow Skipping\", options) : helperMissing.call(depth0, \"__\", \"Allow Skipping\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-allow-skipping\\\" value=\\\"true\\\" checked=\\\"checked\\\" data-bind=\\\"itemSessionControl.allowSkipping\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response (default is true).\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response (default is true).\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/itemSessionControl/validateResponses -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-validate-responses\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Validate Responses\", options) : helperMissing.call(depth0, \"__\", \"Validate Responses\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-validate-responses\\\" value=\\\"true\\\" data-bind=\\\"itemSessionControl.validateResponses\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The candidate is not allowed to submit invalid responses.\", options) : helperMissing.call(depth0, \"__\", \"The candidate is not allowed to submit invalid responses.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n </div>\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .itemref-time-limits\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"</h4>\\n\\n<!-- assessmentTest/timeLimits -->\\n <div class=\\\"itemref-time-limits toggled\\\">\\n\\n <div class=\\\"lockedtime-container hidden\\\">\\n\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-max-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum Duration\", options) : helperMissing.call(depth0, \"__\", \"Maximum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" name=\\\"max-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.maxTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Minimum duration : enforces the test taker to stay on the item for the given duration.\", options) : helperMissing.call(depth0, \"__\", \"Minimum duration : enforces the test taker to stay on the item for the given duration.\", options)))\n + \"<br>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration : the items times out when the duration reaches 0.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration : the items times out when the duration reaches 0.\", options)))\n + \"<br>\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Locked duration : guided navigation. The test transition to the next item once the duration reaches 0.\", options) : helperMissing.call(depth0, \"__\", \"Locked duration : guided navigation. The test transition to the next item once the duration reaches 0.\", options)))\n + \"<br>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"locker\\\">\\n <button class=\\\"unlocked\\\" title='\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Link durations to activate the guided navigation\", options) : helperMissing.call(depth0, \"__\", \"Link durations to activate the guided navigation\", options)))\n + \"' ><span class=\\\"icon-unlink\\\"></span></button>\\n </div>\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-min-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Minimum Duration\", options) : helperMissing.call(depth0, \"__\", \"Minimum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"min-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.minTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/maxTime -->\\n <div class=\\\"grid-row maxtime-container \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.isLinear), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-max-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum Duration\", options) : helperMissing.call(depth0, \"__\", \"Maximum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" name=\\\"max-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.maxTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this item.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this item.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/minTime -->\\n <div class=\\\"grid-row mintime-container \";\n stack1 = helpers.unless.call(depth0, (depth0 && depth0.isLinear), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"min-time\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Minimum Duration\", options) : helperMissing.call(depth0, \"__\", \"Minimum Duration\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6 duration-group\\\">\\n <input type=\\\"text\\\" name=\\\"min-time\\\" value=\\\"00:00:00\\\" data-duration=\\\"HH:mm:ss\\\" data-bind=\\\"timeLimits.minTime\\\" data-bind-encoder=\\\"time\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Minimum duration for this item.\", options) : helperMissing.call(depth0, \"__\", \"Minimum duration for this item.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n<!-- assessmentTest/testPart/assessmentSection/sectionPart/timeLimits/allowLateSubmission -->\\n <div class=\\\"grid-row pseudo-label-box\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-allow-late-submission\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Late submission allowed\", options) : helperMissing.call(depth0, \"__\", \"Late submission allowed\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"itemref-allow-late-submission\\\" value=\\\"true\\\" data-bind=\\\"timeLimits.allowLateSubmission\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/itemref-props-weight', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"<div class=\\\"grid-row itemref-weight\\\">\\n <div class=\\\"col-9\\\">\\n <input data-bind=\\\"identifier\\\" data-validate=\\\"$notEmpty; $testIdFormat; $testIdAvailable(original=\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \");\\\" type=\\\"text\\\" value=\\\"\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" />\\n </div>\\n <div class=\\\"col-2\\\">\\n <input data-bind=\\\"value\\\" data-validate=\\\"$notEmpty; $numeric;\\\" type=\\\"text\\\" value=\\\"\";\n if (helper = helpers.value) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.value); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" data-bind-encoder=\\\"float\\\" />\\n </div>\\n <div class=\\\"col-1\\\">\\n <a class=\\\"itemref-weight-remove\\\" data-delete=\\\":parent .itemref-weight\\\">\\n <span class=\\\"icon-bin\\\"></span>\\n </a>\\n </div>\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/rubricblock-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\", self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", helper, options;\n buffer += \"\\n <div class=\\\"rubric-feedback toggled\\\">\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/activated -->\\n <div class=\\\"grid-row rubric-feedback-activated\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"activated\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Activated\", options) : helperMissing.call(depth0, \"__\", \"Activated\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <label>\\n <input type=\\\"checkbox\\\" name=\\\"activated\\\" value=\\\"true\\\" data-bind=\\\"feedback.activated\\\" data-bind-encoder=\\\"boolean\\\" />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the rubric block as a feedback block\", options) : helperMissing.call(depth0, \"__\", \"Set the rubric block as a feedback block\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/outcome -->\\n <div class=\\\"grid-row rubric-feedback-outcome\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"feedback-outcome\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Outcome\", options) : helperMissing.call(depth0, \"__\", \"Outcome\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"feedback-outcome\\\" data-bind=\\\"feedback.outcome\\\" data-bind-encoder=\\\"string\\\" data-validate=\\\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\\\.-]*)?$);\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set outcome identifier the feedback block is related to\", options) : helperMissing.call(depth0, \"__\", \"Set outcome identifier the feedback block is related to\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback/matchValue -->\\n <div class=\\\"grid-row rubric-feedback-match-value\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"feedback-match-value\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Match value\", options) : helperMissing.call(depth0, \"__\", \"Match value\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"feedback-match-value\\\" data-bind=\\\"feedback.matchValue\\\" data-bind-encoder=\\\"string\\\" data-validate=\\\"$pattern(pattern=^([a-zA-Z_][a-zA-Z0-9_\\\\.-]*)?$);\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the value of the outcome that will activate the feedback block\", options) : helperMissing.call(depth0, \"__\", \"Set the value of the outcome that will activate the feedback block\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n </div>\\n \";\n return buffer;\n }\n\n buffer += \"<div class=\\\"rubricblock-props props clearfix\\\">\\n\\n <h3>\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Rubric Block\", options) : helperMissing.call(depth0, \"__\", \"Rubric Block\", options)))\n + \": \";\n if (helper = helpers.orderIndex) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.orderIndex); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</h3>\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/views -->\\n <!--\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"itemref-identifier\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Views\", options) : helperMissing.call(depth0, \"__\", \"Views\", options)))\n + \" <abbr title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Required field\", options) : helperMissing.call(depth0, \"__\", \"Required field\", options)))\n + \"\\\">*</abbr></label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <select name=\\\"view\\\" multiple=\\\"multiple\\\" data-bind=\\\"views\\\">\\n <option value=\\\"author\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Author\", options) : helperMissing.call(depth0, \"__\", \"Author\", options)))\n + \"</option>\\n <option value=\\\"candidate\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Candidate\", options) : helperMissing.call(depth0, \"__\", \"Candidate\", options)))\n + \"</option>\\n <option value=\\\"proctor\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Proctor\", options) : helperMissing.call(depth0, \"__\", \"Proctor\", options)))\n + \"</option>\\n <option value=\\\"scorer\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Scorer\", options) : helperMissing.call(depth0, \"__\", \"Scorer\", options)))\n + \"</option>\\n <option value=\\\"testConstructor\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test constructor\", options) : helperMissing.call(depth0, \"__\", \"Test constructor\", options)))\n + \"</option>\\n <option value=\\\"tutor\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Tutor\", options) : helperMissing.call(depth0, \"__\", \"Tutor\", options)))\n + \"</option>\\n </select>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Who can view the rubric block during the delivery.\", options) : helperMissing.call(depth0, \"__\", \"Who can view the rubric block during the delivery.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n -->\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/class -->\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"class\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Class\", options) : helperMissing.call(depth0, \"__\", \"Class\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"class\\\" data-bind=\\\"class\\\" data-bind-encoder=\\\"string\\\" data-validate=\\\"$pattern(pattern=^([a-zA-Z_\\\\s][a-zA-Z0-9_\\\\s-]*)?$);\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the XHTML-QTI class of the rubric block.\", options) : helperMissing.call(depth0, \"__\", \"Set the XHTML-QTI class of the rubric block.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/id -->\\n <!--\\n <div class=\\\"grid-row\\\">\\n <div class=\\\"col-5\\\">\\n <label for=\\\"id\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Identifier\", options) : helperMissing.call(depth0, \"__\", \"Identifier\", options)))\n + \"</label>\\n </div>\\n <div class=\\\"col-6\\\">\\n <input type=\\\"text\\\" name=\\\"id\\\" data-bind=\\\"id\\\" data-bind-encoder=\\\"string\\\" data-validate=\\\"$pattern(pattern=^([a-zA-Z_\\\\s][a-zA-Z0-9_\\\\s-]*)?$);\\\" />\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Set the XHTML-QTI identifier of the rubric block.\", options) : helperMissing.call(depth0, \"__\", \"Set the XHTML-QTI identifier of the rubric block.\", options)))\n + \"\\n </div>\\n </div>\\n </div>\\n -->\\n\\n <h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .rubric-feedback\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Feedback block\", options) : helperMissing.call(depth0, \"__\", \"Feedback block\", options)))\n + \"</h4>\\n\\n <!--assessmentTest/testPart/assessmentSection/sectionPart/rubricBlock/feedback -->\\n \";\n stack1 = helpers['with'].call(depth0, (depth0 && depth0.feedback), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n</div>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/category-presets', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data,depth1) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n<h4 class=\\\"toggler closed\\\" data-toggle=\\\"~ .category-preset-group-\";\n if (helper = helpers.groupId) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.groupId); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\";\n if (helper = helpers.groupLabel) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.groupLabel); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</h4>\\n\\n<div class=\\\"category-preset-group-\";\n if (helper = helpers.groupId) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.groupId); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \" toggled\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.presets), {hash:{},inverse:self.noop,fn:self.programWithDepth(2, program2, data, depth1),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n</div>\\n\\n\";\n return buffer;\n }\nfunction program2(depth0,data,depth2) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n <div class=\\\"grid-row pseudo-label-box category-preset\\\" data-qti-category=\\\"\";\n if (helper = helpers.qtiCategory) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.qtiCategory); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <div class=\\\"col-1\\\">\\n <label>\\n <input\\n type=\\\"checkbox\\\"\\n name=\\\"category-preset-\";\n if (helper = helpers.id) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.id); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n value=\\\"\";\n if (helper = helpers.qtiCategory) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.qtiCategory); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\"\\n \";\n stack1 = (helper = helpers.includes || (depth2 && depth2.includes),options={hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data},helper ? helper.call(depth0, (depth2 && depth2.categories), (depth0 && depth0.qtiCategory), options) : helperMissing.call(depth0, \"includes\", (depth2 && depth2.categories), (depth0 && depth0.qtiCategory), options));\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n />\\n <span class=\\\"icon-checkbox\\\"></span>\\n </label>\\n </div>\\n <div class=\\\"col-10\\\">\\n <label for=\\\"category-preset-\";\n if (helper = helpers.id) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.id); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</label>\\n </div>\\n <div class=\\\"col-1 help\\\">\\n <span class=\\\"icon-help\\\" data-tooltip=\\\"~ .tooltip-content\\\" data-tooltip-theme=\\\"info\\\"></span>\\n <div class=\\\"tooltip-content\\\">\\n \";\n if (helper = helpers.description) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.description); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n </div>\\n </div>\\n </div>\\n \";\n return buffer;\n }\nfunction program3(depth0,data) {\n \n \n return \"checked\";\n }\n\n stack1 = helpers.each.call(depth0, (depth0 && depth0.presetGroups), {hash:{},inverse:self.noop,fn:self.programWithDepth(1, program1, data, depth0),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n });\n});\n\n","define('taoQtiTest/controller/creator/templates/index',[\n 'taoQtiTest/controller/creator/config/defaults',\n 'tpl!taoQtiTest/controller/creator/templates/testpart',\n 'tpl!taoQtiTest/controller/creator/templates/section',\n 'tpl!taoQtiTest/controller/creator/templates/rubricblock',\n 'tpl!taoQtiTest/controller/creator/templates/itemref',\n 'tpl!taoQtiTest/controller/creator/templates/outcomes',\n 'tpl!taoQtiTest/controller/creator/templates/test-props',\n 'tpl!taoQtiTest/controller/creator/templates/testpart-props',\n 'tpl!taoQtiTest/controller/creator/templates/section-props',\n 'tpl!taoQtiTest/controller/creator/templates/itemref-props',\n 'tpl!taoQtiTest/controller/creator/templates/itemref-props-weight',\n 'tpl!taoQtiTest/controller/creator/templates/rubricblock-props',\n 'tpl!taoQtiTest/controller/creator/templates/category-presets'\n],\nfunction(\n defaults,\n testPart,\n section,\n rubricBlock,\n itemRef,\n outcomes,\n testProps,\n testPartProps,\n sectionProps,\n itemRefProps,\n itemRefPropsWeight,\n rubricBlockProps,\n categoryPresets\n){\n 'use strict';\n\n const applyTemplateConfiguration = (template) => (config) => template(defaults(config));\n\n /**\n * Expose all the templates used by the test creator\n * @exports taoQtiTest/controller/creator/templates/index\n */\n return {\n testpart : applyTemplateConfiguration(testPart),\n section : applyTemplateConfiguration(section),\n itemref : applyTemplateConfiguration(itemRef),\n rubricblock : applyTemplateConfiguration(rubricBlock),\n outcomes : applyTemplateConfiguration(outcomes),\n properties : {\n test : applyTemplateConfiguration(testProps),\n testpart : applyTemplateConfiguration(testPartProps),\n section : applyTemplateConfiguration(sectionProps),\n itemref : applyTemplateConfiguration(itemRefProps),\n itemrefweight : applyTemplateConfiguration(itemRefPropsWeight),\n rubricblock : applyTemplateConfiguration(rubricBlockProps),\n categorypresets : applyTemplateConfiguration(categoryPresets)\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014-2019 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/property',[\n 'jquery',\n 'uikitLoader',\n 'core/databinder',\n 'taoQtiTest/controller/creator/templates/index'\n],\nfunction($, ui, DataBinder, templates){\n 'use strict';\n\n /**\n * @callback PropertyViewCallback\n * @param {propertyView} propertyView - the view object\n */\n\n /**\n * The PropertyView setup the property panel component\n *\n * @exports taoQtiTest/controller/creator/views/property\n */\n var propView = function propView(tmplName, model){\n var $container = $('.test-creator-props');\n var template = templates.properties[tmplName];\n var $view;\n\n /**\n * Opens the view for the 1st time\n */\n var open = function propOpen(){\n var databinder,\n binderOptions = {\n templates: templates.properties\n };\n $container.children('.props').hide().trigger('propclose.propview');\n $view = $(template(model)).appendTo($container).filter('.props');\n\n //start listening for DOM compoenents inside the view\n ui.startDomComponent($view);\n\n //start the data binding\n databinder = new DataBinder($view, model, binderOptions);\n databinder.bind();\n\n propValidation();\n\n $view.trigger('propopen.propview');\n };\n\n /**\n * Get the view container element\n * @returns {jQueryElement}\n */\n var getView = function propGetView(){\n return $view;\n };\n\n /**\n * Check wheter the view is displayed\n * @returns {boolean} true id opened\n */\n var isOpen = function propIsOpen(){\n return $view.css('display') !== 'none';\n };\n\n /**\n * Bind a callback on view open\n * @param {PropertyViewCallback} cb\n */\n var onOpen = function propOnOpen(cb){\n $view.on('propopen.propview', function(e){\n e.stopPropagation();\n cb();\n });\n };\n\n\n /**\n * Bind a callback on view close\n * @param {PropertyViewCallback} cb\n */\n var onClose = function propOnClose(cb){\n $view.on('propclose.propview', function(e){\n e.stopPropagation();\n cb();\n });\n };\n\n /**\n * Removes the property view\n */\n var destroy = function propDestroy(){\n $view.remove();\n };\n\n /**\n * Toggles the property view display\n */\n var toggle = function propToggle(){\n $container.children('.props').not($view).hide().trigger('propclose.propview');\n if(isOpen()){\n $view.hide().trigger('propclose.propview');\n } else {\n $view.show().trigger('propopen.propview');\n }\n };\n\n /**\n * Set up the validation on the property view\n * @private\n */\n function propValidation() {\n var $togglers;\n $view.on('validated.group', function(e, isValid){\n if(e.namespace === 'group'){\n $togglers = $('#test-creator .property-toggler, #saver');\n if(isValid === true){\n $togglers.removeClass('disabled');\n } else {\n $togglers.addClass('disabled');\n }\n }\n });\n $view.groupValidator();\n }\n\n return {\n open : open,\n getView : getView,\n isOpen : isOpen,\n onOpen : onOpen,\n onClose : onClose,\n destroy : destroy,\n toggle : toggle\n };\n };\n\n return propView;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014-2020 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/actions',[\n'jquery',\n'taoQtiTest/controller/creator/views/property'],\nfunction($, propertyView){\n 'use strict';\n\n var disabledClass = 'disabled';\n var activeClass = 'active';\n var btnOnClass = 'tlb-button-on';\n\n /**\n * Set up the property view for an element\n * @param {jQueryElement} $container - that contains the property opener\n * @param {String} template - the name of the template to give to the propertyView\n * @param {Object} model - the model to bind\n * @param {PropertyViewCallback} cb - execute at view setup phase\n */\n function properties ($container, template, model, cb) {\n var propView = null;\n $container.find('.property-toggler').on('click', function(e){\n e.preventDefault();\n var $elt = $(this);\n if(!$(this).hasClass(disabledClass)){\n\n $elt.blur(); //to remove the focus\n\n if(propView === null){\n\n $container.addClass(activeClass);\n $elt.addClass(btnOnClass);\n\n propView = propertyView(template, model);\n propView.open();\n\n propView.onOpen(function(){\n $container.addClass(activeClass);\n $elt.addClass(btnOnClass);\n });\n propView.onClose(function(){\n $container.removeClass(activeClass);\n $elt.removeClass(btnOnClass);\n });\n\n if(typeof cb === 'function'){\n cb(propView);\n }\n } else {\n propView.toggle();\n }\n }\n });\n }\n\n\n /**\n * Enable to move an element\n * @param {jQueryElement} $actionContainer - where the mover is\n * @param {String} containerClass - the cssClass of the element container\n * @param {String} elementClass - the cssClass to identify elements\n */\n function move ($actionContainer, containerClass, elementClass) {\n var $element = $actionContainer.parents('.' + elementClass);\n var $container = $element.parents('.' + containerClass );\n\n //move up an element\n $('.move-up', $actionContainer).click(function(e){\n var $elements, index;\n\n //prevent default and click during animation\n e.preventDefault();\n if($element.is(':animated')){\n return false;\n }\n\n //get the position\n $elements = $('.' + elementClass, $container);\n index = $elements.index($element);\n if (index > 0) {\n $element.fadeOut(200, () => {\n $element\n .insertBefore($(`.${elementClass}:eq(${index - 1})`, $container))\n .fadeIn(400, () => $container.trigger('change') );\n });\n }\n });\n\n //move down an element\n $('.move-down', $actionContainer).click(function(e){\n var $elements, index;\n\n //prevent default and click during animation\n e.preventDefault();\n if($element.is(':animated')){\n return false;\n }\n\n //get the position\n $elements = $('.' + elementClass, $container);\n index = $elements.index($element);\n if (index < ($elements.length - 1) && $elements.length > 1) {\n $element.fadeOut(200, () => {\n $element\n .insertAfter($(`.${elementClass}:eq(${index + 1})`, $container))\n .fadeIn(400, () => $container.trigger('change') );\n });\n }\n });\n }\n\n /**\n * Update the movable state of an element\n * @param {jQueryElement} $container - the movable elements (scopped)\n * @param {String} elementClass - the cssClass to identify elements\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function movable ($container, elementClass, actionContainerElt){\n $container.each(function(){\n var $elt = $(this);\n var $actionContainer = $(actionContainerElt, $elt);\n\n var index = $container.index($elt);\n var $moveUp = $('.move-up', $actionContainer);\n var $moveDown = $('.move-down', $actionContainer);\n\n //only one test part, no moving\n if( $container.length === 1 ){\n $moveUp.addClass(disabledClass);\n $moveDown.addClass(disabledClass);\n\n //testpart is the first, only moving down\n } else if(index === 0) {\n $moveUp.addClass(disabledClass);\n $moveDown.removeClass(disabledClass);\n\n //testpart is the lasst, only moving up\n } else if ( index >= ($container.length - 1) ) {\n $moveDown.addClass(disabledClass);\n $moveUp.removeClass(disabledClass);\n\n //or enable moving top/bottom\n } else {\n $moveUp.removeClass(disabledClass);\n $moveDown.removeClass(disabledClass);\n }\n });\n }\n\n /**\n * Update the removable state of an element\n * @param {jQueryElement} $container - that contains the removable action\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function removable ($container, actionContainerElt){\n $container.each(function(){\n var $elt = $(this);\n var $actionContainer = $(actionContainerElt, $elt);\n var $delete = $('[data-delete]', $actionContainer);\n\n if($container.length <= 1){\n $delete.addClass(disabledClass);\n } else {\n $delete.removeClass(disabledClass);\n }\n });\n }\n\n /**\n * Disable all the actions of the target\n * @param {jQueryElement} $container - that contains the the actions\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function disable($container, actionContainerElt){\n $container.find(actionContainerElt).find('[data-delete],.move-up,.move-down').addClass(disabledClass);\n }\n\n /**\n * Enable all the actions of the target\n * @param {jQueryElement} $container - that contains the the actions\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function enable($container, actionContainerElt){\n $container.find(actionContainerElt).find('[data-delete],.move-up,.move-down').removeClass(disabledClass);\n }\n\n /**\n * The actions gives you shared behavior for some actions.\n *\n * @exports taoQtiTest/controller/creator/views/actions\n */\n return {\n properties : properties,\n move : move,\n removable : removable,\n movable : movable,\n disable : disable,\n enable : enable\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n/**\n * This helper manages the category selection UI:\n * - either via a text entry field that allow to enter any custom categories\n * - either via displaying grouped checkboxes that allow to select any categories presets\n * All categories are then grouped and given to this object's listeners, as they will later end up in the same model field.\n *\n * @author Christophe Noël <christophe@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/categorySelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/eventifier',\n 'ui/tooltip',\n 'taoQtiTest/controller/creator/templates/index',\n 'select2'\n], function($, _, __, eventifier, tooltip, templates) {\n 'use strict';\n\n var allPresets = [],\n allQtiCategoriesPresets = [];\n\n\n function categorySelectorFactory($container) {\n var categorySelector,\n\n $presetsContainer = $container.find('.category-presets'),\n $presetsCheckboxes,\n $customCategoriesSelect = $container.find('[name=category-custom]');\n\n /**\n * Read the form state from the DOM and trigger an event with the result, so the listeners can update the item/section model\n * @fires categorySelector#category-change\n */\n function updateCategories() {\n var selectedCategories,\n indeterminatedCategories,\n\n presetSelected = $container\n .find('.category-preset input:checked')\n .toArray()\n .map(function(categoryEl) {\n return categoryEl.value;\n }),\n presetIndeterminate = $container\n .find('.category-preset input:indeterminate')\n .toArray()\n .map(function(categoryEl) {\n return categoryEl.value;\n }),\n customSelected = $customCategoriesSelect.siblings('.select2-container').find('.select2-search-choice').not('.partial')\n .toArray()\n .map(function(categoryEl) {\n return categoryEl.textContent && categoryEl.textContent.trim();\n }),\n customIndeterminate = $customCategoriesSelect.siblings('.select2-container').find('.select2-search-choice.partial')\n .toArray()\n .map(function(categoryEl) {\n return categoryEl.textContent && categoryEl.textContent.trim();\n });\n\n selectedCategories = presetSelected.concat(customSelected);\n indeterminatedCategories = presetIndeterminate.concat(customIndeterminate);\n\n /**\n * @event categorySelector#category-change\n * @param {String[]} allCategories\n * @param {String[]} indeterminate\n */\n this.trigger('category-change', selectedCategories, indeterminatedCategories);\n }\n\n categorySelector = {\n /**\n * Create the category selection form\n *\n * @param {Array} [currentCategories] - all categories currently associated to the item. If applied to a section,\n * contains all the categories applied to at least one item of the section.\n */\n createForm: function createForm(currentCategories) {\n var self = this,\n presetsTpl = templates.properties.categorypresets,\n customCategories = _.difference(currentCategories, allQtiCategoriesPresets);\n\n // add preset checkboxes\n $presetsContainer.append(\n presetsTpl({presetGroups: allPresets})\n );\n\n $presetsContainer.on('click', function(e) {\n var $preset = $(e.target).closest('.category-preset'),\n $checkbox;\n\n if ($preset.length) {\n $checkbox = $preset.find('input');\n $checkbox.prop('indeterminate', false);\n\n _.defer(function() {\n updateCategories.call(self);\n });\n }\n });\n\n // init custom categories field\n $customCategoriesSelect.select2({\n width: '100%',\n tags : customCategories,\n multiple : true,\n tokenSeparators: [\",\", \" \", \";\"],\n formatNoMatches : function(){\n return __('Enter a custom category');\n },\n maximumInputLength : 32\n }).on('change', function(){\n updateCategories.call(self);\n });\n\n // enable help tooltips\n tooltip.lookup($container);\n },\n\n /**\n * Check/Uncheck boxes and fill the custom category field to match the new model\n * @param {String[]} selected - categories associated with an item, or with all the items of the same section\n * @param {String[]} [indeterminate] - categories in an indeterminate state at a section level\n */\n updateFormState: function updateFormState(selected, indeterminate) {\n var customCategories;\n\n indeterminate = indeterminate || [];\n\n customCategories = _.difference(selected.concat(indeterminate), allQtiCategoriesPresets);\n\n // Preset categories\n\n $presetsCheckboxes = $container.find('.category-preset input');\n $presetsCheckboxes.each(function() {\n var category = this.value;\n\n this.indeterminate = false;\n this.checked = false;\n\n if (indeterminate.indexOf(category) !== -1) {\n this.indeterminate = true;\n } else if (selected.indexOf(category) !== -1) {\n this.checked = true;\n }\n });\n\n // Custom categories\n\n $customCategoriesSelect.select2('val', customCategories);\n\n $customCategoriesSelect.siblings('.select2-container').find('.select2-search-choice').each(function(){\n var $li = $(this);\n var content = $li.find('div').text();\n if(indeterminate.indexOf(content) !== -1){\n $li.addClass('partial');\n }\n });\n }\n };\n\n eventifier(categorySelector);\n\n return categorySelector;\n }\n\n /**\n * @param {Object[]} presets - expected format:\n * [\n * {\n * groupId: 'navigation',\n * groupLabel: 'Test Navigation',\n * presets: [\n * {\n * id: 'nextPartWarning',\n * label: 'Next Part Warning',\n * qtiCategory : 'x-tao-option-nextPartWarning',\n * description : 'Displays a warning before the user finishes a part'\n * },\n * ...\n * ]\n * },\n * ...\n * ]\n */\n categorySelectorFactory.setPresets = function setPresets(presets) {\n if (_.isArray(presets)) {\n allPresets = presets;\n allQtiCategoriesPresets = extractCategoriesFromPresets();\n }\n };\n\n /**\n * Extract the qtiCategory property of all presets of all groups\n * @returns {String[]}\n */\n function extractCategoriesFromPresets() {\n return allPresets.reduce(function (prev, current) {\n var groupIds = _.pluck(current.presets, 'qtiCategory');\n return prev.concat(groupIds);\n }, []);\n }\n\n return categorySelectorFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n */\ndefine('taoQtiTest/controller/creator/helpers/sectionCategory',[\n 'lodash',\n 'i18n',\n 'core/errorHandler'\n], function (_, __, errorHandler){\n\n 'use strict';\n\n var _ns = '.sectionCategory';\n\n /**\n * Check if the given object is a valid assessmentSection model object\n *\n * @param {object} model\n * @returns {boolean}\n */\n function isValidSectionModel(model){\n return (_.isObject(model) && model['qti-type'] === 'assessmentSection' && _.isArray(model.sectionParts));\n }\n\n /**\n * Set an array of categories to the section model (affect the childen itemRef)\n *\n * @param {object} model\n * @param {array} selected - all categories active for the whole section\n * @param {array} partial - only categories in an indeterminate state\n * @returns {undefined}\n */\n function setCategories(model, selected, partial){\n\n var toRemove,\n toAdd,\n currentCategories = getCategories(model);\n\n partial = partial || [];\n\n //the categories that are no longer in the new list of categories should be removed\n toRemove = _.difference(currentCategories.all, selected.concat(partial));\n\n //the categories that are not in the current categories collection should be added to the children\n toAdd = _.difference(selected, currentCategories.propagated);\n\n model.categories = _.difference(model.categories, toRemove);\n model.categories = model.categories.concat(toAdd);\n\n //process the modification\n addCategories(model, toAdd);\n removeCategories(model, toRemove);\n }\n\n /**\n * Get the categories assign to the section model, infered by its interal itemRefs\n *\n * @param {object} model\n * @returns {object}\n */\n function getCategories(model) {\n var categories,\n arrays,\n union,\n propagated,\n partial,\n itemCount = 0;\n\n if (!isValidSectionModel(model)) {\n return errorHandler.throw(_ns, 'invalid tool config format');\n }\n\n categories = _.map(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef' && ++itemCount && _.isArray(itemRef.categories)){\n return _.compact(itemRef.categories);\n }\n });\n\n if (!itemCount) {\n return createCategories(model.categories, model.categories);\n }\n\n //array of categories\n arrays = _.values(categories);\n union = _.union.apply(null, arrays);\n\n //categories that are common to all itemRef\n propagated = _.intersection.apply(null, arrays);\n\n //the categories that are only partially covered on the section level : complementary of \"propagated\"\n partial = _.difference(union, propagated);\n\n return createCategories(union, propagated, partial);\n }\n\n /**\n * Add an array of categories to a section model (affect the childen itemRef)\n *\n * @param {object} model\n * @param {array} categories\n * @returns {undefined}\n */\n function addCategories(model, categories){\n if(isValidSectionModel(model)){\n _.each(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef'){\n if(!_.isArray(itemRef.categories)){\n itemRef.categories = [];\n }\n itemRef.categories = _.union(itemRef.categories, categories);\n }\n });\n }else{\n errorHandler.throw(_ns, 'invalid tool config format');\n }\n }\n\n /**\n * Remove an array of categories from a section model (affect the childen itemRef)\n *\n * @param {object} model\n * @param {array} categories\n * @returns {undefined}\n */\n function removeCategories(model, categories){\n if(isValidSectionModel(model)){\n _.each(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef' && _.isArray(itemRef.categories)){\n itemRef.categories = _.difference(itemRef.categories, categories);\n }\n });\n }else{\n errorHandler.throw(_ns, 'invalid tool config format');\n }\n }\n\n function createCategories(all = [], propagated = [], partial = []) {\n return _.mapValues({\n all: all,\n propagated: propagated,\n partial: partial\n }, function (categories) {\n return categories.sort();\n });\n }\n\n return {\n isValidSectionModel : isValidSectionModel,\n setCategories : setCategories,\n getCategories : getCategories,\n addCategories : addCategories,\n removeCategories : removeCategories\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/qtiTest',[\n 'lodash',\n 'i18n',\n 'taoQtiTest/controller/creator/helpers/outcome',\n 'taoQtiTest/controller/creator/helpers/qtiElement'\n], function(_, __, outcomeHelper, qtiElementHelper){\n 'use strict';\n\n //Identifiers must be unique across\n //those QTI types\n var qtiTypesForUniqueIds = [\n 'assessmentTest',\n 'testPart',\n 'assessmentSection',\n 'assessmentItemRef'\n ];\n\n /**\n * Utility to manage the QTI Test model\n * @exports taoQtiTest/controller/creator/qtiTestHelper\n */\n var qtiTestHelper = {\n\n /**\n * Extracts the identifiers from a QTI model\n * @param {Object|Object[]} model - the JSON QTI model\n * @param {String[]} [includesOnlyTypes] - list of qti-type to include, exclusively\n * @param {String[]} [excludeTypes] - list of qti-type to exclude, it excludes the children too\n * @returns {Object[]} a collection of identifiers (with some meta), if the id is not unique it will appear multiple times, as extracted.\n */\n extractIdentifiers : function extractIdentifiers(model, includesOnlyTypes, excludeTypes){\n\n var identifiers = [];\n\n var extract = function extract( element ) {\n if(element && _.has(element, 'identifier') && _.isString(element.identifier)){\n if(!includesOnlyTypes.length || _.contains(includesOnlyTypes, element['qti-type'])){\n identifiers.push({\n identifier : element.identifier.toUpperCase(),\n originalIdentifier : element.identifier,\n type : element['qti-type'],\n label : element.title || element.identifier\n });\n }\n }\n _.forEach(element, function(subElement) {\n if(_.isPlainObject(subElement) || _.isArray(subElement)){\n if(!excludeTypes.length || !_.contains(excludeTypes, subElement['qti-type']) ){\n extract(subElement);\n }\n }\n });\n };\n\n if (_.isPlainObject(model) || _.isArray(model)) {\n excludeTypes = excludeTypes || [];\n includesOnlyTypes = includesOnlyTypes || [];\n\n extract(model);\n }\n return identifiers;\n },\n\n /**\n * Get the list of unique identifiers for the given model.\n * @param {Object|Object[]} model - the JSON QTI model\n * @param {String[]} [includesOnlyTypes] - list of qti-type to include, exclusively\n * @param {String[]} [excludeTypes] - list of qti-type to exclude, it excludes the children too\n * @returns {String[]} the list of unique identifiers\n */\n getIdentifiers : function getIdentifiers(model, includesOnlyTypes, excludeTypes){\n return _.uniq(_.pluck(this.extractIdentifiers(model, includesOnlyTypes, excludeTypes), 'identifier'));\n },\n\n /**\n * Get the list of identifiers for a given QTI type, only.\n * @param {Object|Object[]} model - the JSON QTI model\n * @param {String} qtiType - the type of QTI element to get the identifiers.\n * @returns {String[]} the list of unique identifiers\n */\n getIdentifiersOf : function getIdentifiersOf(model, qtiType){\n return this.getIdentifiers(model, [qtiType]);\n },\n\n /**\n * Get a valid and available QTI identifier for the given type\n * @param {Object|Object[]} model - the JSON QTI model to check the existing IDs\n * @param {String} qtiType - the type of element you want an id for\n * @param {String} [suggestion] - the default pattern body, we use the type otherwise\n * @returns {String} the generated identifier\n */\n getAvailableIdentifier : function getAvailableIdentifier(model, qtiType, suggestion){\n var index = 1;\n var glue = '-';\n var identifier;\n var current;\n if(_.contains(qtiTypesForUniqueIds, qtiType)){\n current = this.getIdentifiers(model, qtiTypesForUniqueIds);\n } else {\n current = this.getIdentifiersOf(model, qtiType);\n }\n\n suggestion = suggestion || qtiType;\n\n do {\n identifier = suggestion + glue + (index++);\n } while(_.contains(current, identifier.toUpperCase()));\n\n return identifier;\n },\n\n /**\n * Gives you a validator that check QTI id format\n * @returns {Object} the validator\n */\n idFormatValidator : function idFormatValidator(){\n var qtiIdPattern = /^[_a-zA-Z]{1}[a-zA-Z0-9\\-._]{0,31}$/i;\n return {\n name : 'idFormat',\n message : __('is not a valid identifier (alphanum, underscore, dash and dots)'),\n validate : function(value, callback){\n if(typeof callback === 'function'){\n callback(qtiIdPattern.test(value));\n }\n }\n };\n },\n\n /**\n * Gives you a validator that check QTI id format of the test (it is different from the others...)\n * @returns {Object} the validator\n */\n testidFormatValidator : function testidFormatValidator(){\n var qtiTestIdPattern = /^\\S+$/;\n return {\n name : 'testIdFormat',\n message : __('is not a valid identifier (everything except spaces)'),\n validate : function(value, callback){\n if(typeof callback === 'function'){\n callback(qtiTestIdPattern.test(value));\n }\n }\n };\n },\n\n /**\n * Gives you a validator that check if a QTI id is available\n * @param {Object} modelOverseer - let's you get the data model\n * @returns {Object} the validator\n */\n idAvailableValidator : function idAvailableValidator(modelOverseer){\n var self = this;\n\n return {\n name : 'testIdAvailable',\n message : __('is already used in the test.'),\n validate : function(value, callback){\n var counts = {};\n var key = value.toUpperCase();\n var identifiers = self.extractIdentifiers(modelOverseer.getModel(), qtiTypesForUniqueIds);\n if(typeof callback === 'function'){\n counts = _.countBy(identifiers, 'identifier');\n //the identifier list always contains itself\n //so we check if another one is identical (ie. >= 2)\n callback(typeof counts[key] === 'undefined' || counts[key] < 2);\n }\n }\n };\n },\n\n /**\n * Does the value contains the type type\n * @param {Object} value\n * @param {string} type\n * @returns {boolean}\n */\n filterQtiType : function filterQtiType (value, type){\n return value['qti-type'] && value['qti-type'] === type;\n },\n\n /**\n * Add the 'qti-type' properties to object that miss it, using the parent key name\n * @param {Object|Array} collection\n * @param {string} parentType\n */\n addMissingQtiType : function addMissingQtiType(collection, parentType) {\n var self = this;\n _.forEach(collection, function(value, key) {\n if (_.isObject(value) && !_.isArray(value) && !_.has(value, 'qti-type')) {\n if (_.isNumber(key)) {\n if (parentType) {\n value['qti-type'] = parentType;\n }\n } else {\n value['qti-type'] = key;\n }\n }\n if (_.isArray(value)) {\n self.addMissingQtiType(value, key.replace(/s$/, ''));\n } else if (_.isObject(value)) {\n self.addMissingQtiType(value);\n }\n });\n },\n\n /**\n * Applies consolidation rules to the model\n * @param {Object} model\n * @returns {Object}\n */\n consolidateModel : function consolidateModel(model){\n if(model && model.testParts && _.isArray(model.testParts)){\n\n _.forEach(model.testParts, function(testPart) {\n\n if(testPart.assessmentSections && _.isArray(testPart.assessmentSections)){\n\n _.forEach(testPart.assessmentSections, function(assessmentSection) {\n\n //remove ordering is shuffle is false\n if(assessmentSection.ordering &&\n typeof assessmentSection.ordering.shuffle !== 'undefined' && assessmentSection.ordering.shuffle === false){\n delete assessmentSection.ordering;\n }\n\n // clean categories (QTI identifier can't be empty string)\n if(assessmentSection.sectionParts && _.isArray(assessmentSection.sectionParts)) {\n _.forEach(assessmentSection.sectionParts, function(part) {\n if(part.categories && _.isArray(part.categories) && (part.categories.length === 0 || part.categories[0].length === 0)) {\n part.categories = [];\n }\n });\n }\n\n if(assessmentSection.rubricBlocks && _.isArray(assessmentSection.rubricBlocks)) {\n\n //remove rubric blocks if empty\n if (assessmentSection.rubricBlocks.length === 0 ||\n (assessmentSection.rubricBlocks.length === 1 && assessmentSection.rubricBlocks[0].content.length === 0) ) {\n\n delete assessmentSection.rubricBlocks;\n }\n //ensure the view attribute is present\n else if(assessmentSection.rubricBlocks.length > 0){\n _.forEach(assessmentSection.rubricBlocks, function(rubricBlock){\n rubricBlock.views = ['candidate'];\n //change once views are supported\n //if(rubricBlock && rubricBlock.content && (!rubricBlock.views || (_.isArray(rubricBlock.views) && rubricBlock.views.length === 0))){\n //rubricBlock.views = ['candidate'];\n //}\n });\n }\n }\n });\n }\n });\n }\n return model;\n },\n\n /**\n * Validates the provided model\n * @param {Object} model\n * @throws {Error} if the model is not valid\n */\n validateModel: function validateModel(model) {\n var identifiers = this.extractIdentifiers(model, qtiTypesForUniqueIds);\n var nonUniqueIdentifiers = 0;\n var outcomes = _.indexBy(outcomeHelper.listOutcomes(model));\n var messageDetails = '';\n\n _(identifiers)\n .countBy('identifier')\n .forEach(function(count, id){\n if(count > 1){\n nonUniqueIdentifiers++;\n messageDetails += '\\n' + id.originalIdentifier + ' : ' +\n id.type + ' ' +\n id.label;\n }\n });\n if(nonUniqueIdentifiers.length > 1){\n throw new Error(__('The following identifiers are not unique accross the test : %s', messageDetails));\n }\n\n _.forEach(model.testParts, function (testPart) {\n _.forEach(testPart.assessmentSections, function (assessmentSection) {\n _.forEach(assessmentSection.rubricBlocks, function (rubricBlock) {\n var feedbackBlock = qtiElementHelper.lookupElement(rubricBlock, 'rubricBlock.div.feedbackBlock', 'content');\n if (feedbackBlock && !outcomes[feedbackBlock.outcomeIdentifier]) {\n throw new Error(__('The outcome \"%s\" does not exist, but it is referenced by a feedback block!', feedbackBlock.outcomeIdentifier));\n }\n });\n });\n });\n }\n };\n\n return qtiTestHelper;\n});\n\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/itemref',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoQtiTest/controller/creator/views/actions',\n 'taoQtiTest/controller/creator/helpers/categorySelector',\n 'taoQtiTest/controller/creator/helpers/sectionCategory',\n 'taoQtiTest/controller/creator/helpers/qtiTest',\n 'taoQtiTest/controller/creator/templates/index'\n],\nfunction(\n $,\n _,\n __,\n actions,\n categorySelectorFactory,\n sectionCategory,\n qtiTestHelper,\n templates\n){\n 'use strict';\n\n /**\n * We need to resize the itemref in case of long labels\n */\n var resize = _.throttle(function resize(){\n var $refs = $('.itemrefs').first();\n var $actions = $('.itemref .actions').first();\n var width = $refs.innerWidth() - $actions.outerWidth();\n $('.itemref > .title').width(width);\n }, 100);\n\n /**\n * Set up an item ref: init action behaviors. Called for each one.\n *\n * @param {Object} creatorContext\n * @param {Object} refModel - the data model to bind to the item ref\n * @param {Object} sectionModel - the parent data model to inherit\n * @param {Object} partModel - the model of the parent's test part\n * @param {jQueryElement} $itemRef - the itemRef element to set up\n */\n function setUp (creatorContext, refModel, sectionModel, partModel, $itemRef) {\n\n var modelOverseer = creatorContext.getModelOverseer();\n var config = modelOverseer.getConfig() || {};\n var $actionContainer = $('.actions', $itemRef);\n\n // set item session control to use test part options if section level isn't set\n if (!refModel.itemSessionControl) {\n refModel.itemSessionControl = {};\n }\n _.defaults(refModel.itemSessionControl, sectionModel.itemSessionControl);\n\n refModel.isLinear = partModel.navigationMode === 0;\n\n actions.properties($actionContainer, 'itemref', refModel, propHandler);\n actions.move($actionContainer, 'itemrefs', 'itemref');\n\n resize();\n\n /**\n * Set up the time limits behaviors :\n * - linear test part: display the minTime field\n * - linear + guided nav option : display the minTime field + the lock\n * - otherwise only the maxTime field\n * @param {propView} propView - the view object\n */\n function timeLimitsProperty(propView){\n var $view = propView.getView();\n\n //target elements\n var $minTimeContainer = $('.mintime-container', $view);\n var $maxTimeContainer = $('.maxtime-container', $view);\n var $lockedTimeContainer = $('.lockedtime-container', $view);\n var $locker = $('.locker button', $lockedTimeContainer);\n var $durationFields = $(':text[data-duration]', $lockedTimeContainer);\n var $minTimeField = $(':text[name=\"min-time\"]', $lockedTimeContainer);\n var $maxTimeField = $(':text[name=\"max-time\"]', $lockedTimeContainer);\n\n /**\n * Sync min value to max value, trigger change to sync the component.\n * Need to temporally remove the other handler to prevent infinite loop\n */\n var minToMaxHandler = _.throttle(function minToMax(){\n $maxTimeField.off('change.sync');\n $maxTimeField.val($minTimeField.val()).trigger('change');\n _.defer(function(){\n $maxTimeField.on('change.sync', minToMaxHandler);\n });\n }, 200);\n\n /**\n * Sync max value to min value, trigger change to sync the component.\n * Need to temporally remove the other handler to prevent infinite loop\n */\n var maxToMinHandler = _.throttle(function maxToMin(){\n $minTimeField.off('change.sync');\n $minTimeField.val($maxTimeField.val()).trigger('change');\n _.defer(function(){\n $minTimeField.on('change.sync', minToMaxHandler);\n });\n }, 200);\n\n /**\n * Lock the timers\n */\n var lockTimers = function lockTimers(){\n $locker.removeClass('unlocked')\n .addClass('locked')\n .attr('title', __('Unlink to use separated durations'));\n\n //sync min to max\n $minTimeField.val($maxTimeField.val()).trigger('change');\n\n //keep both in sync\n $minTimeField.on('change.sync', minToMaxHandler);\n $maxTimeField.on('change.sync', maxToMinHandler);\n };\n\n /**\n * Unlock the timers\n */\n var unlockTimers = function unlockTimers(){\n $locker.removeClass('locked')\n .addClass('unlocked')\n .attr('title', __('Link durations to activate the guided navigation'));\n\n $durationFields.off('change.sync');\n $minTimeField.val('00:00:00').trigger('change');\n };\n\n /**\n * Toggle the timelimits modes max, min + max, min + max + locked\n */\n var toggleTimeContainers = function toggleTimeContainers(){\n refModel.isLinear = partModel.navigationMode === 0;\n if(refModel.isLinear && config.guidedNavigation){\n $minTimeContainer.addClass('hidden');\n $maxTimeContainer.addClass('hidden');\n $lockedTimeContainer.removeClass('hidden');\n if($minTimeField.val() === $maxTimeField.val() && $maxTimeField.val() !== '00:00:00'){\n lockTimers();\n }\n $locker.on('click', function(e){\n e.preventDefault();\n\n if($locker.hasClass('locked')){\n unlockTimers();\n } else {\n lockTimers();\n }\n });\n } else if (refModel.isLinear){\n $lockedTimeContainer.addClass('hidden');\n $minTimeContainer.removeClass('hidden');\n $maxTimeContainer.removeClass('hidden');\n } else {\n $lockedTimeContainer.addClass('hidden');\n $minTimeContainer.addClass('hidden');\n $maxTimeContainer.removeClass('hidden');\n }\n };\n\n //if the testpart changes it's navigation mode\n modelOverseer.on('testpart-change', function(){\n toggleTimeContainers();\n });\n\n toggleTimeContainers();\n\n //chek if min <= maw\n $durationFields.on('change.check', function(){\n if( refModel.timeLimits.minTime > 0 &&\n refModel.timeLimits.maxTime > 0 &&\n refModel.timeLimits.minTime > refModel.timeLimits.maxTime ) {\n\n $minTimeField.parent('div').find('.duration-ctrl-wrapper').addClass('brd-danger');\n } else {\n $minTimeField.parent('div').find('.duration-ctrl-wrapper').removeClass('brd-danger');\n }\n });\n }\n\n /**\n * Set up the category property\n * @private\n * @param {jQueryElement} $view - the $view object containing the $select\n */\n function categoriesProperty($view){\n var categorySelector = categorySelectorFactory($view),\n $categoryField = $view.find('[name=\"itemref-category\"]');\n\n categorySelector.createForm();\n categorySelector.updateFormState(refModel.categories);\n\n $view.on('propopen.propview', function(){\n categorySelector.updateFormState(refModel.categories);\n });\n\n categorySelector.on('category-change', function(selected) {\n // Let the binder update the model by going through the category hidden field\n $categoryField.val(selected.join(','));\n $categoryField.trigger('change');\n\n modelOverseer.trigger('category-change', selected);\n });\n }\n\n /**\n * Setup the weights properties\n */\n function weightsProperty(propView) {\n var $view = propView.getView(),\n $weightList = $view.find('[data-bind-each=\"weights\"]'),\n weightTpl = templates.properties.itemrefweight;\n\n $view.find('.itemref-weight-add').on('click', function(e) {\n var defaultData = {\n value: 1,\n 'qti-type' : 'weight',\n identifier: (refModel.weights.length === 0) ? 'WEIGHT' : qtiTestHelper.getAvailableIdentifier(refModel, 'weight', 'WEIGHT')\n };\n e.preventDefault();\n\n $weightList.append(weightTpl(defaultData));\n refModel.weights.push(defaultData);\n $weightList.trigger('add.internalbinder'); // trigger model update\n\n $view.groupValidator();\n });\n }\n\n /**\n * Perform some binding once the property view is create\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n const removePropHandler = function removePropHandler(e, $deletedNode){\n const validIds = [\n $itemRef.attr('id'),\n $itemRef.parents('.section').attr('id'),\n $itemRef.parents('.testpart').attr('id')\n ];\n const deletedNodeId = $deletedNode.attr('id');\n\n if (propView !== null && validIds.includes(deletedNodeId)) {\n propView.destroy();\n }\n };\n\n categoriesProperty(propView.getView());\n weightsProperty(propView);\n timeLimitsProperty(propView);\n\n $itemRef.parents('.testparts').on('deleted.deleter', removePropHandler);\n }\n }\n\n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n function listenActionState (){\n\n $('.itemrefs').each(function(){\n actions.movable($('.itemref', $(this)), 'itemref', '.actions');\n });\n\n $(document)\n .on('delete', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('itemref')){\n $parent = $target.parents('.itemrefs');\n actions.disable($parent.find('.itemref'), '.actions');\n }\n })\n .on('add change undo.deleter deleted.deleter', '.itemrefs', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('itemref') || $target.hasClass('itemrefs')){\n $parent = $('.itemref', $target.hasClass('itemrefs') ? $target : $target.parents('.itemrefs'));\n actions.enable($parent, '.actions');\n actions.movable($parent, 'itemref', '.actions');\n }\n });\n }\n\n /**\n * The itemrefView setup itemref related components and beahvior\n *\n * @exports taoQtiTest/controller/creator/views/itemref\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState,\n resize : resize\n };\n\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/encoders/dom2qti',[\n 'jquery',\n 'lodash',\n 'taoQtiTest/controller/creator/helpers/qtiElement',\n 'taoQtiTest/controller/creator/helpers/baseType',\n 'lib/dompurify/purify'\n], function ($, _, qtiElementHelper, baseType, DOMPurify) {\n 'use strict';\n\n /**\n * A mapping of QTI-XML node and attributes names in order to keep the camel case form\n * @type {Object}\n */\n const normalizedNodes = {\n feedbackblock: 'feedbackBlock',\n outcomeidentifier: 'outcomeIdentifier',\n showhide: 'showHide',\n printedvariable: 'printedVariable',\n powerform: 'powerForm',\n mappingindicator: 'mappingIndicator'\n };\n\n /**\n * Some Nodes have attributes that needs typing during decoding.\n * @type {Object}\n */\n const typedAttributes = {\n printedVariable: {\n identifier: baseType.getConstantByName('identifier'),\n powerForm: baseType.getConstantByName('boolean'),\n base: baseType.getConstantByName('intOrIdentifier'),\n index: baseType.getConstantByName('intOrIdentifier'),\n delimiter: baseType.getConstantByName('string'),\n field: baseType.getConstantByName('string'),\n mappingIndicator: baseType.getConstantByName('string')\n }\n };\n\n /**\n * Get the list of objects attributes to encode\n * @param {Object} object\n * @returns {Array}\n */\n function getAttributes(object) {\n return _.omit(object, [\n 'qti-type',\n 'content',\n 'xmlBase',\n 'lang',\n 'label'\n ]);\n }\n\n /**\n * Encode object's properties to xml/html string attributes\n * @param {Object} attributes\n * @returns {String}\n */\n function attrToStr(attributes) {\n return _.reduce(attributes, function (acc, value, key) {\n if (_.isNumber(value) || _.isBoolean(value) || (_.isString(value) && !_.isEmpty(value))) {\n return acc + ' ' + key + '=\"' + value + '\" ';\n }\n return acc;\n }, '');\n }\n\n /**\n * Ensures the nodeName has a normalized form:\n * - standard HTML tags are in lower case\n * - QTI-XML tags are in the right form\n * @param {String} nodeName\n * @returns {String}\n */\n function normalizeNodeName(nodeName) {\n const normalized = (nodeName) ? nodeName.toLocaleLowerCase() : '';\n return normalizedNodes[normalized] || normalized;\n }\n\n /**\n * This encoder is used to transform DOM to JSON QTI and JSON QTI to DOM.\n * It works now for the rubricBlocks components.\n * @exports creator/encoders/dom2qti\n */\n return {\n\n /**\n * Encode an object to a dom string\n * @param {Object} modelValue\n * @returns {String}\n */\n encode: function (modelValue) {\n let self = this,\n startTag;\n\n if (_.isArray(modelValue)) {\n return _.reduce(modelValue, function (result, value) {\n return result + self.encode(value);\n }, '');\n } else if (_.isObject(modelValue) && modelValue['qti-type']) {\n if (modelValue['qti-type'] === 'textRun') {\n return modelValue.content;\n }\n startTag = '<' + modelValue['qti-type'] + attrToStr(getAttributes(modelValue));\n if (modelValue.content) {\n return startTag + '>' + self.encode(modelValue.content) + '</' + modelValue['qti-type'] + '>';\n } else {\n return startTag + '/>';\n }\n }\n return '' + modelValue;\n },\n\n /**\n * Decode a string that represents a DOM to a QTI formatted object\n * @param {String} nodeValue\n * @returns {Array}\n */\n decode: function (nodeValue) {\n const self = this;\n const $nodeValue = (nodeValue instanceof $) ? nodeValue : $(nodeValue);\n const result = [];\n let nodeName;\n\n _.forEach($nodeValue, function (elt) {\n let object;\n if (elt.nodeType === 3) {\n if (!_.isEmpty($.trim(elt.nodeValue))) {\n result.push(qtiElementHelper.create('textRun', {\n 'content': DOMPurify.sanitize(elt.nodeValue),\n 'xmlBase': ''\n }));\n }\n } else if (elt.nodeType === 1) {\n nodeName = normalizeNodeName(elt.nodeName);\n\n object = _.merge(qtiElementHelper.create(nodeName, {\n 'id': '',\n 'class': '',\n 'xmlBase': '',\n 'lang': '',\n 'label': ''\n }),\n _.transform(elt.attributes, function (acc, value) {\n const attrName = normalizeNodeName(value.nodeName);\n if (attrName) {\n if (typedAttributes[nodeName] && typedAttributes[nodeName][attrName]) {\n acc[attrName] = baseType.getValue(typedAttributes[nodeName][attrName], value.nodeValue);\n } else {\n acc[attrName] = value.nodeValue;\n }\n }\n }));\n if (elt.childNodes.length > 0) {\n object.content = self.decode(elt.childNodes);\n }\n result.push(object);\n }\n });\n return result;\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA;\n */\n/**\n * Instanciate a Wysiwyg editor to create QTI content.\n *\n * @author Christophe Noël <christophe@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/qtiContentCreator',[\n 'lodash',\n 'jquery',\n 'lib/uuid',\n 'taoQtiItem/qtiCreator/helper/commonRenderer',\n 'taoQtiItem/qtiCreator/editor/containerEditor'\n], function(_, $, uuid, qtiCommonRenderer, containerEditor) {\n 'use strict';\n\n return {\n create: function create(creatorContext, $container, options) {\n var self = this,\n editorId = uuid(),\n areaBroker = creatorContext.getAreaBroker(),\n modelOverseer = creatorContext.getModelOverseer();\n\n var removePlugins = [\n 'magicline',\n 'taoqtiimage',\n 'taoqtimedia',\n 'taoqtimaths',\n 'taoqtiinclude',\n 'taoqtitable',\n 'sharedspace' // That Ck instance still use floatingspace to position the toolbar, whereas the sharedspace plugin is used by the Item creator\n ].join(','),\n\n toolbar = [\n {\n name : 'basicstyles',\n items : ['Bold', 'Italic', 'Subscript', 'Superscript']\n }, {\n name : 'insert',\n items : ['SpecialChar', 'TaoQtiPrintedVariable']\n }, {\n name : 'links',\n items : ['Link']\n },\n '/',\n {\n name : 'styles',\n items : ['Format']\n }, {\n name : 'paragraph',\n items : ['NumberedList', 'BulletedList', '-', 'Blockquote', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock']\n }\n ];\n\n qtiCommonRenderer.setContext(areaBroker.getContentCreatorPanelArea());\n\n containerEditor.create($container, {\n areaBroker: areaBroker,\n removePlugins: removePlugins,\n toolbar: toolbar,\n metadata: {\n getOutcomes: function getOutcomes() {\n return modelOverseer.getOutcomesNames();\n }\n },\n change: options.change || _.noop,\n resetRenderer: true,\n autofocus: false\n });\n\n // destroying ckInstance on editor close\n creatorContext.on('creatorclose.' + editorId, function() {\n self.destroy(creatorContext, $container);\n });\n\n $container.data('editorId', editorId);\n },\n\n /**\n * @returns {Promise} - when editor is destroyed\n */\n destroy: function destroy(creatorContext, $container) {\n var editorId = $container.data('editorId');\n if (editorId) {\n creatorContext.off('.' + editorId);\n }\n return containerEditor.destroy($container);\n }\n };\n});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/rubricblock',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'ui/dialog/alert',\n 'util/namespace',\n 'taoQtiTest/controller/creator/views/actions',\n 'helpers',\n 'taoQtiTest/controller/creator/encoders/dom2qti',\n 'taoQtiTest/controller/creator/helpers/qtiElement',\n 'taoQtiTest/controller/creator/qtiContentCreator',\n 'ckeditor',\n], function ($, _, __, hider, dialogAlert, namespaceHelper, actions, helpers, Dom2QtiEncoder, qtiElementHelper, qtiContentCreator) {\n 'use strict';\n\n /**\n * The rubriclockView setup RB related components and behavior\n *\n * @exports taoQtiTest/controller/creator/views/rubricblock\n */\n return {\n /**\n * Set up a rubric block: init action behaviors. Called for each one.\n *\n * @param {Object} creatorContext\n * @param {Object} rubricModel - the rubric block data\n * @param {jQueryElement} $rubricBlock - the rubric block to set up\n */\n setUp: function setUp(creatorContext, rubricModel, $rubricBlock) {\n var modelOverseer = creatorContext.getModelOverseer();\n var areaBroker = creatorContext.getAreaBroker();\n var $rubricBlockContent = $('.rubricblock-content', $rubricBlock);\n\n /**\n * Bind a listener only related to this rubric.\n * @param {jQuery} $el\n * @param {String} eventName\n * @param {Function} cb\n * @returns {jQuery}\n */\n function bindEvent($el, eventName, cb) {\n eventName = namespaceHelper.namespaceAll(eventName, rubricModel.uid);\n return $el.off(eventName).on(eventName, cb);\n }\n\n /**\n * Ensures an html content is wrapped by a container tag.\n * @param {String} html\n * @returns {String}\n */\n function ensureWrap(html) {\n html = (html || '').trim();\n if (html.charAt(0) !== '<' || html.charAt(html.length - 1) !== '>') {\n html = '<div>' + html + '</div>';\n }\n if ($(html).length > 1) {\n html = '<div>' + html + '</div>';\n }\n return html;\n }\n\n /**\n * Forwards the editor content into the model\n */\n function editorToModel(html) {\n var rubric = qtiElementHelper.lookupElement(rubricModel, 'rubricBlock', 'content');\n var wrapper = qtiElementHelper.lookupElement(rubricModel, 'rubricBlock.div.feedbackBlock', 'content');\n var content = Dom2QtiEncoder.decode(ensureWrap(html));\n\n if (wrapper) {\n wrapper.content = content;\n } else {\n rubric.content = content;\n }\n }\n\n /**\n * Forwards the model content into the editor\n */\n function modelToEditor() {\n var rubric = qtiElementHelper.lookupElement(rubricModel, 'rubricBlock', 'content') || {};\n var wrapper = qtiElementHelper.lookupElement(rubricModel, 'rubricBlock.div.feedbackBlock', 'content');\n var content = wrapper ? wrapper.content : rubric.content;\n var html = ensureWrap(Dom2QtiEncoder.encode(content));\n\n // Destroy any existing CKEditor instance\n qtiContentCreator.destroy(creatorContext, $rubricBlockContent).then(function() {\n // update the editor content\n $rubricBlockContent.html(html);\n\n // Re-create the Qti-ckEditor instance\n qtiContentCreator.create(creatorContext, $rubricBlockContent, {\n change: function change(editorContent) {\n editorToModel(editorContent);\n }\n });\n });\n }\n\n /**\n * Wrap/unwrap the rubric block in a feedback according to the user selection\n * @param {Object} feedback\n * @returns {Boolean}\n */\n function updateFeedback(feedback) {\n var activated = feedback && feedback.activated;\n var wrapper = qtiElementHelper.lookupElement(rubricModel, 'rubricBlock.div.feedbackBlock', 'content');\n\n if (activated) {\n // wrap the actual content into a feedbackBlock if needed\n if (!wrapper) {\n rubricModel.content = [qtiElementHelper.create('div', {\n content: [qtiElementHelper.create('feedbackBlock', {\n outcomeIdentifier: feedback.outcome,\n identifier: feedback.matchValue,\n content: rubricModel.content\n })]\n })];\n } else {\n wrapper.outcomeIdentifier = feedback.outcome;\n wrapper.identifier = feedback.matchValue;\n }\n modelToEditor();\n } else {\n // remove the feedbackBlock wrapper, just keep the actual content\n if (wrapper) {\n rubricModel.content = wrapper.content;\n modelToEditor();\n }\n }\n\n return activated;\n }\n\n /**\n * Perform some binding once the property view is created\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler(propView) {\n var $view = propView.getView();\n var $feedbackOutcomeLine = $('.rubric-feedback-outcome', $view);\n var $feedbackMatchLine = $('.rubric-feedback-match-value', $view);\n var $feedbackOutcome = $('[name=feedback-outcome]', $view);\n var $feedbackActivated = $('[name=activated]', $view);\n\n // toggle the feedback panel\n function changeFeedback(activated) {\n hider.toggle($feedbackOutcomeLine, activated);\n hider.toggle($feedbackMatchLine, activated);\n }\n\n // should be called when the properties panel is removed\n function removePropHandler() {\n rubricModel.feedback = {};\n if (propView !== null) {\n propView.destroy();\n }\n }\n\n // take care of changes in the properties view\n function changeHandler(e, changedModel) {\n if (e.namespace === 'binder' && changedModel['qti-type'] === 'rubricBlock') {\n changeFeedback(updateFeedback(changedModel.feedback));\n }\n }\n\n // update the list of outcomes the feedback can target\n function updateOutcomes() {\n var activated = rubricModel.feedback && rubricModel.feedback.activated;\n // build the list of outcomes in a way select2 can understand\n var outcomes = _.map(modelOverseer.getOutcomesNames(), function(name) {\n return {\n id: name,\n text: name\n };\n });\n\n // create/update the select field\n $feedbackOutcome.select2({\n minimumResultsForSearch: -1,\n width: '100%',\n data: outcomes\n });\n\n // update the UI to reflect the data\n if (!activated) {\n $feedbackActivated.prop('checked', false);\n }\n changeFeedback(activated);\n }\n\n $('[name=type]', $view).select2({\n minimumResultsForSearch: -1,\n width: '100%'\n });\n\n $view.on('change.binder', changeHandler);\n bindEvent($rubricBlock.parents('.testpart'), 'delete', removePropHandler);\n bindEvent($rubricBlock.parents('.section'), 'delete', removePropHandler);\n bindEvent($rubricBlock, 'delete', removePropHandler);\n bindEvent($rubricBlock, 'outcome-removed', function() {\n $feedbackOutcome.val('');\n updateOutcomes();\n });\n bindEvent($rubricBlock, 'outcome-updated', function() {\n updateFeedback(rubricModel.feedback);\n updateOutcomes();\n });\n\n changeFeedback(rubricModel.feedback);\n updateOutcomes();\n rbViews($view);\n }\n\n /**\n * Set up the views select box\n * @private\n * @param {jQueryElement} $propContainer - the element container\n */\n function rbViews($propContainer) {\n var $select = $('[name=view]', $propContainer);\n\n bindEvent($select.select2({'width': '100%'}), \"select2-removed\", function () {\n if ($select.select2('val').length === 0) {\n $select.select2('val', [1]);\n }\n });\n\n if ($select.select2('val').length === 0) {\n $select.select2('val', [1]);\n }\n }\n\n rubricModel.orderIndex = (rubricModel.index || 0) + 1;\n rubricModel.uid = _.uniqueId('rb');\n rubricModel.feedback = {\n activated: !!qtiElementHelper.lookupElement(rubricModel, 'rubricBlock.div.feedbackBlock', 'content'),\n outcome: qtiElementHelper.lookupProperty(rubricModel, 'rubricBlock.div.feedbackBlock.outcomeIdentifier', 'content'),\n matchValue: qtiElementHelper.lookupProperty(rubricModel, 'rubricBlock.div.feedbackBlock.identifier', 'content')\n };\n\n modelOverseer\n .before('scoring-write.' + rubricModel.uid, function() {\n var feedbackOutcome = rubricModel.feedback && rubricModel.feedback.outcome;\n if (feedbackOutcome && _.indexOf(modelOverseer.getOutcomesNames(), feedbackOutcome) < 0) {\n // the targeted outcome has been removed, so remove the feedback\n modelOverseer.changedRubricBlock = (modelOverseer.changedRubricBlock || 0) + 1;\n rubricModel.feedback.activated = false;\n rubricModel.feedback.outcome = '';\n updateFeedback(rubricModel.feedback);\n $rubricBlock.trigger('outcome-removed');\n } else {\n // the tageted outcome is still here, just notify the properties panel to update the list\n $rubricBlock.trigger('outcome-updated');\n }\n })\n .on('scoring-write.' + rubricModel.uid, function() {\n // will notify the user of any removed feedbacks\n if (modelOverseer.changedRubricBlock) {\n /** @todo: provide a way to cancel changes */\n dialogAlert(__('Some rubric blocks have been updated to reflect the changes in the list of outcomes.'));\n modelOverseer.changedRubricBlock = 0;\n }\n });\n\n actions.properties($rubricBlock, 'rubricblock', rubricModel, propHandler);\n\n modelToEditor();\n\n // destroy CK instance on rubric bloc deletion.\n // todo: find a way to destroy CK upon destroying rubric bloc parent section/part\n bindEvent($rubricBlock, 'delete', function() {\n qtiContentCreator.destroy(creatorContext, $rubricBlockContent);\n });\n\n $rubricBlockContent.on('editorfocus', function() {\n // close all properties forms and turn off their related button\n areaBroker.getPropertyPanelArea().children('.props').hide().trigger('propclose.propview');\n });\n\n //change position of CKeditor toolbar on scroll\n areaBroker.getContentCreatorPanelArea().find('.test-content').on('scroll', function () {\n CKEDITOR.document.getWindow().fire('scroll');\n });\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA;\n */\ndefine('taoQtiTest/controller/creator/helpers/sectionBlueprints',[\n 'lodash',\n 'i18n',\n 'core/errorHandler'\n], function (_, __, errorHandler){\n\n 'use strict';\n\n var _ns = '.sectionBlueprint';\n\n\n /**\n * Set an array of categories to the section model (affect the childen itemRef)\n *\n * @param {object} model\n * @param {string} blueprint\n * @returns {undefined}\n */\n function setBlueprint(model, blueprint){\n model.blueprint = blueprint;\n }\n\n /**\n * Get the categories assign to the section model, infered by its interal itemRefs\n *\n * @param {string} getUrl\n * @param {object} model\n * @returns {object}\n */\n function getBlueprint(getUrl, model){\n\n return $.ajax({\n url: getUrl,\n type: 'GET',\n data: {\n section: model.identifier\n },\n dataType: 'json'\n\n })\n .fail(function () {\n errorHandler.throw(_ns, 'invalid tool config format');\n });\n\n }\n\n return {\n setBlueprint : setBlueprint,\n getBlueprint : getBlueprint\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/section',[\n 'jquery',\n 'lodash',\n 'uri',\n 'i18n',\n 'taoQtiTest/controller/creator/config/defaults',\n 'taoQtiTest/controller/creator/views/actions',\n 'taoQtiTest/controller/creator/views/itemref',\n 'taoQtiTest/controller/creator/views/rubricblock',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest',\n 'taoQtiTest/controller/creator/helpers/categorySelector',\n 'taoQtiTest/controller/creator/helpers/sectionCategory',\n 'taoQtiTest/controller/creator/helpers/sectionBlueprints'\n],\nfunction(\n $,\n _,\n uri,\n __,\n defaults,\n actions,\n itemRefView,\n rubricBlockView,\n templates,\n qtiTestHelper,\n categorySelectorFactory,\n sectionCategory,\n sectionBlueprint\n){\n 'use strict';\n\n /**\n * Set up a section: init action behaviors. Called for each section.\n *\n * @param {Object} creatorContext\n * @param {Object} sectionModel - the data model to bind to the test section\n * @param {Object} partModel - the parent data model to inherit\n * @param {jQuery} $section - the section to set up\n */\n function setUp (creatorContext, sectionModel, partModel, $section) {\n\n var $actionContainer = $('h2', $section);\n var modelOverseer = creatorContext.getModelOverseer();\n var config = modelOverseer.getConfig();\n\n // set item session control to use test part options if section level isn't set\n if (!sectionModel.itemSessionControl) {\n sectionModel.itemSessionControl = {};\n }\n if (!sectionModel.categories) {\n sectionModel.categories = defaults().categories;\n }\n _.defaults(sectionModel.itemSessionControl, partModel.itemSessionControl);\n\n if(!_.isEmpty(config.routes.blueprintsById)){\n sectionModel.hasBlueprint = true;\n }\n actions.properties($actionContainer, 'section', sectionModel, propHandler);\n actions.move($actionContainer, 'sections', 'section');\n itemRefs();\n acceptItemRefs();\n rubricBlocks();\n addRubricBlock();\n\n //trigger for the case the section is added an a selection is ongoing\n\n /**\n * Perform some binding once the property view is create\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n\n var $title;\n var $view = propView.getView();\n\n //enable/disable selection\n var $selectionSwitcher = $('[name=section-enable-selection]', $view);\n var $selectionSelect = $('[name=section-select]', $view);\n var $selectionWithRep = $('[name=section-with-replacement]', $view);\n\n // sectionModel.selection will be filled by binded values from template section-props.tpl\n // if sectionModel.selection from server response it has 'qti-type'\n var isSelectionFromServer = !!(sectionModel.selection && sectionModel.selection['qti-type']);\n\n var switchSelection = function switchSelection(){\n if($selectionSwitcher.prop('checked') === true){\n $selectionSelect.incrementer('enable');\n $selectionWithRep.removeClass('disabled');\n } else {\n $selectionSelect.incrementer('disable');\n $selectionWithRep.addClass('disabled');\n }\n };\n $selectionSwitcher.on('change', switchSelection);\n $selectionSwitcher.on('change', function updateModel(){\n if(!$selectionSwitcher.prop('checked')){\n $selectionSelect.val(0);\n $selectionWithRep.prop('checked', false);\n delete sectionModel.selection;\n }\n });\n\n $selectionSwitcher.prop('checked', isSelectionFromServer).trigger('change');\n\n //listen for databinder change to update the test part title\n $title = $('[data-bind=title]', $section);\n $view.on('change.binder', function(e){\n if(e.namespace === 'binder' && sectionModel['qti-type'] === 'assessmentSection'){\n $title.text(sectionModel.title);\n }\n });\n\n // deleted.deleter event fires only on the parent nodes (testparts, sections, etc)\n // Since it \"bubles\" we can subsctibe only to the highest parent node\n $section.parents('.testparts').on('deleted.deleter', removePropHandler);\n\n //section level category configuration\n categoriesProperty($view);\n\n if(typeof sectionModel.hasBlueprint !== 'undefined'){\n blueprintProperty($view);\n }\n\n function removePropHandler(e, $deletedNode) {\n const validIds = [\n $section.parents('.testpart').attr('id'),\n $section.attr('id')\n ];\n\n const deletedNodeId = $deletedNode.attr('id');\n // We have to check id of a deleted node, because\n // 1. Event fires after child node was deleted, but e.stopPropagation doesn't help\n // because currentTarget is always document\n // 2. We have to subscribe to the parent node and it's posiible that another section was removed even from another testpart\n // Subscription to the .sections selector event won't help because sections element might contain several children.\n\n if (propView !== null && validIds.includes(deletedNodeId)){\n propView.destroy();\n }\n }\n }\n\n /**\n * Set up the item refs that already belongs to the section\n * @private\n */\n function itemRefs(){\n\n if(!sectionModel.sectionParts){\n sectionModel.sectionParts = [];\n }\n $('.itemref', $section).each(function(){\n var $itemRef = $(this);\n var index = $itemRef.data('bind-index');\n if(!sectionModel.sectionParts[index]){\n sectionModel.sectionParts[index] = {};\n }\n\n itemRefView.setUp(creatorContext, sectionModel.sectionParts[index], sectionModel, partModel, $itemRef);\n $itemRef.find('.title').text(\n config.labels[uri.encode($itemRef.data('uri'))]\n );\n });\n }\n\n /**\n * Make the section to accept the selected items\n * @private\n * @fires modelOverseer#item-add\n */\n function acceptItemRefs(){\n var $itemsPanel = $('.test-creator-items .item-selection');\n\n //the item selector trigger a select event\n $itemsPanel.on('itemselect.creator', function(e, selection){\n\n var $placeholder = $('.itemref-placeholder', $section);\n var $placeholders = $('.itemref-placeholder');\n\n if(_.size(selection) > 0){\n $placeholder.show().off('click').on('click', function(){\n\n //prepare the item data\n var categories,\n defaultItemData = {};\n\n if(sectionModel.itemSessionControl && !_.isUndefined(sectionModel.itemSessionControl.maxAttempts)){\n\n //for a matter of consistency, the itemRef will \"inherit\" the itemSessionControl configuration from its parent section\n defaultItemData.itemSessionControl = _.clone(sectionModel.itemSessionControl);\n }\n\n //the itemRef should also \"inherit\" the categories set at the item level\n categories = sectionCategory.getCategories(sectionModel);\n defaultItemData.categories = _.clone(categories.propagated) || [];\n\n _.forEach(selection, function(item){\n var itemData = _.defaults({\n href : item.uri,\n label : item.label,\n 'qti-type' : 'assessmentItemRef'\n }, defaultItemData);\n\n if(_.isArray(item.categories)){\n itemData.categories = item.categories.concat(itemData.categories);\n }\n\n addItemRef($('.itemrefs', $section), null, itemData);\n });\n\n $itemsPanel.trigger('itemselected.creator');\n\n $placeholders.hide().off('click');\n });\n } else {\n $placeholders.hide().off('click');\n }\n });\n\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '#' + $section.attr('id') + ' .itemrefs')\n .on('add.binder', '#' + $section.attr('id') + ' .itemrefs', function(e, $itemRef){\n var index, itemRefModel;\n if(e.namespace === 'binder' && $itemRef.hasClass('itemref')){\n index = $itemRef.data('bind-index');\n itemRefModel = sectionModel.sectionParts[index];\n\n //initialize the new item ref\n itemRefView.setUp(creatorContext, itemRefModel, sectionModel, partModel, $itemRef);\n\n /**\n * @event modelOverseer#item-add\n * @param {Object} itemRefModel\n */\n modelOverseer.trigger('item-add', itemRefModel);\n }\n });\n }\n\n /**\n * Add a new item ref to the section\n * @param {jQuery} $refList - the element to add the item to\n * @param {Number} [index] - the position of the item to add\n * @param {Object} [itemData] - the data to bind to the new item ref\n */\n function addItemRef($refList, index, itemData){\n var $itemRef;\n var $items = $refList.children('li');\n index = index || $items.length;\n itemData.identifier = qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(), 'assessmentItemRef', 'item');\n itemData.index = index + 1;\n $itemRef = $(templates.itemref(itemData));\n if(index > 0){\n $itemRef.insertAfter($items.eq(index - 1));\n } else {\n $itemRef.appendTo($refList);\n }\n $refList.trigger('add', [$itemRef, itemData]);\n }\n\n\n /**\n * Set up the rubric blocks that already belongs to the section\n * @private\n */\n function rubricBlocks () {\n if(!sectionModel.rubricBlocks){\n sectionModel.rubricBlocks = [];\n }\n $('.rubricblock', $section).each(function(){\n var $rubricBlock = $(this);\n var index = $rubricBlock.data('bind-index');\n if(!sectionModel.rubricBlocks[index]){\n sectionModel.rubricBlocks[index] = {};\n }\n\n rubricBlockView.setUp(creatorContext, sectionModel.rubricBlocks[index], $rubricBlock);\n });\n\n //opens the rubric blocks section if they are there.\n if(sectionModel.rubricBlocks.length > 0){\n $('.rub-toggler', $section).trigger('click');\n }\n }\n\n /**\n * Enable to add new rubric block\n * @private\n * @fires modelOverseer#rubric-add\n */\n function addRubricBlock () {\n\n $('.rublock-adder', $section).adder({\n target: $('.rubricblocks', $section),\n content : templates.rubricblock,\n templateData : function(cb){\n cb({\n 'qti-type' : 'rubricBlock',\n index : $('.rubricblock', $section).length,\n content : [],\n views : [1]\n });\n }\n });\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document).on('add.binder', '#' + $section.attr('id') + ' .rubricblocks', function(e, $rubricBlock){\n var index, rubricModel;\n if(e.namespace === 'binder' && $rubricBlock.hasClass('rubricblock')){\n index = $rubricBlock.data('bind-index');\n rubricModel = sectionModel.rubricBlocks[index] || {};\n\n $('.rubricblock-binding', $rubricBlock).html('<p> </p>');\n rubricBlockView.setUp(creatorContext, rubricModel, $rubricBlock);\n\n /**\n * @event modelOverseer#rubric-add\n * @param {Object} rubricModel\n */\n modelOverseer.trigger('rubric-add', rubricModel);\n }\n });\n }\n\n /**\n * Set up the category property\n * @private\n * @param {jQuery} $view - the $view object containing the $select\n * @fires modelOverseer#category-change\n */\n function categoriesProperty($view){\n var categories = sectionCategory.getCategories(sectionModel),\n categorySelector = categorySelectorFactory($view);\n\n categorySelector.createForm(categories.all);\n updateFormState(categorySelector);\n\n $view.on('propopen.propview', function(){\n updateFormState(categorySelector);\n });\n\n categorySelector.on('category-change', function(selected, indeterminate) {\n sectionCategory.setCategories(sectionModel, selected, indeterminate);\n\n modelOverseer.trigger('category-change');\n });\n }\n\n function updateFormState(categorySelector) {\n var categories = sectionCategory.getCategories(sectionModel);\n categorySelector.updateFormState(categories.propagated, categories.partial);\n }\n\n /**\n * Set up the Blueprint property\n * @private\n * @param {jQuery} $view - the $view object containing the $select\n */\n function blueprintProperty($view){\n var $select = $('[name=section-blueprint]', $view);\n $select.select2({\n ajax:{\n url: config.routes.blueprintsById,\n dataType: 'json',\n delay: 350,\n method: 'POST',\n data: function (params) {\n return {\n identifier: params // search term\n };\n },\n results: function (data) {\n return data;\n }\n },\n minimumInputLength: 3,\n width: '100%',\n multiple : false,\n allowClear: true,\n placeholder: __('Select a blueprint'),\n formatNoMatches : function(){\n return __('Enter a blueprint');\n },\n maximumInputLength : 32\n }).on('change', function(e){\n setBlueprint(e.val);\n });\n\n initBlueprint();\n $view.on('propopen.propview', function(){\n initBlueprint();\n });\n\n /**\n * Start the blueprint editing\n * @private\n */\n function initBlueprint(){\n\n if(typeof sectionModel.blueprint === 'undefined'){\n sectionBlueprint\n .getBlueprint(config.routes.blueprintByTestSection, sectionModel)\n .success(function(data){\n if(!_.isEmpty(data)){\n if(sectionModel.blueprint !== \"\"){\n sectionModel.blueprint = data.uri;\n $select.select2('data', {id: data.uri, text: data.text});\n $select.trigger('change');\n }\n }\n });\n }\n }\n\n /**\n * save the categories into the model\n * @private\n */\n function setBlueprint(blueprint){\n sectionBlueprint.setBlueprint(sectionModel, blueprint);\n }\n\n }\n }\n\n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n function listenActionState (){\n\n var $sections;\n\n $('.sections').each(function(){\n $sections = $('.section', $(this));\n\n actions.removable($sections, 'h2');\n actions.movable($sections, 'section', 'h2');\n });\n\n $(document)\n .on('delete', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('section')){\n $parent = $target.parents('.sections');\n actions.disable($parent.find('.section'), 'h2');\n }\n })\n .on('add change undo.deleter deleted.deleter', function(e){\n var $target = $(e.target);\n if($target.hasClass('section') || $target.hasClass('sections')){\n $sections = $('.section', $target.hasClass('sections') ? $target : $target.parents('.sections'));\n actions.removable($sections, 'h2');\n actions.movable($sections, 'section', 'h2');\n }\n })\n .on('open.toggler', '.rub-toggler', function(e){\n if(e.namespace === 'toggler'){\n $(this).parents('h2').addClass('active');\n }\n })\n .on('close.toggler', '.rub-toggler', function(e){\n if(e.namespace === 'toggler'){\n $(this).parents('h2').removeClass('active');\n }\n });\n }\n\n /**\n * The sectionView setup section related components and beahvior\n *\n * @exports taoQtiTest/controller/creator/views/section\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/testpart',[\n 'jquery', 'lodash',\n 'taoQtiTest/controller/creator/config/defaults',\n 'taoQtiTest/controller/creator/views/actions',\n 'taoQtiTest/controller/creator/views/section',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest'],\nfunction($, _, defaults, actions, sectionView, templates, qtiTestHelper){\n 'use strict';\n\n /**\n * Set up a test part: init action behaviors. Called for each test part.\n *\n * @param {Object} creatorContext\n * @param {Object} partModel - the data model to bind to the test part\n * @param {jQuery} $testPart - the testpart container to set up\n */\n function setUp (creatorContext, partModel, $testPart){\n var $actionContainer = $('h1', $testPart);\n var modelOverseer = creatorContext.getModelOverseer();\n\n //run setup methods\n actions.properties($actionContainer, 'testpart', partModel, propHandler);\n actions.move($actionContainer, 'testparts', 'testpart');\n sections();\n addSection();\n\n /**\n * Perform some binding once the property view is created\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n\n var $view = propView.getView();\n\n //listen for databinder change to update the test part title\n var $identifier = $('[data-bind=identifier]', $testPart);\n $view.on('change.binder', function(e, model){\n if(e.namespace === 'binder' && model['qti-type'] === 'testPart'){\n $identifier.text(model.identifier);\n\n /**\n * @event modelOverseer#section-add\n * @param {Object} sectionModel\n */\n modelOverseer.trigger('testpart-change', partModel);\n\n }\n });\n\n //destroy it when it's testpart is removed\n $testPart.parents('.testparts').on('deleted.deleter', function(e, $deletedNode) {\n if ((propView !== null) && ($deletedNode.attr('id') === $testPart.attr('id'))) {\n propView.destroy();\n }\n });\n }\n\n /**\n * Set up sections that already belongs to the test part\n * @private\n */\n function sections(){\n if(!partModel.assessmentSections){\n partModel.assessmentSections = [];\n }\n $('.section', $testPart).each(function(){\n var $section = $(this);\n var index = $section.data('bind-index');\n if(!partModel.assessmentSections[index]){\n partModel.assessmentSections[index] = {};\n }\n\n sectionView.setUp(creatorContext, partModel.assessmentSections[index], partModel, $section);\n });\n }\n\n /**\n * Enable to add new sections\n * @private\n * @fires modelOverseer#section-add\n */\n function addSection(){\n $('.section-adder', $testPart).adder({\n target: $('.sections', $testPart),\n content : templates.section,\n templateData : function(cb){\n\n //create a new section model object to be bound to the template\n var sectionIndex = $('.section', $testPart).length;\n cb({\n 'qti-type' : 'assessmentSection',\n identifier : qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(), 'assessmentSection', defaults().sectionIdPrefix),\n title : `${defaults().sectionTitlePrefix} ${sectionIndex + 1}`,\n index : 0,\n sectionParts : [],\n visible: true\n });\n }\n });\n\n\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '#' + $testPart.attr('id') + ' .sections')\n .on ('add.binder', '#' + $testPart.attr('id') + ' .sections', function(e, $section){\n var index, sectionModel;\n if(e.namespace === 'binder' && $section.hasClass('section')){\n index = $section.data('bind-index');\n sectionModel = partModel.assessmentSections[index];\n\n //initialize the new test part\n sectionView.setUp(creatorContext, sectionModel, partModel, $section);\n\n /**\n * @event modelOverseer#section-add\n * @param {Object} sectionModel\n */\n modelOverseer.trigger('section-add', sectionModel);\n }\n });\n }\n }\n\n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n function listenActionState (){\n\n var $testParts = $('.testpart');\n\n actions.removable($testParts, 'h1');\n actions.movable($testParts, 'testpart', 'h1');\n\n $('.testparts')\n .on('delete', function(e){\n var $target = $(e.target);\n if($target.hasClass('testpart')){\n actions.disable($('.testpart'), 'h1');\n }\n })\n .on('add change undo.deleter deleted.deleter', function(e){\n var $target = $(e.target);\n\n if($target.hasClass('testpart') || $target.hasClass('testparts')){\n\n //refresh\n $testParts = $('.testpart');\n\n //check state\n actions.removable($testParts, 'h1');\n actions.movable($testParts, 'testpart', 'h1');\n }\n });\n }\n\n /**\n * The testPartView setup testpart related components and beahvior\n *\n * @exports taoQtiTest/controller/creator/views/testpart\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/views/test',[\n 'jquery', 'lodash', 'i18n', 'ui/hider', 'ui/feedback',\n 'taoQtiTest/controller/creator/config/defaults',\n 'taoQtiTest/controller/creator/views/actions',\n 'taoQtiTest/controller/creator/views/testpart',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest'\n],\nfunction($, _, __, hider, feedback, defaults, actions, testPartView, templates, qtiTestHelper){\n 'use strict';\n\n /**\n * The TestView setup test related components and behavior\n *\n * @exports taoQtiTest/controller/creator/views/test\n * @param {Object} creatorContext\n */\n function testView (creatorContext) {\n var modelOverseer = creatorContext.getModelOverseer();\n var testModel = modelOverseer.getModel();\n\n actions.properties($('.test-creator-test > h1'), 'test', testModel, propHandler);\n testParts();\n addTestPart();\n\n /**\n * set up the existing test part views\n * @private\n */\n function testParts () {\n if(!testModel.testParts){\n testModel.testParts = [];\n }\n $('.testpart').each(function(){\n var $testPart = $(this);\n var index = $testPart.data('bind-index');\n if(!testModel.testParts[index]){\n testModel.testParts[index] = {};\n }\n\n testPartView.setUp(creatorContext, testModel.testParts[index], $testPart);\n });\n }\n\n /**\n * Perform some binding once the property view is created\n * @private\n * @param {propView} propView - the view object\n * @fires modelOverseer#scoring-change\n */\n function propHandler(propView) {\n\n var $view = propView.getView();\n var $categoryScoreLine = $('.test-category-score', $view);\n var $cutScoreLine = $('.test-cut-score', $view);\n var $weightIdentifierLine = $('.test-weight-identifier', $view);\n var $descriptions = $('.test-outcome-processing-description', $view);\n var $generate = $('[data-action=\"generate-outcomes\"]', $view);\n var $title = $('.test-creator-test > h1 [data-bind=title]');\n var scoringState = JSON.stringify(testModel.scoring);\n\n function changeScoring(scoring) {\n var noOptions = !!scoring && ['none', 'custom'].indexOf(scoring.outcomeProcessing) === -1;\n var newScoringState = JSON.stringify(scoring);\n\n hider.toggle($cutScoreLine, !!scoring && scoring.outcomeProcessing === 'cut');\n hider.toggle($categoryScoreLine, noOptions);\n hider.toggle($weightIdentifierLine, noOptions);\n hider.hide($descriptions);\n hider.show($descriptions.filter('[data-key=\"' + scoring.outcomeProcessing + '\"]'));\n\n if (scoringState !== newScoringState) {\n /**\n * @event modelOverseer#scoring-change\n * @param {Object} testModel\n */\n modelOverseer.trigger('scoring-change', testModel);\n }\n scoringState = newScoringState;\n }\n\n function updateOutcomes() {\n var $panel = $('.outcome-declarations', $view);\n\n $panel.html(templates.outcomes({outcomes: modelOverseer.getOutcomesList()}));\n }\n\n $('[name=test-outcome-processing]', $view).select2({\n minimumResultsForSearch: -1,\n width: '100%'\n });\n\n $generate.on('click', function() {\n $generate.addClass('disabled').attr('disabled', true);\n modelOverseer\n .on('scoring-write.regenerate', function() {\n modelOverseer.off('scoring-write.regenerate');\n feedback().success(__('The outcomes have been regenerated!')).on('destroy', function() {\n $generate.removeClass('disabled').removeAttr('disabled');\n });\n })\n .trigger('scoring-change');\n });\n\n $view.on('change.binder', function (e, model) {\n if (e.namespace === 'binder' && model['qti-type'] === 'assessmentTest') {\n changeScoring(model.scoring);\n\n //update the test part title when the databinder has changed it\n $title.text(model.title);\n }\n });\n\n modelOverseer.on('scoring-write', updateOutcomes);\n\n changeScoring(testModel.scoring);\n updateOutcomes();\n }\n\n /**\n * Enable to add new test parts\n * @private\n * @fires modelOverseer#part-add\n */\n function addTestPart () {\n\n $('.testpart-adder').adder({\n target: $('.testparts'),\n content : templates.testpart,\n templateData : function(cb){\n\n //create an new testPart model object to be bound to the template\n var testPartIndex = $('.testpart').length;\n cb({\n 'qti-type' : 'testPart',\n identifier : qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(), 'testPart', defaults().partIdPrefix),\n index : testPartIndex,\n navigationMode : defaults().navigationMode,\n submissionMode : defaults().submissionMode,\n assessmentSections : [{\n 'qti-type' : 'assessmentSection',\n identifier : qtiTestHelper.getAvailableIdentifier(modelOverseer.getModel(), 'assessmentSection', defaults().sectionIdPrefix),\n title : `${defaults().sectionTitlePrefix} 1`,\n index : 0,\n sectionParts : [],\n visible: true\n }]\n });\n }\n });\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '.testparts')\n .on ('add.binder', '.testparts', function(e, $testPart, added){\n var partModel;\n if(e.namespace === 'binder' && $testPart.hasClass('testpart')){\n partModel = testModel.testParts[added.index];\n\n //initialize the new test part\n testPartView.setUp(creatorContext, partModel, $testPart);\n\n /**\n * @event modelOverseer#part-add\n * @param {Object} partModel\n */\n modelOverseer.trigger('part-add', partModel);\n }\n });\n }\n }\n\n return testView;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * Basic helper that is intended to generate outcomes processing rules for a test model.\n *\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/processingRule',[\n 'lodash',\n 'taoQtiTest/controller/creator/helpers/outcomeValidator',\n 'taoQtiTest/controller/creator/helpers/qtiElement',\n 'taoQtiTest/controller/creator/helpers/baseType',\n 'taoQtiTest/controller/creator/helpers/cardinality'\n], function (_, outcomeValidator, qtiElementHelper, baseTypeHelper, cardinalityHelper) {\n 'use strict';\n\n var processingRuleHelper = {\n /**\n * Creates a basic processing rule\n * @param {String} type\n * @param {String} [identifier]\n * @param {Array|Object} [expression]\n * @returns {Object}\n * @throws {TypeError} if the type is empty or is not a string\n * @throws {TypeError} if the identifier is not valid\n * @throws {TypeError} if the expression does not contain valid QTI elements\n */\n create: function create(type, identifier, expression) {\n var processingRule = qtiElementHelper.create(type, identifier && validateIdentifier(identifier));\n\n if (expression) {\n processingRuleHelper.setExpression(processingRule, expression);\n }\n\n return processingRule;\n },\n\n /**\n * Sets an expression to a processing rule\n * @param {Object} processingRule\n * @param {Object|Array} expression\n * @throws {TypeError} if the expression does not contain valid QTI elements\n */\n setExpression: function setExpression(processingRule, expression) {\n if (processingRule) {\n if (_.isArray(expression)) {\n if (processingRule.expression) {\n processingRule.expression = null;\n }\n processingRule.expressions = validateOutcomeList(expression);\n } else {\n if (processingRule.expressions) {\n processingRule.expressions = null;\n }\n if (expression) {\n processingRule.expression = validateOutcome(expression);\n }\n }\n }\n },\n\n /**\n * Adds an expression to a processing rule\n * @param {Object} processingRule\n * @param {Object|Array} expression\n * @throws {TypeError} if the expression does not contain valid QTI elements\n */\n addExpression: function addExpression(processingRule, expression) {\n if (processingRule && expression) {\n if (processingRule.expression) {\n processingRule.expressions = forceArray(processingRule.expression);\n processingRule.expression = null;\n }\n\n if (_.isArray(expression)) {\n processingRule.expressions = forceArray(processingRule.expressions).concat(validateOutcomeList(expression));\n } else {\n if (processingRule.expressions) {\n processingRule.expressions.push(expression);\n } else {\n processingRule.expression = validateOutcome(expression);\n }\n }\n }\n },\n\n /**\n * Creates a `setOutcomeValue` rule\n * @param {String} identifier\n * @param {Object|Array} [expression]\n * @returns {Object}\n * @throws {TypeError} if the identifier is empty or is not a string\n * @throws {TypeError} if the expression does not contain valid QTI elements\n */\n setOutcomeValue: function setOutcomeValue(identifier, expression) {\n return processingRuleHelper.create('setOutcomeValue', validateIdentifier(identifier), expression);\n },\n\n /**\n * Creates a `gte` rule\n * @param {Object|Array} left - the left operand\n * @param {Object|Array} right - the right operand\n * @returns {Object}\n * @throws {TypeError} if the left and right operands are not valid QTI elements\n */\n gte: function gte(left, right) {\n return binaryOperator('gte', left, right);\n },\n\n /**\n * Creates a `lte` rule\n * @param {Object|Array} left - the left operand\n * @param {Object|Array} right - the right operand\n * @returns {Object}\n * @throws {TypeError} if the left and right operands are not valid QTI elements\n */\n lte: function lte(left, right) {\n return binaryOperator('lte', left, right);\n },\n\n /**\n * Creates a `divide` rule\n * @param {Object|Array} left - the left operand\n * @param {Object|Array} right - the right operand\n * @returns {Object}\n * @throws {TypeError} if the left and right operands are not valid QTI elements\n */\n divide: function divide(left, right) {\n return binaryOperator('divide', left, right);\n },\n\n /**\n * Creates a `sum` rule\n * @param {Object|Array} terms\n * @returns {Object}\n * @throws {TypeError} if the terms are not valid QTI elements\n */\n sum: function sum(terms) {\n var processingRule = processingRuleHelper.create('sum', null, forceArray(terms));\n\n processingRule.minOperands = 1;\n processingRule.maxOperands = -1;\n processingRule.acceptedCardinalities = [cardinalityHelper.SINGLE, cardinalityHelper.MULTIPLE, cardinalityHelper.ORDERED];\n processingRule.acceptedBaseTypes = [baseTypeHelper.INTEGER, baseTypeHelper.FLOAT];\n\n return processingRule;\n },\n\n /**\n * Creates a `testVariables` rule\n * @param {String} identifier\n * @param {String|Number} [type]\n * @param {String} weightIdentifier\n * @param {String|String[]} [includeCategories]\n * @param {String|String[]} [excludeCategories]\n * @returns {Object}\n * @throws {TypeError} if the identifier is empty or is not a string\n */\n testVariables: function testVariables(identifier, type, weightIdentifier, includeCategories, excludeCategories) {\n var processingRule = processingRuleHelper.create('testVariables');\n\n processingRule.variableIdentifier = validateIdentifier(identifier);\n processingRule.baseType = baseTypeHelper.getValid(type);\n addWeightIdentifier(processingRule, weightIdentifier);\n addSectionIdentifier(processingRule, '');\n addCategories(processingRule, includeCategories, excludeCategories);\n\n return processingRule;\n },\n\n /**\n * Creates a `outcomeMaximum` rule\n * @param {String} identifier\n * @param {String} weightIdentifier\n * @param {String|String[]} [includeCategories]\n * @param {String|String[]} [excludeCategories]\n * @returns {Object}\n * @throws {TypeError} if the identifier is empty or is not a string\n */\n outcomeMaximum: function outcomeMaximum(identifier, weightIdentifier, includeCategories, excludeCategories) {\n var processingRule = processingRuleHelper.create('outcomeMaximum');\n\n processingRule.outcomeIdentifier = validateIdentifier(identifier);\n\n addWeightIdentifier(processingRule, weightIdentifier);\n addSectionIdentifier(processingRule, '');\n addCategories(processingRule, includeCategories, excludeCategories);\n\n return processingRule;\n },\n\n /**\n * Creates a `numberPresented` rule\n * @param {String|String[]} [includeCategories]\n * @param {String|String[]} [excludeCategories]\n * @returns {Object}\n */\n numberPresented: function numberPresented(includeCategories, excludeCategories) {\n var processingRule = processingRuleHelper.create('numberPresented');\n\n addSectionIdentifier(processingRule, '');\n addCategories(processingRule, includeCategories, excludeCategories);\n\n return processingRule;\n },\n\n /**\n * Creates a `baseValue` rule\n * @param {*} [value]\n * @param {String|Number} [type]\n * @returns {Object}\n */\n baseValue: function baseValue(value, type) {\n var processingRule = processingRuleHelper.create('baseValue');\n\n processingRule.baseType = baseTypeHelper.getValid(type, baseTypeHelper.FLOAT);\n processingRule.value = baseTypeHelper.getValue(processingRule.baseType, value);\n\n return processingRule;\n },\n\n /**\n ** Creates a `variable` rule\n * @param {String} identifier\n * @param {String} [weightIdentifier]\n * @returns {Object}\n * @throws {TypeError} if the identifier is not valid\n * @throws {TypeError} if the weight identifier is not valid\n */\n variable: function variable(identifier, weightIdentifier) {\n var processingRule = processingRuleHelper.create('variable', validateIdentifier(identifier));\n\n addWeightIdentifier(processingRule, weightIdentifier);\n\n return processingRule;\n },\n\n /**\n * Creates a `match` rule\n * @param {Object|Array} left - the left operand\n * @param {Object|Array} right - the right operand\n * @returns {Object}\n * @throws {TypeError} if the left and right operands are not valid QTI elements\n */\n match: function match(left, right) {\n return binaryOperator('match', left, right, cardinalityHelper.SAME, cardinalityHelper.SAME);\n },\n\n /**\n * Creates a `isNull` rule\n * @param {Object|Array} expression - the operand\n * @returns {Object}\n * @throws {TypeError} if the operand is not valid QTI element\n */\n isNull: function isNull(expression) {\n return unaryOperator('isNull', expression, baseTypeHelper.ANY, cardinalityHelper.ANY);\n },\n\n /**\n * Creates a `outcomeCondition` rule\n * @param {Object} outcomeIf\n * @param {Object} outcomeElse\n * @returns {Object}\n * @throws {TypeError} if the outcomeIf and outcomeElse operands are not valid QTI elements\n */\n outcomeCondition: function outcomeCondition(outcomeIf, outcomeElse) {\n var processingRule = processingRuleHelper.create('outcomeCondition');\n\n if (!outcomeValidator.validateOutcome(outcomeIf, false, 'outcomeIf')) {\n throw new TypeError('You must provide a valid outcomeIf element!');\n }\n\n if (outcomeElse && !outcomeValidator.validateOutcome(outcomeElse, false, 'outcomeElse')) {\n throw new TypeError('You must provide a valid outcomeElse element!');\n }\n\n processingRule.outcomeIf = outcomeIf;\n processingRule.outcomeElseIfs = [];\n\n if (outcomeElse) {\n processingRule.outcomeElse = outcomeElse;\n }\n\n return processingRule;\n },\n\n /**\n * Creates a `outcomeIf` rule\n * @param {Object} expression\n * @param {Object|Object[]} instruction\n * @returns {Object}\n * @throws {TypeError} if the expression and instruction operands are not valid QTI elements\n */\n outcomeIf: function outcomeIf(expression, instruction) {\n var processingRule = processingRuleHelper.create('outcomeIf');\n\n if (!_.isArray(instruction)) {\n instruction = [instruction];\n }\n\n processingRule.expression = validateOutcome(expression);\n processingRule.outcomeRules = validateOutcomeList(instruction);\n\n return processingRule;\n },\n\n /**\n * Creates a `outcomeElse` rule\n * @param {Object|Object[]} instruction\n * @returns {Object}\n * @throws {TypeError} if the instruction is not a valid QTI element\n */\n outcomeElse: function outcomeElse(instruction) {\n var processingRule = processingRuleHelper.create('outcomeElse');\n\n if (!_.isArray(instruction)) {\n instruction = [instruction];\n }\n\n processingRule.outcomeRules = validateOutcomeList(instruction);\n\n return processingRule;\n }\n\n };\n\n /**\n * Creates a unary operator rule\n * @param {String} type - The rule type\n * @param {Object|Array} expression - The operand\n * @param {Number|Array} [baseType] - The accepted base type\n * @param {Number|Array} [cardinality] - The accepted cardinality\n * @returns {Object}\n * @throws {TypeError} if the type is empty or is not a string\n * @throws {TypeError} if the operand is not valid QTI element\n */\n function unaryOperator(type, expression, baseType, cardinality) {\n var processingRule = processingRuleHelper.create(type, null, [expression]);\n\n processingRule.minOperands = 1;\n processingRule.maxOperands = 1;\n\n addTypeAndCardinality(processingRule, baseType, cardinality);\n\n return processingRule;\n }\n\n /**\n * Creates a binary operator rule\n * @param {String} type - The rule type\n * @param {Object|Array} left - The left operand\n * @param {Object|Array} right - The right operand\n * @param {Number|Array} [baseType] - The accepted base type\n * @param {Number|Array} [cardinality] - The accepted cardinality\n * @returns {Object}\n * @throws {TypeError} if the type is empty or is not a string\n * @throws {TypeError} if the left and right operands are not valid QTI elements\n */\n function binaryOperator(type, left, right, baseType, cardinality) {\n var processingRule = processingRuleHelper.create(type, null, [left, right]);\n\n processingRule.minOperands = 2;\n processingRule.maxOperands = 2;\n\n addTypeAndCardinality(processingRule, baseType, cardinality);\n\n return processingRule;\n }\n\n /**\n * Appends the base type and the cardinality on a processing rule\n * @param {Object} processingRule\n * @param {Number|Array} [baseType] - The accepted base type\n * @param {Number|Array} [cardinality] - The accepted cardinality\n * @returns {Object}\n */\n function addTypeAndCardinality(processingRule, baseType, cardinality) {\n if (_.isUndefined(baseType)) {\n baseType = [baseTypeHelper.INTEGER, baseTypeHelper.FLOAT];\n }\n\n if (_.isUndefined(cardinality)) {\n cardinality = [cardinalityHelper.SINGLE];\n }\n\n processingRule.acceptedCardinalities = forceArray(cardinality);\n processingRule.acceptedBaseTypes = forceArray(baseType);\n\n return processingRule;\n }\n\n /**\n * Extends a processing rule with categories\n * @param {Object} processingRule\n * @param {Array|String} [includeCategories]\n * @param {Array|String} [excludeCategories]\n * @returns {Object}\n */\n function addCategories(processingRule, includeCategories, excludeCategories) {\n processingRule.includeCategories = forceArray(includeCategories);\n processingRule.excludeCategories = forceArray(excludeCategories);\n\n return processingRule;\n }\n\n /**\n * Appends the section identifier on a processing rule\n * @param {Object} processingRule\n * @param {String} [sectionIdentifier]\n * @returns {Object}\n * @throws {TypeError} if the weight identifier is not valid\n */\n function addSectionIdentifier(processingRule, sectionIdentifier) {\n if (sectionIdentifier) {\n if (!outcomeValidator.validateIdentifier(sectionIdentifier)) {\n throw new TypeError('You must provide a valid weight identifier!');\n }\n processingRule.sectionIdentifier = sectionIdentifier;\n } else {\n processingRule.sectionIdentifier = '';\n }\n\n return processingRule;\n }\n\n /**\n * Appends the weight identifier on a processing rule\n * @param {Object} processingRule\n * @param {String} [weightIdentifier]\n * @returns {Object}\n * @throws {TypeError} if the weight identifier is not valid\n */\n function addWeightIdentifier(processingRule, weightIdentifier) {\n if (weightIdentifier) {\n if (!outcomeValidator.validateIdentifier(weightIdentifier)) {\n throw new TypeError('You must provide a valid weight identifier!');\n }\n processingRule.weightIdentifier = weightIdentifier;\n } else {\n processingRule.weightIdentifier = '';\n }\n\n return processingRule;\n }\n\n /**\n * Validates an identifier\n * @param {String} identifier\n * @returns {String}\n * @throws {TypeError} if the identifier is not valid\n */\n function validateIdentifier(identifier) {\n if (!outcomeValidator.validateIdentifier(identifier)) {\n throw new TypeError('You must provide a valid identifier!');\n }\n return identifier;\n }\n\n /**\n * Validates an outcome\n * @param {Object} outcome\n * @returns {Object}\n * @throws {TypeError} if the outcome is not valid\n */\n function validateOutcome(outcome) {\n if (!outcomeValidator.validateOutcome(outcome)) {\n throw new TypeError('You must provide a valid QTI element!');\n }\n return outcome;\n }\n\n /**\n * Validates a list of outcomes\n * @param {Array} outcomes\n * @returns {Array}\n * @throws {TypeError} if an outcome is not valid\n */\n function validateOutcomeList(outcomes) {\n if (!outcomeValidator.validateOutcomes(outcomes)) {\n throw new TypeError('You must provide a valid list of QTI elements!');\n }\n return outcomes;\n }\n\n /**\n * Ensures a value is an array\n * @param {*} value\n * @returns {Array}\n */\n function forceArray(value) {\n if (!value) {\n value = [];\n }\n if (!_.isArray(value)) {\n value = [value];\n }\n return value;\n }\n\n return processingRuleHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017 (original work) Open Assessment Technologies SA ;\n */\n/**\n * Basic helper that is intended to manage the score processing declaration in a test model.\n *\n * @author Jean-Sébastien Conan <jean-sebastien@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/scoring',[\n 'lodash',\n 'i18n',\n 'core/format',\n 'taoQtiTest/controller/creator/helpers/baseType',\n 'taoQtiTest/controller/creator/helpers/outcome',\n 'taoQtiTest/controller/creator/helpers/processingRule'\n], function (_, __, format, baseTypeHelper, outcomeHelper, processingRuleHelper) {\n 'use strict';\n\n /**\n * The default cut score\n * @todo Move this to a config file\n * @type {Number}\n */\n var defaultCutScore = 0.5;\n\n /**\n * The name of the variable containing the score\n * @type {String}\n */\n var defaultScoreIdentifier = 'SCORE';\n\n /**\n * The list of supported processing modes, indexed by mode identifier\n * @type {Object}\n */\n var processingModes = {\n none: {\n key: 'none',\n label: __('None'),\n description: __('No outcome processing. Erase the existing rules, if any.')\n },\n custom: {\n key: 'custom',\n label: __('Custom'),\n description: __('Custom outcome processing. No changes will be made to the existing rules.')\n },\n total: {\n key: 'total',\n label: __('Total score'),\n description: __('The score will be processed for the entire test. A sum of all SCORE outcomes will be computed, the result will take place in the SCORE_TOTAL outcome.')\n + ' ' +\n __('If the category option is set, the score will also be processed per categories, and each results will take place in the SCORE_xxx outcome, where xxx is the name of the category.')\n },\n cut: {\n key: 'cut',\n label: __('Cut score'),\n description: __('The score will be processed for the entire test. A sum of all SCORE outcomes will be computed and divided by the sum of MAX SCORE, the result will be compared to the cut score (or pass ratio), then the PASS_TOTAL outcome will be set accordingly.')\n + ' ' +\n __('If the category option is set, the score will also be processed per categories, and each results will take place in the PASS_xxx outcome, where xxx is the name of the category.')\n }\n };\n\n /**\n * The list of recipes to generate the outcomes\n * @type {Object}\n */\n var outcomesRecipes = {\n none: {\n key: 'none',\n clean: true\n },\n custom: {\n key: 'custom',\n clean: false\n },\n total: {\n key: 'total',\n signature: /^SCORE_([a-zA-Z][a-zA-Z0-9_\\.-]*)$/,\n outcomes: [{\n writer: 'total',\n identifier: 'SCORE_TOTAL',\n weighted: 'SCORE_TOTAL_WEIGHTED',\n categoryIdentifier: 'SCORE_CATEGORY_%s',\n categoryWeighted: 'SCORE_CATEGORY_WEIGHTED_%s'\n }, {\n writer: 'max',\n identifier: 'SCORE_TOTAL_MAX',\n weighted: 'SCORE_TOTAL_MAX_WEIGHTED',\n categoryIdentifier: 'SCORE_CATEGORY_MAX_%s',\n categoryWeighted: 'SCORE_CATEGORY_WEIGHTED_MAX_%s'\n }, {\n writer: 'ratio',\n identifier: 'SCORE_RATIO',\n weighted: 'SCORE_RATIO_WEIGHTED',\n scoreIdentifier: {\n total : 'SCORE_TOTAL',\n max : 'SCORE_TOTAL_MAX'\n },\n scoreWeighted : {\n total : 'SCORE_TOTAL_WEIGHTED',\n max : 'SCORE_TOTAL_MAX_WEIGHTED',\n },\n }],\n clean: true\n },\n cut: {\n key: 'cut',\n include: 'total',\n signature: /^PASS_([a-zA-Z][a-zA-Z0-9_\\.-]*)$/,\n outcomes: [{\n writer: 'cut',\n identifier: 'PASS_ALL',\n feedback: 'PASS_ALL_RENDERING',\n feedbackOk: \"passed\",\n feedbackFailed: \"not_passed\",\n categoryIdentifier: 'PASS_CATEGORY_%s',\n categoryFeedback: 'PASS_CATEGORY_%s_RENDERING'\n }],\n clean: true\n }\n };\n\n /**\n * List of writers that provide the outcomes for each score processing mode.\n * @type {Object}\n */\n var outcomesWriters = {\n /**\n * Generates the outcomes that compute the \"Score ratio\"\n * @param {Object} descriptor\n * @param {Object} scoring\n * @param {Object} outcomes\n */\n ratio : function writerRatio(descriptor, scoring, outcomes){\n addRatioOutcomes(outcomes, descriptor.identifier, descriptor.scoreIdentifier.total, descriptor.scoreIdentifier.max);\n if(scoring.weightIdentifier){\n //add weighted ratio outcome only when the scoring outcome processing rule uses a weight\n addRatioOutcomes(outcomes, descriptor.weighted, descriptor.scoreWeighted.total, descriptor.scoreWeighted.max);\n }\n },\n\n /**\n * Generates the outcomes that compute the \"Total score\"\n * @param {Object} descriptor\n * @param {Object} scoring\n * @param {Object} outcomes\n * @param {Array} [categories]\n */\n total: function writerTotal(descriptor, scoring, outcomes, categories) {\n // create the outcome and the rule that process the overall score\n addTotalScoreOutcomes(outcomes, scoring, descriptor.identifier, false);\n if (descriptor.weighted && scoring.weightIdentifier) {\n addTotalScoreOutcomes(outcomes, scoring, descriptor.weighted, true);\n }\n\n // create an outcome per categories\n if (descriptor.categoryIdentifier && categories) {\n _.forEach(categories, function (category) {\n addTotalScoreOutcomes(outcomes, scoring, formatCategoryOutcome(category, descriptor.categoryIdentifier), false, category);\n if (descriptor.categoryWeighted && scoring.weightIdentifier) {\n addTotalScoreOutcomes(outcomes, scoring, formatCategoryOutcome(category, descriptor.categoryWeighted), true, category);\n }\n });\n }\n },\n\n /**\n * Generates the outcomes that compute the \"Max score\"\n * @param {Object} descriptor\n * @param {Object} scoring\n * @param {Object} outcomes\n * @param {Array} [categories]\n */\n max: function writerMax(descriptor, scoring, outcomes, categories) {\n // create the outcome and the rule that process the maximum overall score\n addMaxScoreOutcomes(outcomes, scoring, descriptor.identifier, false);\n if (descriptor.weighted && scoring.weightIdentifier) {\n addMaxScoreOutcomes(outcomes, scoring, descriptor.weighted, true);\n }\n\n // create an outcome per categories\n if (descriptor.categoryIdentifier && categories) {\n _.forEach(categories, function (category) {\n addMaxScoreOutcomes(outcomes, scoring, formatCategoryOutcome(category, descriptor.categoryIdentifier), false, category);\n if (descriptor.categoryWeighted && scoring.weightIdentifier) {\n addMaxScoreOutcomes(outcomes, scoring, formatCategoryOutcome(category, descriptor.categoryWeighted), true, category);\n }\n });\n }\n },\n\n /**\n * Generates the outcomes that compute the \"Cut score\"\n * @param {Object} descriptor\n * @param {Object} scoring\n * @param {Object} outcomes\n * @param {Array} [categories]\n */\n cut: function writerCut(descriptor, scoring, outcomes, categories) {\n var cutScore = scoring.cutScore;\n var totalModeOutcomes = outcomesRecipes.total.outcomes;\n var total = _.find(totalModeOutcomes, {writer: 'total'});\n var max = _.find(totalModeOutcomes, {writer: 'max'});\n var ratio = _.find(totalModeOutcomes, {writer: 'ratio'});\n var whichOutcome = scoring.weightIdentifier ? 'weighted' : 'identifier';\n var ratioIdentifier = ratio[whichOutcome];\n\n // create the outcome and the rule that process the overall score\n addGlobalCutScoreOutcomes(outcomes, descriptor.identifier, ratioIdentifier, cutScore);\n\n // create the outcome and the rule that process the score feedback\n if (descriptor.feedback) {\n addFeedbackScoreOutcomes(\n outcomes,\n descriptor.feedback,\n descriptor.identifier,\n descriptor.feedbackOk,\n descriptor.feedbackFailed\n );\n }\n\n // create an outcome per category\n if (descriptor.categoryIdentifier && categories) {\n _.forEach(categories, function (category) {\n var categoryOutcome = scoring.weightIdentifier ? 'categoryWeighted' : 'categoryIdentifier';\n var categoryOutcomeIdentifier = formatCategoryOutcome(category, descriptor.categoryIdentifier);\n var categoryScoreIdentifier = formatCategoryOutcome(category, total[categoryOutcome]);\n var categoryCountIdentifier = formatCategoryOutcome(category, max[categoryOutcome]);\n\n addCutScoreOutcomes(outcomes, categoryOutcomeIdentifier, categoryScoreIdentifier, categoryCountIdentifier, cutScore);\n\n if (descriptor.categoryFeedback) {\n addFeedbackScoreOutcomes(\n outcomes,\n formatCategoryOutcome(category, descriptor.categoryFeedback),\n categoryOutcomeIdentifier,\n descriptor.feedbackOk,\n descriptor.feedbackFailed\n );\n }\n });\n }\n\n return outcomes;\n }\n };\n\n var scoringHelper = {\n /**\n * Checks the test model against outcome processing mode.\n * Initializes the scoring property accordingly.\n *\n * @param {modelOverseer} modelOverseer\n * @throws {TypeError} if the modelOverseer is invalid\n * @fires modelOverseer#scoring-init\n * @fires modelOverseer#scoring-generate\n * @fires modelOverseer#scoring-write\n */\n init: function init(modelOverseer) {\n var model;\n\n if (!modelOverseer || !_.isFunction(modelOverseer.getModel)) {\n throw new TypeError(\"You must provide a valid modelOverseer\");\n }\n\n model = modelOverseer.getModel();\n\n // detect the score processing mode and build the descriptor used to manage the UI\n model.scoring = detectScoring(modelOverseer);\n\n modelOverseer\n .on('scoring-change category-change delete', function () {\n /**\n * Regenerates the outcomes on any significant changes.\n * After the outcomes have been generated a write is needed to actually apply the data.\n * Other component can listen to this event and eventually prevent the write to happen.\n * @event modelOverseer#scoring-generate\n * @param {Object} outcomes\n */\n modelOverseer.trigger('scoring-generate', scoringHelper.generate(modelOverseer));\n })\n .on('scoring-generate', function (outcomes) {\n outcomeHelper.replaceOutcomes(model, outcomes);\n\n /**\n * The generated outcome have just been applied on the model.\n * @event modelOverseer#scoring-write\n * @param {Object} testModel\n */\n modelOverseer.trigger('scoring-write', model);\n })\n\n /**\n * @event modelOverseer#scoring-init\n * @param {Object} testModel\n */\n .trigger('scoring-init', model);\n },\n\n /**\n * If the processing mode has been set, generates the outcomes that define the scoring.\n *\n * @param {modelOverseer} modelOverseer\n * @returns {Object}\n * @throws {TypeError} if the modelOverseer is invalid or the processing mode is unknown\n */\n generate: function generate(modelOverseer) {\n var model, scoring, outcomes, outcomeRecipe, recipes, categories;\n\n if (!modelOverseer || !_.isFunction(modelOverseer.getModel)) {\n throw new TypeError(\"You must provide a valid modelOverseer\");\n }\n\n model = modelOverseer.getModel();\n scoring = model.scoring;\n outcomes = getOutcomes(model);\n\n // write the score processing mode by generating the outcomes variables, but only if the mode has been set\n if (scoring) {\n outcomeRecipe = outcomesRecipes[scoring.outcomeProcessing];\n if (outcomeRecipe) {\n\n if (outcomeRecipe.clean) {\n // erase the existing rules, they will be replaced by those that are defined here\n removeScoring(outcomes);\n }\n\n // get the recipes that define the outcomes, include sub-recipes if any\n recipes = getRecipes(outcomeRecipe);\n\n // only get the categories if requested\n if (handleCategories(modelOverseer)) {\n categories = modelOverseer.getCategories();\n }\n\n // will generate outcomes based of the defined recipe\n _.forEach(recipes, function(recipe) {\n var writer = outcomesWriters[recipe.writer];\n writer(recipe, scoring, outcomes, categories);\n });\n\n } else {\n throw new Error('Unknown score processing mode: ' + scoring.outcomeProcessing);\n }\n }\n\n return outcomes;\n }\n };\n\n /**\n * Creates an outcome and the rule that process the total score\n *\n * @param {Object} model\n * @param {Object} scoring\n * @param {String} identifier\n * @param {Boolean} [weight]\n * @param {String} [category]\n */\n function addTotalScoreOutcomes(model, scoring, identifier, weight, category) {\n var outcome = outcomeHelper.createOutcome(identifier, baseTypeHelper.FLOAT);\n var processingRule = processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.sum(\n processingRuleHelper.testVariables(scoring.scoreIdentifier, -1, weight && scoring.weightIdentifier, category)\n )\n );\n\n outcomeHelper.addOutcome(model, outcome, processingRule);\n }\n\n /**\n * Creates an outcome and the rule that process the maximum score\n *\n * @param {Object} model\n * @param {Object} scoring\n * @param {String} identifier\n * @param {Boolean} [weight]\n * @param {String} [category]\n */\n function addMaxScoreOutcomes(model, scoring, identifier, weight, category) {\n var outcome = outcomeHelper.createOutcome(identifier, baseTypeHelper.FLOAT);\n var processingRule = processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.sum(\n processingRuleHelper.testVariables('MAXSCORE', -1, weight && scoring.weightIdentifier, category)\n )\n );\n outcomeHelper.addOutcome(model, outcome, processingRule);\n }\n\n /**\n * Create an outcome and the rule that process the score ratio\n *\n * @param model\n * @param identifier\n * @param identifierTotal\n * @param identifierMax\n */\n function addRatioOutcomes(model, identifier, identifierTotal, identifierMax) {\n var outcome = outcomeHelper.createOutcome(identifier, baseTypeHelper.FLOAT);\n var outcomeCondition = processingRuleHelper.outcomeCondition(\n processingRuleHelper.outcomeIf(\n processingRuleHelper.isNull(\n processingRuleHelper.variable(identifierMax)\n ),\n processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.baseValue(0, baseTypeHelper.FLOAT)\n )\n ),\n processingRuleHelper.outcomeElse(\n processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.divide(\n processingRuleHelper.variable(identifierTotal),\n processingRuleHelper.variable(identifierMax)\n )\n )\n )\n );\n\n outcomeHelper.addOutcome(model, outcome);\n outcomeHelper.addOutcomeProcessing(model, outcomeCondition);\n }\n\n /**\n * Creates an outcome and the rule that process the cut score by category\n *\n * @param {Object} model\n * @param {String} identifier\n * @param {String} scoreIdentifier\n * @param {String} countIdentifier\n * @param {String|Number} cutScore\n */\n function addCutScoreOutcomes(model, identifier, scoreIdentifier, countIdentifier, cutScore) {\n var outcome = outcomeHelper.createOutcome(identifier, baseTypeHelper.BOOLEAN);\n var processingRule = processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.gte(\n processingRuleHelper.divide(\n processingRuleHelper.variable(scoreIdentifier),\n processingRuleHelper.variable(countIdentifier)\n ),\n processingRuleHelper.baseValue(cutScore, baseTypeHelper.FLOAT)\n )\n );\n\n outcomeHelper.addOutcome(model, outcome, processingRule);\n }\n\n /**\n * Creates an outcome and the rule that process the global cut score\n *\n * @param {Object} model\n * @param {String} identifier\n * @param {String} scoreIdentifier\n * @param {String} countIdentifier\n * @param {String|Number} cutScore\n */\n function addGlobalCutScoreOutcomes(model, identifier, ratioIdentifier, cutScore) {\n var outcome = outcomeHelper.createOutcome(identifier, baseTypeHelper.BOOLEAN);\n var processingRule = processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.gte(\n processingRuleHelper.variable(ratioIdentifier),\n processingRuleHelper.baseValue(cutScore, baseTypeHelper.FLOAT)\n )\n );\n\n outcomeHelper.addOutcome(model, outcome, processingRule);\n }\n\n /**\n * Creates an outcome and the rule that process the score feedback\n *\n * @param {Object} model\n * @param {String} identifier\n * @param {String} variable\n * @param {String} passed\n * @param {String} notPassed\n */\n function addFeedbackScoreOutcomes(model, identifier, variable, passed, notPassed) {\n var type = baseTypeHelper.IDENTIFIER;\n var outcome = outcomeHelper.createOutcome(identifier, type);\n var processingRule = processingRuleHelper.outcomeCondition(\n processingRuleHelper.outcomeIf(\n processingRuleHelper.match(\n processingRuleHelper.variable(variable),\n processingRuleHelper.baseValue(true, baseTypeHelper.BOOLEAN)\n ),\n processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.baseValue(passed, type)\n )\n ),\n processingRuleHelper.outcomeElse(\n processingRuleHelper.setOutcomeValue(identifier,\n processingRuleHelper.baseValue(notPassed, type)\n )\n )\n );\n\n outcomeHelper.addOutcome(model, outcome);\n outcomeHelper.addOutcomeProcessing(model, processingRule);\n }\n\n /**\n * Formats the identifier of a category outcome\n * @param {String} category\n * @param {String} template\n * @returns {String}\n */\n function formatCategoryOutcome(category, template) {\n return format(template, category.toUpperCase());\n }\n\n /**\n * Checks whether an identifier belongs to a particular recipe\n * @param {String} identifier\n * @param {Object} recipe\n * @param {Boolean} [onlyCategories]\n * @returns {Boolean}\n */\n function belongToRecipe(identifier, recipe, onlyCategories) {\n var match = false;\n if (recipe.signature && recipe.signature.test(identifier)) {\n match = true;\n if (onlyCategories) {\n _.forEach(recipe.outcomes, function(outcome) {\n if (outcome.identifier === identifier ||\n (outcome.weighted && outcome.weighted === identifier) ||\n (outcome.feedback && outcome.feedback === identifier)) {\n match = false;\n return false;\n }\n });\n }\n }\n return match;\n }\n\n /**\n * Checks if all the outcomes are related to the recipe\n * @param {Object} outcomeRecipe\n * @param {Array} outcomes\n * @param {Array} categories\n * @returns {Boolean}\n */\n function matchRecipe(outcomeRecipe, outcomes, categories) {\n var signatures = getSignatures(outcomeRecipe);\n var match = true;\n\n // check the outcomes definitions against the provided identifier\n function matchRecipeOutcome(recipe, identifier) {\n var outcomeMatch = false;\n\n // first level, the signature must match\n if (recipe.signature && recipe.signature.test(identifier)) {\n _.forEach(recipe.outcomes, function(outcome) {\n // second level, the main identifier must match\n if (outcome.identifier !== identifier &&\n (!outcome.weighted || (outcome.weighted && outcome.weighted !== identifier)) &&\n (!outcome.feedback || (outcome.feedback && outcome.feedback !== identifier))) {\n\n if (categories) {\n // third level, a category must match\n _.forEach(categories, function(category) {\n if (outcome.categoryIdentifier &&\n identifier === formatCategoryOutcome(category, outcome.categoryIdentifier)) {\n outcomeMatch = true;\n } else if (outcome.categoryWeighted &&\n identifier === formatCategoryOutcome(category, outcome.categoryWeighted)) {\n outcomeMatch = true;\n } else if (outcome.categoryFeedback &&\n identifier === formatCategoryOutcome(category, outcome.categoryFeedback)) {\n outcomeMatch = true;\n }\n // found something?\n if (outcomeMatch) {\n return false;\n }\n });\n }\n } else {\n outcomeMatch = true;\n }\n\n // found something?\n if (outcomeMatch) {\n return false;\n }\n });\n }\n\n if (!outcomeMatch && recipe.include) {\n outcomeMatch = matchRecipeOutcome(outcomesRecipes[recipe.include], identifier);\n }\n\n return outcomeMatch;\n }\n\n // only check the outcomes that are related to the scoring mode\n _.forEach(outcomes, function(identifier) {\n var signatureMatch = false;\n _.forEach(signatures, function(signature) {\n if (signature.test(identifier)) {\n signatureMatch = true;\n return false;\n }\n });\n\n if (signatureMatch) {\n match = matchRecipeOutcome(outcomeRecipe, identifier);\n\n if (!match) {\n return false;\n }\n }\n });\n\n return match;\n }\n\n /**\n * Gets all the outcomes signatures related to a scoring mode\n * @param {Object} recipe\n * @returns {Array}\n */\n function getSignatures(recipe) {\n var signatures = [];\n\n // list the signatures for each processing mode, taking care of includes\n while(recipe) {\n if (recipe.signature) {\n signatures.push(recipe.signature);\n }\n recipe = recipe.include && outcomesRecipes[recipe.include];\n }\n\n return signatures;\n }\n\n /**\n * Gets all the outcomes recipes related to a scoring mode\n * @param {Object} recipe\n * @returns {Array}\n */\n function getRecipes(recipe) {\n var descriptors = [];\n\n // get the recipes that define the outcomes, include sub-recipes if any\n while(recipe) {\n if (recipe.outcomes) {\n descriptors = [].concat(recipe.outcomes, descriptors);\n }\n recipe = recipe.include && outcomesRecipes[recipe.include];\n }\n\n return descriptors;\n }\n\n /**\n * Checks if an outcome is related to the outcomes recipe,\n * then returns the recipe descriptor.\n * @param {Object|String} outcome\n * @returns {Object}\n */\n function getOutcomesRecipe(outcome) {\n var identifier = outcomeHelper.getOutcomeIdentifier(outcome);\n var mode = null;\n _.forEach(outcomesRecipes, function (processingRecipe) {\n if (belongToRecipe(identifier, processingRecipe)) {\n mode = processingRecipe;\n return false;\n }\n });\n return mode;\n }\n\n /**\n * Gets the score processing modes from a list of outcomes\n * @param {Array} outcomes\n * @returns {Array}\n */\n function listScoringModes(outcomes) {\n var modes = {};\n _.forEach(outcomes, function (outcome) {\n var recipe = getOutcomesRecipe(outcome);\n if (recipe) {\n modes[recipe.key] = true;\n }\n });\n return _.keys(modes);\n }\n\n /**\n * Checks whether the categories have to be taken into account\n * @param {modelOverseer} modelOverseer\n * @returns {Boolean}\n */\n function handleCategories(modelOverseer) {\n var model = modelOverseer.getModel();\n return !!(model.scoring && model.scoring.categoryScore);\n }\n\n /**\n * Checks if the test model contains outcomes for categories\n * @param {Object} model\n * @returns {Boolean}\n */\n function hasCategoryOutcome(model) {\n var categoryOutcomes = false;\n _.forEach(outcomeHelper.getOutcomeDeclarations(model), function (outcomeDeclaration) {\n var identifier = outcomeHelper.getOutcomeIdentifier(outcomeDeclaration);\n _.forEach(outcomesRecipes, function (processingRecipe) {\n if (belongToRecipe(identifier, processingRecipe, true)) {\n categoryOutcomes = true;\n return false;\n }\n });\n });\n return categoryOutcomes;\n }\n\n /**\n * Gets the defined cut score from the outcome rules\n * @param {Object} model\n * @returns {Number}\n */\n function getCutScore(model) {\n var values = _(outcomeHelper.getOutcomeProcessingRules(model)).map(function (outcome) {\n return outcomeHelper.getProcessingRuleProperty(outcome, 'setOutcomeValue.gte.baseValue.value');\n }).compact().uniq().value();\n if (_.isEmpty(values)) {\n values = [defaultCutScore];\n }\n return Math.max(0, _.max(values));\n }\n\n /**\n * Gets the defined weight identifier from the outcome rules\n * @param {Object} model\n * @returns {String}\n */\n function getWeightIdentifier(model) {\n var values = [];\n outcomeHelper.eachOutcomeProcessingRuleExpressions(model, function (processingRule) {\n if (processingRule['qti-type'] === 'testVariables' && processingRule.weightIdentifier) {\n values.push(processingRule.weightIdentifier);\n }\n });\n values = _(values).compact().uniq().value();\n\n return values.length ? values[0] : '';\n }\n\n /**\n * Detects the outcome processing mode for the scoring\n * @param {modelOverseer} modelOverseer\n * @returns {String}\n */\n function getOutcomeProcessing(modelOverseer) {\n var model = modelOverseer.getModel();\n var outcomeDeclarations = outcomeHelper.getOutcomeDeclarations(model);\n var outcomeRules = outcomeHelper.getOutcomeProcessingRules(model);\n\n // walk through each outcome declaration, and tries to identify the score processing mode\n var declarations = listScoringModes(outcomeDeclarations);\n var processing = listScoringModes(outcomeRules);\n var diff = _.difference(declarations, processing);\n var count = _.size(declarations);\n var included;\n\n // default fallback, applied when several modes are detected at the same time\n var outcomeProcessing = 'custom';\n\n // set the score processing mode with respect to the found outcomes\n if (count === _.size(processing)) {\n if (!count) {\n // no mode detected, set the mode to none\n outcomeProcessing = 'none';\n } else if (_.isEmpty(diff)) {\n if (count > 1) {\n // several modes detected, try to reduce the list by detecting includes\n included = [];\n _.forEach(declarations, function(mode) {\n if (outcomesRecipes[mode] && outcomesRecipes[mode].include) {\n included.push(outcomesRecipes[mode].include);\n }\n });\n processing = _.difference(processing, included);\n count = _.size(processing);\n }\n\n if (count === 1) {\n // single mode detected, keep the last got key\n outcomeProcessing = processing[0];\n\n // check if all outcomes are strictly related to the detected mode\n if (!matchRecipe(outcomesRecipes[outcomeProcessing], modelOverseer.getOutcomesNames(), modelOverseer.getCategories())) {\n outcomeProcessing = 'custom';\n }\n }\n }\n }\n\n return outcomeProcessing;\n }\n\n /**\n * Detects the score processing mode and builds the descriptor used to manage the UI.\n * @param {modelOverseer} modelOverseer\n * @returns {Object}\n */\n function detectScoring(modelOverseer) {\n var model = modelOverseer.getModel();\n return {\n modes: processingModes,\n scoreIdentifier: defaultScoreIdentifier,\n weightIdentifier: getWeightIdentifier(model),\n cutScore: getCutScore(model),\n categoryScore: hasCategoryOutcome(model),\n outcomeProcessing: getOutcomeProcessing(modelOverseer)\n };\n }\n\n /**\n * Removes all scoring outcomes\n * @param {Object} model\n */\n function removeScoring(model) {\n var scoringOutcomes = _.indexBy(outcomeHelper.listOutcomes(model, getOutcomesRecipe), function (outcome) {\n return outcome;\n });\n\n outcomeHelper.removeOutcomes(model, function(outcome) {\n var match = false;\n\n function browseExpressions(processingRule) {\n if (_.isArray(processingRule)) {\n _.forEach(processingRule, browseExpressions);\n } else if (processingRule) {\n if (scoringOutcomes[outcomeHelper.getOutcomeIdentifier(processingRule)]) {\n match = true;\n }\n\n if (!match && processingRule.expression) {\n browseExpressions(processingRule.expression);\n }\n if (!match && processingRule.expressions) {\n browseExpressions(processingRule.expressions);\n }\n if (!match && processingRule.outcomeRules) {\n browseExpressions(processingRule.outcomeRules);\n }\n if (!match && processingRule.outcomeIf) {\n browseExpressions(processingRule.outcomeIf);\n }\n if (!match && processingRule.outcomeElse) {\n browseExpressions(processingRule.outcomeElse);\n }\n }\n }\n\n if (outcome['qti-type'] === 'outcomeCondition') {\n browseExpressions(outcome);\n } else {\n match = !!scoringOutcomes[outcomeHelper.getOutcomeIdentifier(outcome)];\n }\n return match;\n });\n }\n\n /**\n * Gets a copy of the list of outcomes, provides the same structure as the model\n * @param {Object} model\n * @returns {Object}\n */\n function getOutcomes(model) {\n return {\n outcomeDeclarations: [].concat(outcomeHelper.getOutcomeDeclarations(model)),\n outcomeProcessing: {\n outcomeRules: [].concat(outcomeHelper.getOutcomeProcessingRules(model))\n }\n };\n }\n\n return scoringHelper;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2020 Open Assessment Technologies SA ;\n */\n/**\n * Track the change within the testCreator\n * @author Juan Luis Gutierrez Dos Santos <juanluis.gutierrezdossantos@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/changeTracker',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'lib/uuid',\n 'core/eventifier',\n 'ui/dialog'\n], function (\n $,\n _,\n __,\n uuid,\n eventifier,\n dialog\n) {\n 'use strict';\n\n /**\n * The messages asking to save\n */\n const messages = {\n preview: __('The test needs to be saved before it can be previewed.'),\n leave: __('The test has unsaved changes, are you sure you want to leave?'),\n exit: __('The test has unsaved changes, would you like to save it?')\n };\n\n /**\n *\n * @param {HTMLElement} container\n * @param {testCreator} testCreator\n * @param {String} [wrapperSelector]\n * @returns {changeTracker}\n */\n function changeTrackerFactory(container, testCreator, wrapperSelector = 'body') {\n\n // internal namespace for global registered events\n const eventNS = `.ct-${uuid(8, 16)}`;\n\n // keep the value of the test before changes\n let originalTest;\n\n // are we in the middle of the confirm process?\n let asking = false;\n\n /**\n * @typedef {Object} changeTracker\n */\n const changeTracker = eventifier({\n /**\n * Initialized the changed state\n * @returns {changeTracker}\n */\n init() {\n originalTest = this.getSerializedTest();\n\n return this;\n },\n\n /**\n * Installs the change tracker, registers listeners\n * @returns {changeTracker}\n */\n install() {\n this.init();\n asking = false;\n\n // add a browser popup to prevent leaving the browser\n $(window)\n .on(`beforeunload${eventNS}`, () => {\n if (!asking && this.hasChanged()) {\n return messages.leave;\n }\n })\n // since we don't know how to prevent history based events, we just stop the handling\n .on('popstate', this.uninstall);\n\n // every click outside the authoring\n $(wrapperSelector)\n .on(`click${eventNS}`, e => {\n if (!$.contains(container, e.target) && this.hasChanged()) {\n e.stopImmediatePropagation();\n e.preventDefault();\n\n this.confirmBefore('exit')\n .then(whatToDo => {\n this.ifWantSave(whatToDo);\n this.uninstall();\n e.target.click();\n })\n //do nothing but prevent uncaught error\n .catch(() => {});\n }\n });\n\n testCreator\n .on(`ready${eventNS} saved${eventNS}`, () => this.init())\n .before(`creatorclose${eventNS}`, () => this.confirmBefore('exit').then(whatToDo => {\n this.ifWantSave(whatToDo);\n }))\n .before(`preview${eventNS}`, () => this.confirmBefore('preview').then(whatToDo => {\n this.ifWantSave(whatToDo);\n }))\n .before(`exit${eventNS}`, () => this.uninstall());\n\n return this;\n },\n\n /**\n * Check if we need to trigger save\n * @param {Object} whatToDo\n * @fires {save}\n */\n ifWantSave(whatToDo) {\n if (whatToDo && whatToDo.ifWantSave) {\n testCreator.trigger('save');\n }\n },\n\n\n /**\n * Uninstalls the change tracker, unregisters listeners\n * @returns {changeTracker}\n */\n uninstall() {\n // remove all global handlers\n $(window.document)\n .off(eventNS);\n $(window).off(eventNS);\n $(wrapperSelector).off(eventNS);\n testCreator.off(eventNS);\n\n return this;\n },\n\n /**\n * Displays a confirmation dialog,\n * The \"ok\" button will save and resolve.\n * The \"cancel\" button will reject.\n *\n * @param {String} message - the confirm message to display\n * @returns {Promise} resolves once saved\n */\n confirmBefore(message) {\n // if a key is given load the related message\n message = messages[message] || message;\n\n return new Promise((resolve, reject) => {\n if (asking) {\n return reject();\n }\n\n if (!this.hasChanged()) {\n return resolve();\n }\n\n asking = true;\n\n const confirmDlg = dialog({\n message: message,\n buttons: [{\n id: 'dontsave',\n type: 'regular',\n label: __('Don\\'t save'),\n close: true\n }, {\n id: 'cancel',\n type: 'regular',\n label: __('Cancel'),\n close: true\n }, {\n id: 'save',\n type: 'info',\n label: __('Save'),\n close: true\n }],\n autoRender: true,\n autoDestroy: true,\n onSaveBtn: () => resolve({ ifWantSave: true }),\n onDontsaveBtn: () => resolve({ ifWantSave: false }),\n onCancelBtn: () => {\n confirmDlg.hide();\n reject({ cancel: true });\n }\n })\n .on('closed.modal', () => asking = false);\n });\n },\n\n /**\n * Does the test have changed?\n * @returns {Boolean}\n */\n hasChanged() {\n const currentTest = this.getSerializedTest();\n return originalTest !== currentTest || (null === currentTest && null === originalTest);\n },\n\n /**\n * Get a string representation of the current test, used for comparison\n * @returns {String} the test\n */\n getSerializedTest() {\n let serialized = '';\n try {\n // create a string from the test content\n serialized = JSON.stringify(testCreator.getModelOverseer().getModel());\n\n // sometimes the creator strip spaces between tags, so we do the same\n serialized = serialized.replace(/ {2,}/g, ' ');\n } catch (err) {\n serialized = null;\n }\n return serialized;\n }\n });\n\n return changeTracker.install();\n }\n\n return changeTrackerFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014-2019 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n/**\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/creator/creator',[\n 'module',\n 'jquery',\n 'lodash',\n 'helpers',\n 'i18n',\n 'ui/feedback',\n 'core/databindcontroller',\n 'taoQtiTest/controller/creator/qtiTestCreator',\n 'taoQtiTest/controller/creator/views/item',\n 'taoQtiTest/controller/creator/views/test',\n 'taoQtiTest/controller/creator/views/testpart',\n 'taoQtiTest/controller/creator/views/section',\n 'taoQtiTest/controller/creator/views/itemref',\n 'taoQtiTest/controller/creator/encoders/dom2qti',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest',\n 'taoQtiTest/controller/creator/helpers/scoring',\n 'taoQtiTest/controller/creator/helpers/categorySelector',\n 'ui/validator/validators',\n 'taoQtiTest/controller/creator/helpers/changeTracker',\n 'taoTests/previewer/factory',\n 'core/logger'\n], function(\n module,\n $,\n _,\n helpers,\n __,\n feedback,\n DataBindController,\n qtiTestCreatorFactory,\n itemView,\n testView,\n testPartView,\n sectionView,\n itemrefView,\n Dom2QtiEncoder,\n templates,\n qtiTestHelper,\n scoringHelper,\n categorySelector,\n validators,\n changeTracker,\n previewerFactory,\n loggerFactory\n){\n 'use strict';\n const logger = loggerFactory('taoQtiTest/controller/creator');\n\n /**\n * The test creator controller is the main entry point\n * and orchestrates data retrieval and view/components loading.\n * @exports creator/controller\n */\n const Controller = {\n\n routes : {},\n\n /**\n * Start the controller, main entry method.\n * @public\n * @param {Object} options\n * @param {Object} options.labels - the list of item's labels to give to the ItemView\n * @param {Object} options.routes - action's urls\n * @param {Object} options.categoriesPresets - predefined category that can be set at the item or section level\n * @param {Boolean} [options.guidedNavigation=false] - feature flag for the guided navigation\n */\n start(options) {\n const $container = $('#test-creator');\n const $saver = $('#saver');\n const $previewer = $('#previewer');\n const $back = $('#authoringBack');\n\n let creatorContext;\n let binder;\n let binderOptions;\n let modelOverseer;\n\n this.identifiers = [];\n\n options = _.merge(module.config(), options || {});\n options.routes = options.routes || {};\n options.labels = options.labels || {};\n options.categoriesPresets = options.categoriesPresets || {};\n options.guidedNavigation = options.guidedNavigation === true;\n\n categorySelector.setPresets(options.categoriesPresets);\n\n //back button\n $back.on('click', e => {\n e.preventDefault();\n if (creatorContext) {\n creatorContext.trigger('creatorclose');\n }\n });\n\n //preview button\n if (!Object.keys(options.labels).length) {\n $previewer.attr('disabled', true).addClass('disabled');\n }\n $previewer.on('click', e => {\n e.preventDefault();\n if(!$previewer.hasClass('disabled')) {\n creatorContext.trigger('preview');\n }\n });\n const isTestContainsItems = () => {\n if ($container.find('.test-content').find('.itemref').length) {\n $previewer.attr('disabled', false).removeClass('disabled');\n return true;\n } else {\n $previewer.attr('disabled', true).addClass('disabled');\n return false;\n }\n };\n\n //set up the ItemView, give it a configured loadItems ref\n itemView($('.test-creator-items .item-selection', $container));\n\n // forwards some binder events to the model overseer\n $container.on('change.binder delete.binder', (e, model) => {\n if (e.namespace === 'binder' && model && modelOverseer) {\n modelOverseer.trigger(e.type, model);\n }\n });\n\n //Data Binding options\n binderOptions = _.merge(options.routes, {\n filters : {\n isItemRef : value => qtiTestHelper.filterQtiType(value, 'assessmentItemRef'),\n isSection : value => qtiTestHelper.filterQtiType(value, 'assessmentSection')\n },\n encoders : {\n 'dom2qti' : Dom2QtiEncoder\n },\n templates : templates,\n beforeSave(model) {\n //ensure the qti-type is present\n qtiTestHelper.addMissingQtiType(model);\n\n //apply consolidation rules\n qtiTestHelper.consolidateModel(model);\n\n //validate the model\n try {\n qtiTestHelper.validateModel(model);\n } catch(err) {\n $saver.attr('disabled', false).removeClass('disabled');\n feedback().error(`${__('The test has not been saved.')} + ${err}`);\n return false;\n }\n return true;\n }\n });\n\n //set up the databinder\n binder = DataBindController\n .takeControl($container, binderOptions)\n .get( model => {\n\n creatorContext = qtiTestCreatorFactory($container, {\n uri : options.uri,\n labels : options.labels,\n routes : options.routes,\n guidedNavigation : options.guidedNavigation\n });\n creatorContext.setTestModel(model);\n modelOverseer = creatorContext.getModelOverseer();\n\n //detect the scoring mode\n scoringHelper.init(modelOverseer);\n\n //register validators\n validators.register('idFormat', qtiTestHelper.idFormatValidator());\n validators.register('testIdFormat', qtiTestHelper.testidFormatValidator());\n validators.register('testIdAvailable', qtiTestHelper.idAvailableValidator(modelOverseer), true);\n\n //once model is loaded, we set up the test view\n testView(creatorContext);\n\n //listen for changes to update available actions\n testPartView.listenActionState();\n sectionView.listenActionState();\n itemrefView.listenActionState();\n itemrefView.resize();\n\n $(window)\n .off('resize.qti-test-creator')\n .on('resize.qti-test-creator', () => itemrefView.resize() );\n\n changeTracker($container.get()[0], creatorContext, '.content-wrap');\n\n creatorContext.on('save', function() {\n if(!$saver.hasClass('disabled')){\n $saver.prop('disabled', true).addClass('disabled');\n binder.save(function() {\n $saver.prop('disabled', false).removeClass('disabled');\n feedback().success(__('Test Saved'));\n isTestContainsItems();\n creatorContext.trigger('saved');\n }, function() {\n $saver.prop('disabled', false).removeClass('disabled');\n });\n }\n });\n\n creatorContext.on('preview', function() {\n if(isTestContainsItems()) {\n const saveUrl = options.routes.save;\n const testUri = saveUrl.slice(saveUrl.indexOf('uri=') + 4);\n return previewerFactory(\n module.config().provider,\n decodeURIComponent(testUri),\n {\n readOnly: false,\n fullPage: true\n }\n )\n .catch(err => {\n logger.error(err);\n feedback().error(__('Test Preview is not installed, please contact to your administrator.'));\n });\n }\n });\n\n creatorContext.on('creatorclose', () => {\n creatorContext.trigger('exit');\n window.history.back();\n });\n });\n\n //the save button triggers binder's save action.\n $saver.on('click', function(event){\n event.preventDefault();\n creatorContext.trigger('save');\n });\n }\n };\n\n return Controller;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>\n */\ndefine('taoQtiTest/controller/creator/helpers/ckConfigurator',['ui/ckeditor/ckConfigurator', 'mathJax'], function(ckConfigurator) {\n 'use strict';\n\n /**\n * Generate a configuration object for CKEDITOR\n *\n * @param editor instance of ckeditor\n * @param toolbarType block | inline | flow | qtiBlock | qtiInline | qtiFlow | reset to get back to normal\n * @param {Object} [options] - is based on the CKEDITOR config object with some additional sugar\n * Note that it's here you need to add parameters for the resource manager.\n * Some options are not covered in http://docs.ckeditor.com/#!/api/CKEDITOR.config\n * @param [options.dtdOverrides] - @see dtdOverrides which pre-defines them\n * @param {Object} [options.positionedPlugins] - @see ckConfig.positionedPlugins\n * @param {Boolean} [options.qtiImage] - enables the qtiImage plugin\n * @param {Boolean} [options.qtiInclude] - enables the qtiInclude plugin\n * @param {Boolean} [options.underline] - enables the underline plugin\n * @param {Boolean} [options.mathJax] - enables the mathJax plugin\n *\n * @see http://docs.ckeditor.com/#!/api/CKEDITOR.config\n */\n var getConfig = function(editor, toolbarType, options){\n options = options || {};\n\n options.underline = true;\n\n return ckConfigurator.getConfig(editor, toolbarType, options);\n };\n\n return {\n getConfig : getConfig\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n *\n *\n */\n\n//@see http://forge.taotesting.com/projects/tao/wiki/Front_js\ndefine('taoQtiTest/controller/routes',[],function () {\n 'use strict';\n\n return {\n Creator: {\n css: 'creator',\n actions: {\n index: 'controller/creator/creator'\n }\n },\n XmlEditor: {\n actions: {\n edit: 'controller/content/edit'\n }\n }\n };\n});\n\n","\ndefine('css!taoQtiTestCss/new-test-runner',[],function(){});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner controller entry\n *\n * @author Bertrand Chevrier <bertrand@taotesting.com>\n */\ndefine('taoQtiTest/controller/runner/runner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'context',\n 'module',\n 'core/router',\n 'core/logger',\n 'layout/loading-bar',\n 'ui/feedback',\n 'util/url',\n 'util/locale',\n 'taoTests/runner/providerLoader',\n 'taoTests/runner/runner',\n 'css!taoQtiTestCss/new-test-runner'\n], function (\n $,\n _,\n __,\n context,\n module,\n router,\n loggerFactory,\n loadingBar,\n feedback,\n urlUtil,\n locale,\n providerLoader,\n runner\n) {\n 'use strict';\n\n /**\n * List of options required by the controller\n * @type {String[]}\n */\n const requiredOptions = [\n 'testDefinition',\n 'testCompilation',\n 'serviceCallId',\n 'bootstrap',\n 'options',\n 'providers'\n ];\n\n /**\n * The runner controller\n */\n return {\n\n /**\n * Controller entry point\n *\n * @param {Object} config - the testRunner config\n * @param {String} config.testDefinition - the test definition id\n * @param {String} config.testCompilation - the test compilation id\n * @param {String} config.serviceCallId - the service call id\n * @param {Object} config.bootstrap - contains the extension and the controller to call\n * @param {Object} config.options - the full URL where to return at the final end of the test\n * @param {Object[]} config.providers - the collection of providers to load\n */\n start(config) {\n let exitReason;\n const $container = $('.runner');\n\n const logger = loggerFactory('controller/runner', {\n serviceCallId : config.serviceCallId,\n plugins : config && config.providers && Object.keys(config.providers.plugins)\n });\n\n let preventFeedback = false;\n let errorFeedback = null;\n\n /**\n * Exit the test runner using the configured exitUrl\n * @param {String} [reason] - to add a warning once left\n * @param {String} [level] - error level\n */\n const exit = function exit(reason, level){\n let url = config.options.exitUrl;\n const params = {};\n if (reason) {\n if (!level) {\n level = 'warning';\n }\n params[level] = reason;\n url = urlUtil.build(url, params);\n }\n window.location = url;\n };\n\n /**\n * Handles errors\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onError = function onError(err, displayMessage) {\n onFeedback(err, displayMessage, \"error\");\n };\n\n /**\n * Handles warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n */\n const onWarning = function onWarning(err, displayMessage) {\n onFeedback(err, displayMessage, \"warning\");\n };\n\n /**\n * Handles errors & warnings\n * @param {Error} err - the thrown error\n * @param {String} [displayMessage] - an alternate message to display\n * @param {String} [type] - \"error\" or \"warning\"\n */\n const onFeedback = function onFeedback(err, displayMessage, type) {\n const typeMap = {\n warning: {\n logger: \"warn\",\n feedback: \"warning\"\n },\n error: {\n logger: \"error\",\n feedback: \"error\"\n }\n };\n const loggerByType = logger[typeMap[type].logger];\n const feedbackByType = feedback()[typeMap[type].feedback];\n\n displayMessage = displayMessage || err.message;\n\n if(!_.isString(displayMessage)){\n displayMessage = JSON.stringify(displayMessage);\n }\n loadingBar.stop();\n\n loggerByType({ displayMessage : displayMessage }, err);\n\n if(type === \"error\" && (err.code === 403 || err.code === 500)) {\n displayMessage = `${__('An error occurred during the test, please content your administrator.')} ${displayMessage}`;\n return exit(displayMessage, 'error');\n }\n if (!preventFeedback) {\n errorFeedback = feedbackByType(displayMessage, {timeout: -1});\n }\n };\n\n const moduleConfig = module.config();\n\n loadingBar.start();\n\n // adding attr for RTL languages\n $('.delivery-scope').attr({dir: locale.getLanguageDirection(context.locale)});\n\n // verify required config\n if ( ! requiredOptions.every( option => typeof config[option] !== 'undefined') ) {\n return onError(new TypeError(__('Missing required configuration option %s', name)));\n }\n\n // dispatch any extra registered routes\n if (moduleConfig && _.isArray(moduleConfig.extraRoutes) && moduleConfig.extraRoutes.length) {\n router.dispatch(moduleConfig.extraRoutes);\n }\n\n //for the qti provider to be selected here\n config.provider = Object.assign( config.provider || {}, { runner: 'qti' });\n\n //load the plugins and the proxy provider\n providerLoader(config.providers, context.bundle)\n .then(function (results) {\n\n const testRunnerConfig = _.omit(config, ['providers']);\n testRunnerConfig.renderTo = $container;\n\n if (results.proxy && typeof results.proxy.getAvailableProviders === 'function') {\n const loadedProxies = results.proxy.getAvailableProviders();\n testRunnerConfig.provider.proxy = loadedProxies[0];\n }\n\n logger.debug({\n config: testRunnerConfig,\n providers : config.providers\n }, 'Start test runner');\n\n //instantiate the QtiTestRunner\n runner(config.provider.runner, results.plugins, testRunnerConfig)\n .on('error', onError)\n .on('warning', onWarning)\n .on('ready', function () {\n _.defer(function () {\n $container.removeClass('hidden');\n });\n })\n .on('pause', function(data) {\n if (data && data.reason) {\n exitReason = data.reason;\n }\n })\n .after('destroy', function () {\n this.removeAllListeners();\n\n // at the end, we are redirected to the exit URL\n exit(exitReason);\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('disablefeedbackalerts', function() {\n if (errorFeedback) {\n errorFeedback.close();\n }\n preventFeedback = true;\n })\n\n //FIXME this event should not be triggered on the test runner\n .on('enablefeedbackalerts', function() {\n preventFeedback = false;\n })\n .init();\n })\n .catch(function(err){\n onError(err, __('An error occurred during the test initialization!'));\n });\n }\n };\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n *\n */\n\n/**\n * This module allows adding extra buttons in the action bar of the test runner\n *\n */\ndefine('taoQtiTest/testRunner/actionBarHook',[\n 'jquery',\n 'lodash',\n 'core/errorHandler',\n 'core/promise'\n], function ($, _, errorHandler, Promise) {\n\n 'use strict';\n\n /**\n * Events namespace\n * @type {String}\n * @private\n */\n var _ns = '.actionBarHook';\n\n /**\n * We need to access the root document to listen for some events\n * @type {jQuery}\n * @private\n */\n var $doc = $(document);\n\n /**\n * List of loaded and visible hooks\n * @type {Object}\n * @private\n */\n var tools = {};\n\n /**\n * Flag set to true when the item is loaded\n * @type {Boolean}\n * @private\n */\n var itemIsLoaded = false;\n\n // catch the item loaded event\n $doc.off(_ns).on('serviceloaded' + _ns, function() {\n itemIsLoaded = true;\n _.forEach(tools, function(tool) {\n triggerItemLoaded(tool);\n });\n });\n\n /**\n * Check that the toolConfig is correct\n *\n * @param {Object} toolconfig\n * @param {String} toolconfig.hook - the amd module to be loaded to initialize the button\n * @param {String} [toolconfig.label] - the label to be displayed in the button\n * @param {String} [toolconfig.icon] - the icon to be displayed in the button\n * @param {String} [toolconfig.title] - the title to be displayed in the button\n * @param {Array} [toolconfig.items] - an optional list of menu items\n * @returns {Boolean}\n */\n function isValidConfig(toolconfig) {\n return !!(_.isObject(toolconfig) && toolconfig.hook);\n }\n\n /**\n * Triggers the itemLoaded event inside the provided actionBar hook\n * @param {Object} tool\n */\n function triggerItemLoaded(tool) {\n if (tool && tool.itemLoaded) {\n tool.itemLoaded();\n }\n }\n\n /**\n * Init a test runner button from its config\n *\n * @param {String} id\n * @param {Object|String} toolconfig\n * @param {String} toolconfig.hook - the amd module to be loaded to initialize the button\n * @param {String} [toolconfig.label] - the label to be displayed in the button\n * @param {String} [toolconfig.icon] - the icon to be displayed in the button\n * @param {String} [toolconfig.title] - the title to be displayed in the button\n * @param {Array} [toolconfig.items] - an optional list of menu items\n * @param {Object} testContext - the complete state of the test\n * @param {Object} testRunner - the test runner instance\n * @fires ready.actionBarHook when the hook has been initialized\n * @returns {Promise}\n */\n function initQtiTool($toolsContainer, id, toolconfig, testContext, testRunner) {\n\n // the tool is always initialized before the item is loaded, so we can safely false the flag\n itemIsLoaded = false;\n tools[id] = null;\n\n if (_.isString(toolconfig)) {\n toolconfig = {\n hook: toolconfig\n };\n }\n\n return new Promise(function(resolve) {\n if (isValidConfig(toolconfig)) {\n\n require([toolconfig.hook], function (hook) {\n\n var $button;\n var $existingBtn;\n\n if (isValidHook(hook)) {\n //init the control\n hook.init(id, toolconfig, testContext, testRunner);\n\n //if an instance of the tool is already attached, remove it:\n $existingBtn = $toolsContainer.children('[data-control=\"' + id + '\"]');\n if ($existingBtn.length) {\n hook.clear($existingBtn);\n $existingBtn.remove();\n }\n\n //check if the tool is to be available\n if (hook.isVisible()) {\n //keep access to the tool\n tools[id] = hook;\n\n // renders the button from the config\n $button = hook.render();\n\n //only attach the button to the dom when everything is ready\n _appendInOrder($toolsContainer, $button);\n\n //ready !\n $button.trigger('ready' + _ns, [hook]);\n\n //fires the itemLoaded event if the item has already been loaded\n if (itemIsLoaded) {\n triggerItemLoaded(hook);\n }\n }\n\n resolve(hook);\n } else {\n errorHandler.throw(_ns, 'invalid hook format');\n resolve(null);\n }\n\n }, function (e) {\n errorHandler.throw(_ns, 'the hook amd module cannot be found');\n resolve(null);\n });\n\n } else {\n errorHandler.throw(_ns, 'invalid tool config format');\n resolve(null);\n }\n });\n }\n\n /**\n * Append a dom element $button to a $container in a specific order\n * The orders are provided by data-order attribute set to the $button\n *\n * @param {JQuery} $container\n * @param {JQuery} $button\n */\n function _appendInOrder($container, $button) {\n\n var $after, $before;\n var order = $button.data('order');\n\n if ('last' === order) {\n\n $container.append($button);\n\n } else if ('first' === order) {\n\n $container.prepend($button);\n\n } else {\n\n order = _.parseInt(order);\n if (!_.isNaN(order)) {\n\n $container.children('.action').each(function () {\n\n var $btn = $(this),\n _order = $btn.data('order');\n\n if ('last' === _order) {\n\n $before = $btn;\n $after = null;\n\n } else if ('first' === _order) {\n\n $before = null;\n $after = $btn;\n\n } else {\n\n _order = _.parseInt(_order);\n\n if (_.isNaN(_order) || _order > order) {\n $before = $btn;\n $after = null;\n //stops here because $container children returns the dom elements in the dom order\n return false;\n } else if (_order === order) {\n $after = $btn;\n } else if (_order < order) {\n $after = $btn;\n $before = null;\n }\n\n }\n\n });\n\n if ($after) {\n $after.after($button);\n } else if ($before) {\n $before.before($button);\n } else {\n $container.append($button);\n }\n\n } else {\n //unordered buttons are append at the end (including when order equals 0)\n $container.append($button);\n }\n }\n }\n\n /**\n * Check if the hook object is valid\n *\n * @param {Object} hook\n * @param {Function} hook.init\n * @param {Function} hook.clear\n * @param {Function} hook.isVisible\n * @returns {Boolean}\n */\n function isValidHook(hook) {\n return (_.isObject(hook) && _(['init', 'render', 'clear', 'isVisible']).reduce(function (result, method) {\n return result && _.isFunction(hook[method]);\n }, true));\n }\n\n return {\n isValid: isValidConfig,\n initQtiTool: initQtiTool\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>\n */\ndefine('taoQtiTest/testRunner/actionBarTools',[\n 'jquery',\n 'lodash',\n 'core/eventifier',\n 'core/promise',\n 'taoQtiTest/testRunner/actionBarHook'\n], function ($, _, eventifier, Promise, actionBarHook) {\n 'use strict';\n\n /**\n * The list of registered actionBar tools\n * @type {Object}\n */\n var registeredQtiTools;\n\n /**\n * The list of actionBar tools instances\n * @type {Object}\n */\n var qtiTools;\n\n /**\n * Manages the actionBar tools\n * @type {Object}\n */\n var actionBarTools = {\n /**\n * Registers the actionBar tools\n * @param {Object} tools\n */\n register : function register(tools) {\n var registerTools = tools || {};\n\n /**\n * @event actionBarTools#beforeregister\n * @param {Object} tools\n * @param {actionBarTools} this\n */\n this.trigger('beforeregister', registerTools, this);\n\n registeredQtiTools = registerTools;\n\n /**\n * @event actionBarTools#afterregister\n * @param {Object} tools\n * @param {actionBarTools} this\n */\n this.trigger('afterregister', registerTools, this);\n },\n\n /**\n * Gets the list of registered tools\n * @returns {Object}\n */\n getRegisteredTools : function getRegisteredTools() {\n return registeredQtiTools || {};\n },\n\n /**\n * Gets a particular tool config\n * @param {String} id\n * @returns {Object}\n */\n getRegistered : function getRegistered(id) {\n return registeredQtiTools && registeredQtiTools[id];\n },\n\n /**\n * Checks if a particular tool is registered\n * @param {String} id\n * @returns {Boolean}\n */\n isRegistered : function isRegistered(id) {\n return !!(registeredQtiTools && registeredQtiTools[id]);\n },\n\n /**\n * Gets a particular tool\n * @param {String} id\n * @returns {Object}\n */\n get : function get(id) {\n return qtiTools && qtiTools[id];\n },\n\n /**\n * Gets the list of tools instances\n * @returns {Array}\n */\n list : function list() {\n return _.values(qtiTools || {});\n },\n\n /**\n * Renders the actionBar\n * @param {String|jQuery|HTMLElement} container - The container in which renders the tools\n * @param {Object} testContext - The assessment test context\n * @param {Object} testRunner - The assessment test runner\n * @param {Function} [callback] - An optional callback fired when all tools have been rendered\n */\n render : function render(container, testContext, testRunner, callback) {\n var self = this;\n var $container = $(container);\n var promises = [];\n\n /**\n * @event actionBarTools#beforerender\n * @param {jQuery} $container\n * @param {Object} testContext\n * @param {Object} testRunner\n * @param {actionBarTools} this\n */\n this.trigger('beforerender', $container, testContext, testRunner, this);\n\n _.forIn(this.getRegisteredTools(), function(toolconfig, id){\n promises.push(actionBarHook.initQtiTool($container, id, toolconfig, testContext, testRunner));\n });\n\n Promise.all(promises).then(function(values) {\n var tools = [];\n qtiTools = {};\n\n _.forEach(values, function(tool) {\n if (tool) {\n tools.push(tool);\n qtiTools[tool.getId()] = tool;\n }\n });\n\n if (_.isFunction(callback)) {\n callback.call(self, tools, $container, testContext, testRunner, self);\n }\n\n /**\n * @event actionBarTools#afterrender\n * @param {Array} tools\n * @param {jQuery} $container\n * @param {Object} testContext\n * @param {Object} testRunner\n * @param {actionBarTools} this\n */\n self.trigger('afterrender', tools, $container, testContext, testRunner, self);\n });\n }\n };\n\n return eventifier(actionBarTools);\n});\n\n","\ndefine('tpl!taoQtiTest/testRunner/tpl/navigator', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n \n return \" hidden\";\n }\n\n buffer += \"<aside class=\\\"test-sidebar test-sidebar-\";\n if (helper = helpers.region) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.region); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \" flex-container-navi qti-navigator\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.hidden), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\">\\n <div class=\\\"qti-navigator-collapsible\\\">\\n <span class=\\\"qti-navigator-collapse icon icon-left\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Collapse the review panel\", options) : helperMissing.call(depth0, \"__\", \"Collapse the review panel\", options)))\n + \"\\\"></span>\\n <span class=\\\"qti-navigator-expand icon icon-right\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Expand the review panel\", options) : helperMissing.call(depth0, \"__\", \"Expand the review panel\", options)))\n + \"\\\"></span>\\n </div>\\n\\n <div class=\\\"qti-navigator-info collapsible\\\">\\n <span class=\\\"qti-navigator-label\\\">\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Test status\", options) : helperMissing.call(depth0, \"__\", \"Test status\", options)))\n + \"</span>\\n <span class=\\\"icon-up\\\"></span>\\n <span class=\\\"icon-down\\\"></span>\\n </span>\\n <ul class=\\\"collapsible-panel plain\\\">\\n <li class=\\\"qti-navigator-viewed\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Viewed items\", options) : helperMissing.call(depth0, \"__\", \"Viewed items\", options)))\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\">\\n <span class=\\\"qti-navigator-icon icon-viewed\\\"></span>\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Viewed\", options) : helperMissing.call(depth0, \"__\", \"Viewed\", options)))\n + \"</span>\\n <span class=\\\"qti-navigator-counter\\\">-/-</span>\\n </span>\\n </li>\\n <li class=\\\"qti-navigator-answered\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Completed items\", options) : helperMissing.call(depth0, \"__\", \"Completed items\", options)))\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\">\\n <span class=\\\"qti-navigator-icon icon-answered\\\"></span>\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Answered\", options) : helperMissing.call(depth0, \"__\", \"Answered\", options)))\n + \"</span>\\n <span class=\\\"qti-navigator-counter\\\">-/-</span>\\n </span>\\n </li>\\n <li class=\\\"qti-navigator-unanswered\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered items\", options) : helperMissing.call(depth0, \"__\", \"Unanswered items\", options)))\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\">\\n <span class=\\\"qti-navigator-icon icon-unanswered\\\"></span>\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Unanswered\", options) : helperMissing.call(depth0, \"__\", \"Unanswered\", options)))\n + \"</span>\\n <span class=\\\"qti-navigator-counter\\\">-/-</span>\\n </span>\\n </li>\\n <li class=\\\"qti-navigator-flagged\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Items marked for later review\", options) : helperMissing.call(depth0, \"__\", \"Items marked for later review\", options)))\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\">\\n <span class=\\\"qti-navigator-icon icon-flagged\\\"></span>\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Flagged\", options) : helperMissing.call(depth0, \"__\", \"Flagged\", options)))\n + \"</span>\\n <span class=\\\"qti-navigator-counter\\\">-/-</span>\\n </span>\\n </li>\\n </ul>\\n </div>\\n\\n <div class=\\\"qti-navigator-filters\\\">\\n <ul role=\\\"tablist\\\" class=\\\"plain clearfix\\\">\\n <li role=\\\"tab\\\" aria-selected=\\\"true\\\" class=\\\"qti-navigator-filter active\\\" data-mode=\\\"all\\\">\\n <span title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Reset filters\", options) : helperMissing.call(depth0, \"__\", \"Reset filters\", options)))\n + \"\\\" class=\\\"qti-navigator-tab\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"All\", options) : helperMissing.call(depth0, \"__\", \"All\", options)))\n + \"</span>\\n </li>\\n <li role=\\\"tab\\\" class=\\\"qti-navigator-filter\\\" data-mode=\\\"unanswered\\\">\\n <span class=\\\"icon-unanswered qti-navigator-tab\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Only display the unanswered items\", options) : helperMissing.call(depth0, \"__\", \"Only display the unanswered items\", options)))\n + \"\\\"></span>\\n </li>\\n <li role=\\\"tab\\\" class=\\\"qti-navigator-filter\\\" data-mode=\\\"flagged\\\">\\n <span class=\\\"icon-flagged qti-navigator-tab\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Only display the items marked for review\", options) : helperMissing.call(depth0, \"__\", \"Only display the items marked for review\", options)))\n + \"\\\"></span>\\n </li>\\n </ul>\\n </div>\\n\\n <nav class=\\\"qti-navigator-tree\\\">\\n </nav>\\n\\n <div id=\\\"qti-navigator-linear\\\" class=\\\"qti-navigator-linear\\\">\\n <span class=\\\"icon icon-info\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\\"></span>\\n <p class=\\\"qti-navigator-message\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n </p>\\n </div>\\n </aside>\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/testRunner/tpl/navigatorTree', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, self=this, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <li class=\\\"qti-navigator-part collapsible \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.active), {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\" data-id=\\\"\";\n if (helper = helpers.id) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.id); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-text\\\">\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\\n <span class=\\\"icon-up\\\"></span>\\n <span class=\\\"icon-down\\\"></span>\\n </span>\\n \";\n stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.sections)),stack1 == null || stack1 === false ? stack1 : stack1.length), {hash:{},inverse:self.program(29, program29, data),fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </li>\\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"active\";\n }\n\nfunction program4(depth0,data) {\n \n \n return \"collapsed\";\n }\n\nfunction program6(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n <ul class=\\\"qti-navigator-sections collapsible-panel plain\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </ul>\\n \";\n return buffer;\n }\nfunction program7(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <li class=\\\"qti-navigator-section collapsible \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.active), {hash:{},inverse:self.program(4, program4, data),fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\" data-id=\\\"\";\n if (helper = helpers.id) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.id); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-label\\\" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-text\\\">\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"</span>\\n <span class=\\\"qti-navigator-counter\\\">\";\n if (helper = helpers.answered) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.answered); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"/\"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.items)),stack1 == null || stack1 === false ? stack1 : stack1.length)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"</span>\\n </span>\\n <ul class=\\\"qti-navigator-items collapsible-panel plain\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.items), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </ul>\\n </li>\\n \";\n return buffer;\n }\nfunction program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n <li class=\\\"qti-navigator-item\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.active), {hash:{},inverse:self.noop,fn:self.program(9, program9, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.flagged), {hash:{},inverse:self.noop,fn:self.program(11, program11, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.answered), {hash:{},inverse:self.noop,fn:self.program(13, program13, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.viewed), {hash:{},inverse:self.program(17, program17, data),fn:self.program(15, program15, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\" data-id=\\\"\";\n if (helper = helpers.id) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.id); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" data-position=\\\"\";\n if (helper = helpers.position) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.position); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-label truncate\\\" title=\\\"\";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\">\\n <span class=\\\"qti-navigator-icon icon-\";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.flagged), {hash:{},inverse:self.program(21, program21, data),fn:self.program(19, program19, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\\"></span>\\n <span class=\\\"qti-navigator-number\\\">\"\n + escapeExpression(((stack1 = (data == null || data === false ? data : data.index)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"</span>\\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n </span>\\n </li>\\n \";\n return buffer;\n }\nfunction program9(depth0,data) {\n \n \n return \" active\";\n }\n\nfunction program11(depth0,data) {\n \n \n return \" flagged\";\n }\n\nfunction program13(depth0,data) {\n \n \n return \" answered\";\n }\n\nfunction program15(depth0,data) {\n \n \n return \" viewed\";\n }\n\nfunction program17(depth0,data) {\n \n \n return \" unseen\";\n }\n\nfunction program19(depth0,data) {\n \n \n return \"flagged\";\n }\n\nfunction program21(depth0,data) {\n \n var stack1;\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.answered), {hash:{},inverse:self.program(24, program24, data),fn:self.program(22, program22, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }\nfunction program22(depth0,data) {\n \n \n return \"answered\";\n }\n\nfunction program24(depth0,data) {\n \n var stack1;\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.viewed), {hash:{},inverse:self.program(27, program27, data),fn:self.program(25, program25, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }\nfunction program25(depth0,data) {\n \n \n return \"viewed\";\n }\n\nfunction program27(depth0,data) {\n \n \n return \"unseen\";\n }\n\nfunction program29(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n <div class=\\\"qti-navigator-linear-part collapsible-panel\\\">\\n <span class=\\\"icon icon-info\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\\"></span>\\n <p class=\\\"qti-navigator-message\\\">\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n </p>\\n <p class=\\\"qti-navigator-actions\\\">\\n <button class=\\\"btn-info small\\\" data-id=\\\"\";\n if (helper = helpers.itemId) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.itemId); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" data-position=\\\"\";\n if (helper = helpers.position) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.position); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\\" title=\\\"\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Start Test-part\", options) : helperMissing.call(depth0, \"__\", \"Start Test-part\", options)))\n + \"\\\">\\n <span class=\\\"qti-navigator-text\\\">\"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Start Test-part\", options) : helperMissing.call(depth0, \"__\", \"Start Test-part\", options)))\n + \"</span>\\n <span class=\\\"icon-play r\\\"></span>\\n </button>\\n </p>\\n </div>\\n \";\n return buffer;\n }\n\n buffer += \"<ul class=\\\"qti-navigator-parts plain\\\">\\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n </ul>\";\n return buffer;\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>\n */\ndefine('taoQtiTest/testRunner/testReview',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'tpl!taoQtiTest/testRunner/tpl/navigator',\n 'tpl!taoQtiTest/testRunner/tpl/navigatorTree',\n 'util/capitalize'\n], function ($, _, __, navigatorTpl, navigatorTreeTpl, capitalize) {\n 'use strict';\n\n /**\n * List of CSS classes\n * @type {Object}\n * @private\n */\n var _cssCls = {\n active : 'active',\n collapsed : 'collapsed',\n collapsible : 'collapsible',\n hidden : 'hidden',\n disabled : 'disabled',\n flagged : 'flagged',\n answered : 'answered',\n viewed : 'viewed',\n unseen : 'unseen',\n icon : 'qti-navigator-icon',\n scope : {\n test : 'scope-test',\n testPart : 'scope-test-part',\n testSection : 'scope-test-section'\n }\n };\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n var _selectors = {\n component : '.qti-navigator',\n filterBar : '.qti-navigator-filters',\n tree : '.qti-navigator-tree',\n collapseHandle : '.qti-navigator-collapsible',\n linearState : '.qti-navigator-linear',\n infoAnswered : '.qti-navigator-answered .qti-navigator-counter',\n infoViewed : '.qti-navigator-viewed .qti-navigator-counter',\n infoUnanswered : '.qti-navigator-unanswered .qti-navigator-counter',\n infoFlagged : '.qti-navigator-flagged .qti-navigator-counter',\n infoPanel : '.qti-navigator-info',\n infoPanelLabels : '.qti-navigator-info > .qti-navigator-label',\n parts : '.qti-navigator-part',\n partLabels : '.qti-navigator-part > .qti-navigator-label',\n sections : '.qti-navigator-section',\n sectionLabels : '.qti-navigator-section > .qti-navigator-label',\n items : '.qti-navigator-item',\n itemLabels : '.qti-navigator-item > .qti-navigator-label',\n itemIcons : '.qti-navigator-item > .qti-navigator-icon',\n icons : '.qti-navigator-icon',\n linearStart : '.qti-navigator-linear-part button',\n counters : '.qti-navigator-counter',\n actives : '.active',\n collapsible : '.collapsible',\n collapsiblePanels : '.collapsible-panel',\n unseen : '.unseen',\n answered : '.answered',\n flagged : '.flagged',\n notFlagged : ':not(.flagged)',\n notAnswered : ':not(.answered)',\n hidden : '.hidden'\n };\n\n /**\n * Maps the filter mode to filter criteria.\n * Each filter criteria is a CSS selector used to find and mask the items to be discarded by the filter.\n * @type {Object}\n * @private\n */\n var _filterMap = {\n all : \"\",\n unanswered : _selectors.answered,\n flagged : _selectors.notFlagged,\n answered : _selectors.notAnswered,\n filtered : _selectors.hidden\n };\n\n /**\n * Maps of config options translated from the context object to the local options\n * @type {Object}\n * @private\n */\n var _optionsMap = {\n 'reviewScope' : 'reviewScope',\n 'reviewPreventsUnseen' : 'preventsUnseen',\n 'canCollapse' : 'canCollapse'\n };\n\n /**\n * Maps the handled review scopes\n * @type {Object}\n * @private\n */\n var _reviewScopes = {\n test : 'test',\n testPart : 'testPart',\n testSection : 'testSection'\n };\n\n /**\n * Provides a test review manager\n * @type {Object}\n */\n var testReview = {\n /**\n * Initializes the component\n * @param {String|jQuery|HTMLElement} element The element on which install the component\n * @param {Object} [options] A list of extra options\n * @param {String} [options.region] The region on which put the component: left or right\n * @param {String} [options.reviewScope] Limit the review screen to a particular scope:\n * the whole test, the current test part or the current test section)\n * @param {Boolean} [options.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {testReview}\n */\n init: function init(element, options) {\n var initOptions = _.isObject(options) && options || {};\n var putOnRight = 'right' === initOptions.region;\n var insertMethod = putOnRight ? 'append' : 'prepend';\n\n this.options = initOptions;\n this.disabled = false;\n this.hidden = !!initOptions.hidden;\n this.currentFilter = 'all';\n\n // clean the DOM if the init method is called after initialisation\n if (this.$component) {\n this.$component.remove();\n }\n\n // build the component structure and inject it into the DOM\n this.$container = $(element);\n insertMethod = this.$container[insertMethod];\n if (insertMethod) {\n insertMethod.call(this.$container, navigatorTpl({\n region: putOnRight ? 'right' : 'left',\n hidden: this.hidden\n }));\n } else {\n throw new Error(\"Unable to inject the component structure into the DOM\");\n }\n\n // install the component behaviour\n this._loadDOM();\n this._initEvents();\n this._updateDisplayOptions();\n\n return this;\n },\n\n /**\n * Links the component to the underlying DOM elements\n * @private\n */\n _loadDOM: function() {\n this.$component = this.$container.find(_selectors.component);\n\n // access to info panel displaying counters\n this.$infoAnswered = this.$component.find(_selectors.infoAnswered);\n this.$infoViewed = this.$component.find(_selectors.infoViewed);\n this.$infoUnanswered = this.$component.find(_selectors.infoUnanswered);\n this.$infoFlagged = this.$component.find(_selectors.infoFlagged);\n\n // access to filter switches\n this.$filterBar = this.$component.find(_selectors.filterBar);\n this.$filters = this.$filterBar.find('li');\n\n // access to the tree of parts/sections/items\n this.$tree = this.$component.find(_selectors.tree);\n\n // access to the panel displayed when a linear part is reached\n this.$linearState = this.$component.find(_selectors.linearState);\n },\n\n /**\n * Installs the event handlers on the underlying DOM elements\n * @private\n */\n _initEvents: function() {\n var self = this;\n\n // click on the collapse handle: collapse/expand the review panel\n this.$component.on('click' + _selectors.component, _selectors.collapseHandle, function() {\n if (self.disabled) {\n return;\n }\n\n self.$component.toggleClass(_cssCls.collapsed);\n if (self.$component.hasClass(_cssCls.collapsed)) {\n self._openSelected();\n }\n });\n\n // click on the info panel title: toggle the related panel\n this.$component.on('click' + _selectors.component, _selectors.infoPanelLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.infoPanel);\n self._togglePanel($panel, _selectors.infoPanel);\n });\n\n // click on a part title: toggle the related panel\n this.$tree.on('click' + _selectors.component, _selectors.partLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.parts);\n var open = self._togglePanel($panel, _selectors.parts);\n\n if (open) {\n if ($panel.hasClass(_cssCls.active)) {\n self._openSelected();\n } else {\n self._openOnly($panel.find(_selectors.sections).first(), $panel);\n }\n }\n });\n\n // click on a section title: toggle the related panel\n this.$tree.on('click' + _selectors.component, _selectors.sectionLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.sections);\n\n self._togglePanel($panel, _selectors.sections);\n });\n\n // click on an item: jump to the position\n this.$tree.on('click' + _selectors.component, _selectors.itemLabels, function(event) {\n if (self.disabled) {\n return;\n }\n\n var $item = $(this).closest(_selectors.items);\n var $target;\n\n if (!$item.hasClass(_cssCls.disabled)) {\n $target = $(event.target);\n if ($target.is(_selectors.icons) && !self.$component.hasClass(_cssCls.collapsed)) {\n if (!$item.hasClass(_cssCls.unseen)) {\n self._mark($item);\n }\n } else {\n self._select($item);\n self._jump($item);\n }\n }\n });\n\n // click on the start button inside a linear part: jump to the position\n this.$tree.on('click' + _selectors.component, _selectors.linearStart, function() {\n if (self.disabled) {\n return;\n }\n\n var $btn = $(this);\n\n if (!$btn.hasClass(_cssCls.disabled)) {\n $btn.addClass(_cssCls.disabled);\n self._jump($btn);\n }\n });\n\n // click on a filter button\n this.$filterBar.on('click' + _selectors.component, 'li', function() {\n if (self.disabled) {\n return;\n }\n\n var $btn = $(this);\n var mode = $btn.data('mode');\n\n self.$filters.removeClass(_cssCls.active);\n self.$component.removeClass(_cssCls.collapsed);\n $btn.addClass(_cssCls.active);\n\n self._filter(mode);\n });\n },\n\n /**\n * Filters the items by a criteria\n * @param {String} criteria\n * @private\n */\n _filter: function(criteria) {\n var $items = this.$tree.find(_selectors.items).removeClass(_cssCls.hidden);\n var filter = _filterMap[criteria];\n if (filter) {\n $items.filter(filter).addClass(_cssCls.hidden);\n }\n this._updateSectionCounters(!!filter);\n this.currentFilter = criteria;\n },\n\n /**\n * Selects an item\n * @param {String|jQuery} position The item's position\n * @param {Boolean} [open] Forces the tree to be opened on the selected item\n * @returns {jQuery} Returns the selected item\n * @private\n */\n _select: function(position, open) {\n // find the item to select and extract its hierarchy\n var selected = position && position.jquery ? position : this.$tree.find('[data-position=' + position + ']');\n var hierarchy = selected.parentsUntil(this.$tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n if (open) {\n this._openOnly(hierarchy);\n }\n\n // select the item\n this.$tree.find(_selectors.actives).removeClass(_cssCls.active);\n hierarchy.add(selected).addClass(_cssCls.active);\n return selected;\n },\n\n /**\n * Opens the tree on the selected item only\n * @returns {jQuery} Returns the selected item\n * @private\n */\n _openSelected: function() {\n // find the selected item and extract its hierarchy\n var selected = this.$tree.find(_selectors.items + _selectors.actives);\n var hierarchy = selected.parentsUntil(this.$tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n this._openOnly(hierarchy);\n\n return selected;\n },\n\n /**\n * Collapses the full tree and opens only the provided branch\n * @param {jQuery} opened The element to be opened\n * @param {jQuery} [root] The root element from which collapse the panels\n * @private\n */\n _openOnly: function(opened, root) {\n (root || this.$tree).find(_selectors.collapsible).addClass(_cssCls.collapsed);\n opened.removeClass(_cssCls.collapsed);\n },\n\n /**\n * Toggles a panel\n * @param {jQuery} panel The panel to toggle\n * @param {String} [collapseSelector] Selector of panels to collapse\n * @returns {Boolean} Returns `true` if the panel just expanded now\n */\n _togglePanel: function(panel, collapseSelector) {\n var collapsed = panel.hasClass(_cssCls.collapsed);\n\n if (collapseSelector) {\n this.$tree.find(collapseSelector).addClass(_cssCls.collapsed);\n }\n\n if (collapsed) {\n panel.removeClass(_cssCls.collapsed);\n } else {\n panel.addClass(_cssCls.collapsed);\n }\n return collapsed;\n },\n\n /**\n * Sets the icon of a particular item\n * @param {jQuery} $item\n * @param {String} icon\n * @private\n */\n _setItemIcon: function($item, icon) {\n $item.find(_selectors.icons).attr('class', _cssCls.icon + ' icon-' + icon);\n },\n\n /**\n * Sets the icon of a particular item according to its state\n * @param {jQuery} $item\n * @private\n */\n _adjustItemIcon: function($item) {\n var icon = null;\n var defaultIcon = _cssCls.unseen;\n var iconCls = [\n _cssCls.flagged,\n _cssCls.answered,\n _cssCls.viewed\n ];\n\n _.forEach(iconCls, function(cls) {\n if ($item.hasClass(cls)) {\n icon = cls;\n return false;\n }\n });\n\n this._setItemIcon($item, icon || defaultIcon);\n },\n\n /**\n * Toggle the marked state of an item\n * @param {jQuery} $item\n * @param {Boolean} [flag]\n * @private\n */\n _toggleFlag: function($item, flag) {\n $item.toggleClass(_cssCls.flagged, flag);\n this._adjustItemIcon($item);\n },\n\n /**\n * Marks an item for later review\n * @param {jQuery} $item\n * @private\n */\n _mark: function($item) {\n var itemId = $item.data('id');\n var itemPosition = $item.data('position');\n var flag = !$item.hasClass(_cssCls.flagged);\n\n this._toggleFlag($item);\n\n /**\n * A storage of the flag is required\n * @event testReview#mark\n * @param {Boolean} flag - Tells whether the item is marked for review or not\n * @param {Number} position - The item position on which jump\n * @param {String} itemId - The identifier of the target item\n * @param {testReview} testReview - The client testReview component\n */\n this.trigger('mark', [flag, itemPosition, itemId]);\n },\n\n /**\n * Jumps to an item\n * @param {jQuery} $item\n * @private\n */\n _jump: function($item) {\n var itemId = $item.data('id');\n var itemPosition = $item.data('position');\n\n /**\n * A jump to a particular item is required\n * @event testReview#jump\n * @param {Number} position - The item position on which jump\n * @param {String} itemId - The identifier of the target item\n * @param {testReview} testReview - The client testReview component\n */\n this.trigger('jump', [itemPosition, itemId]);\n },\n\n /**\n * Updates the sections related items counters\n * @param {Boolean} filtered\n */\n _updateSectionCounters: function(filtered) {\n var self = this;\n var filter = _filterMap[filtered ? 'filtered' : 'answered'];\n this.$tree.find(_selectors.sections).each(function() {\n var $section = $(this);\n var $items = $section.find(_selectors.items);\n var $filtered = $items.filter(filter);\n var total = $items.length;\n var nb = total - $filtered.length;\n self._writeCount($section.find(_selectors.counters), nb, total);\n });\n },\n\n /**\n * Updates the display according to options\n * @private\n */\n _updateDisplayOptions: function() {\n var reviewScope = _reviewScopes[this.options.reviewScope] || 'test';\n var scopeClass = _cssCls.scope[reviewScope];\n var $root = this.$component;\n _.forEach(_cssCls.scope, function(cls) {\n $root.removeClass(cls);\n });\n if (scopeClass) {\n $root.addClass(scopeClass);\n }\n $root.toggleClass(_cssCls.collapsible, this.options.canCollapse);\n },\n\n /**\n * Updates the local options from the provided context\n * @param {Object} testContext The progression context\n * @private\n */\n _updateOptions: function(testContext) {\n var options = this.options;\n _.forEach(_optionsMap, function(optionKey, contextKey) {\n if (undefined !== testContext[contextKey]) {\n options[optionKey] = testContext[contextKey];\n }\n });\n },\n\n /**\n * Updates the info panel\n */\n _updateInfos: function() {\n var progression = this.progression,\n unanswered = Number(progression.total) - Number(progression.answered);\n\n // update the info panel\n this._writeCount(this.$infoAnswered, progression.answered, progression.total);\n this._writeCount(this.$infoUnanswered, unanswered, progression.total);\n this._writeCount(this.$infoViewed, progression.viewed, progression.total);\n this._writeCount(this.$infoFlagged, progression.flagged, progression.total);\n },\n\n /**\n * Updates a counter\n * @param {jQuery} $place\n * @param {Number} count\n * @param {Number} total\n * @private\n */\n _writeCount: function($place, count, total) {\n $place.text(count + '/' + total);\n },\n\n /**\n * Gets the progression stats for the whole test\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTest: function(testContext) {\n return {\n total : testContext.numberItems || 0,\n answered : testContext.numberCompleted || 0,\n viewed : testContext.numberPresented || 0,\n flagged : testContext.numberFlagged || 0\n };\n },\n\n /**\n * Gets the progression stats for the current test part\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTestPart: function(testContext) {\n return {\n total : testContext.numberItemsPart || 0,\n answered : testContext.numberCompletedPart || 0,\n viewed : testContext.numberPresentedPart || 0,\n flagged : testContext.numberFlaggedPart || 0\n };\n },\n\n /**\n * Gets the progression stats for the current test section\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTestSection: function(testContext) {\n return {\n total : testContext.numberItemsSection || 0,\n answered : testContext.numberCompletedSection || 0,\n viewed : testContext.numberPresentedSection || 0,\n flagged : testContext.numberFlaggedSection || 0\n };\n },\n\n /**\n * Updates the navigation tre\n * @param {Object} testContext The progression context\n */\n _updateTree: function(testContext) {\n var navigatorMap = testContext.navigatorMap;\n var reviewScope = this.options.reviewScope;\n var reviewScopePart = reviewScope === 'testPart';\n var reviewScopeSection = reviewScope === 'testSection';\n var _partsFilter = function(part) {\n if (reviewScopeSection && part.sections) {\n part.sections = _.filter(part.sections, _partsFilter);\n }\n return part.active;\n };\n\n // rebuild the tree\n if (navigatorMap) {\n if (reviewScopePart || reviewScopeSection) {\n // display only the current section\n navigatorMap = _.filter(navigatorMap, _partsFilter);\n }\n\n this.$filterBar.show();\n this.$linearState.hide();\n this.$tree.html(navigatorTreeTpl({\n parts: navigatorMap\n }));\n\n if (this.options.preventsUnseen) {\n // disables all unseen items to prevent the test taker has access to.\n this.$tree.find(_selectors.unseen).addClass(_cssCls.disabled);\n }\n } else {\n this.$filterBar.hide();\n this.$linearState.show();\n this.$tree.empty();\n }\n\n // apply again the current filter\n this._filter(this.$filters.filter(_selectors.actives).data('mode'));\n },\n\n /**\n * Set the marked state of an item\n * @param {Number|String|jQuery} position\n * @param {Boolean} flag\n */\n setItemFlag: function setItemFlag(position, flag) {\n var $item = position && position.jquery ? position : this.$tree.find('[data-position=' + position + ']');\n var progression = this.progression;\n\n // update the item flag\n this._toggleFlag($item, flag);\n\n // update the info panel\n progression.flagged = this.$tree.find(_selectors.flagged).length;\n this._writeCount(this.$infoFlagged, progression.flagged, progression.total);\n this._filter(this.currentFilter);\n },\n\n /**\n * Update the number of flagged items in the test context\n * @param {Object} testContext The test context\n * @param {Number} position The position of the flagged item\n * @param {Boolean} flag The flag state\n */\n updateNumberFlagged: function(testContext, position, flag) {\n var fields = ['numberFlagged'];\n var currentPosition = testContext.itemPosition;\n var currentFound = false, currentSection = null, currentPart = null;\n var itemFound = false, itemSection = null, itemPart = null;\n\n if (testContext.navigatorMap) {\n // find the current item and the marked item inside the navigator map\n // check if the marked item is in the current section\n _.forEach(testContext.navigatorMap, function(part) {\n _.forEach(part && part.sections, function(section) {\n _.forEach(section && section.items, function(item) {\n if (item) {\n if (item.position === position) {\n itemPart = part;\n itemSection = section;\n itemFound = true;\n }\n if (item.position === currentPosition) {\n currentPart = part;\n currentSection = section;\n currentFound = true;\n\n }\n if (itemFound && currentFound) {\n return false;\n }\n }\n });\n\n if (itemFound && currentFound) {\n return false;\n }\n });\n\n if (itemFound && currentFound) {\n return false;\n }\n });\n\n // select the context to update\n if (itemFound && currentPart === itemPart) {\n fields.push('numberFlaggedPart');\n }\n if (itemFound && currentSection === itemSection) {\n fields.push('numberFlaggedSection');\n }\n } else {\n // no navigator map, the current the marked item is in the current section\n fields.push('numberFlaggedPart');\n fields.push('numberFlaggedSection');\n }\n\n _.forEach(fields, function(field) {\n if (field in testContext) {\n testContext[field] += flag ? 1 : -1;\n }\n });\n },\n\n /**\n * Get progression\n * @param {Object} testContext The progression context\n * @returns {object} progression\n */\n getProgression: function getProgression(testContext) {\n var reviewScope = _reviewScopes[this.options.reviewScope] || 'test',\n progressInfoMethod = '_getProgressionOf' + capitalize(reviewScope),\n getProgression = this[progressInfoMethod] || this._getProgressionOfTest,\n progression = getProgression && getProgression(testContext) || {};\n\n return progression;\n },\n\n /**\n * Updates the review screen\n * @param {Object} testContext The progression context\n * @returns {testReview}\n */\n update: function update(testContext) {\n this.progression = this.getProgression(testContext);\n this._updateOptions(testContext);\n this._updateInfos(testContext);\n this._updateTree(testContext);\n this._updateDisplayOptions(testContext);\n return this;\n },\n\n /**\n * Disables the component\n * @returns {testReview}\n */\n disable: function disable() {\n this.disabled = true;\n this.$component.addClass(_cssCls.disabled);\n return this;\n },\n\n /**\n * Enables the component\n * @returns {testReview}\n */\n enable: function enable() {\n this.disabled = false;\n this.$component.removeClass(_cssCls.disabled);\n return this;\n },\n\n /**\n * Hides the component\n * @returns {testReview}\n */\n hide: function hide() {\n this.disabled = true;\n this.hidden = true;\n this.$component.addClass(_cssCls.hidden);\n return this;\n },\n\n /**\n * Shows the component\n * @returns {testReview}\n */\n show: function show() {\n this.disabled = false;\n this.hidden = false;\n this.$component.removeClass(_cssCls.hidden);\n return this;\n },\n\n /**\n * Toggles the display state of the component\n * @param {Boolean} [show] External condition that's tells if the component must be shown or hidden\n * @returns {testReview}\n */\n toggle: function toggle(show) {\n if (undefined === show) {\n show = this.hidden;\n }\n\n if (show) {\n this.show();\n } else {\n this.hide();\n }\n\n return this;\n },\n\n /**\n * Install an event handler on the underlying DOM element\n * @param {String} eventName\n * @returns {testReview}\n */\n on: function on(eventName) {\n var dom = this.$component;\n if (dom) {\n dom.on.apply(dom, arguments);\n }\n\n return this;\n },\n\n /**\n * Uninstall an event handler from the underlying DOM element\n * @param {String} eventName\n * @returns {testReview}\n */\n off: function off(eventName) {\n var dom = this.$component;\n if (dom) {\n dom.off.apply(dom, arguments);\n }\n\n return this;\n },\n\n /**\n * Triggers an event on the underlying DOM element\n * @param {String} eventName\n * @param {Array|Object} extraParameters\n * @returns {testReview}\n */\n trigger : function trigger(eventName, extraParameters) {\n var dom = this.$component;\n\n if (undefined === extraParameters) {\n extraParameters = [];\n }\n if (!_.isArray(extraParameters)) {\n extraParameters = [extraParameters];\n }\n\n extraParameters.push(this);\n\n if (dom) {\n dom.trigger(eventName, extraParameters);\n }\n\n return this;\n }\n };\n\n /**\n * Builds an instance of testReview\n * @param {String|jQuery|HTMLElement} element The element on which install the component\n * @param {Object} [options] A list of extra options\n * @param {String} [options.region] The region on which put the component: left or right\n * @param {String} [options.reviewScope] Limit the review screen to a particular scope:\n * the whole test, the current test part or the current test section)\n * @param {Boolean} [options.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {testReview}\n */\n var testReviewFactory = function(element, options) {\n var component = _.clone(testReview, true);\n return component.init(element, options);\n };\n\n return testReviewFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>\n */\ndefine('taoQtiTest/testRunner/progressUpdater',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/progressbar'\n], function ($, _, __) {\n 'use strict';\n\n /**\n * Provides a versatile progress bar updater\n * @type {{init: Function, update: Function}}\n */\n var progressUpdaters = {\n /**\n * Initializes the progress updater\n *\n * @param {String|jQuery|HTMLElement} progressBar The element on which put the progress bar\n * @param {String|jQuery|HTMLElement} progressLabel The element on which put the progress label\n * @returns {progressUpdaters}\n */\n init: function(progressBar, progressLabel) {\n this.progressBar = $(progressBar).progressbar();\n this.progressLabel = $(progressLabel);\n return this;\n },\n\n /**\n * Writes the progress label and update the progress by ratio\n * @param {String} label\n * @param {Number} ratio\n * @returns {progressUpdaters}\n */\n write: function(label, ratio) {\n this.progressLabel.text(label);\n this.progressBar.progressbar('value', ratio);\n return this;\n },\n\n /**\n * Updates the progress bar\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n update: function(testContext) {\n var progressIndicator = testContext.progressIndicator || 'percentage';\n var progressIndicatorMethod = progressIndicator + 'Progression';\n var getProgression = this[progressIndicatorMethod] || this.percentageProgression;\n var progression = getProgression && getProgression(testContext) || {};\n\n this.write(progression.label, progression.ratio);\n return progression;\n },\n\n /**\n * Updates the progress bar displaying the percentage\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n percentageProgression: function(testContext) {\n var total = Math.max(1, testContext.numberItems);\n var ratio = Math.floor(testContext.numberCompleted / total * 100);\n return {\n ratio : ratio,\n label : ratio + '%'\n };\n },\n\n /**\n * Updates the progress bar displaying the position\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n positionProgression: function(testContext) {\n var progressScope = testContext.progressIndicatorScope;\n var progressScopeCounter = {\n test : {\n total : 'numberItems',\n position : 'itemPosition'\n },\n testPart : {\n total : 'numberItemsPart',\n position : 'itemPositionPart'\n },\n testSection : {\n total : 'numberItemsSection',\n position : 'itemPositionSection'\n }\n };\n var counter = progressScopeCounter[progressScope] || progressScopeCounter.test;\n var total = Math.max(1, testContext[counter.total]);\n var position = testContext[counter.position] + 1;\n return {\n ratio : Math.floor(position / total * 100),\n label : __('Item %d of %d', position, total)\n };\n }\n };\n\n /**\n * Builds an instance of progressUpdaters\n * @param {String|jQuery|HTMLElement} progressBar The element on which put the progress bar\n * @param {String|jQuery|HTMLElement} progressLabel The element on which put the progress label\n * @returns {progressUpdaters}\n */\n var progressUpdaterFactory = function(progressBar, progressLabel) {\n var updater = _.clone(progressUpdaters, true);\n return updater.init(progressBar, progressLabel);\n };\n\n return progressUpdaterFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n */\n\n/**\n * Metadata to be sent to the server. Will be saved in result storage as a trace variable.\n * Usage example:\n * <pre>\n * var testMetaData = testMetaDataFactory({\n * testServiceCallId : this.itemServiceApi.serviceCallId\n * });\n *\n * testMetaData.setData({\n * 'TEST' : {\n * 'TEST_EXIT_CODE' : 'T'\n * },\n * 'SECTION' : {\n * 'SECTION_EXIT_CODE' : 704\n * }\n * });\n *\n * testMetaData.addData({'ITEM' : {\n * 'ITEM_START_TIME_CLIENT' : 1443596730143,\n * 'ITEM_END_TIME_CLIENT' : 1443596731301\n * }\n * });\n * </pre>\n *\n * Data for each service call id will be stored in local storage to be able get data\n * after reloading the page or resuming the test session.\n *\n * To clear all data related to current test_call_id used <i>clearData</i> method.\n */\ndefine('taoQtiTest/testRunner/testMetaData',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * @param {Object} options\n * @param {string} options.testServiceCallId - test call id.\n */\n var testMetaDataFactory = function testMetaDataFactory(options) {\n var _testServiceCallId,\n _storageKeyPrefix = 'testMetaData_',\n _data = {};\n\n if (!options || options.testServiceCallId === undefined) {\n throw new TypeError(\"testServiceCallId option is required\");\n }\n\n var testMetaData = {\n SECTION_EXIT_CODE : {\n 'COMPLETED_NORMALLY': 700,\n 'QUIT': 701,\n 'COMPLETE_TIMEOUT': 703,\n 'TIMEOUT': 704,\n 'FORCE_QUIT': 705,\n 'IN_PROGRESS': 706,\n 'ERROR': 300\n },\n TEST_EXIT_CODE : {\n 'COMPLETE': 'C',\n 'TERMINATED': 'T',\n 'INCOMPLETE': 'IC',\n 'INCOMPLETE_QUIT': 'IQ',\n 'INACTIVE': 'IA',\n 'CANDIDATE_DISAGREED_WITH_NDA': 'DA'\n },\n /**\n * Return test call id.\n * @returns {string}- Test call id\n */\n getTestServiceCallId : function getTestServiceCallId () {\n return _testServiceCallId;\n },\n\n /**\n * Set test call id.\n * @param {string} value\n */\n setTestServiceCallId : function setTestServiceCallId (value) {\n _testServiceCallId = value;\n },\n\n /**\n * Set meta data. Current data object will be overwritten.\n * @param {Object} data - metadata object\n */\n setData : function setData(data) {\n _data = data;\n setLocalStorageData(JSON.stringify(_data));\n },\n\n /**\n * Add data.\n * @param {Object} data - metadata object\n * @param {Boolean} overwrite - whether the same data should be overwritten. Default - <i>false</i>\n */\n addData : function addData(data, overwrite) {\n data = _.clone(data);\n if (overwrite === undefined) {\n overwrite = false;\n }\n\n if (overwrite) {\n _.merge(_data, data);\n } else {\n _data = _.merge(data, _data);\n }\n setLocalStorageData(JSON.stringify(_data));\n },\n\n /**\n * Get the saved data.\n * The cloned object will be returned to avoid unwanted affecting of the original data.\n * @returns {Object} - metadata object.\n */\n getData : function getData() {\n return _.clone(_data);\n },\n\n /**\n * Clear all data saved in current object and in local storage related to current test call id.\n * @returns {Object} - metadata object.\n */\n clearData : function clearData() {\n _data = {};\n window.localStorage.removeItem(testMetaData.getLocalStorageKey());\n },\n\n getLocalStorageKey : function getLocalStorageKey () {\n return _storageKeyPrefix + _testServiceCallId;\n }\n };\n\n /**\n * Initialize test meta data manager\n */\n function init() {\n _testServiceCallId = options.testServiceCallId;\n testMetaData.setData(getLocalStorageData());\n }\n\n /**\n * Set data to local storage\n * @param {string} val - data to be stored.\n */\n function setLocalStorageData(val) {\n var currentKey = testMetaData.getLocalStorageKey();\n try {\n window.localStorage.setItem(currentKey, val);\n } catch(domException) {\n if (domException.name === 'QuotaExceededError' ||\n domException.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n var removed = 0,\n i = window.localStorage.length,\n key;\n while (i--) {\n key = localStorage.key(i);\n if (/^testMetaData_.*/.test(key) && key !== currentKey) {\n window.localStorage.removeItem(key);\n removed++;\n }\n }\n if (removed) {\n setLocalStorageData(val);\n } else {\n throw domException;\n }\n } else {\n throw domException;\n }\n }\n }\n\n /**\n * Get data from local storage stored for current call id\n * @returns {*} saved data or empty object\n */\n function getLocalStorageData() {\n var data = window.localStorage.getItem(testMetaData.getLocalStorageKey()),\n result = JSON.parse(data) || {};\n\n return result;\n }\n\n init();\n\n return testMetaData;\n };\n\n return testMetaDataFactory;\n});\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n */\n\ndefine('taoQtiTest/controller/runtime/testRunner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'module',\n 'taoQtiTest/testRunner/actionBarTools',\n 'taoQtiTest/testRunner/testReview',\n 'taoQtiTest/testRunner/progressUpdater',\n 'taoQtiTest/testRunner/testMetaData',\n 'serviceApi/ServiceApi',\n 'serviceApi/UserInfoService',\n 'serviceApi/StateStorage',\n 'iframeNotifier',\n 'mathJax',\n 'ui/feedback',\n 'ui/deleter',\n 'moment',\n 'ui/modal',\n 'ui/progressbar'\n],\nfunction (\n $,\n _,\n __,\n module,\n actionBarTools,\n testReview,\n progressUpdater,\n testMetaDataFactory,\n ServiceApi,\n UserInfoService,\n StateStorage,\n iframeNotifier,\n MathJax,\n feedback,\n deleter,\n moment,\n modal\n) {\n\n 'use strict';\n\n var timerIds = [],\n currentTimes = [],\n lastDates = [],\n timeDiffs = [],\n waitingTime = 0,\n $timers,\n $controls,\n timerIndex,\n testMetaData,\n sessionStateService,\n $doc = $(document),\n optionNextSection = 'x-tao-option-nextSection',\n optionNextSectionWarning = 'x-tao-option-nextSectionWarning',\n optionReviewScreen = 'x-tao-option-reviewScreen',\n optionEndTestWarning = 'x-tao-option-endTestWarning',\n optionNoExitTimedSectionWarning = 'x-tao-option-noExitTimedSectionWarning',\n TestRunner = {\n // Constants\n 'TEST_STATE_INITIAL': 0,\n 'TEST_STATE_INTERACTING': 1,\n 'TEST_STATE_MODAL_FEEDBACK': 2,\n 'TEST_STATE_SUSPENDED': 3,\n 'TEST_STATE_CLOSED': 4,\n 'TEST_NAVIGATION_LINEAR': 0,\n 'TEST_NAVIGATION_NONLINEAR': 1,\n 'TEST_ITEM_STATE_INTERACTING': 1,\n\n /**\n * Prepare a transition to another item\n * @param {Function} [callback]\n */\n beforeTransition: function (callback) {\n // Ask the top window to start the loader.\n iframeNotifier.parent('loading');\n\n // Disable buttons.\n this.disableGui();\n\n $controls.$itemFrame.hide();\n $controls.$rubricBlocks.hide();\n $controls.$timerWrapper.hide();\n\n // Wait at least waitingTime ms for a better user experience.\n if (typeof callback === 'function') {\n setTimeout(callback, waitingTime);\n }\n },\n\n /**\n * Complete a transition to another item\n */\n afterTransition: function () {\n this.enableGui();\n\n //ask the top window to stop the loader\n iframeNotifier.parent('unloading');\n testMetaData.addData({\n 'ITEM' : {'ITEM_START_TIME_CLIENT' : Date.now() / 1000}\n });\n },\n\n /**\n * Jumps to a particular item in the test\n * @param {Number} position The position of the item within the test\n */\n jump: function(position) {\n var self = this,\n action = 'jump',\n params = {position: position};\n this.disableGui();\n\n if( this.isJumpOutOfSection(position) && this.isCurrentItemActive() && this.isTimedSection() ){\n this.exitTimedSection(action, params);\n } else {\n this.killItemSession(function() {\n self.actionCall(action, params);\n });\n }\n },\n\n /**\n * Push to server how long user seen that item before to track duration\n * @param {Number} duration\n */\n keepItemTimed: function(duration){\n if (duration) {\n var self = this,\n action = 'keepItemTimed',\n params = {duration: duration};\n self.actionCall(action, params);\n }\n },\n\n /**\n * Marks an item for later review\n * @param {Boolean} flag The state of the flag\n * @param {Number} position The position of the item within the test\n */\n markForReview: function(flag, position) {\n var self = this;\n\n // Ask the top window to start the loader.\n iframeNotifier.parent('loading');\n\n // Disable buttons.\n this.disableGui();\n\n $.ajax({\n url: self.testContext.markForReviewUrl,\n cache: false,\n async: true,\n type: 'POST',\n dataType: 'json',\n data: {\n flag: flag,\n position: position\n },\n success: function(data) {\n // update the item flagged state\n if (self.testReview) {\n self.testReview.setItemFlag(position, flag);\n self.testReview.updateNumberFlagged(self.testContext, position, flag);\n if (self.testContext.itemPosition === position) {\n self.testContext.itemFlagged = flag;\n }\n self.updateTools(self.testContext);\n }\n\n // Enable buttons.\n self.enableGui();\n\n //ask the top window to stop the loader\n iframeNotifier.parent('unloading');\n }\n });\n },\n\n /**\n * Move to the next available item\n */\n moveForward: function () {\n var self = this,\n action = 'moveForward';\n\n function doExitSection() {\n if( self.isTimedSection() && !self.testContext.isTimeout){\n self.exitTimedSection(action);\n } else {\n self.exitSection(action);\n }\n }\n\n this.disableGui();\n\n if( (( this.testContext.numberItemsSection - this.testContext.itemPositionSection - 1) == 0) && this.isCurrentItemActive()){\n if (this.shouldDisplayEndTestWarning()) {\n this.displayEndTestWarning(doExitSection);\n this.enableGui();\n } else {\n doExitSection();\n }\n\n } else {\n this.killItemSession(function () {\n self.actionCall(action);\n });\n }\n },\n\n /**\n * Check if necessary to display an end test warning\n */\n shouldDisplayEndTestWarning: function(){\n return (this.testContext.isLast === true && this.hasOption(optionEndTestWarning));\n },\n\n /**\n * Warns upon exiting test\n */\n displayEndTestWarning: function(nextAction){\n var options = {\n confirmLabel: __('OK'),\n cancelLabel: __('Cancel'),\n showItemCount: false\n };\n\n this.displayExitMessage(\n __('You are about to submit the test. You will not be able to access this test once submitted. Click OK to continue and submit the test.'),\n nextAction,\n options\n );\n },\n\n /**\n * Move to the previous available item\n */\n moveBackward: function () {\n var self = this,\n action = 'moveBackward';\n\n this.disableGui();\n\n if( (this.testContext.itemPositionSection == 0) && this.isCurrentItemActive() && this.isTimedSection() ){\n this.exitTimedSection(action);\n } else {\n this.killItemSession(function () {\n self.actionCall(action);\n });\n }\n },\n\n /**\n * Checks if a position is out of the current section\n * @param {Number} jumpPosition\n * @returns {Boolean}\n */\n isJumpOutOfSection: function(jumpPosition){\n var items = this.getCurrentSectionItems(),\n isJumpToOtherSection = true,\n isValidPosition = (jumpPosition >= 0) && ( jumpPosition < this.testContext.numberItems );\n\n if( isValidPosition){\n for(var i in items ) {\n if (!items.hasOwnProperty(i)) {\n continue;\n }\n if( items[i].position == jumpPosition ){\n isJumpToOtherSection = false;\n break;\n }\n }\n } else {\n isJumpToOtherSection = false;\n }\n\n return isJumpToOtherSection;\n },\n\n /**\n * Exit from the current section. Set the exit code.de\n * @param {String} action\n * @param {Object} params\n * @param {Number} [exitCode]\n */\n exitSection: function(action, params, exitCode){\n var self = this;\n\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : exitCode || testMetaData.SECTION_EXIT_CODE.COMPLETED_NORMALLY}});\n self.killItemSession(function () {\n self.actionCall(action, params);\n });\n },\n\n /**\n * Tries to exit a timed section. Display a confirm message.\n * @param {String} action\n * @param {Object} params\n */\n exitTimedSection: function(action, params){\n var self = this,\n qtiRunner = this.getQtiRunner(),\n doExitTimedSection = function() {\n if (qtiRunner) {\n qtiRunner.updateItemApi();\n }\n self.exitSection(action, params);\n };\n\n if ((action === 'moveForward' && this.shouldDisplayEndTestWarning()) // prevent duplicate warning\n || this.hasOption(optionNoExitTimedSectionWarning) // check if warning is disabled\n || this.testContext.keepTimerUpToTimeout // no need to display the message as we may be able to go back\n ) {\n doExitTimedSection();\n } else {\n this.displayExitMessage(\n __('After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?'),\n doExitTimedSection,\n { scope: 'testSection' }\n );\n }\n\n this.enableGui();\n },\n\n /**\n * Tries to leave the current section and go to the next\n */\n nextSection: function(){\n var self = this;\n var qtiRunner = this.getQtiRunner();\n var doNextSection = function() {\n self.exitSection('nextSection', null, testMetaData.SECTION_EXIT_CODE.QUIT);\n };\n\n if (qtiRunner) {\n qtiRunner.updateItemApi();\n }\n\n if (this.hasOption(optionNextSectionWarning)) {\n this.displayExitMessage(\n __('After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?'),\n doNextSection,\n { scope: 'testSection' }\n );\n } else {\n doNextSection();\n }\n\n this.enableGui();\n },\n\n /**\n * Gets the current progression within a particular scope\n * @param {String} [scope]\n * @returns {Object}\n */\n getProgression: function(scope) {\n var scopeSuffixMap = {\n test : '',\n testPart : 'Part',\n testSection : 'Section'\n };\n var scopeSuffix = scope && scopeSuffixMap[scope] || '';\n\n return {\n total : this.testContext['numberItems' + scopeSuffix] || 0,\n answered : this.testContext['numberCompleted' + scopeSuffix] || 0,\n viewed : this.testContext['numberPresented' + scopeSuffix] || 0,\n flagged : this.testContext['numberFlagged' + scopeSuffix] || 0\n };\n },\n\n /**\n * Displays an exit message for a particular scope\n * @param {String} message\n * @param {Function} [action]\n * @param {Object} [options]\n * @param {String} [options.scope]\n * @param {String} [options.confirmLabel] - label of confirm button\n * @param {String} [options.cancelLabel] - label of cancel button\n * @param {Boolean} [options.showItemCount] - display the number of unanswered / flagged items in modal\n * @returns {jQuery} Returns the message box\n */\n displayExitMessage: function(message, action, options) {\n var self = this,\n options = options || {},\n scope = options.scope,\n confirmLabel = options.confirmLabel || __('Yes'),\n cancelLabel = options.cancelLabel || __('No'),\n showItemCount = typeof options.showItemCount !== 'undefined' ? options.showItemCount : true;\n\n var $confirmBox = $('.exit-modal-feedback');\n var progression = this.getProgression(scope);\n var unansweredCount = (progression.total - progression.answered);\n var flaggedCount = progression.flagged;\n\n if (showItemCount) {\n if (unansweredCount && this.isCurrentItemAnswered()) {\n unansweredCount--;\n }\n\n if (flaggedCount && unansweredCount) {\n message = __('You have %s unanswered question(s) and have %s item(s) marked for review.',\n unansweredCount.toString(),\n flaggedCount.toString()\n ) + ' ' + message;\n } else {\n if (flaggedCount) {\n message = __('You have %s item(s) marked for review.', flaggedCount.toString()) + ' ' + message;\n }\n\n if (unansweredCount) {\n message = __('You have %s unanswered question(s).', unansweredCount.toString()) + ' ' + message;\n }\n }\n }\n\n $confirmBox.find('.message').html(message);\n $confirmBox.find('.js-exit-confirm').html(confirmLabel);\n $confirmBox.find('.js-exit-cancel').html(cancelLabel);\n $confirmBox.modal({ width: 500 });\n\n $confirmBox.find('.js-exit-cancel, .modal-close').off('click').on('click', function () {\n $confirmBox.modal('close');\n });\n\n $confirmBox.find('.js-exit-confirm').off('click').on('click', function () {\n $confirmBox.modal('close');\n if (_.isFunction(action)) {\n action.call(self);\n }\n });\n\n return $confirmBox;\n },\n\n /**\n * Kill current item section and execute callback function given as first parameter.\n * Item end execution time will be stored in metadata object to be sent to the server.\n * @param {function} callback\n */\n killItemSession : function (callback) {\n testMetaData.addData({\n 'ITEM' : {\n 'ITEM_END_TIME_CLIENT' : Date.now() / 1000,\n 'ITEM_TIMEZONE' : moment().utcOffset(moment().utcOffset()).format('Z')\n }\n });\n if (typeof callback !== 'function') {\n callback = _.noop;\n }\n this.itemServiceApi.kill(callback);\n },\n\n /**\n * Checks if the current item is active\n * @returns {Boolean}\n */\n isCurrentItemActive: function(){\n return (this.testContext.itemSessionState !=4);\n },\n\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n *\n * @returns {Boolean}\n */\n isCurrentItemAnswered: function(){\n var answered = false;\n _.each(this.getCurrentItemState(), function(state){\n if(state && _.isObject(state.response) && state.response.base !== null){\n answered = true;//at least one response is not null so consider the item answered\n return false;\n }\n });\n return answered;\n },\n\n /**\n * Checks if a particular option is enabled for the current item\n * @param {String} option\n * @returns {Boolean}\n */\n hasOption: function(option) {\n return _.indexOf(this.testContext.categories, option) >= 0;\n },\n\n /**\n * Gets access to the qtiRunner instance\n * @returns {Object}\n */\n getQtiRunner: function(){\n var itemFrame = document.getElementById('qti-item');\n var itemWindow = itemFrame && itemFrame.contentWindow;\n var itemContainerFrame = itemWindow && itemWindow.document.getElementById('item-container');\n var itemContainerWindow = itemContainerFrame && itemContainerFrame.contentWindow;\n return itemContainerWindow && itemContainerWindow.qtiRunner;\n },\n\n /**\n * Checks if the current section is timed\n * @returns {Boolean}\n */\n isTimedSection: function(){\n var timeConstraints = this.testContext.timeConstraints,\n isTimedSection = false;\n for( var index in timeConstraints ){\n if(timeConstraints.hasOwnProperty(index) &&\n timeConstraints[index].qtiClassName === 'assessmentSection' ){\n isTimedSection = true;\n }\n }\n\n return isTimedSection;\n },\n\n /**\n * Gets the list of items owned by the current section\n * @returns {Array}\n */\n getCurrentSectionItems: function(){\n var partId = this.testContext.testPartId,\n navMap = this.testContext.navigatorMap,\n sectionItems;\n\n for( var partIndex in navMap ){\n if( !navMap.hasOwnProperty(partIndex)){\n continue;\n }\n if( navMap[partIndex].id !== partId ){\n continue;\n }\n\n for(var sectionIndex in navMap[partIndex].sections){\n if( !navMap[partIndex].sections.hasOwnProperty(sectionIndex)){\n continue;\n }\n if( navMap[partIndex].sections[sectionIndex].active === true ){\n sectionItems = navMap[partIndex].sections[sectionIndex].items;\n break;\n }\n }\n }\n\n return sectionItems;\n },\n\n /**\n * Skips the current item\n */\n skip: function () {\n var self = this,\n doSkip = function() {\n self.disableGui();\n self.actionCall('skip');\n };\n\n if (this.shouldDisplayEndTestWarning()) {\n this.displayEndTestWarning(doSkip);\n } else {\n doSkip();\n }\n },\n\n /**\n * Handles the timeout state\n */\n timeout: function () {\n var self = this;\n this.disableGui();\n this.testContext.isTimeout = true;\n this.updateTimer();\n\n this.killItemSession(function () {\n var confirmBox = $('.timeout-modal-feedback'),\n testContext = self.testContext,\n confirmBtn = confirmBox.find('.js-timeout-confirm, .modal-close');\n\n if (testContext.numberCompletedSection === testContext.numberItemsSection) {\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : testMetaData.SECTION_EXIT_CODE.COMPLETE_TIMEOUT}});\n } else {\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : testMetaData.SECTION_EXIT_CODE.TIMEOUT}});\n }\n\n self.enableGui();\n confirmBox.modal({width: 500});\n confirmBtn.off('click').on('click', function () {\n confirmBox.modal('close');\n self.actionCall('timeout');\n });\n });\n },\n\n /**\n * Sets the assessment test context object\n * @param {Object} testContext\n */\n setTestContext: function(testContext) {\n this.testContext = testContext;\n this.itemServiceApi = eval(testContext.itemServiceApiCall);\n this.itemServiceApi.setHasBeenPaused(testContext.hasBeenPaused);\n },\n\n\n /**\n * Handles Metadata initialization\n */\n initMetadata: function (){\n testMetaData = testMetaDataFactory({\n testServiceCallId: this.itemServiceApi.serviceCallId\n });\n },\n\n /**\n * Retrieve service responsible for broken session tracking\n * @returns {*}\n */\n getSessionStateService: function () {\n if (!sessionStateService) {\n sessionStateService = this.testContext.sessionStateService({accuracy: 1000});\n }\n return sessionStateService;\n },\n\n /**\n * Updates the GUI\n * @param {Object} testContext\n */\n update: function (testContext) {\n var self = this;\n $controls.$itemFrame.remove();\n\n var $runner = $('#runner');\n $runner.css('height', 'auto');\n\n this.getSessionStateService().restart();\n\n this.setTestContext(testContext);\n this.updateContext();\n this.updateProgress();\n this.updateNavigation();\n this.updateTestReview();\n this.updateInformation();\n this.updateRubrics();\n this.updateTools(testContext);\n this.updateTimer();\n this.updateExitButton();\n this.resetCurrentItemState();\n this.initMetadata();\n\n $controls.$itemFrame = $('<iframe id=\"qti-item\" frameborder=\"0\" scrollbars=\"no\"/>');\n $controls.$itemFrame.appendTo($controls.$contentBox);\n\n if (this.testContext.itemSessionState === this.TEST_ITEM_STATE_INTERACTING && self.testContext.isTimeout === false) {\n $doc.off('.testRunner').on('serviceloaded.testRunner', function () {\n self.afterTransition();\n self.adjustFrame();\n $controls.$itemFrame.css({visibility: 'visible'});\n });\n\n // Inject API into the frame.\n this.itemServiceApi.loadInto($controls.$itemFrame[0], function () {\n // We now rely on the 'serviceloaded' event.\n });\n }\n else {\n // e.g. no more attempts or timeout! Simply consider the transition is finished,\n // but do not load the item.\n self.afterTransition();\n }\n },\n\n /**\n * Displays feedback on the current state of the test\n */\n updateInformation: function () {\n\n if (this.testContext.isTimeout === true) {\n feedback().error(__('Time limit reached for item \"%s\".', this.testContext.itemIdentifier));\n }\n else if (this.testContext.itemSessionState !== this.TEST_ITEM_STATE_INTERACTING) {\n feedback().error(__('No more attempts allowed for item \"%s\".', this.testContext.itemIdentifier));\n }\n },\n\n /**\n * Updates the displayed tools\n * @param {Object} testContext\n */\n updateTools: function updateTools(testContext) {\n var showSkip = false;\n var showSkipEnd = false;\n var showNextSection = !!testContext.nextSection && (this.hasOption(optionNextSection) || this.hasOption(optionNextSectionWarning));\n\n if (this.testContext.allowSkipping === true) {\n if (this.testContext.isLast === false) {\n showSkip = true;\n } else {\n showSkipEnd = true;\n }\n }\n\n $controls.$skip.toggle(showSkip);\n $controls.$skipEnd.toggle(showSkipEnd);\n $controls.$nextSection.toggle(showNextSection);\n\n actionBarTools.render('.tools-box-list', testContext, TestRunner);\n },\n\n /**\n * Displays a timer\n * @param {Object} cst\n * @returns {*|jQuery|HTMLElement}\n */\n createTimer: function(cst) {\n var $timer = $('<div>', {'class': 'qti-timer qti-timer__type-' + cst.qtiClassName }),\n $label = $('<div>', {'class': 'qti-timer_label truncate', text: cst.label }),\n $time = $('<div>', {'class': 'qti-timer_time', text: this.formatTime(cst.seconds) });\n\n $timer.append($label);\n $timer.append($time);\n return $timer;\n },\n\n /**\n * Updates the timers\n */\n updateTimer: function () {\n var self = this;\n var hasTimers;\n $controls.$timerWrapper.empty();\n\n for (var i = 0; i < timerIds.length; i++) {\n clearTimeout(timerIds[i]);\n }\n\n timerIds = [];\n currentTimes = [];\n lastDates = [];\n timeDiffs = [];\n\n if (self.testContext.isTimeout === false &&\n self.testContext.itemSessionState === self.TEST_ITEM_STATE_INTERACTING) {\n\n hasTimers = !!this.testContext.timeConstraints.length;\n $controls.$topActionBar.toggleClass('has-timers', hasTimers);\n\n if (hasTimers) {\n\n // Insert QTI Timers container.\n // self.formatTime(cst.seconds)\n for (i = 0; i < this.testContext.timeConstraints.length; i++) {\n\n var cst = this.testContext.timeConstraints[i];\n\n if (cst.allowLateSubmission === false) {\n\n // Set up a timer for this constraint\n $controls.$timerWrapper.append(self.createTimer(cst));\n\n // Set up a timer and update it with setInterval.\n currentTimes[i] = cst.seconds;\n lastDates[i] = new Date();\n timeDiffs[i] = 0;\n timerIndex = i;\n\n if (self.testContext.timerWarning && self.testContext.timerWarning[cst.qtiClassName]) {\n cst.warnings = {};\n _(self.testContext.timerWarning[cst.qtiClassName]).forEach(function (value, key) {\n if (_.contains(['info', 'warning', 'danger'], value)) {\n cst.warnings[key] = {\n type: value,\n showed: cst.seconds <= key,\n point: parseInt(key, 10)\n };\n }\n });\n var closestPreviousWarning = _.find(cst.warnings, { showed: true });\n if (!_.isEmpty(closestPreviousWarning) && closestPreviousWarning.point) {\n cst.warnings[closestPreviousWarning.point].showed = false;\n }\n }\n\n (function (timerIndex, cst) {\n timerIds[timerIndex] = setInterval(function () {\n\n timeDiffs[timerIndex] += (new Date()).getTime() - lastDates[timerIndex].getTime();\n\n if (timeDiffs[timerIndex] >= 1000) {\n var seconds = timeDiffs[timerIndex] / 1000;\n currentTimes[timerIndex] -= seconds;\n timeDiffs[timerIndex] = 0;\n }\n\n $timers.eq(timerIndex)\n .html(self.formatTime(Math.round(currentTimes[timerIndex])));\n\n if (currentTimes[timerIndex] <= 0) {\n // The timer expired...\n currentTimes[timerIndex] = 0;\n clearInterval(timerIds[timerIndex]);\n\n // Hide item to prevent any further interaction with the candidate.\n $controls.$itemFrame.hide();\n self.timeout();\n } else {\n lastDates[timerIndex] = new Date();\n }\n\n var warning = _.findLast(cst.warnings, { showed: false });\n\n if (!_.isEmpty(warning) && _.isFinite(warning.point) && currentTimes[timerIndex] <= warning.point) {\n self.timeWarning(cst, warning);\n }\n\n }, 1000);\n }(timerIndex, cst));\n }\n }\n\n $timers = $controls.$timerWrapper.find('.qti-timer .qti-timer_time');\n $controls.$timerWrapper.show();\n }\n }\n },\n\n /**\n * Mark appropriate timer by warning colors and show feedback message\n *\n * @param {object} cst - Time constraint\n * @param {integer} cst.warningTime - Warning time in seconds.\n * @param {integer} cst.qtiClassName - Class name of qti instance for which the timer is set (assessmentItemRef | assessmentSection | testPart | assessmentTest).\n * @param {integer} cst.seconds - Initial timer value.\n * @param {object} warning - Current actual warning\n * @param {integer} warning.point - Warning time point in seconds, when show message\n * @param {boolean} warning.showed - boolean flag for mark already showed warnings\n * @param {string} warning.type - type of warning (from config), can be info, warning or error\n *\n * @returns {undefined}\n */\n timeWarning: function (cst, warning) {\n var message = '',\n remaining,\n $timer = $controls.$timerWrapper.find('.qti-timer__type-' + cst.qtiClassName),\n $time = $timer.find('.qti-timer_time');\n\n $time.removeClass('txt-info txt-warning txt-danger').addClass('txt-' + warning.type);\n\n remaining = moment.duration(warning.point, \"seconds\").humanize();\n\n switch (cst.qtiClassName) {\n case 'assessmentItemRef':\n message = __(\"Warning – You have %s remaining to complete this item.\", remaining);\n break;\n case 'assessmentSection':\n message = __(\"Warning – You have %s remaining to complete this section.\", remaining);\n break;\n case 'testPart':\n message = __(\"Warning – You have %s remaining to complete this test part.\", remaining);\n break;\n case 'assessmentTest':\n message = __(\"Warning – You have %s remaining to complete the test.\", remaining);\n break;\n }\n\n feedback()[warning.type](message);\n\n cst.warnings[warning.point].showed = true;\n },\n\n /**\n * Displays or hides the rubric block\n */\n updateRubrics: function () {\n $controls.$rubricBlocks.remove();\n\n if (this.testContext.rubrics.length > 0) {\n\n $controls.$rubricBlocks = $('<div id=\"qti-rubrics\"/>');\n\n for (var i = 0; i < this.testContext.rubrics.length; i++) {\n $controls.$rubricBlocks.append(this.testContext.rubrics[i]);\n }\n\n // modify the <a> tags in order to be sure it\n // opens in another window.\n $controls.$rubricBlocks.find('a').bind('click keypress', function () {\n window.open(this.href);\n return false;\n });\n\n $controls.$rubricBlocks.prependTo($controls.$contentBox);\n\n if (MathJax) {\n MathJax.Hub.Queue([\"Typeset\", MathJax.Hub], $controls.$rubricBlocks[0]);\n }\n\n }\n },\n\n /**\n * Updates the list of navigation buttons (previous, next, skip, etc.)\n */\n updateNavigation: function () {\n $controls.$exit.show();\n\n if(this.testContext.isLast === true) {\n $controls.$moveForward.hide();\n $controls.$moveEnd.show();\n }\n else {\n $controls.$moveForward.show();\n $controls.$moveEnd.hide();\n }\n if (this.testContext.navigationMode === this.TEST_NAVIGATION_LINEAR) {\n // LINEAR\n $controls.$moveBackward.hide();\n }\n else {\n // NONLINEAR\n $controls.$controls.show();\n if(this.testContext.canMoveBackward === true) {\n $controls.$moveBackward.show();\n }\n else {\n $controls.$moveBackward.hide();\n }\n }\n },\n\n /**\n * Updates the test taker review screen\n */\n updateTestReview: function() {\n var considerProgress = this.testContext.considerProgress === true;\n\n if (this.testReview) {\n this.testReview.toggle(considerProgress && this.hasOption(optionReviewScreen));\n this.testReview.update(this.testContext);\n }\n },\n\n /**\n * Updates the progress bar\n */\n updateProgress: function () {\n var considerProgress = this.testContext.considerProgress === true;\n\n $controls.$progressBox.css('visibility', considerProgress ? 'visible' : 'hidden');\n\n if (considerProgress) {\n this.progressUpdater.update(this.testContext);\n }\n },\n\n /**\n * Updates the test informations\n */\n updateContext: function () {\n\n $controls.$title.text(this.testContext.testTitle);\n\n // Visibility of section?\n var sectionText = (this.testContext.isDeepestSectionVisible === true) ? (' - ' + this.testContext.sectionTitle) : '';\n\n $controls.$position.text(sectionText);\n $controls.$titleGroup.show();\n },\n\n /**\n * Displays the right exit button\n */\n updateExitButton : function(){\n\n $controls.$logout.toggleClass('hidden', !this.testContext.logoutButton);\n $controls.$exit.toggleClass('hidden', !this.testContext.exitButton);\n },\n\n /**\n * Ensures the frame has the right size\n */\n adjustFrame: function () {\n var rubricHeight = $controls.$rubricBlocks.outerHeight(true) || 0;\n var frameContentHeight;\n var finalHeight = $(window).innerHeight() - $controls.$topActionBar.outerHeight() - $controls.$bottomActionBar.outerHeight();\n var itemFrame = $controls.$itemFrame.get(0);\n $controls.$contentBox.height(finalHeight);\n if($controls.$sideBars.length){\n $controls.$sideBars.each(function() {\n var $sideBar = $(this);\n $sideBar.height(finalHeight - $sideBar.outerHeight() + $sideBar.height());\n });\n }\n\n if(itemFrame && itemFrame.contentWindow){\n frameContentHeight = $controls.$itemFrame.contents().outerHeight(true);\n\n if (frameContentHeight < finalHeight) {\n if (rubricHeight) {\n frameContentHeight = Math.max(frameContentHeight, finalHeight - rubricHeight);\n } else {\n frameContentHeight = finalHeight;\n }\n }\n if (itemFrame.contentWindow.$) {\n itemFrame.contentWindow.$('body').trigger('setheight', [frameContentHeight]);\n }\n $controls.$itemFrame.height(frameContentHeight);\n }\n },\n\n /**\n * Locks the GUI\n */\n disableGui: function () {\n $controls.$naviButtons.addClass('disabled');\n if (this.testReview) {\n this.testReview.disable();\n }\n },\n\n /**\n * Unlocks the GUI\n */\n enableGui: function () {\n $controls.$naviButtons.removeClass('disabled');\n if (this.testReview) {\n this.testReview.enable();\n }\n },\n\n /**\n * Hides the GUI\n */\n hideGui: function () {\n $controls.$naviButtons.addClass('hidden');\n if (this.testReview) {\n this.testReview.hide();\n }\n },\n\n /**\n * Shows the GUI\n */\n showGui: function () {\n $controls.$naviButtons.removeClass('hidden');\n if (this.testReview) {\n this.testReview.show();\n }\n },\n\n /**\n * Formats a timer\n * @param {Number} totalSeconds\n * @returns {String}\n */\n formatTime: function (totalSeconds) {\n var sec_num = totalSeconds;\n var hours = Math.floor(sec_num / 3600);\n var minutes = Math.floor((sec_num - (hours * 3600)) / 60);\n var seconds = Math.floor(sec_num - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) {\n hours = \"0\" + hours;\n }\n if (minutes < 10) {\n minutes = \"0\" + minutes;\n }\n if (seconds < 10) {\n seconds = \"0\" + seconds;\n }\n\n var time = hours + ':' + minutes + ':' + seconds;\n\n return time;\n },\n\n /**\n * Processes an error\n * @param {Object} error\n */\n processError : function processError(error) {\n var self = this;\n\n // keep disabled\n this.hideGui();\n this.beforeTransition();\n\n // ask the parent to display a message\n iframeNotifier.parent('messagealert', {\n message : error.message,\n action : function() {\n if (testMetaData) {\n testMetaData.clearData();\n }\n if (error.state === self.TEST_STATE_CLOSED) {\n // test is closed, finish it\n self.serviceApi.finish();\n } else {\n // test is still open, just exit to the index\n self.serviceApi.exit();\n }\n }\n });\n },\n\n /**\n * Call action specified in testContext. A postfix <i>Url</i> will be added to the action name.\n * To specify actions see {@link https://github.com/oat-sa/extension-tao-testqti/blob/master/helpers/class.TestRunnerUtils.php}\n * @param {String} action - Action name\n * @param {Object} [extraParams] - Additional parameters to be sent to the server\n * @returns {undefined}\n */\n actionCall: function (action, extraParams) {\n var self = this,\n params = {metaData: testMetaData ? testMetaData.getData() : {}};\n\n if (extraParams) {\n params = _.assign(params, extraParams);\n }\n this.beforeTransition(function () {\n $.ajax({\n url: self.testContext[action + 'Url'],\n cache: false,\n data: params,\n async: true,\n dataType: 'json',\n success: function (testContext) {\n testMetaData.clearData();\n\n if (!testContext.success) {\n self.processError(testContext);\n }\n else if (testContext.state === self.TEST_STATE_CLOSED) {\n self.serviceApi.finish();\n }\n else {\n self.update(testContext);\n }\n }\n });\n });\n },\n\n /**\n * Exit from test (after confirmation). All answered questions will be submitted.\n *\n * @returns {undefined}\n */\n exit: function () {\n var self = this;\n testMetaData.addData({\n \"TEST\" : {\"TEST_EXIT_CODE\" : testMetaData.TEST_EXIT_CODE.INCOMPLETE},\n \"SECTION\" : {\"SECTION_EXIT_CODE\" : testMetaData.SECTION_EXIT_CODE.QUIT}\n });\n this.displayExitMessage(\n __('Are you sure you want to end the test?'),\n function() {\n self.killItemSession(function () {\n self.actionCall('endTestSession');\n testMetaData.clearData();\n });\n },\n { scope: this.testReview ? this.testContext.reviewScope : null }\n );\n },\n\n /**\n * Set the state of the current item in the test runner\n *\n * @param {string} id\n * @param {object} state\n */\n setCurrentItemState : function(id, state){\n if(id){\n this.currentItemState[id] = state;\n }\n },\n\n /**\n * Reset the state of the current item in the test runner\n */\n resetCurrentItemState : function(){\n this.currentItemState = {};\n },\n\n /**\n * Get the state of the current item as stored in the test runner\n * @returns {Object}\n */\n getCurrentItemState : function(){\n return this.currentItemState;\n }\n };\n\n var config = module.config();\n if (config) {\n actionBarTools.register(config.qtiTools);\n }\n\n return {\n start: function (testContext) {\n\n $controls = {\n // navigation\n $moveForward: $('[data-control=\"move-forward\"]'),\n $moveEnd: $('[data-control=\"move-end\"]'),\n $moveBackward: $('[data-control=\"move-backward\"]'),\n $nextSection: $('[data-control=\"next-section\"]'),\n $skip: $('[data-control=\"skip\"]'),\n $skipEnd: $('[data-control=\"skip-end\"]'),\n $exit: $(window.parent.document).find('[data-control=\"exit\"]'),\n $logout: $(window.parent.document).find('[data-control=\"logout\"]'),\n $naviButtons: $('.bottom-action-bar .action'),\n $skipButtons: $('.navi-box .skip'),\n $forwardButtons: $('.navi-box .forward'),\n\n // progress bar\n $progressBar: $('[data-control=\"progress-bar\"]'),\n $progressLabel: $('[data-control=\"progress-label\"]'),\n $progressBox: $('.progress-box'),\n\n // title\n $title: $('[data-control=\"qti-test-title\"]'),\n $position: $('[data-control=\"qti-test-position\"]'),\n\n // timers\n $timerWrapper: $('[data-control=\"qti-timers\"]'),\n\n // other zones\n $contentPanel: $('.content-panel'),\n $controls: $('.qti-controls'),\n $itemFrame: $('#qti-item'),\n $rubricBlocks: $('#qti-rubrics'),\n $contentBox: $('#qti-content'),\n $sideBars: $('.test-sidebar'),\n $topActionBar: $('.horizontal-action-bar.top-action-bar'),\n $bottomActionBar: $('.horizontal-action-bar.bottom-action-bar')\n };\n\n // title\n $controls.$titleGroup = $controls.$title.add($controls.$position);\n\n $doc.ajaxError(function (event, jqxhr) {\n if (jqxhr.status === 403) {\n iframeNotifier.parent('serviceforbidden');\n }\n });\n\n window.onServiceApiReady = function onServiceApiReady(serviceApi) {\n TestRunner.serviceApi = serviceApi;\n\n if (!testContext.success) {\n TestRunner.processError(testContext);\n }\n\n // If the assessment test session is in CLOSED state,\n // we give the control to the delivery engine by calling finish.\n else if (testContext.state === TestRunner.TEST_STATE_CLOSED) {\n serviceApi.finish();\n testMetaData.clearData();\n }\n else {\n\n if (TestRunner.getSessionStateService().getDuration()) {\n TestRunner.setTestContext(testContext);\n TestRunner.initMetadata();\n\n TestRunner.keepItemTimed(TestRunner.getSessionStateService().getDuration());\n TestRunner.getSessionStateService().restart();\n } else {\n TestRunner.update(testContext);\n }\n }\n };\n\n TestRunner.beforeTransition();\n TestRunner.testContext = testContext;\n\n $controls.$skipButtons.click(function () {\n if (!$(this).hasClass('disabled')) {\n TestRunner.skip();\n }\n });\n\n $controls.$forwardButtons.click(function () {\n if (!$(this).hasClass('disabled')) {\n TestRunner.moveForward();\n }\n });\n\n $controls.$moveBackward.click(function () {\n if (!$(this).hasClass('disabled')) {\n TestRunner.moveBackward();\n }\n });\n\n $controls.$nextSection.click(function () {\n if (!$(this).hasClass('disabled')) {\n TestRunner.nextSection();\n }\n });\n\n $controls.$exit.click(function (e) {\n e.preventDefault();\n TestRunner.exit();\n });\n\n $(window).on('resize', _.throttle(function () {\n TestRunner.adjustFrame();\n $controls.$titleGroup.show();\n }, 250));\n\n $doc.on('loading', function () {\n iframeNotifier.parent('loading');\n });\n\n\n $doc.on('unloading', function () {\n iframeNotifier.parent('unloading');\n });\n\n TestRunner.progressUpdater = progressUpdater($controls.$progressBar, $controls.$progressLabel);\n\n if (testContext.reviewScreen) {\n TestRunner.testReview = testReview($controls.$contentPanel, {\n region: testContext.reviewRegion || 'left',\n hidden: !TestRunner.hasOption(optionReviewScreen),\n reviewScope: testContext.reviewScope,\n preventsUnseen: !!testContext.reviewPreventsUnseen,\n canCollapse: !!testContext.reviewCanCollapse\n }).on('jump', function(event, position) {\n TestRunner.jump(position);\n }).on('mark', function(event, flag, position) {\n TestRunner.markForReview(flag, position);\n });\n $controls.$sideBars = $('.test-sidebar');\n }\n\n TestRunner.updateProgress();\n TestRunner.updateTestReview();\n\n iframeNotifier.parent('serviceready');\n\n\n TestRunner.adjustFrame();\n\n $controls.$topActionBar.add($controls.$bottomActionBar).animate({ opacity: 1 }, 600);\n\n deleter($('#feedback-box'));\n modal($('body'));\n\n //listen to state change in the current item\n $(document).on('responsechange', function(e, responseId, response){\n if(responseId && response){\n TestRunner.setCurrentItemState(responseId, {response:response});\n }\n }).on('stateready', function(e, id, state){\n if(id && state){\n TestRunner.setCurrentItemState(id, state);\n }\n }).on('heightchange', function(e, height) {\n $controls.$itemFrame.height(height);\n });\n\n }\n };\n });\n\n","\n(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})\n('.qti-navigator{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;padding:0;cursor:default;min-width:calc(18rem - 8px);height:100%;position:relative}.qti-navigator span{display:inline-block}.qti-navigator .collapsed .collapsible-panel{display:none !important}.qti-navigator .collapsed .qti-navigator-label .icon-up{display:none}.qti-navigator .collapsed .qti-navigator-label .icon-down{display:inline-block}.qti-navigator .collapsible>.qti-navigator-label,.qti-navigator .qti-navigator-item>.qti-navigator-label{cursor:pointer}.qti-navigator.scope-test-section .qti-navigator-part>.qti-navigator-label{display:none !important}.qti-navigator .qti-navigator-label{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;min-width:calc(100% - 12px);padding:0 6px;line-height:3rem}.qti-navigator .qti-navigator-label .icon-up,.qti-navigator .qti-navigator-label .icon-down{line-height:3rem;margin-left:auto}.qti-navigator .qti-navigator-label .icon-down{display:none}.qti-navigator .qti-navigator-label .qti-navigator-number{display:none}.qti-navigator .qti-navigator-icon,.qti-navigator .icon{position:relative;top:1px;display:inline-block;width:2rem;line-height:2.8rem}.qti-navigator .unseen .qti-navigator-icon{cursor:default}.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-icon,.qti-navigator.prevents-unseen:not(.skipahead-enabled) .unseen .qti-navigator-label{cursor:not-allowed !important}.qti-navigator .icon-answered:before{content:\\\"\\\\e69a\\\"}.qti-navigator .icon-viewed:before{content:\\\"\\\\e631\\\"}.qti-navigator .icon-flagged:before{content:\\\"\\\\e64e\\\"}.qti-navigator .icon-unanswered:before,.qti-navigator .icon-unseen:before{content:\\\"\\\\e6a5\\\"}.qti-navigator .qti-navigator-counter{text-align:right;margin-left:auto;font-size:12px;font-size:1.2rem}.qti-navigator .qti-navigator-actions{text-align:center}.qti-navigator .qti-navigator-info.collapsed{height:calc(3rem + 1px)}.qti-navigator .qti-navigator-info{height:calc(5 * (3rem + 1px));overflow:hidden}.qti-navigator .qti-navigator-info>.qti-navigator-label{min-width:calc(100% - 16px);padding:0 8px}.qti-navigator .qti-navigator-info ul{padding:0 4px}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-text{padding:0 6px;min-width:10rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-icon{min-width:1.5rem}.qti-navigator .qti-navigator-info ul .qti-navigator-label span.qti-navigator-counter{min-width:5rem}.qti-navigator .qti-navigator-filters{margin-top:1rem;text-align:center;width:15rem;height:calc(3rem + (2 * 1px))}.qti-navigator .qti-navigator-filters ul{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.qti-navigator .qti-navigator-filters li{display:block}.qti-navigator .qti-navigator-filters li .qti-navigator-tab{border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;border-left:none;line-height:3rem;min-width:5rem;cursor:pointer;white-space:nowrap}.qti-navigator .qti-navigator-tree{-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-y:auto}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{padding:8px}.qti-navigator .qti-navigator-linear .icon,.qti-navigator .qti-navigator-linear-part .icon{display:none}.qti-navigator .qti-navigator-linear .qti-navigator-label,.qti-navigator .qti-navigator-linear-part .qti-navigator-label{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-linear .qti-navigator-title,.qti-navigator .qti-navigator-linear-part .qti-navigator-title{font-size:14px;font-size:1.4rem;margin:8px 0}.qti-navigator .qti-navigator-linear .qti-navigator-message,.qti-navigator .qti-navigator-linear-part .qti-navigator-message{font-size:14px;font-size:1.4rem}.qti-navigator .qti-navigator-part>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-part:not(:first-child){margin-top:1px}.qti-navigator .qti-navigator-section>.qti-navigator-label{padding:0 8px}.qti-navigator .qti-navigator-item{margin:1px 0;padding-left:10px}.qti-navigator .qti-navigator-item:first-child{margin-top:0}.qti-navigator .qti-navigator-item.disabled>.qti-navigator-label{cursor:not-allowed}.qti-navigator .qti-navigator-collapsible{cursor:pointer;text-align:center;display:none;position:absolute;top:0;bottom:0;right:0;padding-top:50%}.qti-navigator .qti-navigator-collapsible .icon{font-size:20px;font-size:2rem;width:1rem !important;height:2rem !important}.qti-navigator .qti-navigator-collapsible .qti-navigator-expand{display:none}.qti-navigator.collapsible{padding-right:calc(1rem + 10px) !important}.qti-navigator.collapsible .qti-navigator-collapsible{display:block}.qti-navigator.collapsed{width:calc(8rem + 1rem + 10px);min-width:8rem}.qti-navigator.collapsed ul{padding:0 !important}.qti-navigator.collapsed .qti-navigator-text,.qti-navigator.collapsed .qti-navigator-info>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-part>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-section>.qti-navigator-label,.qti-navigator.collapsed .qti-navigator-message{display:none !important}.qti-navigator.collapsed .qti-navigator-label{padding:0 2px !important;width:calc(8rem - 4px);min-width:calc(8rem - 4px)}.qti-navigator.collapsed .qti-navigator-icon,.qti-navigator.collapsed .icon{width:auto}.qti-navigator.collapsed .qti-navigator-counter{margin-left:0;min-width:4rem !important}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-collapse{display:none}.qti-navigator.collapsed .qti-navigator-collapsible .qti-navigator-expand{display:block}.qti-navigator.collapsed .qti-navigator-info{height:calc(4 * (3rem + 1px))}.qti-navigator.collapsed .qti-navigator-info.collapsed .collapsible-panel{display:block !important}.qti-navigator.collapsed .qti-navigator-filters{width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-filter span{display:none}.qti-navigator.collapsed .qti-navigator-filter.active span{display:block;border:0 none;width:calc(8rem - 16px)}.qti-navigator.collapsed .qti-navigator-item,.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding-left:2px;text-align:center}.qti-navigator.collapsed .qti-navigator-item{overflow:hidden}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-icon{padding-left:6px;width:2rem}.qti-navigator.collapsed .qti-navigator-item .qti-navigator-number{display:inline-block;margin-left:6px;margin-right:8rem}.qti-navigator.collapsed .qti-navigator-linear,.qti-navigator.collapsed .qti-navigator-linear-part{padding:0 0 8px 0}.qti-navigator.collapsed .qti-navigator-linear .icon,.qti-navigator.collapsed .qti-navigator-linear-part .icon{display:block}.qti-navigator.collapsed .qti-navigator-actions button{padding:0 9px 0 5px}.qti-navigator .qti-navigator-info>.qti-navigator-label{background-color:#D4D5D7;color:#222;border-top:1px solid #D4D5D7}.qti-navigator .qti-navigator-info li{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab{background-color:#fff}.qti-navigator .qti-navigator-filter .qti-navigator-tab:hover{background-color:#3e7da7;color:#fff}.qti-navigator .qti-navigator-filter.active .qti-navigator-tab{background-color:#a4a9b1;color:#fff}.qti-navigator .qti-navigator-linear,.qti-navigator .qti-navigator-linear-part{background:#fff}.qti-navigator .qti-navigator-part>.qti-navigator-label{background-color:#dddfe2}.qti-navigator .qti-navigator-part>.qti-navigator-label:hover{background-color:#c6cacf}.qti-navigator .qti-navigator-part.active>.qti-navigator-label{background-color:#c0c4ca}.qti-navigator .qti-navigator-section>.qti-navigator-label{border-bottom:1px solid #fff}.qti-navigator .qti-navigator-section>.qti-navigator-label:hover{background-color:#ebe8e4}.qti-navigator .qti-navigator-section.active>.qti-navigator-label{background-color:#ded9d4}.qti-navigator .qti-navigator-item{background:#fff}.qti-navigator .qti-navigator-item.active{background:#0e5d91;color:#fff}.qti-navigator .qti-navigator-item:hover{background:#0a3f62;color:#fff}.qti-navigator .qti-navigator-item.disabled{background-color:#e2deda !important}.qti-navigator .qti-navigator-collapsible{background-color:#dfe1e4;color:#222}.qti-navigator .qti-navigator-collapsible .icon{color:#fff}.document-viewer-plugin{position:relative}.document-viewer-plugin .viewer-overlay{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10000;width:100%;opacity:.5;background-color:#e4ecef}.document-viewer-plugin .viewer-panel{position:fixed;top:10px;left:10px;bottom:10px;right:10px;z-index:100000;color:#222;background:#f3f1ef;font-size:14px;font-size:1.4rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.document-viewer-plugin .viewer-header{position:relative;width:100%;height:30px;padding:5px 0;z-index:1}.document-viewer-plugin .viewer-header .viewer-title{font-size:15px;font-size:1.5rem;padding:0;margin:0 0 0 1.6rem}.document-viewer-plugin .viewer-header .icon{float:right;font-size:20px;font-size:2rem;color:#266d9c;margin:1px 6px;top:3px}.document-viewer-plugin .viewer-header .icon:hover{cursor:pointer;opacity:.75}.document-viewer-plugin .viewer-content{padding:0 20px;margin-top:4px;position:relative;height:calc(100% - 40px);overflow:auto}.qti-choiceInteraction.maskable .qti-choice .answer-mask{position:absolute;top:0;right:0;height:100%;padding:5px 10px 0 10px;z-index:10;color:#0e5d91;border:solid 1px #222;background-color:#c8d6dc;text-align:right;vertical-align:middle}.qti-choiceInteraction.maskable .qti-choice .answer-mask:hover{color:#568eb2}.qti-choiceInteraction.maskable .qti-choice .answer-mask .answer-mask-toggle:before{font-family:\\'tao\\' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\\e643\\\"}.qti-choiceInteraction.maskable .qti-choice .label-content{padding-right:40px}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask{width:100%}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask .answer-mask-toggle:before{font-family:\\'tao\\' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:\\\"\\\\e631\\\"}.qti-choiceInteraction.maskable .qti-choice.masked .answer-mask:hover{background-color:#d2dde2}.mask-container.mask-container{background-color:transparent}.mask-container.mask-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:1}.mask-container.mask-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.mask-container.mask-container .dynamic-component-title-bar .closer{display:none}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.mask-container.mask-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.mask-container.mask-container .dynamic-component-content .mask{position:absolute;width:100%;height:100%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent;opacity:1}.mask-container.mask-container .dynamic-component-content .mask .inner{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;position:relative;width:100%;height:100%;background-color:#fff;opacity:1;box-sizing:content-box;padding-bottom:30px}.mask-container.mask-container .dynamic-component-content .mask .controls{background:#f3f1ef;position:absolute;top:0;right:0;padding:0 5px 0 10px;border-radius:5px;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom:1px solid #8d949e;border-left:1px solid #8d949e;height:30px;z-index:2}.mask-container.mask-container .dynamic-component-content .mask .controls a{text-decoration:none;margin-right:5px;vertical-align:middle}.mask-container.mask-container .dynamic-component-content .mask .controls a:hover{color:#0a4166}.mask-container.mask-container .dynamic-component-content .mask .controls .view{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content .mask .controls .close{font-size:20px;font-size:2rem}.mask-container.mask-container .dynamic-component-content.moving .mask .inner{border-color:rgba(14,93,145,0.5);opacity:.55}.mask-container.mask-container .dynamic-component-content.moving .mask .controls{border-left:none;border-bottom-left-radius:0;z-index:2}.mask-container.mask-container .dynamic-component-content.sizing .mask{border-color:rgba(14,93,145,0.5)}.mask-container.mask-container .dynamic-component-content.sizing .mask .inner{opacity:.55}.mask-container.mask-container .dynamic-component-content.sizing .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.mask-container.mask-container.previewing .dynamic-component-content .mask .inner{opacity:.15;-webkit-transition:opacity, 600ms, ease, 0s;-moz-transition:opacity, 600ms, ease, 0s;-ms-transition:opacity, 600ms, ease, 0s;-o-transition:opacity, 600ms, ease, 0s;transition:opacity, 600ms, ease, 0s}.mask-container.mask-container.previewing .dynamic-component-content .mask .controls{background-color:transparent;border-bottom:none;border-left:none}.connectivity-box{display:none;width:40px;margin-left:40px}.connectivity-box.with-message{width:60px}.connectivity-box .icon-connect,.connectivity-box .icon-disconnect{display:none;line-height:2;font-size:16px;font-size:1.6rem;text-shadow:0 1px 0 rgba(0,0,0,0.9)}.connectivity-box .message-connect,.connectivity-box .message-disconnected{display:none;font-size:14px;font-size:1.4rem;text-shadow:none;margin-right:3px}.connectivity-box.connected,.connectivity-box.disconnected{display:inline-block}.connectivity-box.connected .icon-connect,.connectivity-box.connected .message-connect{display:inline-block}.connectivity-box.disconnected .icon-disconnect,.connectivity-box.disconnected .message-disconnected{display:inline-block}.line-reader-mask{box-sizing:border-box;border:0 solid #0E5D91;background-color:#f3f7fa}.line-reader-mask.hidden{display:none}.line-reader-mask.resizing{background-color:rgba(243,247,250,0.8);border-color:rgba(14,93,145,0.5)}.line-reader-mask.resizer{z-index:99999 !important}.line-reader-mask.resizer.se .resize-control{border-right:2px solid #0E5D91;border-bottom:2px solid #0E5D91;width:40px;height:40px}.line-reader-mask.border-top{border-top-width:1px}.line-reader-mask.border-right{border-right-width:1px}.line-reader-mask.border-bottom{border-bottom-width:1px}.line-reader-mask.border-left{border-left-width:1px}.line-reader-mask.ne{-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px}.line-reader-mask.se{-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px}.line-reader-mask.sw{-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.line-reader-mask.nw{-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.line-reader-mask.se .resize-control{width:20px;height:20px;margin-bottom:10px;margin-right:10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;position:absolute;right:0;bottom:0;cursor:nwse-resize}.line-reader-mask.e .resize-control{position:absolute;width:20px;height:20px;bottom:-10px;left:-10px;border-right:1px solid #0E5D91;border-bottom:1px solid #0E5D91;cursor:nesw-resize}.line-reader-mask.s .resize-control{position:absolute;width:20px;height:10px;right:-10px;border-bottom:1px solid #0E5D91}.line-reader-overlay{box-sizing:border-box;opacity:0}.line-reader-overlay.hidden{display:none}.line-reader-overlay.moving{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.line-reader-overlay.moving.n{max-height:none}.line-reader-overlay.moving,.line-reader-overlay .inner-window{overflow:hidden;position:absolute;opacity:1;background-color:transparent;border:1px solid rgba(14,93,145,0.5)}.line-reader-overlay .inner-window{box-sizing:content-box}.line-reader-overlay .mask-bg{box-sizing:border-box;border:0 solid rgba(243,247,250,0.8);background-color:transparent;position:absolute}.line-reader-overlay.n{max-height:30px;opacity:1}.line-reader-overlay.n .icon-mobile-menu{font-size:22px;font-size:2.2rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;border-bottom:1px solid #0E5D91;color:#0E5D91;position:absolute;left:0;top:0;height:30px;width:100%;z-index:1}.line-reader-overlay.n .icon-mobile-menu:hover{color:#0a4166}.line-reader-overlay.n .icon-mobile-menu:before{position:relative;top:3px}.line-reader-overlay .icon-mobile-menu{display:none}.line-reader-inner-drag{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;text-align:center;padding-top:3px;color:#0E5D91}.line-reader-inner-drag.hidden{display:none}.line-reader-inner-drag:hover{background-color:#87aec8;color:#0a4166}.line-reader-inner-drag.moving{background-color:transparent;color:#9fbed3}.line-reader-inner-drag .icon{text-shadow:none !important;border-bottom-left-radius:110px;border-bottom-right-radius:110px;border:1px solid #0E5D91;border-top:0;width:50px;height:25px;position:relative;bottom:10px}.line-reader-inner-drag .icon:before{position:relative;top:5px;left:1px}.line-reader-closer{font-size:22px;font-size:2.2rem;cursor:pointer;color:#0E5D91;width:12px;height:12px}.line-reader-closer:hover{color:#0a4166}.line-reader-closer .icon{text-shadow:none !important}.magnifier-container.magnifier-container{background-color:transparent}.magnifier-container.magnifier-container .dynamic-component-title-bar{border-top-left-radius:5px;border-top-right-radius:5px;background-color:transparent;border:none;position:absolute;width:100%;z-index:3}.magnifier-container.magnifier-container .dynamic-component-title-bar.moving{background:#f3f1ef;border-bottom:1px solid #8d949e}.magnifier-container.magnifier-container .dynamic-component-title-bar .closer{display:none}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper{bottom:0}.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper:hover,.magnifier-container.magnifier-container .dynamic-component-resize-container .dynamic-component-resize-wrapper.resizing{bottom:20px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier{position:absolute;width:100%;height:100%;overflow:hidden;background-color:#fff;opacity:1;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;box-sizing:content-box;padding-bottom:30px}@-o-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-moz-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-webkit-keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes fadeIn{0%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@-o-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-moz-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-webkit-keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@keyframes fadeOut{0%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}@-o-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-moz-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@-webkit-keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}@keyframes pop{0%{opacity:0;visibility:visible}50%{opacity:.5;visibility:visible;transform:scale(2)}100%{opacity:0;visibility:hidden;transform:scale(3)}}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level{position:absolute;overflow:hidden;z-index:1;top:0;left:0;bottom:0;right:0;background:transparent;color:#3e7da7;opacity:1;font-size:50px;font-size:5rem;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-animation:pop 400ms forwards;-moz-animation:pop 400ms forwards;-ms-animation:pop 400ms forwards;-o-animation:pop 400ms forwards;animation:pop 400ms forwards}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .level:before{content:\\\"x\\\"}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .overlay{position:absolute;overflow:hidden;z-index:2;top:0;left:0;bottom:0;right:0;background:transparent}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls{position:absolute;background-color:#f3f1ef;border:0 solid #8d949e;min-height:29px;z-index:4}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a{color:#222;text-decoration:none;font-size:20px;font-size:2rem;margin:0 2px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls a:hover{color:#0a4166}.magnifier-container.magnifier-container .dynamic-component-content .magnifier>.controls.close{top:0;right:0;border-bottom-width:1px;border-left-width:1px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.magnifier-container.magnifier-container .dynamic-component-content .magnifier .inner{position:absolute}.magnifier-container.magnifier-container .dynamic-component-content.moving .magnifier .controls{border-left:none;border-bottom-left-radius:0}.magnifier-container.magnifier-container .dynamic-component-content.sizing{border-color:rgba(14,93,145,0.5)}.magnifier-container.magnifier-container .dynamic-component-content.sizing .inner,.magnifier-container.magnifier-container .dynamic-component-content.sizing .controls,.magnifier-container.magnifier-container .dynamic-component-content.sizing .level{opacity:0.45 !important}.progress-box .progressbar .progressbar-points{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.progress-box .progressbar .progressbar-points>span.progressbar-point{flex:1;display:inline-block;border:1px solid #0e5d91;background-color:#f3f1ef;height:calc(1rem - 4px);margin:0 1px 0 0}.progress-box .progressbar .progressbar-points>span.progressbar-point:last-child{margin-right:0}.progress-box .progressbar .progressbar-points>span.progressbar-point.reached{background-color:#0e5d91}.progress-box .progressbar .progressbar-points>span.progressbar-point.current{background-color:#a4a9b1}.tts-container .tts-controls{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;background-color:#f3f1ef;-webkit-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);-o-box-shadow:0 2px 3px 1px rgba(0,0,0,0.2);box-shadow:0 2px 3px 1px rgba(0,0,0,0.2)}.tts-container .tts-controls .tts-control{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;color:#222;height:100%;padding:6px 8.5px;text-decoration:none}.tts-container .tts-controls .tts-control .tts-control-label{padding-left:7.5px}.tts-container .tts-controls .tts-control .tts-icon{font-size:18px;text-align:center;width:18px}.tts-container .tts-controls .tts-control .icon-pause{display:none}.tts-container .tts-controls .tts-control.tts-control-drag{cursor:move}.tts-container .tts-controls .tts-control.tts-control-drag .tts-icon{color:#555}.tts-container .tts-controls .tts-control.tts-control-drag:hover{background-color:transparent}.tts-container .tts-controls .tts-control:hover{background-color:#ddd8d2}.tts-container .tts-controls .tts-control-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch}.tts-container .tts-controls .tts-control-container .tts-slider-container{display:none}.tts-container .tts-controls .tts-control-container .tts-slider-container .tts-slider{margin:0 8.5px;width:80px}.tts-container.playing .tts-controls .tts-control .icon-pause{display:block}.tts-container.playing .tts-controls .tts-control .icon-play{display:none}.tts-container.sfhMode .tts-controls .tts-control.tts-control-mode{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-slider-container{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}.tts-container.settings .tts-controls .tts-control-container:last-child{-webkit-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-moz-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-ms-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);-o-box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);box-shadow:inset 2px 2px 4px rgba(0,0,0,0.2);background-color:#ddd8d2}.tts-container.settings .tts-controls .tts-control-container .tts-control-settings:hover{background-color:transparent}.tts-content-node{outline:none}.tts-visible.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-visible.tts-component-container .test-runner-sections .tts-content-node:focus{background-color:transparent !important;color:#222 !important}.tts-visible.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-visible.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:default !important}.tts-sfhMode.tts-component-container .test-runner-sections{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover{color:#222 !important;background-color:#ff0 !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node:focus{color:#222 !important;background-color:#f3f1ef !important}.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .label-box,.tts-sfhMode.tts-component-container .test-runner-sections .tts-content-node .qti-choice{cursor:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxNHB4IiBoZWlnaHQ9IjE0cHgiIHZpZXdCb3g9IjAgMCAxNCAxNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5Hcm91cCAyPC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPiAgICAgICAgPGcgaWQ9IkFydGJvYXJkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMTYuMDAwMDAwKSI+ICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzLjAwMDAwMCwgMTUuMDAwMDAwKSI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weS02IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPGcgaWQ9Imljb24tLy0xNi0vLWNoZXZyb24tYm90dG9tLWNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGw9IiMyRDJEMkQiPiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9InN3YXAtaWNvbi1jb2xvciIgcG9pbnRzPSIwIDAgMCA4IDYgNCI+PC9wb2x5Z29uPiAgICAgICAgICAgICAgICA8L2c+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtQ29weSIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iNSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktNCIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iMSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMiIgZmlsbD0iIzJEMkQyRCIgeD0iOSIgeT0iOSIgd2lkdGg9IjYiIGhlaWdodD0iMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLUNvcHktMyIgZmlsbD0iIzJEMkQyRCIgeD0iMSIgeT0iMTMiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+) 0 32,auto !important}.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:hover,.tts-sfhMode.tts-component-container .test-runner-sections img.tts-content-node:focus{padding:5px}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node:hover,.tts-playing.tts-component-container .test-runner-sections .tts-content-node.tts-active-content-node *:hover{color:#222 !important;background-color:#ff0 !important}.tts-playing.tts-component-container .test-runner-sections img.tts-content-node.tts-active-content-node{padding:5px}body.delivery-scope{min-height:100vh;max-height:100vh;margin-bottom:0}.runner{position:relative}.qti-choiceInteraction .overlay-answer-eliminator{display:none}.test-runner-scope{position:relative;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 99px)}.test-runner-scope .landmark-title-hidden{width:1px;height:1px;overflow:hidden;position:absolute}.test-runner-scope .test-runner-sections{-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.test-runner-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;overflow-y:auto;max-width:350px}.test-runner-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.test-runner-scope .test-sidebar{max-width:200px}.test-runner-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.test-runner-scope .test-sidebar{max-width:250px}.test-runner-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.test-runner-scope .test-sidebar{max-width:300px}.test-runner-scope .test-sidebar>.qti-panel{max-width:300px}}.test-runner-scope .test-sidebar-left{border-right:1px #ddd solid}.test-runner-scope .test-sidebar-right{border-left:1px #ddd solid}.test-runner-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.test-runner-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.test-runner-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.test-runner-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.test-runner-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.test-runner-scope .qti-item{padding:30px}.test-runner-scope .size-wrapper{max-width:1280px;margin:auto;width:100%}.test-runner-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.test-runner-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.test-runner-scope #qti-rubrics .hidden{display:none}.test-runner-scope .visible-hidden{position:absolute;overflow:hidden;height:1px;width:1px;word-wrap:normal}.no-controls .test-runner-scope{height:100vh}.test-runner-scope .action-bar.content-action-bar{padding:2px}.test-runner-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.test-runner-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:36px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a{float:left;margin:0 2px;padding:0 15px;border:1px solid rgba(255,255,255,0.3);border-radius:0px;display:inline-block;height:inherit}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px;margin-left:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px;margin-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar li.btn-info:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active,.test-runner-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.test-runner-scope .action-bar.content-action-bar li.btn-info:active a,.test-runner-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.test-runner-scope .action-bar.content-action-bar li.btn-info:active:hover,.test-runner-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px;flex-basis:40px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:38px;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:space-between;-ms-flex-pack:space-between;justify-content:space-between;padding-left:10px;padding-right:10px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .title-box{font-size:14px;font-size:1.4rem;padding:4px 0 0;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box{padding-top:4px;white-space:nowrap;-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progress-box .qti-controls,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .item-number-box .qti-controls{display:inline-block;margin-left:20px;white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .timer-box{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box .progressbar{margin-top:5px;min-width:150px;max-width:200px;height:0.6em}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu{color:#222;background:#f3f1ef;border:1px solid #aaa9a7;overflow:auto;list-style:none;min-width:150px;margin:0;padding:0;position:absolute;bottom:36px;left:-3px}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action{display:inline-block;text-align:left;width:100%;white-space:nowrap;overflow:hidden;color:#222;border-bottom:1px solid #c2c1bf;margin:0;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px;height:auto;padding:8px 15px 9px;line-height:1;border-left:solid 3px transparent}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:focus .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon{font-size:14px;font-size:1.4rem;text-shadow:none;color:#222}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}.test-runner-scope [data-control=\\\"exit\\\"]{margin-left:20px}.test-runner-scope [data-control=\\\"comment-toggle\\\"]{display:none}.test-runner-scope.non-lti-context .title-box{display:none}.test-runner-scope [data-control=\\\"qti-comment\\\"]{background-color:#f3f1ef;position:absolute;bottom:33px;left:8px;text-align:right;padding:5px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-moz-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-ms-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);-o-box-shadow:0 0 15px 1px rgba(0,0,0,0.2);box-shadow:0 0 15px 1px rgba(0,0,0,0.2)}.test-runner-scope [data-control=\\\"qti-comment\\\"] textarea{display:block;height:100px;resize:none;width:350px;padding:3px;margin:0 0 10px 0;border:none;font-size:13px;font-size:1.3rem;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.test-runner-scope .tools-box{position:relative;overflow:visible}.wait-content .wait-content_text--centered{text-align:center}.wait-content .wait-content_actions-list{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.wait-content .wait-content_actions-list .wait-content_text--centered{position:relative;right:15px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box>.lft{float:right;margin:2px 10px 0 0}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .rgt{float:left}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action>.li-inner>.icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action>.li-inner>.icon{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action{text-align:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action.active .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action.active .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active) .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active) .icon.icon-checkbox{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox{display:none}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .action:not(.active):hover .icon.icon-checkbox-checked{display:inline-block}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list>.action .menu,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list>.action .menu{left:auto;right:-3px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action{float:right}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon{padding:0 0 0 9px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .icon.icon-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-right:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-left:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-forward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-fast-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-step-backward:before,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .icon.icon-backward:before{display:inline-block;transform:scaleX(-1)}body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .tools-box-list .action .action,body.delivery-scope[dir=rtl] .runner .test-runner-scope .bottom-action-bar .control-box .navi-box-list .action .action{text-align:right}body.delivery-scope[dir=rtl] .qti-navigator .icon-up,body.delivery-scope[dir=rtl] .qti-navigator .icon-down{margin-left:0;margin-right:auto}body.delivery-scope[dir=rtl] .qti-navigator .qti-navigator-counter{margin-left:0;margin-right:auto;text-align:left}body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small,body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small{padding:8px 45px 8px 20px;text-align:right}body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small>[class^=\\\"icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class^=\\\"feedback-\\\"].small>[class*=\\\" icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class^=\\\"icon-\\\"],body.delivery-scope[dir=rtl] .qti-item [class*=\\\" feedback-\\\"].small>[class*=\\\" icon-\\\"]{left:auto;right:10px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box{margin-left:0px;margin-right:40px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.connectivity-box.with-message .message-connect{margin-left:3px;margin-right:0px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.progress-box>.qti-controls{margin-left:0px;margin-right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-toggler{right:20px}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:first-child::before{content:\\' \\'}body.delivery-scope[dir=rtl] .runner .test-runner-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar .control-box>.timer-box .timer-wrapper .countdown:last-child::before{content:none}.action-bar .shortcuts-list-wrapper{width:100%;height:100%;position:fixed;top:0;left:0;display:flex;align-items:center;align-content:center;justify-content:center;overflow:auto;background:rgba(0,0,0,0.5);z-index:10001}.action-bar .shortcuts-list-wrapper .shortcuts-list{width:auto;min-width:400px;height:auto;min-height:300px;padding:30px !important;color:#222 !important;text-shadow:none !important;position:relative;background-color:#fff;border:1px solid #ddd}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-description{width:450px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-list-title{font-size:24px;margin-top:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title{font-size:18px;margin-top:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-title:focus{outline:3px solid #276D9B;outline-offset:3px}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list{list-style:none;margin:0;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item{display:-ms-flexbox;display:-webkit-flex;display:flex;float:none;margin:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action,.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-shortcut{-ms-flex:0 1 50%;-webkit-flex:0 1 50%;flex:0 1 50%;margin:0;text-align:center}.action-bar .shortcuts-list-wrapper .shortcuts-list .shortcuts-group-list .shortcut-item .shortcut-item-action{text-align:left}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close{background-color:transparent;box-shadow:none;height:20px;padding:0;position:absolute;right:12px;top:10px;width:20px}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close .icon-close{color:#222;font-size:20px;padding:0}.action-bar .shortcuts-list-wrapper .shortcuts-list .btn-close:focus{outline:3px solid #276D9B;outline-offset:3px}.jump-links-container .jump-links-box{display:block;width:0;height:0;position:absolute}.jump-links-container .jump-links-box .jump-link-item{position:fixed;display:block;z-index:1001}.jump-links-container .jump-links-box .jump-link{z-index:1002;position:fixed;display:block;overflow:hidden;top:10px;left:10px;width:0;padding:0 !important;font-size:2.4rem !important}.jump-links-container .jump-links-box .jump-link:focus{width:auto;height:auto;padding:30px !important;background:#f3f1ef;color:#222 !important;border:3px solid #222;outline:none;text-shadow:none !important}.jump-links-container .jump-links-box .jump-link:focus:hover{background:#f3f1ef;text-decoration:underline}\\n\\n/*# sourceMappingURL=../../../taoQtiTest/views/css/new-test-runner.css.map */');\n","\ndefine(\"taoQtiTest/loader/taoQtiTest.bundle\", function(){});\n","define(\"taoQtiTest/loader/taoQtiTest.min\", [\"taoItems/loader/taoItems.min\",\"taoQtiItem/loader/taoQtiItem.min\",\"taoTests/loader/taoTests.min\"], function(){});\n"]} |