diff --git a/controller/Previewer.php b/controller/Previewer.php index 5bbbadab..08efd5ba 100644 --- a/controller/Previewer.php +++ b/controller/Previewer.php @@ -15,127 +15,73 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * Copyright (c) 2018-2019 (original work) Open Assessment Technologies SA ; + * Copyright (c) 2018-2020 (original work) Open Assessment Technologies SA ; */ +declare(strict_types=1); + namespace oat\taoQtiTestPreviewer\controller; +use Exception; use common_exception_Error; use oat\tao\helpers\Base64; +use tao_helpers_Http as HttpHelper; +use oat\taoItems\model\pack\Packer; use common_Exception as CommonException; -use common_exception_BadRequest as BadRequestException; -use common_exception_MissingParameter as MissingParameterException; -use common_exception_NoImplementation as NoImplementationException; -use common_exception_NotImplemented as NotImplementedException; -use common_exception_Unauthorized as UnauthorizedException; -use common_exception_UserReadableException as UserReadableException; -use Exception; +use taoItems_models_classes_ItemsService; use oat\generis\model\OntologyAwareTrait; -use oat\tao\model\media\sourceStrategy\HttpSource; -use oat\tao\model\routing\AnnotationReader\security; +use tao_actions_ServiceModule as ServiceModule; use oat\taoItems\model\media\ItemMediaResolver; use oat\taoQtiTestPreviewer\models\ItemPreviewer; +use oat\tao\model\media\sourceStrategy\HttpSource; +use oat\tao\model\routing\AnnotationReader\security; +use common_exception_BadRequest as BadRequestException; +use taoQtiTest_helpers_TestRunnerUtils as TestRunnerUtils; use oat\taoQtiTestPreviewer\models\PreviewLanguageService; -use tao_actions_ServiceModule as ServiceModule; -use tao_helpers_Http as HttpHelper; +use common_exception_Unauthorized as UnauthorizedException; +use common_exception_NotImplemented as NotImplementedException; +use common_exception_MissingParameter as MissingParameterException; +use common_exception_NoImplementation as NoImplementationException; +use common_exception_UserReadableException as UserReadableException; use tao_models_classes_FileNotFoundException as FileNotFoundException; -use taoItems_models_classes_ItemsService; -use taoQtiTest_helpers_TestRunnerUtils as TestRunnerUtils; -use oat\taoItems\model\pack\Packer; /** - * Class taoQtiTest_actions_Runner + * Class Previewer * - * Serves QTI implementation of the test runner + * @package oat\taoQtiTestPreviewer\controller */ class Previewer extends ServiceModule { use OntologyAwareTrait; /** - * taoQtiTest_actions_Runner constructor. + * Previewer constructor. + * * @security("hide") */ public function __construct() { + parent::__construct(); + // Prevent anything to be cached by the client. TestRunnerUtils::noHttpClientCache(); } - /** - * Gets an error response array - * @param Exception $e - * @return array - */ - protected function getErrorResponse($e) - { - $response = [ - 'success' => false, - 'type' => 'error', - ]; - - if ($e instanceof FileNotFoundException) { - $response['type'] = 'FileNotFound'; - $response['message'] = __('File not found'); - } elseif ($e instanceof UnauthorizedException) { - $response['code'] = 403; - $response['message'] = $e->getUserMessage(); - } elseif ($e instanceof UserReadableException) { - $response['message'] = $e->getUserMessage(); - } elseif ($e instanceof Exception) { - $response['type'] = 'exception'; - $response['code'] = $e->getCode(); - $response['message'] = $e->getMessage(); - } else { - $response['message'] = __('An error occurred!'); - } - - return $response; - } - - /** - * Gets an HTTP response code - * @param Exception $e - * @return int - */ - protected function getErrorCode($e) - { - switch (true) { - case $e instanceof NotImplementedException: - case $e instanceof NoImplementationException: - case $e instanceof UnauthorizedException: - $code = 403; - break; - - case $e instanceof FileNotFoundException: - $code = 404; - break; - - default: - $code = 500; - break; - } - - return $code; - } - /** * Initializes the delivery session */ - public function init() + public function init(): void { $code = 200; try { - $this->validateCsrf(); - $requestParams = $this->getPsrRequest()->getQueryParams(); $serviceCallId = $requestParams['serviceCallId']; $response = [ 'success' => $serviceCallId === 'previewer', 'itemIdentifier' => null, - 'itemData' => null + 'itemData' => null, ]; } catch (Exception $e) { $response = $this->getErrorResponse($e); @@ -149,16 +95,12 @@ public function init() * Provides the definition data and the state for a particular item * * @param taoItems_models_classes_ItemsService $itemsService - * - * @return void */ - public function getItem(taoItems_models_classes_ItemsService $itemsService) + public function getItem(taoItems_models_classes_ItemsService $itemsService): void { $code = 200; try { - $this->validateCsrf(); - $requestParams = $this->getPsrRequest()->getQueryParams(); $itemUri = $requestParams['itemUri'] ?? ''; @@ -202,7 +144,8 @@ public function getItem(taoItems_models_classes_ItemsService $itemsService) $lang = $this->getSession()->getDataLanguage(); if (!$itemsService->hasItemContent($item, $lang)) { - return $this->returnJson($response, $code); + $this->returnJson($response, $code); + return; } $packer = new Packer($item, $lang); @@ -210,7 +153,10 @@ public function getItem(taoItems_models_classes_ItemsService $itemsService) $itemPack = $packer->pack(); $response['content'] = $itemPack->JsonSerialize(); - $response['baseUrl'] = _url('asset', null, null, ['uri' => $itemUri, 'path' => '']); + $response['baseUrl'] = _url('asset', null, null, [ + 'uri' => $itemUri, + 'path' => '', + ]); } else { throw new BadRequestException('Either itemUri or resultId needs to be provided.'); } @@ -231,17 +177,15 @@ public function getItem(taoItems_models_classes_ItemsService $itemsService) * @throws FileNotFoundException * @throws common_exception_Error */ - public function asset() + public function asset(): void { $requestParams = $this->getPsrRequest()->getQueryParams(); - $itemUri = $requestParams['uri']; - $path = $requestParams['path']; - $item = $this->getResource($itemUri); + $item = $this->getResource($requestParams['uri']); $lang = $this->getSession()->getDataLanguage(); $resolver = new ItemMediaResolver($item, $lang); - $asset = $resolver->resolve($path); + $asset = $resolver->resolve($requestParams['path']); $mediaSource = $asset->getMediaSource(); $mediaIdentifier = $asset->getMediaIdentifier(); @@ -251,18 +195,18 @@ public function asset() $info = $mediaSource->getFileInfo($mediaIdentifier); $stream = $mediaSource->getFileStream($mediaIdentifier); + HttpHelper::returnStream($stream, $info['mime']); } /** * Stores the state object and the response set of a particular item */ - public function submitItem() + public function submitItem(): void { $code = 200; try { - $this->validateCsrf(); $requestParams = $this->getPsrRequest()->getQueryParams(); $itemUri = $requestParams['itemUri']; $jsonPayload = $this->getPayload(); @@ -275,23 +219,87 @@ public function submitItem() $this->returnJson($response, $code); } + /** + * Gets an error response array + * + * @param Exception $e + * + * @return array + */ + protected function getErrorResponse(Exception $e): array + { + $response = [ + 'success' => false, + 'type' => 'error', + ]; + + if ($e instanceof FileNotFoundException) { + $response['type'] = 'FileNotFound'; + $response['message'] = __('File not found'); + } elseif ($e instanceof UnauthorizedException) { + $response['code'] = 403; + $response['message'] = $e->getUserMessage(); + } elseif ($e instanceof UserReadableException) { + $response['message'] = $e->getUserMessage(); + } elseif ($e instanceof Exception) { + $response['type'] = 'exception'; + $response['code'] = $e->getCode(); + $response['message'] = $e->getMessage(); + } else { + $response['message'] = __('An error occurred!'); + } + + return $response; + } + + /** + * Gets an HTTP response code + * + * @param Exception $e + * + * @return int + */ + protected function getErrorCode(Exception $e): int + { + switch (true) { + case $e instanceof NotImplementedException: + case $e instanceof NoImplementationException: + case $e instanceof UnauthorizedException: + $code = 403; + break; + + case $e instanceof FileNotFoundException: + $code = 404; + break; + + default: + $code = 500; + break; + } + + return $code; + } + /** * @return ItemPreviewer */ - private function getItemPreviewer() + private function getItemPreviewer(): ItemPreviewer { - return $this->getServiceLocator()->get(ItemPreviewer::class); + /** @var ItemPreviewer $itemPreviewer */ + $itemPreviewer = $this->getServiceLocator()->get(ItemPreviewer::class); + + return $itemPreviewer; } /** * Gets payload from the request + * * @return array|mixed|object|null */ private function getPayload() { $jsonPayload = $this->getPsrRequest()->getParsedBody(); - $jsonPayload = json_decode($jsonPayload['itemResponse'], true); - return $jsonPayload; + return json_decode($jsonPayload['itemResponse'], true); } } diff --git a/manifest.php b/manifest.php index 5ad766e6..e6f238cd 100755 --- a/manifest.php +++ b/manifest.php @@ -27,7 +27,7 @@ 'label' => 'extension-tao-testqti-previewer', 'description' => 'extension that provides QTI test previewer', 'license' => 'GPL-2.0', - 'version' => '2.17.0', + 'version' => '2.18.0', 'author' => 'Open Assessment Technologies SA', 'requires' => [ 'generis' => '>=12.15.0', diff --git a/views/js/loader/qtiPreviewer.min.js b/views/js/loader/qtiPreviewer.min.js index 8faefe3c..de598cef 100644 --- a/views/js/loader/qtiPreviewer.min.js +++ b/views/js/loader/qtiPreviewer.min.js @@ -1,2 +1,2 @@ -function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(iter))return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
"})}),define("taoQtiTestPreviewer/previewer/runner",["taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/runner"],function(runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
\n
    \n
    "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
  • ",(helper=helpers.time)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.time,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.type)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.type,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
  • ",buffer})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit",["jquery","lodash","i18n","moment","ui/hider","ui/autoscroll","util/strPad","taoTests/runner/plugin","taoQtiItem/qtiCommonRenderer/helpers/PciResponse","tpl!taoQtiTest/runner/plugins/templates/button","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer"],function($,_,__,moment,hider,autoscroll,strPad,pluginFactory,pciResponse,buttonTpl,consoleTpl,consoleLineTpl,consoleCloserTpl){'use strict';var defaults={submitTitle:__("Submit and show the result"),submitText:__("Submit"),submitIcon:"forward"};return pluginFactory({name:"submit",init:function init(){var _this2=this,testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaults),isPluginAllowed=function(){var config=testRunner.getConfig();return!config.options.readOnly},showConsole=function(){hider.show(_this2.controls.$console),hider.show(_this2.controls.$consoleBody),hider.show(_this2.controls.$consoleCloser),autoscroll(_this2.controls.$consoleBody.children().last(),_this2.controls.$consoleBody)},hideConsole=function(){hider.hide(_this2.controls.$console),hider.hide(_this2.controls.$consoleCloser)},addConsoleLine=function(type,message){var data={time:strPad(moment().format("HH:mm:ss"),12," "),type:strPad(type||"",18," "),message:strPad(message||"",18," ")};_this2.controls.$consoleBody.append($(consoleLineTpl(data)))},showResponses=function(type,responses){_.forEach(responses,function(response,identifier){addConsoleLine(type,strPad("".concat(identifier,": "),15," ")+_.escape(pciResponse.prettyPrint(response)))})};this.controls={$button:$(buttonTpl({control:"submit",title:pluginConfig.submitTitle,icon:pluginConfig.submitIcon,text:pluginConfig.submitText})),$console:$(consoleTpl()),$consoleCloser:$(consoleCloserTpl())},this.controls.$consoleBody=this.controls.$console.find(".preview-console-body"),this.controls.$button.on("click",function(e){e.preventDefault(),!1!==_this2.getState("enabled")&&(_this2.disable(),testRunner.trigger("submititem"))}),this.controls.$consoleCloser.on("click",function(e){e.preventDefault(),hideConsole()}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?_this2.show():_this2.hide()}).on("submitresponse",function(responses){showResponses(__("Submitted data"),responses),showConsole()}).on("scoreitem",function(responses){responses.itemSession&&(showResponses(__("Output data"),responses.itemSession),showConsole())}).on("enablenav",function(){_this2.enable()}).on("disablenav",function(){_this2.disable()})},render:function render(){var $container=this.getAreaBroker().getContainer(),$navigation=this.getAreaBroker().getNavigationArea();$navigation.append(this.controls.$button),$navigation.append(this.controls.$consoleCloser),$container.append(this.controls.$console)},destroy:function destroy(){_.forEach(this.controls,function($el){return $el.remove()}),this.controls=null},enable:function enable(){this.controls.$button.prop("disabled",!1).removeClass("disabled")},disable:function disable(){this.controls.$button.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.controls.$button)},hide:function hide(){_.forEach(this.controls,hider.hide)}})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    ",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer",["jquery","lodash","i18n","ui/component","ui/transformer","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css"],function($,_,__,componentFactory,transformer,devicesPreviewerTpl){'use strict';var defaults={deviceType:"standard",deviceWith:0,deviceHeight:0,deviceOrientation:null};return function(container,config){var controls=null,resetScale=function(){controls&&(controls.$previewContent.removeAttr("style"),controls.$previewContainer.removeAttr("style"))},devicesPreviewer=componentFactory({getDeviceWidth:function(){return this.getConfig().deviceWidth},setDeviceWidth:function(width){var componentConfig=this.getConfig();return componentConfig.deviceWidth=parseInt(width,10)||0,this.trigger("devicewidthchange",componentConfig.deviceWidth),this},getDeviceHeight:function(){return this.getConfig().deviceHeight},setDeviceHeight:function(height){var componentConfig=this.getConfig();return componentConfig.deviceHeight=parseInt(height,10)||0,this.trigger("deviceheightchange",componentConfig.deviceHeight),this},getDeviceOrientation:function(){return this.getConfig().deviceOrientation},setDeviceOrientation:function(orientation){var componentConfig=this.getConfig();return componentConfig.deviceOrientation=orientation,this.is("rendered")&&this.getElement().attr("data-orientation",componentConfig.deviceOrientation),this.trigger("deviceorientationchange",componentConfig.deviceOrientation),this},isDeviceMode:function(){return"standard"!==this.getDeviceType()},getDeviceType:function(){return this.getConfig().deviceType},setDeviceType:function(type){var componentConfig=this.getConfig();return componentConfig.deviceType=type,this.is("rendered")&&this.getElement().attr("data-type",componentConfig.deviceType),this.trigger("devicetypechange",componentConfig.deviceType),this},previewDevice:function(){var width,height;return this.is("rendered")&&(this.is("disabled")||"standard"===this.getDeviceType()?this.clearScale():("portrait"===this.getDeviceOrientation()?(width=this.getDeviceHeight(),height=this.getDeviceWidth()):(width=this.getDeviceWidth(),height=this.getDeviceHeight()),this.applyScale(width,height)),this.trigger("devicepreview")),this},clearScale:function(){return this.is("rendered")&&(resetScale(),this.trigger("scaleclear")),this},applyScale:function(width,height){var frameSize,frameMargins,scaleFactor;return this.is("rendered")&&(resetScale(),frameSize=this.getFrameSize(),frameMargins=this.getFrameMargins(),scaleFactor=this.getScaleFactor(width,height),controls.$previewContent.width(width).height(height),controls.$previewContainer.css("left",(frameSize.width-(width+frameMargins.width)*scaleFactor)/2).width(width+frameMargins.width).height(height+frameMargins.height),transformer.setTransformOrigin(controls.$previewContainer,0,0),transformer.scale(controls.$previewContainer,scaleFactor),this.trigger("scalechange")),this},getFrameMargins:function(){var margins={width:0,height:0};return this.is("rendered")&&(margins.width=controls.$previewContainer.outerWidth()-controls.$previewContent.width(),margins.height=controls.$previewContainer.outerHeight()-controls.$previewContent.height()),margins},getFrameSize:function(){var size={width:0,height:0};return this.is("rendered")&&(size.width=this.getContainer().innerWidth(),size.height=this.getContainer().innerHeight()),size},getScaleFactor:function(width,height){var margins,frameSize,_Mathmin=Math.min,scaleFactor={x:1,y:1};return this.is("rendered")&&this.isDeviceMode()&&(frameSize=this.getFrameSize(),margins=this.getFrameMargins(),width+=margins.width,height+=margins.height,width>frameSize.width&&(scaleFactor.x=frameSize.width/width),height>frameSize.height&&(scaleFactor.y=frameSize.height/height)),_Mathmin(scaleFactor.x,scaleFactor.y)},wrap:function(element){return this.is("rendered")&&(this.unwrap(),controls.$wrappedElement=$(element),controls.$wrappedElementContainer=controls.$wrappedElement.parent(),controls.$previewContent.append(controls.$wrappedElement),this.trigger("wrap",controls.$wrappedElement)),this},unwrap:function(){var $wasWrappedElement;return this.is("rendered")&&controls.$wrappedElement&&($wasWrappedElement=controls.$wrappedElement,controls.$wrappedElementContainer.append(controls.$wrappedElement),controls.$wrappedElement=null,controls.$wrappedElementContainer=null,this.trigger("unwrap",$wasWrappedElement)),this}},defaults).setTemplate(devicesPreviewerTpl).on("init",function(){var componentConfig=this.getConfig();this.setDeviceType(componentConfig.deviceType),this.setDeviceWidth(componentConfig.deviceWidth),this.setDeviceHeight(componentConfig.deviceHeight),this.setDeviceOrientation(componentConfig.deviceOrientation),_.defer(function(){devicesPreviewer.render(container)})}).on("render",function(){var $element=this.getElement();controls={$previewContainer:$element.find(".preview-container"),$previewFrame:$element.find(".preview-frame"),$previewContent:$element.find(".preview-content"),$wrappedElement:null,$wrappedElementContainer:null},this.trigger("ready")}).on("disable enable",function(){var self=this;this.is("rendered")&&_.defer(function(){self.previewDevice()})}).on("destroy",function(){this.unwrap(),controls=null});return _.defer(function(){devicesPreviewer.init(config)}),devicesPreviewer}}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
    \n
    \n
    \n
    \n
    \n
    "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n \n ",buffer}function program2(){return"selected=\"selected\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression,self=this;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector",["jquery","lodash","i18n","ui/component","ui/selecter","taoQtiTestPreviewer/previewer/helpers/devices","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css"],function($,_,__,componentFactory,lookupSelecter,devicesHelper,devicesSelectorTpl,selectorTpl){'use strict';function getSelectorData(selected,list){return selected&&_.size(list)?_.find(list,{value:selected})||null:null}function getValidIdentifier(identifier,list){return list&&list.length?_.find(list,{value:identifier})?identifier:_.first(list).value:null}function updateSelect2($selector,value){var current=$selector.val();return current!==value&&($selector.val(value),$selector.trigger("change")),$selector}function removeSelect2($selector){return $selector.hasClass("select2-offscreen")&&$selector.select2("destroy"),$selector}var defaults={type:"standard",device:null,orientation:"landscape"},deviceTypesList=[{value:"standard",label:__("Actual size"),devicesList:!1,orientation:!1},{value:"desktop",label:__("Desktop preview"),devicesList:!0,orientation:!1},{value:"mobile",label:__("Mobile preview"),devicesList:!0,orientation:!0}],deviceOrientationsList=[{value:"landscape",label:__("Landscape")},{value:"portrait",label:__("Portrait")}],callbackMap={type:"setType",device:"setDevice",mobile:"setDevice",desktop:"setDevice",orientation:"setOrientation"};return function(container,config){var selected={type:null,device:null,orientation:null,desktop:null,mobile:null},devicesList=[],typeData=null,controls=null,setControlsProp=function(property,value){_.forEach(controls,function($selector){$selector.prop(property,value)})},devicesSelector=componentFactory({isDeviceMode:function(){return"standard"!==selected.type},updateMode:function(){return this.is("rendered")&&this.getElement().attr("data-type",selected.type),this},getType:function(){return selected.type},getOrientation:function(){return typeData&&typeData.orientation?selected.orientation:null},getDevice:function(){return typeData&&typeData.devicesList?selected.device:null},getDeviceData:function(){return getSelectorData(this.getDevice(),devicesList)},setType:function(identifier){return identifier=getValidIdentifier(identifier,deviceTypesList),identifier!==selected.type&&(selected.type=identifier,selected.device=null,devicesList=devicesHelper.getDevicesByType(selected.type),typeData=getSelectorData(selected.type,deviceTypesList),this.is("rendered")&&(updateSelect2(controls.$typeSelector,selected.type),this.updateMode()),this.trigger("typechange",selected.type),typeData.devicesList&&this.setDevice(selected[selected.type])),this},setOrientation:function(identifier){return identifier=getValidIdentifier(identifier,deviceOrientationsList),identifier!==selected.orientation&&(selected.orientation=identifier,this.is("rendered")&&updateSelect2(controls.$orientationSelector,selected.orientation),this.trigger("orientationchange",selected.orientation)),this},setDevice:function(identifier){var $selector;return identifier=getValidIdentifier(identifier,devicesList),identifier!==selected.device&&(selected.device=identifier,selected[selected.type]=identifier,this.is("rendered")&&this.isDeviceMode()&&($selector=controls["$"+selected.type+"Selector"],$selector&&updateSelect2($selector,selected.device)),this.trigger("devicechange",selected.device,this.getDeviceData())),this},select:function(name,value){var setterName=callbackMap[name];return setterName&&_.isFunction(this[setterName])&&this[setterName](value),this},reset:function(){var componentConfig=this.getConfig();return this.setType(componentConfig.type),this.setDevice(componentConfig.device),this.setOrientation(componentConfig.orientation),this}},defaults).setTemplate(devicesSelectorTpl).on("init",function(){this.reset(),_.defer(function(){devicesSelector.render(container)})}).on("render",function(){function renderSelector(name,list,selectedValue,category){var $selector=$(selectorTpl({name:name,category:category||name,items:_.map(list,function(item){return{value:item.value,label:item.label,selected:selectedValue===item.value}})}));return self.getElement().find("."+name+"-selector").html($selector),$selector}var self=this;controls={$typeSelector:renderSelector("type",deviceTypesList,selected.type),$desktopSelector:renderSelector("desktop",devicesHelper.getDesktopDevices(),selected.device,"device"),$mobileSelector:renderSelector("mobile",devicesHelper.getMobileDevices(),selected.device,"device"),$orientationSelector:renderSelector("orientation",deviceOrientationsList,selected.orientation)},lookupSelecter(this.getElement()),this.getElement().on("change",".selector",function(e){var $selector=$(e.target).closest("select");self.select($selector.attr("name"),$selector.val())}),this.updateMode(),this.trigger("ready")}).on("disable",function(){this.is("rendered")&&setControlsProp("disabled",!0)}).on("enable",function(){this.is("rendered")&&setControlsProp("disabled",!1)}).on("destroy",function(){_.forEach(controls,removeSelect2),controls=null,selected=null,typeData=null,devicesList=null});return _.defer(function(){devicesSelector.init(config)}),devicesSelector}}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/scale",["jquery","lodash","lib/uuid","util/namespace","taoTests/runner/plugin","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector"],function($,_,uuid,namespaceHelper,pluginFactory,devicesPreviewerFactory,devicesSelectorFactory){'use strict';return pluginFactory({name:"scale",init:function(){function isPluginAllowed(){var config=testRunner.getConfig();return!config.options.readOnly}var self=this,testRunner=this.getTestRunner();this.nsId=this.getName()+uuid(6),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?self.show():self.hide()}).on("resizeitem",function(size,orientation,type){self.devicesPreviewer&&self.devicesPreviewer.setDeviceType(type).setDeviceOrientation(orientation).setDeviceWidth(size&&size.width).setDeviceHeight(size&&size.height).previewDevice()}).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()})},render:function(){function resizeItem(){self.devicesSelector&&self.getState("enabled")&&testRunner.trigger("resizeitem",self.devicesSelector.getDeviceData(),self.devicesSelector.getOrientation(),self.devicesSelector.getType())}var self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker();return $(window).on(namespaceHelper.namespaceAll("resize orientationchange",this.nsId),_.throttle(function(){self.devicesSelector&&self.devicesSelector.isDeviceMode()&&resizeItem()},50)),Promise.all([new Promise(function(resolve){self.devicesSelector=devicesSelectorFactory(areaBroker.getHeaderArea()).on("ready",function(){self.getState("enabled")||this.disable(),this.on("typechange",function(){this.isDeviceMode()||resizeItem()}),this.on("devicechange orientationchange",function(){resizeItem()}),resolve()})}),new Promise(function(resolve){self.devicesPreviewer=devicesPreviewerFactory(areaBroker.getArea("contentWrapper")).on("ready",function(){this.wrap(areaBroker.getContentArea()),resolve()})})])},destroy:function(){this.nsId&&$(window).off("."+this.nsId),this.devicesSelector&&this.devicesSelector.destroy(),this.devicesPreviewer&&this.devicesPreviewer.destroy(),this.devicesSelector=null,this.devicesPreviewer=null},enable:function(){this.devicesSelector&&this.devicesSelector.enable()},disable:function(){this.devicesSelector&&this.devicesSelector.disable()},show:function(){this.devicesSelector&&this.devicesSelector.show()},hide:function(){this.devicesSelector&&this.devicesSelector.hide()}})}),define("tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
    \n
    \n
    \n
    \n
    \n
      \n
      \n
      \n
      \n\n
      \n\n \n\n
      \n
      \n
      \n
      \n\n \n\n
      "})}),define("taoQtiTestPreviewer/previewer/provider/item/item",["jquery","lodash","i18n","ui/feedback","taoTests/runner/areaBroker","taoTests/runner/testStore","taoTests/runner/proxy","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoItems/assets/strategies","taoQtiItem/qtiCommonRenderer/helpers/container","tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item"],function($,_,__,feedback,areaBrokerFactory,testStoreFactory,proxyFactory,toolboxFactory,qtiItemRunner,assetManagerFactory,assetStrategies,containerHelper,layoutTpl){'use strict';function setContext($context){_$previousContext=containerHelper.getContext(),containerHelper.setContext($context)}function restoreContext(){containerHelper.setContext(_$previousContext),_$previousContext=null}var assetManager=assetManagerFactory();assetManager.prependStrategy(assetStrategies.taomedia);var _$previousContext=null;return{name:"qtiItemPreviewer",loadAreaBroker:function loadAreaBroker(){var $layout=$(layoutTpl());return areaBrokerFactory($layout,{contentWrapper:$(".content-wrapper",$layout),content:$("#qti-content",$layout),toolbox:$(".bottom-action-bar .tools-box",$layout),navigation:$(".bottom-action-bar .navi-box-list",$layout),control:$(".top-action-bar .control-box",$layout),actionsBar:$(".bottom-action-bar .control-box",$layout),panel:$(".test-sidebar-left",$layout),header:$(".top-action-bar .tools-box",$layout),context:$(".top-action-bar .navi-box-list",$layout)})},loadProxy:function loadProxy(){var _this$getConfig=this.getConfig(),proxyProvider=_this$getConfig.proxyProvider,serviceCallId=_this$getConfig.serviceCallId,bootstrap=_this$getConfig.bootstrap,timeout=_this$getConfig.timeout;return proxyFactory(proxyProvider||"qtiItemPreviewerProxy",{serviceCallId:serviceCallId,bootstrap:bootstrap,timeout:timeout})},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||"test-".concat(Date.now());return testStoreFactory(identifier)},install:function install(){var plugins=this.getConfig().options.plugins;plugins&&_.forEach(this.getPlugins(),function(plugin){if(_.isPlainObject(plugin)&&_.isFunction(plugin.setConfig)){var config=plugins[plugin.getName()];_.isPlainObject(config)&&plugin.setConfig(config)}})},init:function init(){var _this3=this,dataHolder=this.getDataHolder(),areaBroker=this.getAreaBroker();return areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init(),this.on("submititem",function(){var itemState=_this3.itemRunner.getState(),itemResponses=_this3.itemRunner.getResponses();return _this3.trigger("disabletools disablenav"),_this3.trigger("submitresponse",itemResponses,itemState),_this3.getProxy().submitItem(dataHolder.get("itemIdentifier"),itemState,itemResponses).then(function(response){_this3.trigger("scoreitem",response),_this3.trigger("enabletools enablenav resumeitem")}).catch(function(err){_this3.trigger("enabletools enablenav"),200===err.code&&_this3.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),function(){return _this3.trigger("resumeitem")})})}).on("ready",function(){var itemIdentifier=dataHolder.get("itemIdentifier"),itemData=dataHolder.get("itemData");itemIdentifier&&(itemData?_this3.renderItem(itemIdentifier,itemData):_this3.loadItem(itemIdentifier))}).on("loaditem",function(itemRef,itemData){dataHolder.set("itemIdentifier",itemRef),dataHolder.set("itemData",itemData)}).on("renderitem",function(){_this3.trigger("enabletools enablenav")}).on("resumeitem",function(){_this3.trigger("enableitem enablenav")}).on("disableitem",function(){_this3.trigger("disabletools")}).on("enableitem",function(){_this3.trigger("enabletools")}).on("error",function(){_this3.trigger("disabletools enablenav")}).on("finish leave",function(){_this3.trigger("disablenav disabletools"),_this3.flush()}).on("flush",function(){_this3.destroy()}),this.getProxy().init().then(function(data){dataHolder.set("itemIdentifier",data.itemIdentifier),dataHolder.set("itemData",data.itemData)})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier)},renderItem:function renderItem(itemIdentifier,itemData){var _this4=this,areaBroker=this.getAreaBroker(),options=this.getConfig().options,changeState=function(){_this4.setItemState(itemIdentifier,"changed",!0)};return setContext(areaBroker.getContentArea()),new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),itemData.content=itemData.content||{},_this4.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,Object.assign({assetManager:assetManager},options)).on("error",function(err){_this4.trigger("enablenav"),reject(err),feedback().error(__("It seems that there is an error during item preview loading. Please, try again."))}).on("init",function(){var state=itemData.state,portableElements=itemData.portableElements;this.render(areaBroker.getContentArea(),{state:state,portableElements:portableElements})}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).init()})},unloadItem:function unloadItem(){var _this5=this;return this.trigger("beforeunloaditem disablenav disabletools"),this.itemRunner?new Promise(function(resolve){_this5.itemRunner.on("clear",resolve).clear()}):Promise.resolve()},destroy:function destroy(){var areaBroker=this.getAreaBroker();this.itemRunner&&this.itemRunner.on("clear",restoreContext).clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy()}}}),define("taoQtiTestPreviewer/previewer/proxy/item",["jquery","lodash","i18n","core/promiseQueue","core/request","taoQtiTestPreviewer/previewer/config/item"],function($,_,__,promiseQueue,coreRequest,configFactory){'use strict';return{name:"qtiItemPreviewerProxy",install:function(){var self=this;this.queue=promiseQueue(),this.prepareParams=function(actionParams){var stringifyParams=["itemState","itemResponse"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return _.contains(stringifyParams,key)?JSON.stringify(value):value}):actionParams},this.request=function(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return error.data&&self.isConnectivityError(error.data)&&self.setOffline("request"),Promise.reject(error)})}},init:function(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params)},destroy:function(){return this.configStorage=null,this.queue=null,Promise.resolve()},callTestAction:function(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},callItemAction:function(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},getItem:function(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params)},submitItem:function(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body)}}}),function(c){var d=document,s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}("@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:'';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;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}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-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}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\" \";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\"btn-\"],.section-container .content-block [class*=\" btn-\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-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 - 0px)}.item-previewer-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}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\"Andale Mono WT\",\"Andale Mono\",\"Lucida Console\",\"Lucida Sans Typewriter\",\"DejaVu Sans Mono\",\"Bitstream Vera Sans Mono\",\"Liberation Mono\",\"Nimbus Mono L\",Monaco,\"Courier New\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-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}.item-previewer-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}.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;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:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\"btn-\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-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}.item-previewer-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:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\"desktop\"],.devices-previewer:not(.disabled)[data-type=\"mobile\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame{border-radius:5px;padding:30px}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\"standard\"] .desktop-selector,.devices-selector[data-type=\"standard\"] .mobile-selector,.devices-selector[data-type=\"standard\"] .orientation-selector{display:none}.devices-selector[data-type=\"desktop\"] .mobile-selector,.devices-selector[data-type=\"desktop\"] .orientation-selector{display:none}.devices-selector[data-type=\"mobile\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */"),define("taoQtiTestPreviewer/loader/qtiPreviewer.bundle",function(){}),define("taoQtiTestPreviewer/loader/qtiPreviewer.min",["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min","taoQtiTest/loader/taoQtiTestRunner.min","taoQtiTest/loader/testPlugins.min"],function(){}); +function _typeof(obj){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(iter))return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
      "})}),define("taoQtiTestPreviewer/previewer/runner",["taoTests/runner/runnerComponent","tpl!taoQtiTestPreviewer/previewer/runner"],function(runnerComponentFactory,runnerTpl){'use strict';return function(container){var config=1= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
      \n
        \n
        "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
      • ",(helper=helpers.time)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.time,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.type)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.type,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),buffer+=escapeExpression(stack1)+"",(helper=helpers.message)?stack1=helper.call(depth0,{hash:{},data:data}):(helper=depth0&&depth0.message,stack1="function"===_typeof(helper)?helper.call(depth0,{hash:{},data:data}):helper),(stack1||0===stack1)&&(buffer+=stack1),buffer+="
      • ",buffer})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var helper,options,buffer="",helperMissing=helpers.helperMissing,escapeExpression=this.escapeExpression;return buffer+="",buffer})}),define("taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit",["jquery","lodash","i18n","moment","ui/hider","ui/autoscroll","util/strPad","taoTests/runner/plugin","taoQtiItem/qtiCommonRenderer/helpers/PciResponse","tpl!taoQtiTest/runner/plugins/templates/button","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer"],function($,_,__,moment,hider,autoscroll,strPad,pluginFactory,pciResponse,buttonTpl,consoleTpl,consoleLineTpl,consoleCloserTpl){'use strict';var defaults={submitTitle:__("Submit and show the result"),submitText:__("Submit"),submitIcon:"forward"};return pluginFactory({name:"submit",init:function init(){var _this2=this,testRunner=this.getTestRunner(),pluginConfig=_.defaults(this.getConfig(),defaults),isPluginAllowed=function(){var config=testRunner.getConfig();return!config.options.readOnly},showConsole=function(){hider.show(_this2.controls.$console),hider.show(_this2.controls.$consoleBody),hider.show(_this2.controls.$consoleCloser),autoscroll(_this2.controls.$consoleBody.children().last(),_this2.controls.$consoleBody)},hideConsole=function(){hider.hide(_this2.controls.$console),hider.hide(_this2.controls.$consoleCloser)},addConsoleLine=function(type,message){var data={time:strPad(moment().format("HH:mm:ss"),12," "),type:strPad(type||"",18," "),message:strPad(message||"",18," ")};_this2.controls.$consoleBody.append($(consoleLineTpl(data)))},showResponses=function(type,responses){_.forEach(responses,function(response,identifier){addConsoleLine(type,strPad("".concat(identifier,": "),15," ")+_.escape(pciResponse.prettyPrint(response)))})};this.controls={$button:$(buttonTpl({control:"submit",title:pluginConfig.submitTitle,icon:pluginConfig.submitIcon,text:pluginConfig.submitText})),$console:$(consoleTpl()),$consoleCloser:$(consoleCloserTpl())},this.controls.$consoleBody=this.controls.$console.find(".preview-console-body"),this.controls.$button.on("click",function(e){e.preventDefault(),!1!==_this2.getState("enabled")&&(_this2.disable(),testRunner.trigger("submititem"))}),this.controls.$consoleCloser.on("click",function(e){e.preventDefault(),hideConsole()}),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?_this2.show():_this2.hide()}).on("submitresponse",function(responses){showResponses(__("Submitted data"),responses),showConsole()}).on("scoreitem",function(responses){responses.itemSession&&(showResponses(__("Output data"),responses.itemSession),showConsole())}).on("enablenav",function(){_this2.enable()}).on("disablenav",function(){_this2.disable()})},render:function render(){var $container=this.getAreaBroker().getContainer(),$navigation=this.getAreaBroker().getNavigationArea();$navigation.append(this.controls.$button),$navigation.append(this.controls.$consoleCloser),$container.append(this.controls.$console)},destroy:function destroy(){_.forEach(this.controls,function($el){return $el.remove()}),this.controls=null},enable:function enable(){this.controls.$button.prop("disabled",!1).removeClass("disabled")},disable:function disable(){this.controls.$button.prop("disabled",!0).addClass("disabled")},show:function show(){hider.show(this.controls.$button)},hide:function hide(){_.forEach(this.controls,hider.hide)}})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression;return buffer+="
        \n
        \n
        \n
        \n
        \n
        \n
        \n
        ",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer",["jquery","lodash","i18n","ui/component","ui/transformer","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css"],function($,_,__,componentFactory,transformer,devicesPreviewerTpl){'use strict';var defaults={deviceType:"standard",deviceWith:0,deviceHeight:0,deviceOrientation:null};return function(container,config){var controls=null,resetScale=function(){controls&&(controls.$previewContent.removeAttr("style"),controls.$previewContainer.removeAttr("style"))},devicesPreviewer=componentFactory({getDeviceWidth:function(){return this.getConfig().deviceWidth},setDeviceWidth:function(width){var componentConfig=this.getConfig();return componentConfig.deviceWidth=parseInt(width,10)||0,this.trigger("devicewidthchange",componentConfig.deviceWidth),this},getDeviceHeight:function(){return this.getConfig().deviceHeight},setDeviceHeight:function(height){var componentConfig=this.getConfig();return componentConfig.deviceHeight=parseInt(height,10)||0,this.trigger("deviceheightchange",componentConfig.deviceHeight),this},getDeviceOrientation:function(){return this.getConfig().deviceOrientation},setDeviceOrientation:function(orientation){var componentConfig=this.getConfig();return componentConfig.deviceOrientation=orientation,this.is("rendered")&&this.getElement().attr("data-orientation",componentConfig.deviceOrientation),this.trigger("deviceorientationchange",componentConfig.deviceOrientation),this},isDeviceMode:function(){return"standard"!==this.getDeviceType()},getDeviceType:function(){return this.getConfig().deviceType},setDeviceType:function(type){var componentConfig=this.getConfig();return componentConfig.deviceType=type,this.is("rendered")&&this.getElement().attr("data-type",componentConfig.deviceType),this.trigger("devicetypechange",componentConfig.deviceType),this},previewDevice:function(){var width,height;return this.is("rendered")&&(this.is("disabled")||"standard"===this.getDeviceType()?this.clearScale():("portrait"===this.getDeviceOrientation()?(width=this.getDeviceHeight(),height=this.getDeviceWidth()):(width=this.getDeviceWidth(),height=this.getDeviceHeight()),this.applyScale(width,height)),this.trigger("devicepreview")),this},clearScale:function(){return this.is("rendered")&&(resetScale(),this.trigger("scaleclear")),this},applyScale:function(width,height){var frameSize,frameMargins,scaleFactor;return this.is("rendered")&&(resetScale(),frameSize=this.getFrameSize(),frameMargins=this.getFrameMargins(),scaleFactor=this.getScaleFactor(width,height),controls.$previewContent.width(width).height(height),controls.$previewContainer.css("left",(frameSize.width-(width+frameMargins.width)*scaleFactor)/2).width(width+frameMargins.width).height(height+frameMargins.height),transformer.setTransformOrigin(controls.$previewContainer,0,0),transformer.scale(controls.$previewContainer,scaleFactor),this.trigger("scalechange")),this},getFrameMargins:function(){var margins={width:0,height:0};return this.is("rendered")&&(margins.width=controls.$previewContainer.outerWidth()-controls.$previewContent.width(),margins.height=controls.$previewContainer.outerHeight()-controls.$previewContent.height()),margins},getFrameSize:function(){var size={width:0,height:0};return this.is("rendered")&&(size.width=this.getContainer().innerWidth(),size.height=this.getContainer().innerHeight()),size},getScaleFactor:function(width,height){var margins,frameSize,_Mathmin=Math.min,scaleFactor={x:1,y:1};return this.is("rendered")&&this.isDeviceMode()&&(frameSize=this.getFrameSize(),margins=this.getFrameMargins(),width+=margins.width,height+=margins.height,width>frameSize.width&&(scaleFactor.x=frameSize.width/width),height>frameSize.height&&(scaleFactor.y=frameSize.height/height)),_Mathmin(scaleFactor.x,scaleFactor.y)},wrap:function(element){return this.is("rendered")&&(this.unwrap(),controls.$wrappedElement=$(element),controls.$wrappedElementContainer=controls.$wrappedElement.parent(),controls.$previewContent.append(controls.$wrappedElement),this.trigger("wrap",controls.$wrappedElement)),this},unwrap:function(){var $wasWrappedElement;return this.is("rendered")&&controls.$wrappedElement&&($wasWrappedElement=controls.$wrappedElement,controls.$wrappedElementContainer.append(controls.$wrappedElement),controls.$wrappedElement=null,controls.$wrappedElementContainer=null,this.trigger("unwrap",$wasWrappedElement)),this}},defaults).setTemplate(devicesPreviewerTpl).on("init",function(){var componentConfig=this.getConfig();this.setDeviceType(componentConfig.deviceType),this.setDeviceWidth(componentConfig.deviceWidth),this.setDeviceHeight(componentConfig.deviceHeight),this.setDeviceOrientation(componentConfig.deviceOrientation),_.defer(function(){devicesPreviewer.render(container)})}).on("render",function(){var $element=this.getElement();controls={$previewContainer:$element.find(".preview-container"),$previewFrame:$element.find(".preview-frame"),$previewContent:$element.find(".preview-content"),$wrappedElement:null,$wrappedElementContainer:null},this.trigger("ready")}).on("disable enable",function(){var self=this;this.is("rendered")&&_.defer(function(){self.previewDevice()})}).on("destroy",function(){this.unwrap(),controls=null});return _.defer(function(){devicesPreviewer.init(config)}),devicesPreviewer}}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
        \n
        \n
        \n
        \n
        \n
        "})}),define("tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){function program1(depth0,data){var stack1,helper,buffer="";return buffer+="\n \n ",buffer}function program2(){return"selected=\"selected\""}this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{};var stack1,helper,buffer="",escapeExpression=this.escapeExpression,self=this;return buffer+="",buffer})}),define("css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector",[],function(){}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector",["jquery","lodash","i18n","ui/component","ui/selecter","taoQtiTestPreviewer/previewer/helpers/devices","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector","css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css"],function($,_,__,componentFactory,lookupSelecter,devicesHelper,devicesSelectorTpl,selectorTpl){'use strict';function getSelectorData(selected,list){return selected&&_.size(list)?_.find(list,{value:selected})||null:null}function getValidIdentifier(identifier,list){return list&&list.length?_.find(list,{value:identifier})?identifier:_.first(list).value:null}function updateSelect2($selector,value){var current=$selector.val();return current!==value&&($selector.val(value),$selector.trigger("change")),$selector}function removeSelect2($selector){return $selector.hasClass("select2-offscreen")&&$selector.select2("destroy"),$selector}var defaults={type:"standard",device:null,orientation:"landscape"},deviceTypesList=[{value:"standard",label:__("Actual size"),devicesList:!1,orientation:!1},{value:"desktop",label:__("Desktop preview"),devicesList:!0,orientation:!1},{value:"mobile",label:__("Mobile preview"),devicesList:!0,orientation:!0}],deviceOrientationsList=[{value:"landscape",label:__("Landscape")},{value:"portrait",label:__("Portrait")}],callbackMap={type:"setType",device:"setDevice",mobile:"setDevice",desktop:"setDevice",orientation:"setOrientation"};return function(container,config){var selected={type:null,device:null,orientation:null,desktop:null,mobile:null},devicesList=[],typeData=null,controls=null,setControlsProp=function(property,value){_.forEach(controls,function($selector){$selector.prop(property,value)})},devicesSelector=componentFactory({isDeviceMode:function(){return"standard"!==selected.type},updateMode:function(){return this.is("rendered")&&this.getElement().attr("data-type",selected.type),this},getType:function(){return selected.type},getOrientation:function(){return typeData&&typeData.orientation?selected.orientation:null},getDevice:function(){return typeData&&typeData.devicesList?selected.device:null},getDeviceData:function(){return getSelectorData(this.getDevice(),devicesList)},setType:function(identifier){return identifier=getValidIdentifier(identifier,deviceTypesList),identifier!==selected.type&&(selected.type=identifier,selected.device=null,devicesList=devicesHelper.getDevicesByType(selected.type),typeData=getSelectorData(selected.type,deviceTypesList),this.is("rendered")&&(updateSelect2(controls.$typeSelector,selected.type),this.updateMode()),this.trigger("typechange",selected.type),typeData.devicesList&&this.setDevice(selected[selected.type])),this},setOrientation:function(identifier){return identifier=getValidIdentifier(identifier,deviceOrientationsList),identifier!==selected.orientation&&(selected.orientation=identifier,this.is("rendered")&&updateSelect2(controls.$orientationSelector,selected.orientation),this.trigger("orientationchange",selected.orientation)),this},setDevice:function(identifier){var $selector;return identifier=getValidIdentifier(identifier,devicesList),identifier!==selected.device&&(selected.device=identifier,selected[selected.type]=identifier,this.is("rendered")&&this.isDeviceMode()&&($selector=controls["$"+selected.type+"Selector"],$selector&&updateSelect2($selector,selected.device)),this.trigger("devicechange",selected.device,this.getDeviceData())),this},select:function(name,value){var setterName=callbackMap[name];return setterName&&_.isFunction(this[setterName])&&this[setterName](value),this},reset:function(){var componentConfig=this.getConfig();return this.setType(componentConfig.type),this.setDevice(componentConfig.device),this.setOrientation(componentConfig.orientation),this}},defaults).setTemplate(devicesSelectorTpl).on("init",function(){this.reset(),_.defer(function(){devicesSelector.render(container)})}).on("render",function(){function renderSelector(name,list,selectedValue,category){var $selector=$(selectorTpl({name:name,category:category||name,items:_.map(list,function(item){return{value:item.value,label:item.label,selected:selectedValue===item.value}})}));return self.getElement().find("."+name+"-selector").html($selector),$selector}var self=this;controls={$typeSelector:renderSelector("type",deviceTypesList,selected.type),$desktopSelector:renderSelector("desktop",devicesHelper.getDesktopDevices(),selected.device,"device"),$mobileSelector:renderSelector("mobile",devicesHelper.getMobileDevices(),selected.device,"device"),$orientationSelector:renderSelector("orientation",deviceOrientationsList,selected.orientation)},lookupSelecter(this.getElement()),this.getElement().on("change",".selector",function(e){var $selector=$(e.target).closest("select");self.select($selector.attr("name"),$selector.val())}),this.updateMode(),this.trigger("ready")}).on("disable",function(){this.is("rendered")&&setControlsProp("disabled",!0)}).on("enable",function(){this.is("rendered")&&setControlsProp("disabled",!1)}).on("destroy",function(){_.forEach(controls,removeSelect2),controls=null,selected=null,typeData=null,devicesList=null});return _.defer(function(){devicesSelector.init(config)}),devicesSelector}}),define("taoQtiTestPreviewer/previewer/plugins/tools/scale/scale",["jquery","lodash","lib/uuid","util/namespace","taoTests/runner/plugin","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer","taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector"],function($,_,uuid,namespaceHelper,pluginFactory,devicesPreviewerFactory,devicesSelectorFactory){'use strict';return pluginFactory({name:"scale",init:function(){function isPluginAllowed(){var config=testRunner.getConfig();return!config.options.readOnly}var self=this,testRunner=this.getTestRunner();this.nsId=this.getName()+uuid(6),isPluginAllowed()||this.hide(),this.disable(),testRunner.on("render",function(){isPluginAllowed()?self.show():self.hide()}).on("resizeitem",function(size,orientation,type){self.devicesPreviewer&&self.devicesPreviewer.setDeviceType(type).setDeviceOrientation(orientation).setDeviceWidth(size&&size.width).setDeviceHeight(size&&size.height).previewDevice()}).on("enablenav",function(){self.enable()}).on("disablenav",function(){self.disable()})},render:function(){function resizeItem(){self.devicesSelector&&self.getState("enabled")&&testRunner.trigger("resizeitem",self.devicesSelector.getDeviceData(),self.devicesSelector.getOrientation(),self.devicesSelector.getType())}var self=this,testRunner=this.getTestRunner(),areaBroker=this.getAreaBroker();return $(window).on(namespaceHelper.namespaceAll("resize orientationchange",this.nsId),_.throttle(function(){self.devicesSelector&&self.devicesSelector.isDeviceMode()&&resizeItem()},50)),Promise.all([new Promise(function(resolve){self.devicesSelector=devicesSelectorFactory(areaBroker.getHeaderArea()).on("ready",function(){self.getState("enabled")||this.disable(),this.on("typechange",function(){this.isDeviceMode()||resizeItem()}),this.on("devicechange orientationchange",function(){resizeItem()}),resolve()})}),new Promise(function(resolve){self.devicesPreviewer=devicesPreviewerFactory(areaBroker.getArea("contentWrapper")).on("ready",function(){this.wrap(areaBroker.getContentArea()),resolve()})})])},destroy:function(){this.nsId&&$(window).off("."+this.nsId),this.devicesSelector&&this.devicesSelector.destroy(),this.devicesPreviewer&&this.devicesPreviewer.destroy(),this.devicesSelector=null,this.devicesPreviewer=null},enable:function(){this.devicesSelector&&this.devicesSelector.enable()},disable:function(){this.devicesSelector&&this.devicesSelector.disable()},show:function(){this.devicesSelector&&this.devicesSelector.show()},hide:function(){this.devicesSelector&&this.devicesSelector.hide()}})}),define("tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item",["handlebars"],function(hb){return hb.template(function(Handlebars,depth0,helpers,partials,data){return this.compilerInfo=[4,">= 1.0.0"],helpers=this.merge(helpers,Handlebars.helpers),data=data||{},"
        \n
        \n
        \n
        \n
        \n
          \n
          \n
          \n
          \n\n
          \n\n \n\n
          \n
          \n
          \n
          \n\n \n\n
          "})}),define("taoQtiTestPreviewer/previewer/provider/item/item",["jquery","lodash","i18n","ui/feedback","taoTests/runner/areaBroker","taoTests/runner/testStore","taoTests/runner/proxy","taoQtiTest/runner/ui/toolbox/toolbox","taoQtiItem/runner/qtiItemRunner","taoQtiTest/runner/config/assetManager","taoItems/assets/strategies","taoQtiItem/qtiCommonRenderer/helpers/container","tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item"],function($,_,__,feedback,areaBrokerFactory,testStoreFactory,proxyFactory,toolboxFactory,qtiItemRunner,assetManagerFactory,assetStrategies,containerHelper,layoutTpl){'use strict';function setContext($context){_$previousContext=containerHelper.getContext(),containerHelper.setContext($context)}function restoreContext(){containerHelper.setContext(_$previousContext),_$previousContext=null}var assetManager=assetManagerFactory();assetManager.prependStrategy(assetStrategies.taomedia);var _$previousContext=null;return{name:"qtiItemPreviewer",loadAreaBroker:function loadAreaBroker(){var $layout=$(layoutTpl());return areaBrokerFactory($layout,{contentWrapper:$(".content-wrapper",$layout),content:$("#qti-content",$layout),toolbox:$(".bottom-action-bar .tools-box",$layout),navigation:$(".bottom-action-bar .navi-box-list",$layout),control:$(".top-action-bar .control-box",$layout),actionsBar:$(".bottom-action-bar .control-box",$layout),panel:$(".test-sidebar-left",$layout),header:$(".top-action-bar .tools-box",$layout),context:$(".top-action-bar .navi-box-list",$layout)})},loadProxy:function loadProxy(){var _this$getConfig=this.getConfig(),proxyProvider=_this$getConfig.proxyProvider,serviceCallId=_this$getConfig.serviceCallId,bootstrap=_this$getConfig.bootstrap,timeout=_this$getConfig.timeout;return proxyFactory(proxyProvider||"qtiItemPreviewerProxy",{serviceCallId:serviceCallId,bootstrap:bootstrap,timeout:timeout})},loadTestStore:function loadTestStore(){var config=this.getConfig(),identifier=config.serviceCallId||"test-".concat(Date.now());return testStoreFactory(identifier)},install:function install(){var plugins=this.getConfig().options.plugins;plugins&&_.forEach(this.getPlugins(),function(plugin){if(_.isPlainObject(plugin)&&_.isFunction(plugin.setConfig)){var config=plugins[plugin.getName()];_.isPlainObject(config)&&plugin.setConfig(config)}})},init:function init(){var _this3=this,dataHolder=this.getDataHolder(),areaBroker=this.getAreaBroker();return areaBroker.setComponent("toolbox",toolboxFactory()),areaBroker.getToolbox().init(),this.on("submititem",function(){var itemState=_this3.itemRunner.getState(),itemResponses=_this3.itemRunner.getResponses();return _this3.trigger("disabletools disablenav"),_this3.trigger("submitresponse",itemResponses,itemState),_this3.getProxy().submitItem(dataHolder.get("itemIdentifier"),itemState,itemResponses).then(function(response){_this3.trigger("scoreitem",response),_this3.trigger("enabletools enablenav resumeitem")}).catch(function(err){_this3.trigger("enabletools enablenav"),200===err.code&&_this3.trigger("alert.submitError",err.message||__("An error occurred during results submission. Please retry."),function(){return _this3.trigger("resumeitem")})})}).on("ready",function(){var itemIdentifier=dataHolder.get("itemIdentifier"),itemData=dataHolder.get("itemData");itemIdentifier&&(itemData?_this3.renderItem(itemIdentifier,itemData):_this3.loadItem(itemIdentifier))}).on("loaditem",function(itemRef,itemData){dataHolder.set("itemIdentifier",itemRef),dataHolder.set("itemData",itemData)}).on("renderitem",function(){_this3.trigger("enabletools enablenav")}).on("resumeitem",function(){_this3.trigger("enableitem enablenav")}).on("disableitem",function(){_this3.trigger("disabletools")}).on("enableitem",function(){_this3.trigger("enabletools")}).on("error",function(){_this3.trigger("disabletools enablenav")}).on("finish leave",function(){_this3.trigger("disablenav disabletools"),_this3.flush()}).on("flush",function(){_this3.destroy()}),this.getProxy().init().then(function(data){dataHolder.set("itemIdentifier",data.itemIdentifier),dataHolder.set("itemData",data.itemData)})},render:function render(){var config=this.getConfig(),areaBroker=this.getAreaBroker();config.renderTo.append(areaBroker.getContainer()),areaBroker.getToolbox().render(areaBroker.getToolboxArea())},loadItem:function loadItem(itemIdentifier){return this.getProxy().getItem(itemIdentifier)},renderItem:function renderItem(itemIdentifier,itemData){var _this4=this,areaBroker=this.getAreaBroker(),options=this.getConfig().options,changeState=function(){_this4.setItemState(itemIdentifier,"changed",!0)};return setContext(areaBroker.getContentArea()),new Promise(function(resolve,reject){assetManager.setData("baseUrl",itemData.baseUrl),itemData.content=itemData.content||{},_this4.itemRunner=qtiItemRunner(itemData.content.type,itemData.content.data,Object.assign({assetManager:assetManager},options)).on("error",function(err){_this4.trigger("enablenav"),reject(err),feedback().error(__("It seems that there is an error during item preview loading. Please, try again."))}).on("init",function(){var state=itemData.state,portableElements=itemData.portableElements;this.render(areaBroker.getContentArea(),{state:state,portableElements:portableElements})}).on("render",function(){this.on("responsechange",changeState),this.on("statechange",changeState),resolve()}).init()})},unloadItem:function unloadItem(){var _this5=this;return this.trigger("beforeunloaditem disablenav disabletools"),this.itemRunner?new Promise(function(resolve){_this5.itemRunner.on("clear",resolve).clear()}):Promise.resolve()},destroy:function destroy(){var areaBroker=this.getAreaBroker();this.itemRunner&&this.itemRunner.on("clear",restoreContext).clear(),this.itemRunner=null,areaBroker&&areaBroker.getToolbox().destroy()}}}),define("taoQtiTestPreviewer/previewer/proxy/item",["jquery","lodash","i18n","core/promiseQueue","core/request","taoQtiTestPreviewer/previewer/config/item"],function($,_,__,promiseQueue,coreRequest,configFactory){'use strict';return{name:"qtiItemPreviewerProxy",install:function(){var self=this;this.queue=promiseQueue(),this.prepareParams=function(actionParams){var stringifyParams=["itemState","itemResponse"];return _.isPlainObject(actionParams)?_.mapValues(actionParams,function(value,key){return _.contains(stringifyParams,key)?JSON.stringify(value):value}):actionParams},this.request=function(url,reqParams,contentType,noToken){return coreRequest({url:url,data:self.prepareParams(reqParams),method:reqParams?"POST":"GET",contentType:contentType,noToken:noToken,background:!1,sequential:!0,timeout:self.configStorage.getTimeout()}).then(function(response){return self.setOnline(),response&&response.success?Promise.resolve(response):Promise.reject(response)}).catch(function(error){return error.data&&self.isConnectivityError(error.data)&&self.setOffline("request"),Promise.reject(error)})}},init:function(config,params){return this.configStorage=configFactory(config||{}),this.request(this.configStorage.getTestActionUrl("init"),params,void 0,!0)},destroy:function(){return this.configStorage=null,this.queue=null,Promise.resolve()},callTestAction:function(action,params){return this.request(this.configStorage.getTestActionUrl(action),params)},callItemAction:function(itemIdentifier,action,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,action),params)},getItem:function(itemIdentifier,params){return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"getItem"),params,void 0,!0)},submitItem:function(itemIdentifier,state,response,params){var body=_.merge({itemState:state,itemResponse:response},params||{});return this.request(this.configStorage.getItemActionUrl(itemIdentifier,"submitItem"),body,void 0,!0)}}}),function(c){var d=document,s=d.createElement("style");s.type="text/css",d.getElementsByTagName("head")[0].appendChild(s),s.styleSheet?s.styleSheet.cssText=c:s.appendChild(d.createTextNode(c))}("@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:'';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;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}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-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}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\" \";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\"btn-\"],.section-container .content-block [class*=\" btn-\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-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 - 0px)}.item-previewer-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}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:' ';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\"Andale Mono WT\",\"Andale Mono\",\"Lucida Console\",\"Lucida Sans Typewriter\",\"DejaVu Sans Mono\",\"Bitstream Vera Sans Mono\",\"Liberation Mono\",\"Nimbus Mono L\",Monaco,\"Courier New\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-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}.item-previewer-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}.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;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:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\"btn-\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\" btn-\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-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}.item-previewer-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:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\"desktop\"],.devices-previewer:not(.disabled)[data-type=\"mobile\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\"mobile\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\"desktop\"] .preview-frame{border-radius:5px;padding:30px}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\"standard\"] .desktop-selector,.devices-selector[data-type=\"standard\"] .mobile-selector,.devices-selector[data-type=\"standard\"] .orientation-selector{display:none}.devices-selector[data-type=\"desktop\"] .mobile-selector,.devices-selector[data-type=\"desktop\"] .orientation-selector{display:none}.devices-selector[data-type=\"mobile\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\n\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */"),define("taoQtiTestPreviewer/loader/qtiPreviewer.bundle",function(){}),define("taoQtiTestPreviewer/loader/qtiPreviewer.min",["taoItems/loader/taoItemsRunner.min","taoTests/loader/taoTestsRunner.min","taoQtiItem/loader/taoQtiItemRunner.min","taoQtiTest/loader/taoQtiTestRunner.min","taoQtiTest/loader/testPlugins.min"],function(){}); //# sourceMappingURL=qtiPreviewer.min.js.map \ No newline at end of file diff --git a/views/js/loader/qtiPreviewer.min.js.map b/views/js/loader/qtiPreviewer.min.js.map index d0b1998c..e34eb6f8 100644 --- a/views/js/loader/qtiPreviewer.min.js.map +++ b/views/js/loader/qtiPreviewer.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../previewer/runner!tpl","../previewer/runner.js","../previewer/provider/item/css/item!css","../previewer/component/qtiItem.js","../previewer/adapter/item/qtiItem.js","../previewer/config/item.js","../previewer/resources/devices.json!json","../previewer/helpers/devices.js","../previewer/plugins/content/enhancedReadOnlyMode.js","../previewer/plugins/controls/close.js","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer","../previewer/plugins/navigation/submit/submit.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","../previewer/plugins/tools/scale/component/css/devicesPreviewer!css","../previewer/plugins/tools/scale/component/devicesPreviewer.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","../previewer/plugins/tools/scale/component/tpl/selector!tpl","../previewer/plugins/tools/scale/component/css/devicesSelector!css","../previewer/plugins/tools/scale/component/devicesSelector.js","../previewer/plugins/tools/scale/scale.js","../previewer/provider/item/tpl/item!tpl","../previewer/provider/item/item.js","../previewer/proxy/item.js","onLayerEnd0.js","module-create.js","/Users/luis/Projects/package-tao/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["\ndefine('tpl!taoQtiTestPreviewer/previewer/runner', ['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 \n\n\n return \"
          \";\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Component that embeds the QTI previewer for tests and items\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/runner',[\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/runner'\n], function (runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The testRunner options\n * @param {String} [config.provider] - The provider to use\n * @param {Object[]} [config.providers] - A collection of providers to load.\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Boolean} [config.options.fullPage] - Force the previewer to occupy the full window.\n * @param {Booleanh} [config.options.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function previewerFactory(container, config = {}, template = null) {\n\n return runnerComponentFactory(container, config, template || runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy() );\n });\n };\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/provider/item/css/item',[],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) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/component/qtiItem',[\n 'context',\n 'taoQtiTestPreviewer/previewer/runner',\n 'css!taoQtiTestPreviewer/previewer/provider/item/css/item'\n], function (context, previewerFactory) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.itemUri] - The URI of the item to load\n * @param {Object} [config.itemState] - The state of the item when relevant\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {Object[]} [config.pluginsOptions] - Options for the plugins\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function qtiItemPreviewerFactory(container, config = {}, template = null) {\n\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qtiItemPreviewer',\n module: 'taoQtiTestPreviewer/previewer/provider/item/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiItemPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.pluginsOptions,\n hideActionBars: config.hideActionBars,\n }\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return previewerFactory(container, testRunnerConfig, template)\n .on('ready', runner => {\n if (config.itemState) {\n runner.on('renderitem', () => runner.itemRunner.setState(config.itemState));\n }\n if (config.itemUri) {\n return runner.loadItem(config.itemUri);\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) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/item/qtiItem',[\n 'lodash',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/qtiItem',\n 'ui/feedback'\n], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTest/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [{\n module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'controls'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'navigation'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'tools'\n }, {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }];\n\n /**\n * Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiItem',\n\n /**\n * Builds and shows the legacy item previewer\n *\n * @param {String} uri - The URI of the item to load\n * @param {Object} state - The state of the item\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(uri, state, config = {}) {\n config.itemUri = uri;\n config.itemState = state;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiItemPreviewerFactory(window.document.body, config)\n .on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n } else {\n logger.error(err);\n }\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) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Config manager for the proxy of the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/config/item',[\n 'lodash',\n 'util/url',\n 'util/config'\n], function(_, urlUtil, configHelper) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap : {\n serviceController : 'Previewer',\n serviceExtension : 'taoQtiTestPreviewer'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n serviceCallId : true,\n bootstrap : false,\n timeout : false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.serviceCallId - An identifier for the service call\n * @param {String} [config.bootstrap.serviceController] - The name of the service controller\n * @param {String} [config.bootstrap.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n return function itemPreviewerConfigFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the list of parameters\n * @param {String|Object} [itemIdentifier]\n * @returns {Object}\n */\n getParameters: function getParameters(itemIdentifier) {\n var type = typeof itemIdentifier;\n var parameters = {\n serviceCallId : this.getServiceCallId()\n };\n\n if (type === 'string') {\n // simple item identifier\n parameters.itemUri = itemIdentifier;\n // structured item identifier (a list of parameters)\n } else if (type === 'object' && _.isPlainObject(itemIdentifier)) {\n _.merge(parameters, itemIdentifier);\n } else if (type !== 'undefined') {\n throw new TypeError('Wrong parameter type provided for itemIdentifier: ' + type + '. Only string or plain object are allowed!');\n }\n\n return parameters;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId : function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController : function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension : function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl : function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters());\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String|Object} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl : function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters(itemIdentifier));\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout : function getTimeout() {\n return storage.timeout;\n }\n };\n };\n});\n\n","\ndefine(\"json!taoQtiTestPreviewer/previewer/resources/devices.json\", function(){ return {\n \"tablets\": {\n \"193986c3715c81838870f908fa98d69a\": {\n \"label\": \"Amazon Kindle Fire HDX 7\\u2033\",\n \"width\": 960,\n \"height\": 600\n },\n \"4e8eafab11aad1486992d7ee2c8c16ca\": {\n \"label\": \"Apple iPad\",\n \"width\": 1024,\n \"height\": 768\n },\n \"5aac2932d9ad00d6d8a1604b8f9e4e8d\": {\n \"label\": \"Google Nexus 10, Motorola Xoom, Xyboard\",\n \"width\": 1280,\n \"height\": 800\n },\n \"9805d9753ad08c7630a9ee5418aa6c6c\": {\n \"label\": \"Google Nexus 7\",\n \"width\": 966,\n \"height\": 604\n },\n \"d4a431cedf4705d6bf2cba6d5788378b\": {\n \"label\": \"Samsung Galaxy Tab 7.7, 8.9, 10.1\",\n \"width\": 1280,\n \"height\": 800\n }\n },\n \"phones\": {\n \"1b89338531ef0155c8d6abc2ac02c81a\": {\n \"label\": \"Apple iPhone 3GS\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1,\n \"dpWidth\": 320,\n \"dpHeight\": 480\n },\n \"3f89da99d84214cde7df87ebe0699a6f\": {\n \"label\": \"Apple iPhone 4\",\n \"width\": 640,\n \"height\": 960,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 1920\n },\n \"0d36971a5b98b367f54ced708c9af849\": {\n \"label\": \"Apple iPhone 5\",\n \"width\": 640,\n \"height\": 1136,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 2272\n },\n \"026beffcc051af995660ebdede986ace\": {\n \"label\": \"BlackBerry Z10\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"fd2dd53e667d6d49e4fa73356fa941dd\": {\n \"label\": \"BlackBerry Z30\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"707584c1ae17d9b5b2cbe8603c91c147\": {\n \"label\": \"Google Nexus 4\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"91823264de952e7f2347e07db5c4058b\": {\n \"label\": \"Google Nexus 5\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"cd69817a6e147e8a4677389e56fcf568\": {\n \"label\": \"Google Nexus S\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"75994faa6a38e31e99b53fcd75534a33\": {\n \"label\": \"HTC Evo, Touch HD, Desire HD, Desire\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0cab4dfccdfc880687cb608cfe4159db\": {\n \"label\": \"HTC One X, EVO LTE\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"c4ff41fcba24d74fc21dc3490ca1edc9\": {\n \"label\": \"HTC Sensation, Evo 3D\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 360,\n \"dpHeight\": 1440\n },\n \"fa969a5e0dd2de53700eeee4ba4ba142\": {\n \"label\": \"LG Optimus 2X, Optimus 3D, Optimus Black\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"33c4f9364e295ec03531f3a3425819cf\": {\n \"label\": \"LG Optimus G\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"bc47f5275f0efd56fee52d43a8082981\": {\n \"label\": \"LG Optimus LTE, Optimus 4X HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1.7,\n \"dpWidth\": 424,\n \"dpHeight\": 2176\n },\n \"0732887e6e324fd10777b735520a34cf\": {\n \"label\": \"LG Optimus One\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 213,\n \"dpHeight\": 720\n },\n \"2e38a78364f09d0da0e9e1a3a68e7fb0\": {\n \"label\": \"Motorola Defy, Droid, Droid X, Milestone\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1281\n },\n \"bd4b78dddc7c9625a4141a1b1ddabb87\": {\n \"label\": \"Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1,\n \"dpWidth\": 540,\n \"dpHeight\": 960\n },\n \"3bf1edf21cfa81006183d2b02974c84e\": {\n \"label\": \"Motorola Droid Razr HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1,\n \"dpWidth\": 720,\n \"dpHeight\": 1280\n },\n \"ab5a352e0e016b97dac986f06c394f55\": {\n \"label\": \"Nokia C5, C6, C7, N97, N8, X7\",\n \"width\": 360,\n \"height\": 640,\n \"scaleFactor\": 1,\n \"dpWidth\": 360,\n \"dpHeight\": 640\n },\n \"4826fb7d7257aeaac992ce699df41b3c\": {\n \"label\": \"Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0a691ab20add7c432200f8fa6527b488\": {\n \"label\": \"Samsung Galaxy Note\",\n \"width\": 800,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 400,\n \"dpHeight\": 2560\n },\n \"9c23ee31be29960fbac9e9bbfc2fc7b0\": {\n \"label\": \"Samsung Galaxy Note 3\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 2,\n \"dpWidth\": 540,\n \"dpHeight\": 3840\n },\n \"92177c0508c1d73905a58e2338f2a81f\": {\n \"label\": \"Samsung Galaxy Note II\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"5222b8866dc4cc606725e16ffcc0a783\": {\n \"label\": \"Samsung Galaxy S III, Galaxy Nexus\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"37c1541e2bd55cfd0f4073b0ccdf68b3\": {\n \"label\": \"Samsung Galaxy S, S II, W\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"2f7f64b7dda0144907ff300e83eed465\": {\n \"label\": \"Samsung Galaxy S4\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"9c24f9057744dad56043702a9703127f\": {\n \"label\": \"Sony Xperia S, Ion\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"0a8b2732a016a9395c3af5f12dd9c0da\": {\n \"label\": \"Sony Xperia Sola, U\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1,\n \"dpWidth\": 480,\n \"dpHeight\": 854\n },\n \"5a153d7f53d82dcb0801f041574a6a43\": {\n \"label\": \"Sony Xperia Z, Z1\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n }\n },\n \"screens\": {\n \"9e523ae15b61dc766f5c818726881ecf\": {\n \"label\": \"1920 \\u00d7 1080\",\n \"width\": 1920,\n \"height\": 1080,\n \"dpWidth\": 1920,\n \"dpHeight\": 1080,\n \"scaleFactor\": 1\n },\n \"07769cd8d0a7d09818b2f0b018042fb7\": {\n \"label\": \"1366 \\u00d7 768\",\n \"width\": 1366,\n \"height\": 768,\n \"dpWidth\": 1366,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"72d5478a24194f98b9378e8e0fd65737\": {\n \"label\": \"1280 \\u00d7 1024\",\n \"width\": 1280,\n \"height\": 1024,\n \"dpWidth\": 1280,\n \"dpHeight\": 1024,\n \"scaleFactor\": 1\n },\n \"b7a6dd5900cc72e61f0d3479c7e314ec\": {\n \"label\": \"1280 \\u00d7 800\",\n \"width\": 1280,\n \"height\": 800,\n \"dpWidth\": 1280,\n \"dpHeight\": 800,\n \"scaleFactor\": 1\n },\n \"43193b0ff671a37d8232ab664190a125\": {\n \"label\": \"1024 \\u00d7 768\",\n \"width\": 1024,\n \"height\": 768,\n \"dpWidth\": 1024,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"c29e48814af5443ff5688d9e967ce917\": {\n \"label\": \"800 \\u00d7 600\",\n \"width\": 800,\n \"height\": 600,\n \"dpWidth\": 800,\n \"dpHeight\": 600,\n \"scaleFactor\": 1\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) 2019 Open Assessment Technologies SA;\n */\n/**\n * Helper to work with screen values and mobile devices list\n * for \"select device\" select-box on any test-item preview page\n * for example using scale plugin app/taoQtiTestPreviewer/views/js/previewer/plugins/tools/scale/scale.js\n *\n * @author Dieter Raber \n * @author Pavel Hendelman \n */\ndefine('taoQtiTestPreviewer/previewer/helpers/devices',[\n 'lodash',\n 'json!taoQtiTestPreviewer/previewer/resources/devices.json'\n], function (\n _,\n deviceList\n) {\n 'use strict';\n\n /**\n * @typedef {Object} deviceScreen\n * @property {String} value - The selector's value to use\n * @property {String} label - The label to display in the selector\n * @property {Number} width - The width of the screen\n * @property {Number} height - The height of the screen\n */\n\n /**\n * Translation map to convert a device type to a collection's name in the provided list.\n * @type {Object}\n */\n var deviceTypeMap = {\n 'mobile': 'tablets',\n 'desktop': 'screens'\n };\n\n /**\n * Helpers to get the list of devices\n */\n var devicesHelper = {\n /**\n * Gets the list of devices to test item through. This list is meant to be used by a selector.\n * @param {String} type - The type of device from the list ['mobile', 'desktop']\n * @returns {deviceScreen[]} - The list of devices to test item through, filtered by the provided type\n */\n getDevicesByType : function getDevicesByType(type) {\n /*\n * @todo\n * The device list is currently based on the devices found on the Chrome emulator.\n * This is not ideal and should be changed in the future.\n * I have http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density in mind but we\n * will need to figure what criteria to apply when generating the list.\n */\n var key = deviceTypeMap[type];\n\n return _.map(deviceList[key] || [], function mapDeviceData(device, identifier) {\n return {\n value: identifier,\n label: device.label,\n width: device.width,\n height: device.height\n };\n });\n },\n\n /**\n * Gets the list of mobile devices\n * @returns {deviceScreen[]} - The list of mobile devices to test item through\n */\n getMobileDevices: function getMobileDevices() {\n return devicesHelper.getDevicesByType('mobile');\n },\n\n /**\n * Gets the list of desktop devices\n * @returns {deviceScreen[]} - The list of desktop devices to test item through\n */\n getDesktopDevices: function getDesktopDevices() {\n return devicesHelper.getDevicesByType('desktop');\n }\n };\n\n return devicesHelper;\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\n/**\n * Test Previewer Content Plugin : EnhancedReadOnlyMode\n *\n * This plugin can be used as a hook to do modification in the item preview for read only mode\n *\n * @author Ansul Sharma \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoTests/runner/plugin'\n], function ($, _, __, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'EnhancedReadOnlyMode',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n /**\n * Enables the plugin only in readOnly mode\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return config.options.readOnly;\n };\n\n testRunner\n .after('renderitem', () => {\n if (isPluginAllowed()) {\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const $extendedTextinteractionTextAreas = $contentArea.find('.qti-extendedTextInteraction textarea.text-container');\n const $ckeEditorsContent = $contentArea.find('.qti-extendedTextInteraction div.cke_contents');\n\n /**\n * Updates the height of textarea element of all extended text interactions based on the height of the content\n */\n if($extendedTextinteractionTextAreas.length) {\n $extendedTextinteractionTextAreas.each(function() {\n this.style.height = `${this.scrollHeight + 20}px`;\n });\n }\n\n /**\n * Updates the height of all the ckeEditor container of wysiwyg extended text interaction based on the height of the iFrame\n */\n if($ckeEditorsContent.length) {\n $ckeEditorsContent.each(function() {\n const $ckeEditorContent = $(this);\n const $ckeEditorIFrame = $ckeEditorContent.find('iframe.cke_wysiwyg_frame');\n\n /**\n * Only update the height when the iFrame has finished loading the styles because font-size may change the height\n */\n $ckeEditorIFrame.on('load', () => {\n setTimeout(() => {\n const ckeEditorBody = $ckeEditorIFrame[0].contentWindow.document.querySelector('body');\n $ckeEditorContent[0].style.height = `${ckeEditorBody.scrollHeight + 20}px`;\n }, 0);\n });\n });\n }\n }\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) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Control Plugin : Close\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/controls/close',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/templates/button'\n], function ($, _, __, hider, pluginFactory, buttonTpl) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'close',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.hideActionBars;\n }\n\n this.$element = $(buttonTpl({\n control: 'close',\n title: __('Close the previewer'),\n icon: 'close',\n text: __('Close'),\n className: 'context-action'\n }));\n\n this.$element.on('click', function (e) {\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.trigger('finish');\n }\n });\n\n this.disable();\n\n testRunner\n .on('enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getArea('context');\n $container.append(this.$element);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console', ['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 \n\n\n return \"
          \\n
            \\n
            \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line', ['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 += \"
          • \";\n  if (helper = helpers.time) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.time); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\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    + \"\";\n  if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  if(stack1 || stack1 === 0) { buffer += stack1; }\n  buffer += \"
          • \";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer', ['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 += \"\";\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Navigation Plugin : Submit\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'moment',\n 'ui/hider',\n 'ui/autoscroll',\n 'util/strPad',\n 'taoTests/runner/plugin',\n 'taoQtiItem/qtiCommonRenderer/helpers/PciResponse',\n 'tpl!taoQtiTest/runner/plugins/templates/button',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer'\n], function (\n $,\n _,\n __,\n moment,\n hider,\n autoscroll,\n strPad,\n pluginFactory,\n pciResponse,\n buttonTpl,\n consoleTpl,\n consoleLineTpl,\n consoleCloserTpl\n) {\n 'use strict';\n\n /**\n * Some default config for the plugin\n * @type {Object}\n */\n const defaults = {\n submitTitle: __('Submit and show the result'),\n submitText: __('Submit'),\n submitIcon: 'forward'\n };\n\n return pluginFactory({\n\n name: 'submit',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaults);\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return !config.options.readOnly;\n };\n\n // display the console and its related controls, then auto scrolls to the last element\n const showConsole = () => {\n hider.show(this.controls.$console);\n hider.show(this.controls.$consoleBody);\n hider.show(this.controls.$consoleCloser);\n autoscroll(this.controls.$consoleBody.children().last(), this.controls.$consoleBody);\n };\n\n // hide the console and its related controls\n const hideConsole = () => {\n hider.hide(this.controls.$console);\n hider.hide(this.controls.$consoleCloser);\n };\n\n // add a line to the console\n const addConsoleLine = (type, message) => {\n const data = {\n time: strPad(moment().format('HH:mm:ss'), 12, ' '),\n type: strPad(type || '', 18, ' '),\n message: strPad(message || '', 18, ' ')\n };\n this.controls.$consoleBody.append($(consoleLineTpl(data)));\n };\n\n // display responses in the console\n const showResponses = (type, responses) => {\n _.forEach(responses, (response, identifier) => {\n addConsoleLine(type, strPad(`${identifier}: `, 15, ' ') + _.escape(pciResponse.prettyPrint(response)));\n });\n };\n\n this.controls = {\n $button: $(buttonTpl({\n control: 'submit',\n title: pluginConfig.submitTitle,\n icon: pluginConfig.submitIcon,\n text: pluginConfig.submitText\n })),\n $console: $(consoleTpl()),\n $consoleCloser: $(consoleCloserTpl())\n };\n this.controls.$consoleBody = this.controls.$console.find('.preview-console-body');\n\n this.controls.$button.on('click', e => {\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n testRunner.trigger('submititem');\n }\n });\n\n this.controls.$consoleCloser.on('click', e => {\n e.preventDefault();\n hideConsole();\n });\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', () => {\n if (isPluginAllowed()) {\n this.show();\n } else {\n this.hide();\n }\n })\n .on('submitresponse', responses => {\n showResponses(__('Submitted data'), responses);\n showConsole();\n })\n .on('scoreitem', responses => {\n if (responses.itemSession) {\n showResponses(__('Output data'), responses.itemSession);\n showConsole();\n }\n })\n .on('enablenav', () => {\n this.enable();\n })\n .on('disablenav', () => {\n this.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getContainer();\n const $navigation = this.getAreaBroker().getNavigationArea();\n $navigation.append(this.controls.$button);\n $navigation.append(this.controls.$consoleCloser);\n $container.append(this.controls.$console);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n _.forEach(this.controls, $el => $el.remove());\n this.controls = null;\n },\n\n /**\n * Enable the button\n */\n enable() {\n this.controls.$button\n .prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable() {\n this.controls.$button\n .prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show() {\n hider.show(this.controls.$button);\n },\n\n /**\n * Hide the button\n */\n hide() {\n _.forEach(this.controls, hider.hide);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer', ['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 += \"
            \\n
            \\n
            \\n
            \\n
            \\n
            \\n
            \\n
            \";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer',[],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) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/transformer',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css'\n], function ($, _, __, componentFactory, transformer, devicesPreviewerTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} size\n * @property {Number} width\n * @property {Number} height\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n deviceType: 'standard',\n deviceWith: 0,\n deviceHeight: 0,\n deviceOrientation: null\n };\n\n /**\n * Builds a devices previewer component. It will works in two modes:\n * - the standard mode will do nothing special, this is simply a sleeping mode\n * - the device mode will redesign the view to show a content using a device's layout and aspect ratio\n *\n * @example\n * var devicesPreviewer = devicesPreviewerFactory('.previewer .previewer-content);\n * ...\n * // react to changes\n * devicesPreviewer\n * .on('devicewidthchange', function(width) {\n * // the width has changed\n * })\n * .on('deviceheightchange', function(height) {\n * // the height has changed\n * })\n * .on('deviceorientationchange', function(orientation) {\n * // the orientation has changed\n * })\n * .on('devicetypechange', function(type) {\n * // the type has changed\n * })\n * .on('devicepreview', function() {\n * // the device preview mode has been applied\n * });\n * ...\n * // apply changes\n * devicesPreviewer\n * .setDeviceType(type)\n * .setDeviceOrientation(orientation)\n * .setDeviceWidth(width)\n * .setDeviceHeight(height)\n * .previewDevice();\n * ...\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.deviceType='standard'] - The preview mode to apply\n * @param {Number} [config.deviceWidth=null] - The width of the device to preview\n * @param {Number} [config.deviceHeight=null] - The height of the device to preview\n * @param {String} [config.deviceOrientation='landscape'] - The device orientation\n * @returns {devicesPreviewer}\n * @fires ready - When the component is ready to work\n */\n function devicesPreviewerFactory(container, config) {\n var controls = null;\n\n /**\n * Remove the applied scale\n */\n var resetScale = function resetScale() {\n if (controls) {\n controls.$previewContent.removeAttr('style');\n controls.$previewContainer.removeAttr('style');\n }\n };\n\n // component specific API\n var api = {\n /**\n * Gets the device width.\n * @returns {Number}\n */\n getDeviceWidth: function getDeviceWidth() {\n return this.getConfig().deviceWidth;\n },\n\n /**\n * Sets the device width.\n * @param {String|Number} width\n * @returns {devicesPreviewer}\n * @fires devicewidthchange\n */\n setDeviceWidth: function setDeviceWidth(width) {\n var componentConfig = this.getConfig();\n componentConfig.deviceWidth = parseInt(width, 10) || 0;\n\n /**\n * @event devicewidthchange\n * @param {Number} deviceWidth\n */\n this.trigger('devicewidthchange', componentConfig.deviceWidth);\n\n return this;\n },\n\n /**\n * Gets the device height.\n * @returns {Number}\n */\n getDeviceHeight: function getDeviceHeight() {\n return this.getConfig().deviceHeight;\n },\n\n /**\n * Sets the device height.\n * @param {String|Number} height\n * @returns {devicesPreviewer}\n * @fires deviceheightchange\n */\n setDeviceHeight: function setDeviceHeight(height) {\n var componentConfig = this.getConfig();\n componentConfig.deviceHeight = parseInt(height, 10) || 0;\n\n /**\n * @event deviceheightchange\n * @param {Number} deviceHeight\n */\n this.trigger('deviceheightchange', componentConfig.deviceHeight);\n\n return this;\n },\n\n /**\n * Gets the device orientation.\n * @returns {String}\n */\n getDeviceOrientation: function getDeviceOrientation() {\n return this.getConfig().deviceOrientation;\n },\n\n /**\n * Sets the device orientation.\n * @param {String} orientation\n * @returns {devicesPreviewer}\n * @fires deviceorientationchange\n */\n setDeviceOrientation: function setDeviceOrientation(orientation) {\n var componentConfig = this.getConfig();\n componentConfig.deviceOrientation = orientation;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-orientation', componentConfig.deviceOrientation);\n }\n\n /**\n * @event deviceorientationchange\n * @param {String} deviceOrientation\n */\n this.trigger('deviceorientationchange', componentConfig.deviceOrientation);\n\n return this;\n },\n\n /**\n * Tells if the previewer has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return this.getDeviceType() !== 'standard';\n },\n\n /**\n * Gets the device type.\n * @returns {String}\n */\n getDeviceType: function getDeviceType() {\n return this.getConfig().deviceType;\n },\n\n /**\n * Sets the type of device\n * @param {String} type\n * @returns {devicesPreviewer}\n * @fires devicetypechange\n */\n setDeviceType: function setDeviceType(type) {\n var componentConfig = this.getConfig();\n componentConfig.deviceType = type;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-type', componentConfig.deviceType);\n }\n\n /**\n * @event devicetypechange\n * @param {String} deviceType\n */\n this.trigger('devicetypechange', componentConfig.deviceType);\n\n return this;\n },\n\n /**\n * Previews the content using the current device settings\n * @returns {devicesPreviewer}\n * @fires devicepreview after the device has been set on preview\n */\n previewDevice: function previewDevice() {\n var width, height;\n\n if (this.is('rendered')) {\n if (this.is('disabled') || this.getDeviceType() === 'standard') {\n // standard mode and disabled state both should be reflected by a \"no scale\" view\n this.clearScale();\n } else {\n // in device preview mode, we need to apply the device's size with respect to the orientation\n if (this.getDeviceOrientation() === 'portrait') {\n width = this.getDeviceHeight();\n height = this.getDeviceWidth();\n } else {\n width = this.getDeviceWidth();\n height = this.getDeviceHeight();\n }\n this.applyScale(width, height);\n }\n\n /**\n * @event devicepreview\n */\n this.trigger('devicepreview');\n }\n\n return this;\n },\n\n /**\n * Removes the scale settings applied on the devices previewer\n * @returns {devicesPreviewer}\n * @fires scaleclear after the scale settings have been cleared\n */\n clearScale: function clearScale() {\n if (this.is('rendered')) {\n resetScale();\n\n /**\n * @event scaleclear\n */\n this.trigger('scaleclear');\n }\n\n return this;\n },\n\n /**\n * Computes and applies the scale settings on the devices previewer\n * @param {Number} width\n * @param {Number} height\n * @returns {devicesPreviewer}\n * * @fires scalechange after the scale settings have been applied\n */\n applyScale: function applyScale(width, height) {\n var frameSize, frameMargins, scaleFactor;\n\n if (this.is('rendered')) {\n resetScale();\n\n frameSize = this.getFrameSize();\n frameMargins = this.getFrameMargins();\n scaleFactor = this.getScaleFactor(width, height);\n\n controls.$previewContent\n .width(width)\n .height(height);\n\n controls.$previewContainer\n .css('left', (frameSize.width - (width + frameMargins.width) * scaleFactor) / 2)\n .width(width + frameMargins.width)\n .height(height + frameMargins.height);\n\n transformer.setTransformOrigin(controls.$previewContainer, 0, 0);\n transformer.scale(controls.$previewContainer, scaleFactor);\n\n /**\n * @event scalechange\n */\n this.trigger('scalechange');\n }\n\n return this;\n },\n\n /**\n * Computes and gets the margins of the previewer frame\n * @returns {size}\n */\n getFrameMargins: function getFrameMargins() {\n var margins = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n margins.width = controls.$previewContainer.outerWidth() - controls.$previewContent.width();\n margins.height = controls.$previewContainer.outerHeight() - controls.$previewContent.height();\n }\n return margins;\n },\n\n /**\n * Computes and gets the available size in the previewer frame\n * @returns {size}\n */\n getFrameSize: function getFrameSize() {\n var size = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n size.width = this.getContainer().innerWidth();\n size.height = this.getContainer().innerHeight();\n }\n return size;\n },\n\n /**\n * Computes and gets the scale factor of the previewer frame\n * @param {Number} width\n * @param {Number} height\n * @returns {Number}\n */\n getScaleFactor: function getScaleFactor(width, height) {\n var margins, frameSize;\n var scaleFactor = {\n x: 1,\n y: 1\n };\n if (this.is('rendered') && this.isDeviceMode()) {\n frameSize = this.getFrameSize();\n margins = this.getFrameMargins();\n width += margins.width;\n height += margins.height;\n\n if (width > frameSize.width) {\n scaleFactor.x = frameSize.width / width;\n }\n\n if (height > frameSize.height) {\n scaleFactor.y = frameSize.height / height;\n }\n }\n return Math.min(scaleFactor.x, scaleFactor.y);\n },\n\n /**\n * Wraps the previewed content into the previewer frame\n * @param {HTMLElement|jQuery} element\n * @returns {devicesPreviewer}\n * @fires wrap after the element has been wrapped\n */\n wrap: function wrap(element) {\n if (this.is('rendered')) {\n // restore current wrapped element to its previous place\n this.unwrap();\n\n // move the element to wrap in the preview container\n controls.$wrappedElement = $(element);\n controls.$wrappedElementContainer = controls.$wrappedElement.parent();\n controls.$previewContent.append(controls.$wrappedElement);\n\n /**\n * @event wrap\n * @param {jQuery} $wrappedElement - The element that has been wrapped\n */\n this.trigger('wrap', controls.$wrappedElement);\n }\n\n return this;\n },\n\n /**\n * Unwraps the previewed content from the previewer frame\n * @returns {devicesPreviewer}\n * @fires unwrap after the element has been unwrapped\n */\n unwrap: function unwrap() {\n var $wasWrappedElement;\n if (this.is('rendered') && controls.$wrappedElement) {\n $wasWrappedElement = controls.$wrappedElement;\n\n // restore current wrapped element to its previous place\n controls.$wrappedElementContainer.append(controls.$wrappedElement);\n controls.$wrappedElement = null;\n controls.$wrappedElementContainer = null;\n\n /**\n * @event unwrap\n * @param {jQuery} $wrappedElement - The element that was wrapped\n */\n this.trigger('unwrap', $wasWrappedElement);\n }\n\n return this;\n }\n };\n\n // build and setup the component\n var devicesPreviewer = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesPreviewerTpl)\n\n // auto render on init\n .on('init', function () {\n var componentConfig = this.getConfig();\n\n // init the internal state\n this.setDeviceType(componentConfig.deviceType);\n this.setDeviceWidth(componentConfig.deviceWidth);\n this.setDeviceHeight(componentConfig.deviceHeight);\n this.setDeviceOrientation(componentConfig.deviceOrientation);\n\n // auto render on init\n _.defer(function () {\n devicesPreviewer.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var $element = this.getElement();\n controls = {\n // internal elements\n $previewContainer: $element.find('.preview-container'),\n $previewFrame: $element.find('.preview-frame'),\n $previewContent: $element.find('.preview-content'),\n\n // placeholder for the wrapped element\n $wrappedElement: null,\n $wrappedElementContainer: null\n };\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable enable', function () {\n var self = this;\n if (this.is('rendered')) {\n // need to defer the call as the enable/disable events are emitted before the state is updated\n _.defer(function () {\n self.previewDevice();\n });\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n this.unwrap();\n controls = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesPreviewer.init(config);\n });\n\n return devicesPreviewer;\n }\n\n return devicesPreviewerFactory;\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector', ['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 \n\n\n return \"
            \\n
            \\n
            \\n
            \\n
            \\n
            \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector', ['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, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector',[],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) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/selecter',\n 'taoQtiTestPreviewer/previewer/helpers/devices',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css'\n], function ($, _, __, componentFactory, lookupSelecter, devicesHelper, devicesSelectorTpl, selectorTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} selectorEntry\n * @property {String} value - The value that identifies the entry\n * @property {String} label - The text displayed to describe the entry\n */\n\n /**\n * @typedef {selectorEntry} mainSelectorEntry\n * @property {Boolean} devicesList - tells if a list of devices is expected\n * @property {Boolean} orientation - tells if a list of orientations is expected\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n type: 'standard',\n device: null,\n orientation: 'landscape'\n };\n\n /**\n * List of available types of devices\n * @type {mainSelectorEntry[]}\n */\n var deviceTypesList = [{\n value: 'standard',\n label: __('Actual size'),\n devicesList: false,\n orientation: false\n }, {\n value: 'desktop',\n label: __('Desktop preview'),\n devicesList: true,\n orientation: false\n }, {\n value: 'mobile',\n label: __('Mobile preview'),\n devicesList: true,\n orientation: true\n }];\n\n /**\n * List of available orientations\n * @type {selectorEntry[]}\n */\n var deviceOrientationsList = [{\n value: 'landscape',\n label: __('Landscape')\n }, {\n value: 'portrait',\n label: __('Portrait')\n }];\n\n /**\n * Map selector's names to setter callbacks.\n * This will be used to call the expected setter when selecting a value.\n * @see devicesSelector.select()\n * @type {Object}\n */\n var callbackMap = {\n type: 'setType',\n device: 'setDevice',\n mobile: 'setDevice',\n desktop: 'setDevice',\n orientation: 'setOrientation'\n };\n\n /**\n * Gets the data for a selected entry\n * @param {String} selected\n * @param {selectorEntry[]|deviceScreen[]} list\n * @returns {selectorEntry|deviceScreen|null}\n */\n function getSelectorData(selected, list) {\n if (selected && _.size(list)) {\n return _.find(list, {value: selected}) || null;\n }\n return null;\n }\n\n /**\n * Ensures an identifier is valid with respect to the provided list, or defaulted to null.\n * @param {String} identifier\n * @param {selectorEntry[]} list\n * @returns {String|null}\n */\n function getValidIdentifier(identifier, list) {\n if (list && list.length) {\n if (_.find(list, {value: identifier})) {\n return identifier;\n } else {\n return _.first(list).value;\n }\n }\n return null;\n }\n\n /**\n * Update a Select2 control\n * @param {jQuery} $selector\n * @param {String} value\n * @returns {jQuery}\n */\n function updateSelect2($selector, value) {\n var current = $selector.val();\n // avoid to stress the setters if the value is already set\n if (current !== value) {\n $selector.val(value);\n $selector.trigger('change');\n }\n return $selector;\n }\n\n /**\n * Uninstalls a Select2 control\n * @param {jQuery} $selector\n * @returns {jQuery}\n */\n function removeSelect2($selector) {\n if ($selector.hasClass(\"select2-offscreen\")) {\n $selector.select2('destroy');\n }\n return $selector;\n }\n\n /**\n * Builds a devices selector component. It will provides 3 selectors in cascade:\n * - the first allows to select the type of device\n * - the second allows to select the device itself, the list being filtered by the value of the first selector\n * - the third allows to select the display orientation, if applicable\n *\n * @example\n * var devicesSelector = devicesSelectorFactory('.previewer .previewer-top-bar);\n * ...\n * // react to type change\n * devicesSelector.on('typechange', function(type) {\n * if (!this.isDeviceMode()) {\n * // reset the type to standard, we can re-apply the default size\n * }\n * });\n *\n * // react to device change\n * devicesSelector.on('devicechange', function(device, data) {\n * // apply the size provided in data\n * });\n *\n * // react to orientation change\n * devicesSelector.on('orientationchange', function(orientation) {\n * // apply the orientation\n * });\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.type='standard'] - The default selected device type\n * @param {String} [config.device=null] - The default selected device\n * @param {String} [config.orientation='landscape'] - The default selected orientation\n * @returns {devicesSelector}\n * @fires ready - When the component is ready to work\n */\n function devicesSelectorFactory(container, config) {\n // internal state\n var selected = {\n type: null,\n device: null,\n orientation: null,\n desktop: null,\n mobile: null\n };\n var devicesList = [];\n var typeData = null;\n var controls = null;\n\n /**\n * Changes a DOM property on each selector\n * @param {String} property\n * @param {String|Boolean|Number} value\n */\n var setControlsProp = function setControlsProp(property, value) {\n _.forEach(controls, function($selector) {\n $selector.prop(property, value);\n });\n };\n\n // component specific API\n var api = {\n /**\n * Tells if the selector has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return selected.type !== 'standard';\n },\n\n /**\n * Reflects the mode to the DOM\n * @returns {devicesSelector}\n */\n updateMode: function updateMode() {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n if (this.is('rendered')) {\n this.getElement().attr('data-type', selected.type);\n }\n return this;\n },\n\n /**\n * Gets the selected device type.\n * @returns {String} The type of device, from the list `['standard', 'mobile', 'desktop']`\n */\n getType: function getType() {\n return selected.type;\n },\n\n /**\n * Gets the selected device orientation.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String}\n */\n getOrientation: function getOrientation() {\n if (typeData && typeData.orientation) {\n return selected.orientation;\n }\n return null;\n },\n\n /**\n * Gets the identifier of the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String|null}\n */\n getDevice: function getDevice() {\n if (typeData && typeData.devicesList) {\n return selected.device;\n }\n return null;\n },\n\n /**\n * Gets the data for the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {deviceScreen|null}\n */\n getDeviceData: function getDeviceData() {\n return getSelectorData(this.getDevice(), devicesList);\n },\n\n /**\n * Selects a type of device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires typechange event after the type has been changed\n * @fires devicechange event after the device has been updated if a list of devices is expected\n */\n setType: function setType(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceTypesList);\n if (identifier !== selected.type) {\n selected.type = identifier;\n selected.device = null;\n\n // when the type changes, the list of devices must be updated\n devicesList = devicesHelper.getDevicesByType(selected.type);\n typeData = getSelectorData(selected.type, deviceTypesList);\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$typeSelector, selected.type);\n this.updateMode();\n }\n\n /**\n * @event typechange\n * @param {String} selectedType\n */\n this.trigger('typechange', selected.type);\n\n // the current device must be adapted if a list of devices is expected\n if (typeData.devicesList) {\n this.setDevice(selected[selected.type]);\n }\n }\n return this;\n },\n\n /**\n * Sets the selected device orientation\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires orientationchange event after the type has been changed\n */\n setOrientation: function setOrientation(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceOrientationsList);\n if (identifier !== selected.orientation) {\n selected.orientation = identifier;\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$orientationSelector, selected.orientation);\n }\n\n /**\n * @event orientationchange\n * @param {String} selectedOrientation\n */\n this.trigger('orientationchange', selected.orientation);\n }\n return this;\n },\n\n /**\n * Selects a device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires devicechange event after the device has been changed\n */\n setDevice: function setDevice(identifier) {\n var $selector;\n\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, devicesList);\n if (identifier !== selected.device) {\n selected.device = identifier;\n selected[selected.type] = identifier;\n\n // update the rendered content, depending on the device's category\n if (this.is('rendered') && this.isDeviceMode()) {\n $selector = controls['$' + selected.type + 'Selector'];\n if ($selector) {\n updateSelect2($selector, selected.device);\n }\n }\n\n /**\n * @event devicechange\n * @param {String} selectedDevice\n * @param {deviceScreen} deviceData\n */\n this.trigger('devicechange', selected.device, this.getDeviceData());\n }\n return this;\n },\n\n /**\n * Selects a value in the proper selector\n * @param {String} name - The name of the selector\n * @param {String} value - The value to select\n * @returns {devicesSelector}\n */\n select: function select(name, value) {\n var setterName = callbackMap[name];\n if (setterName && _.isFunction(this[setterName])) {\n this[setterName](value);\n }\n return this;\n },\n\n /**\n * Reset to default values, from the config.\n * @returns {devicesSelector}\n */\n reset: function reset() {\n var componentConfig = this.getConfig();\n this.setType(componentConfig.type);\n this.setDevice(componentConfig.device);\n this.setOrientation(componentConfig.orientation);\n return this;\n }\n };\n\n // build and setup the component\n var devicesSelector = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesSelectorTpl)\n\n // auto render on init\n .on('init', function () {\n // ensure the initial state is aligned with the config\n this.reset();\n\n // auto render on init\n _.defer(function () {\n devicesSelector.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n /**\n * Renders a selector from a list of entries. Takes care of the currently selected value.\n * @param {String} name - The name of the selector\n * @param {selectorEntry[]} list - The list of entries\n * @param {String} selectedValue - The currently selected value\n * @param {String} [category=name] - The category of the selector (type, device, orientation).\n * Defaulted to the name if not provided.\n * @returns {jQuery}\n */\n function renderSelector(name, list, selectedValue, category) {\n var $selector = $(selectorTpl({\n name: name,\n category: category || name,\n items: _.map(list, function(item) {\n return {\n value: item.value,\n label: item.label,\n selected: selectedValue === item.value\n };\n })\n }));\n self.getElement().find('.' + name + '-selector').html($selector);\n return $selector;\n }\n\n // create each selector, and keep access to them\n controls = {\n $typeSelector: renderSelector('type', deviceTypesList, selected.type),\n $desktopSelector: renderSelector('desktop', devicesHelper.getDesktopDevices(), selected.device, 'device'),\n $mobileSelector: renderSelector('mobile', devicesHelper.getMobileDevices(), selected.device, 'device'),\n $orientationSelector: renderSelector('orientation', deviceOrientationsList, selected.orientation)\n };\n lookupSelecter(this.getElement());\n\n // react to any change in selectors and then forward the event to the related entry\n this.getElement().on('change', '.selector', function onSelectorChange(e) {\n var $selector = $(e.target).closest('select');\n self.select($selector.attr('name'), $selector.val());\n });\n\n // initialize the display mode\n this.updateMode();\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", true);\n }\n })\n .on('enable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", false);\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n _.forEach(controls, removeSelect2);\n controls = null;\n selected = null;\n typeData = null;\n devicesList = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesSelector.init(config);\n });\n\n return devicesSelector;\n }\n\n return devicesSelectorFactory;\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) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Responsive Scale plugin : Scale\n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',[\n 'jquery',\n 'lodash',\n 'lib/uuid',\n 'util/namespace',\n 'taoTests/runner/plugin',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector'\n], function (\n $,\n _,\n uuid,\n namespaceHelper,\n pluginFactory,\n devicesPreviewerFactory,\n devicesSelectorFactory\n) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'scale',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.readOnly;\n }\n\n // generate unique id for global events\n this.nsId = this.getName() + uuid(6);\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n })\n .on('resizeitem', function (size, orientation, type) {\n if (self.devicesPreviewer) {\n self.devicesPreviewer\n .setDeviceType(type)\n .setDeviceOrientation(orientation)\n .setDeviceWidth(size && size.width)\n .setDeviceHeight(size && size.height)\n .previewDevice();\n }\n })\n .on('enablenav', function () {\n self.enable();\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n * Renders plugins controls on proper place\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var areaBroker = this.getAreaBroker();\n\n /**\n * Triggers an item resize based on the current selected device\n */\n function resizeItem() {\n if (self.devicesSelector && self.getState('enabled')) {\n /**\n * @event resizeitem\n * @param {deviceScreen} deviceData - The device data, containing width and height\n * @param {String} orientation - The device orientation\n * @param {String} type - The type of device\n */\n testRunner.trigger(\n 'resizeitem',\n self.devicesSelector.getDeviceData(),\n self.devicesSelector.getOrientation(),\n self.devicesSelector.getType()\n );\n }\n }\n\n /**\n * adjust device frame position and size when browser size change\n */\n $(window).on(namespaceHelper.namespaceAll('resize orientationchange', this.nsId), _.throttle(function () {\n if (self.devicesSelector && self.devicesSelector.isDeviceMode()) {\n resizeItem();\n }\n }, 50));\n\n return Promise.all([\n new Promise(function (resolve) {\n self.devicesSelector = devicesSelectorFactory(areaBroker.getHeaderArea())\n .on('ready', function () {\n if (!self.getState('enabled')) {\n this.disable();\n }\n\n this.on('typechange', function () {\n if (!this.isDeviceMode()) {\n resizeItem();\n }\n });\n\n this.on('devicechange orientationchange', function () {\n resizeItem();\n });\n\n resolve();\n });\n }),\n new Promise(function (resolve) {\n self.devicesPreviewer = devicesPreviewerFactory(areaBroker.getArea('contentWrapper'))\n .on('ready', function () {\n this.wrap(areaBroker.getContentArea());\n resolve();\n });\n })\n ]);\n },\n\n /**\n * Called during the runner's destroy phase\n * clears all controls tied to applications DOM\n * detaches the global events\n */\n destroy: function destroy() {\n if (this.nsId) {\n $(window).off('.' + this.nsId);\n }\n if (this.devicesSelector) {\n this.devicesSelector.destroy();\n }\n if (this.devicesPreviewer) {\n this.devicesPreviewer.destroy();\n }\n this.devicesSelector = null;\n this.devicesPreviewer = null;\n },\n\n /**\n * Enable default controls\n */\n enable: function enable() {\n if (this.devicesSelector) {\n this.devicesSelector.enable();\n }\n },\n\n /**\n * Disable default controls\n */\n disable: function disable() {\n if (this.devicesSelector) {\n this.devicesSelector.disable();\n }\n },\n\n /**\n * Show default controls\n */\n show: function show() {\n if (this.devicesSelector) {\n this.devicesSelector.show();\n }\n },\n\n /**\n * Hide default controls\n */\n hide: function hide() {\n if (this.devicesSelector) {\n this.devicesSelector.hide();\n }\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item', ['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 \n\n\n return \"
            \\n
            \\n
            \\n
            \\n
            \\n
              \\n
              \\n
              \\n
              \\n\\n
              \\n\\n \\n\\n
              \\n
              \\n
              \\n
              \\n\\n \\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) 2018-2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner provider for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/provider/item/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/feedback',\n 'taoTests/runner/areaBroker',\n 'taoTests/runner/testStore',\n 'taoTests/runner/proxy',\n 'taoQtiTest/runner/ui/toolbox/toolbox',\n 'taoQtiItem/runner/qtiItemRunner',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'taoQtiItem/qtiCommonRenderer/helpers/container',\n 'tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item'\n], function (\n $,\n _,\n __,\n feedback,\n areaBrokerFactory,\n testStoreFactory,\n proxyFactory,\n toolboxFactory,\n qtiItemRunner,\n assetManagerFactory,\n assetStrategies,\n containerHelper,\n layoutTpl\n) {\n 'use strict';\n\n //the asset strategies\n const assetManager = assetManagerFactory();\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n //store the current execution context of the common renderer (preview)\n let _$previousContext = null;\n function setContext($context){\n _$previousContext = containerHelper.getContext();\n containerHelper.setContext($context);\n }\n function restoreContext(){\n containerHelper.setContext(_$previousContext);\n _$previousContext = null;\n }\n /**\n * A Test runner provider to be registered against the runner\n */\n return {\n\n //provider name\n name: 'qtiItemPreviewer',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker() {\n const $layout = $(layoutTpl());\n\n return areaBrokerFactory($layout, {\n contentWrapper: $('.content-wrapper', $layout),\n content: $('#qti-content', $layout),\n toolbox: $('.bottom-action-bar .tools-box', $layout),\n navigation: $('.bottom-action-bar .navi-box-list', $layout),\n control: $('.top-action-bar .control-box', $layout),\n actionsBar: $('.bottom-action-bar .control-box', $layout),\n panel: $('.test-sidebar-left', $layout),\n header: $('.top-action-bar .tools-box', $layout),\n context: $('.top-action-bar .navi-box-list', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy() {\n const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();\n return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore() {\n const config = this.getConfig();\n\n //the test run needs to be identified uniquely\n const identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n\n /**\n * Installation of the provider, called during test runner init phase.\n */\n install() {\n const {plugins} = this.getConfig().options;\n if (plugins) {\n _.forEach(this.getPlugins(), plugin => {\n if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {\n const config = plugins[plugin.getName()];\n if (_.isPlainObject(config)) {\n plugin.setConfig(config);\n }\n }\n });\n }\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init() {\n const dataHolder = this.getDataHolder();\n const areaBroker = this.getAreaBroker();\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n\n /*\n * Install behavior on events\n */\n this\n .on('submititem', () => {\n const itemState = this.itemRunner.getState();\n const itemResponses = this.itemRunner.getResponses();\n\n this.trigger('disabletools disablenav');\n this.trigger('submitresponse', itemResponses, itemState);\n\n return this.getProxy()\n .submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)\n .then(response => {\n this.trigger('scoreitem', response);\n this.trigger('enabletools enablenav resumeitem');\n })\n .catch(err => {\n this.trigger('enabletools enablenav');\n\n //some server errors are valid, so we don't fail (prevent empty responses)\n if (err.code === 200) {\n this.trigger('alert.submitError',\n err.message || __('An error occurred during results submission. Please retry.'),\n () => this.trigger('resumeitem')\n );\n }\n });\n })\n .on('ready', () => {\n const itemIdentifier = dataHolder.get('itemIdentifier');\n const itemData = dataHolder.get('itemData');\n\n if (itemIdentifier) {\n if (itemData) {\n this.renderItem(itemIdentifier, itemData);\n } else {\n this.loadItem(itemIdentifier);\n }\n }\n })\n .on('loaditem', (itemRef, itemData) => {\n dataHolder.set('itemIdentifier', itemRef);\n dataHolder.set('itemData', itemData);\n })\n .on('renderitem', () => {\n this.trigger('enabletools enablenav');\n })\n .on('resumeitem', () => {\n this.trigger('enableitem enablenav');\n })\n .on('disableitem', () => {\n this.trigger('disabletools');\n })\n .on('enableitem', () => {\n this.trigger('enabletools');\n })\n .on('error', () => {\n this.trigger('disabletools enablenav');\n })\n .on('finish leave', () => {\n this.trigger('disablenav disabletools');\n this.flush();\n })\n .on('flush', () => {\n this.destroy();\n });\n\n return this.getProxy()\n .init()\n .then(data => {\n dataHolder.set('itemIdentifier', data.itemIdentifier);\n dataHolder.set('itemData', data.itemData);\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render() {\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n config.renderTo.append(areaBroker.getContainer());\n\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier);\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem(itemIdentifier, itemData) {\n const areaBroker = this.getAreaBroker();\n const options = this.getConfig().options;\n\n const changeState = () => {\n this.setItemState(itemIdentifier, 'changed', true);\n };\n\n setContext(areaBroker.getContentArea());\n\n return new Promise((resolve, reject) => {\n assetManager.setData('baseUrl', itemData.baseUrl);\n\n itemData.content = itemData.content || {};\n\n this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({\n assetManager: assetManager\n }, options))\n .on('error', err => {\n this.trigger('enablenav');\n reject(err);\n feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));\n })\n .on('init', function onItemRunnerInit() {\n const {state, portableElements} = itemData;\n this.render(areaBroker.getContentArea(), {state, portableElements});\n })\n .on('render', function onItemRunnerRender() {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n })\n .init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem() {\n this.trigger('beforeunloaditem disablenav disabletools');\n\n if (this.itemRunner) {\n return new Promise(resolve => {\n this.itemRunner\n .on('clear', resolve)\n .clear();\n });\n }\n return Promise.resolve();\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n */\n destroy() {\n const areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner\n .on('clear', restoreContext)\n .clear();\n }\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promiseQueue',\n 'core/request',\n 'taoQtiTestPreviewer/previewer/config/item'\n], function($, _, __, promiseQueue, coreRequest, configFactory) {\n 'use strict';\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n\n name : 'qtiItemPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install : function install(){\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams){\n\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse'];\n\n if(_.isPlainObject(actionParams)){\n return _.mapValues(actionParams, function(value, key){\n if(_.contains(stringifyParams, key)){\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n })\n .then(function(response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n })\n .catch(function(error) {\n if (error.data && self.isConnectivityError(error.data)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(this.configStorage.getTestActionUrl('init'), params);\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params);\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), body);\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('@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:\\'\\';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;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}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-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}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\\\" \\\";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\\\"btn-\\\"],.section-container .content-block [class*=\\\" btn-\\\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-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 - 0px)}.item-previewer-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}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\\\"Andale Mono WT\\\",\\\"Andale Mono\\\",\\\"Lucida Console\\\",\\\"Lucida Sans Typewriter\\\",\\\"DejaVu Sans Mono\\\",\\\"Bitstream Vera Sans Mono\\\",\\\"Liberation Mono\\\",\\\"Nimbus Mono L\\\",Monaco,\\\"Courier New\\\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-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}.item-previewer-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}.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;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:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-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}.item-previewer-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:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"],.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame{border-radius:5px;padding:30px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\\\"standard\\\"] .desktop-selector,.devices-selector[data-type=\\\"standard\\\"] .mobile-selector,.devices-selector[data-type=\\\"standard\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"desktop\\\"] .mobile-selector,.devices-selector[data-type=\\\"desktop\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"mobile\\\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */');\n","\ndefine(\"taoQtiTestPreviewer/loader/qtiPreviewer.bundle\", function(){});\n","define(\"taoQtiTestPreviewer/loader/qtiPreviewer.min\", [\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\",\"taoQtiTest/loader/taoQtiTestRunner.min\",\"taoQtiTest/loader/testPlugins.min\"], function(){});\n"]} \ No newline at end of file +{"version":3,"sources":["../previewer/runner!tpl","../previewer/runner.js","../previewer/provider/item/css/item!css","../previewer/component/qtiItem.js","../previewer/adapter/item/qtiItem.js","../previewer/config/item.js","../previewer/resources/devices.json!json","../previewer/helpers/devices.js","../previewer/plugins/content/enhancedReadOnlyMode.js","../previewer/plugins/controls/close.js","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line","tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer","../previewer/plugins/navigation/submit/submit.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer","../previewer/plugins/tools/scale/component/css/devicesPreviewer!css","../previewer/plugins/tools/scale/component/devicesPreviewer.js","tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector","../previewer/plugins/tools/scale/component/tpl/selector!tpl","../previewer/plugins/tools/scale/component/css/devicesSelector!css","../previewer/plugins/tools/scale/component/devicesSelector.js","../previewer/plugins/tools/scale/scale.js","../previewer/provider/item/tpl/item!tpl","../previewer/provider/item/item.js","../previewer/proxy/item.js","onLayerEnd0.js","module-create.js","/Users/aleksej/Work/tao/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["\ndefine('tpl!taoQtiTestPreviewer/previewer/runner', ['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 \n\n\n return \"
              \";\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Component that embeds the QTI previewer for tests and items\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/runner',[\n 'taoTests/runner/runnerComponent',\n 'tpl!taoQtiTestPreviewer/previewer/runner'\n], function (runnerComponentFactory, runnerTpl) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The testRunner options\n * @param {String} [config.provider] - The provider to use\n * @param {Object[]} [config.providers] - A collection of providers to load.\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Boolean} [config.options.fullPage] - Force the previewer to occupy the full window.\n * @param {Booleanh} [config.options.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function previewerFactory(container, config = {}, template = null) {\n\n return runnerComponentFactory(container, config, template || runnerTpl)\n .on('render', function() {\n const { fullPage, readOnly, hideActionBars } = this.getConfig().options;\n this.setState('fullpage', fullPage);\n this.setState('readonly', readOnly);\n this.setState('hideactionbars', hideActionBars);\n })\n .on('ready', function(runner) {\n runner.on('destroy', () => this.destroy() );\n });\n };\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/provider/item/css/item',[],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) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/component/qtiItem',[\n 'context',\n 'taoQtiTestPreviewer/previewer/runner',\n 'css!taoQtiTestPreviewer/previewer/provider/item/css/item'\n], function (context, previewerFactory) {\n 'use strict';\n\n /**\n * Builds a test runner to preview test item\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} [config] - The testRunner options\n * @param {String} [config.itemUri] - The URI of the item to load\n * @param {Object} [config.itemState] - The state of the item when relevant\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {Object[]} [config.pluginsOptions] - Options for the plugins\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @param {Function} [template] - An optional template for the component\n * @returns {previewer}\n */\n return function qtiItemPreviewerFactory(container, config = {}, template = null) {\n\n const testRunnerConfig = {\n testDefinition: 'test-container',\n serviceCallId: 'previewer',\n providers: {\n runner: {\n id: 'qtiItemPreviewer',\n module: 'taoQtiTestPreviewer/previewer/provider/item/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'runner'\n },\n proxy: {\n id: 'qtiItemPreviewerProxy',\n module: 'taoQtiTestPreviewer/previewer/proxy/item',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'proxy'\n },\n communicator: {\n id: 'request',\n module: 'core/communicator/request',\n bundle: 'loader/vendor.min',\n category: 'communicator'\n },\n plugins: config.plugins || []\n },\n options: {\n view: config.view,\n readOnly: config.readOnly,\n fullPage: config.fullPage,\n plugins: config.pluginsOptions,\n hideActionBars: config.hideActionBars,\n }\n };\n\n //extra context config\n testRunnerConfig.loadFromBundle = !!context.bundle;\n\n return previewerFactory(container, testRunnerConfig, template)\n .on('ready', runner => {\n if (config.itemState) {\n runner.on('renderitem', () => runner.itemRunner.setState(config.itemState));\n }\n if (config.itemUri) {\n return runner.loadItem(config.itemUri);\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) 2019 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/adapter/item/qtiItem',[\n 'lodash',\n 'core/logger',\n 'taoQtiTestPreviewer/previewer/component/qtiItem',\n 'ui/feedback'\n], function (_, loggerFactory, qtiItemPreviewerFactory, feedback) {\n 'use strict';\n\n const logger = loggerFactory('taoQtiTest/previewer');\n\n /**\n * List of required plugins that should be loaded in order to make the previewer work properly\n * @type {Object[]}\n */\n const defaultPlugins = [{\n module: 'taoQtiTestPreviewer/previewer/plugins/controls/close',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'controls'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'navigation'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'tools'\n }, {\n module: 'taoQtiTest/runner/plugins/tools/itemThemeSwitcher/itemThemeSwitcher',\n bundle: 'taoQtiTest/loader/testPlugins.min',\n category: 'tools'\n }, {\n module: 'taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',\n bundle: 'taoQtiTestPreviewer/loader/qtiPreviewer.min',\n category: 'content'\n }];\n\n /**\n * Wraps the legacy item previewer in order to be loaded by the taoItems previewer factory\n */\n return {\n name: 'qtiItem',\n\n /**\n * Builds and shows the legacy item previewer\n *\n * @param {String} uri - The URI of the item to load\n * @param {Object} state - The state of the item\n * @param {Object} [config] - Some config entries\n * @param {Object[]} [config.plugins] - Additional plugins to load\n * @param {String} [config.fullPage] - Force the previewer to occupy the full window.\n * @param {String} [config.readOnly] - Do not allow to modify the previewed item.\n * @returns {Object}\n */\n init(uri, state, config = {}) {\n config.itemUri = uri;\n config.itemState = state;\n config.plugins = Array.isArray(config.plugins) ? [...defaultPlugins, ...config.plugins] : defaultPlugins;\n return qtiItemPreviewerFactory(window.document.body, config)\n .on('error', function (err) {\n if (!_.isUndefined(err.message)) {\n feedback().error(err.message);\n } else {\n logger.error(err);\n }\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) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Config manager for the proxy of the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/config/item',[\n 'lodash',\n 'util/url',\n 'util/config'\n], function(_, urlUtil, configHelper) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n bootstrap : {\n serviceController : 'Previewer',\n serviceExtension : 'taoQtiTestPreviewer'\n }\n };\n\n /**\n * The list of handled config entries. Each required entry is set to true, while optional entries are set to false.\n * @type {Object}\n * @private\n */\n var _entries = {\n serviceCallId : true,\n bootstrap : false,\n timeout : false\n };\n\n /**\n * Creates a config object for the proxy implementation\n * @param {Object} config - Some required and optional config\n * @param {String} config.serviceCallId - An identifier for the service call\n * @param {String} [config.bootstrap.serviceController] - The name of the service controller\n * @param {String} [config.bootstrap.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n return function itemPreviewerConfigFactory(config) {\n // protected storage\n var storage = configHelper.from(config, _entries, _defaults);\n var undef;\n\n // convert some values from seconds to milliseconds\n if (storage.timeout) {\n storage.timeout *= 1000;\n } else {\n storage.timeout = undef;\n }\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the list of parameters\n * @param {String|Object} [itemIdentifier]\n * @returns {Object}\n */\n getParameters: function getParameters(itemIdentifier) {\n var type = typeof itemIdentifier;\n var parameters = {\n serviceCallId : this.getServiceCallId()\n };\n\n if (type === 'string') {\n // simple item identifier\n parameters.itemUri = itemIdentifier;\n // structured item identifier (a list of parameters)\n } else if (type === 'object' && _.isPlainObject(itemIdentifier)) {\n _.merge(parameters, itemIdentifier);\n } else if (type !== 'undefined') {\n throw new TypeError('Wrong parameter type provided for itemIdentifier: ' + type + '. Only string or plain object are allowed!');\n }\n\n return parameters;\n },\n\n /**\n * Gets the URI of the service call\n * @returns {String}\n */\n getServiceCallId : function getServiceCallId() {\n return storage.serviceCallId;\n },\n\n /**\n * Gets the name of the service controller\n * @returns {String}\n */\n getServiceController : function getServiceController() {\n return storage.bootstrap.serviceController || _defaults.bootstrap.serviceController;\n },\n\n /**\n * Gets the name of the extension containing the service controller\n * @returns {String}\n */\n getServiceExtension : function getServiceExtension() {\n return storage.bootstrap.serviceExtension || _defaults.bootstrap.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getTestActionUrl : function getTestActionUrl(action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters());\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String|Object} itemIdentifier - The URI of the item\n * @param {String} action - the name of the action to request\n * @returns {String} - Returns the URL\n */\n getItemActionUrl : function getItemActionUrl(itemIdentifier, action) {\n return urlUtil.route(action, this.getServiceController(), this.getServiceExtension(), this.getParameters(itemIdentifier));\n },\n\n /**\n * Gets the request timeout\n * @returns {Number}\n */\n getTimeout : function getTimeout() {\n return storage.timeout;\n }\n };\n };\n});\n\n","\ndefine(\"json!taoQtiTestPreviewer/previewer/resources/devices.json\", function(){ return {\n \"tablets\": {\n \"193986c3715c81838870f908fa98d69a\": {\n \"label\": \"Amazon Kindle Fire HDX 7\\u2033\",\n \"width\": 960,\n \"height\": 600\n },\n \"4e8eafab11aad1486992d7ee2c8c16ca\": {\n \"label\": \"Apple iPad\",\n \"width\": 1024,\n \"height\": 768\n },\n \"5aac2932d9ad00d6d8a1604b8f9e4e8d\": {\n \"label\": \"Google Nexus 10, Motorola Xoom, Xyboard\",\n \"width\": 1280,\n \"height\": 800\n },\n \"9805d9753ad08c7630a9ee5418aa6c6c\": {\n \"label\": \"Google Nexus 7\",\n \"width\": 966,\n \"height\": 604\n },\n \"d4a431cedf4705d6bf2cba6d5788378b\": {\n \"label\": \"Samsung Galaxy Tab 7.7, 8.9, 10.1\",\n \"width\": 1280,\n \"height\": 800\n }\n },\n \"phones\": {\n \"1b89338531ef0155c8d6abc2ac02c81a\": {\n \"label\": \"Apple iPhone 3GS\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1,\n \"dpWidth\": 320,\n \"dpHeight\": 480\n },\n \"3f89da99d84214cde7df87ebe0699a6f\": {\n \"label\": \"Apple iPhone 4\",\n \"width\": 640,\n \"height\": 960,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 1920\n },\n \"0d36971a5b98b367f54ced708c9af849\": {\n \"label\": \"Apple iPhone 5\",\n \"width\": 640,\n \"height\": 1136,\n \"scaleFactor\": 2,\n \"dpWidth\": 320,\n \"dpHeight\": 2272\n },\n \"026beffcc051af995660ebdede986ace\": {\n \"label\": \"BlackBerry Z10\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"fd2dd53e667d6d49e4fa73356fa941dd\": {\n \"label\": \"BlackBerry Z30\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"707584c1ae17d9b5b2cbe8603c91c147\": {\n \"label\": \"Google Nexus 4\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"91823264de952e7f2347e07db5c4058b\": {\n \"label\": \"Google Nexus 5\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"cd69817a6e147e8a4677389e56fcf568\": {\n \"label\": \"Google Nexus S\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"75994faa6a38e31e99b53fcd75534a33\": {\n \"label\": \"HTC Evo, Touch HD, Desire HD, Desire\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0cab4dfccdfc880687cb608cfe4159db\": {\n \"label\": \"HTC One X, EVO LTE\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"c4ff41fcba24d74fc21dc3490ca1edc9\": {\n \"label\": \"HTC Sensation, Evo 3D\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 360,\n \"dpHeight\": 1440\n },\n \"fa969a5e0dd2de53700eeee4ba4ba142\": {\n \"label\": \"LG Optimus 2X, Optimus 3D, Optimus Black\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"33c4f9364e295ec03531f3a3425819cf\": {\n \"label\": \"LG Optimus G\",\n \"width\": 768,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 384,\n \"dpHeight\": 2560\n },\n \"bc47f5275f0efd56fee52d43a8082981\": {\n \"label\": \"LG Optimus LTE, Optimus 4X HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1.7,\n \"dpWidth\": 424,\n \"dpHeight\": 2176\n },\n \"0732887e6e324fd10777b735520a34cf\": {\n \"label\": \"LG Optimus One\",\n \"width\": 320,\n \"height\": 480,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 213,\n \"dpHeight\": 720\n },\n \"2e38a78364f09d0da0e9e1a3a68e7fb0\": {\n \"label\": \"Motorola Defy, Droid, Droid X, Milestone\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1281\n },\n \"bd4b78dddc7c9625a4141a1b1ddabb87\": {\n \"label\": \"Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2\",\n \"width\": 540,\n \"height\": 960,\n \"scaleFactor\": 1,\n \"dpWidth\": 540,\n \"dpHeight\": 960\n },\n \"3bf1edf21cfa81006183d2b02974c84e\": {\n \"label\": \"Motorola Droid Razr HD\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 1,\n \"dpWidth\": 720,\n \"dpHeight\": 1280\n },\n \"ab5a352e0e016b97dac986f06c394f55\": {\n \"label\": \"Nokia C5, C6, C7, N97, N8, X7\",\n \"width\": 360,\n \"height\": 640,\n \"scaleFactor\": 1,\n \"dpWidth\": 360,\n \"dpHeight\": 640\n },\n \"4826fb7d7257aeaac992ce699df41b3c\": {\n \"label\": \"Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"0a691ab20add7c432200f8fa6527b488\": {\n \"label\": \"Samsung Galaxy Note\",\n \"width\": 800,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 400,\n \"dpHeight\": 2560\n },\n \"9c23ee31be29960fbac9e9bbfc2fc7b0\": {\n \"label\": \"Samsung Galaxy Note 3\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 2,\n \"dpWidth\": 540,\n \"dpHeight\": 3840\n },\n \"92177c0508c1d73905a58e2338f2a81f\": {\n \"label\": \"Samsung Galaxy Note II\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"5222b8866dc4cc606725e16ffcc0a783\": {\n \"label\": \"Samsung Galaxy S III, Galaxy Nexus\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"37c1541e2bd55cfd0f4073b0ccdf68b3\": {\n \"label\": \"Samsung Galaxy S, S II, W\",\n \"width\": 480,\n \"height\": 800,\n \"scaleFactor\": 1.5,\n \"dpWidth\": 320,\n \"dpHeight\": 1200\n },\n \"2f7f64b7dda0144907ff300e83eed465\": {\n \"label\": \"Samsung Galaxy S4\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n },\n \"9c24f9057744dad56043702a9703127f\": {\n \"label\": \"Sony Xperia S, Ion\",\n \"width\": 720,\n \"height\": 1280,\n \"scaleFactor\": 2,\n \"dpWidth\": 360,\n \"dpHeight\": 2560\n },\n \"0a8b2732a016a9395c3af5f12dd9c0da\": {\n \"label\": \"Sony Xperia Sola, U\",\n \"width\": 480,\n \"height\": 854,\n \"scaleFactor\": 1,\n \"dpWidth\": 480,\n \"dpHeight\": 854\n },\n \"5a153d7f53d82dcb0801f041574a6a43\": {\n \"label\": \"Sony Xperia Z, Z1\",\n \"width\": 1080,\n \"height\": 1920,\n \"scaleFactor\": 3,\n \"dpWidth\": 360,\n \"dpHeight\": 5760\n }\n },\n \"screens\": {\n \"9e523ae15b61dc766f5c818726881ecf\": {\n \"label\": \"1920 \\u00d7 1080\",\n \"width\": 1920,\n \"height\": 1080,\n \"dpWidth\": 1920,\n \"dpHeight\": 1080,\n \"scaleFactor\": 1\n },\n \"07769cd8d0a7d09818b2f0b018042fb7\": {\n \"label\": \"1366 \\u00d7 768\",\n \"width\": 1366,\n \"height\": 768,\n \"dpWidth\": 1366,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"72d5478a24194f98b9378e8e0fd65737\": {\n \"label\": \"1280 \\u00d7 1024\",\n \"width\": 1280,\n \"height\": 1024,\n \"dpWidth\": 1280,\n \"dpHeight\": 1024,\n \"scaleFactor\": 1\n },\n \"b7a6dd5900cc72e61f0d3479c7e314ec\": {\n \"label\": \"1280 \\u00d7 800\",\n \"width\": 1280,\n \"height\": 800,\n \"dpWidth\": 1280,\n \"dpHeight\": 800,\n \"scaleFactor\": 1\n },\n \"43193b0ff671a37d8232ab664190a125\": {\n \"label\": \"1024 \\u00d7 768\",\n \"width\": 1024,\n \"height\": 768,\n \"dpWidth\": 1024,\n \"dpHeight\": 768,\n \"scaleFactor\": 1\n },\n \"c29e48814af5443ff5688d9e967ce917\": {\n \"label\": \"800 \\u00d7 600\",\n \"width\": 800,\n \"height\": 600,\n \"dpWidth\": 800,\n \"dpHeight\": 600,\n \"scaleFactor\": 1\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) 2019 Open Assessment Technologies SA;\n */\n/**\n * Helper to work with screen values and mobile devices list\n * for \"select device\" select-box on any test-item preview page\n * for example using scale plugin app/taoQtiTestPreviewer/views/js/previewer/plugins/tools/scale/scale.js\n *\n * @author Dieter Raber \n * @author Pavel Hendelman \n */\ndefine('taoQtiTestPreviewer/previewer/helpers/devices',[\n 'lodash',\n 'json!taoQtiTestPreviewer/previewer/resources/devices.json'\n], function (\n _,\n deviceList\n) {\n 'use strict';\n\n /**\n * @typedef {Object} deviceScreen\n * @property {String} value - The selector's value to use\n * @property {String} label - The label to display in the selector\n * @property {Number} width - The width of the screen\n * @property {Number} height - The height of the screen\n */\n\n /**\n * Translation map to convert a device type to a collection's name in the provided list.\n * @type {Object}\n */\n var deviceTypeMap = {\n 'mobile': 'tablets',\n 'desktop': 'screens'\n };\n\n /**\n * Helpers to get the list of devices\n */\n var devicesHelper = {\n /**\n * Gets the list of devices to test item through. This list is meant to be used by a selector.\n * @param {String} type - The type of device from the list ['mobile', 'desktop']\n * @returns {deviceScreen[]} - The list of devices to test item through, filtered by the provided type\n */\n getDevicesByType : function getDevicesByType(type) {\n /*\n * @todo\n * The device list is currently based on the devices found on the Chrome emulator.\n * This is not ideal and should be changed in the future.\n * I have http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density in mind but we\n * will need to figure what criteria to apply when generating the list.\n */\n var key = deviceTypeMap[type];\n\n return _.map(deviceList[key] || [], function mapDeviceData(device, identifier) {\n return {\n value: identifier,\n label: device.label,\n width: device.width,\n height: device.height\n };\n });\n },\n\n /**\n * Gets the list of mobile devices\n * @returns {deviceScreen[]} - The list of mobile devices to test item through\n */\n getMobileDevices: function getMobileDevices() {\n return devicesHelper.getDevicesByType('mobile');\n },\n\n /**\n * Gets the list of desktop devices\n * @returns {deviceScreen[]} - The list of desktop devices to test item through\n */\n getDesktopDevices: function getDesktopDevices() {\n return devicesHelper.getDevicesByType('desktop');\n }\n };\n\n return devicesHelper;\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\n/**\n * Test Previewer Content Plugin : EnhancedReadOnlyMode\n *\n * This plugin can be used as a hook to do modification in the item preview for read only mode\n *\n * @author Ansul Sharma \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/content/enhancedReadOnlyMode',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'taoTests/runner/plugin'\n], function ($, _, __, pluginFactory) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'EnhancedReadOnlyMode',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n\n /**\n * Enables the plugin only in readOnly mode\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return config.options.readOnly;\n };\n\n testRunner\n .after('renderitem', () => {\n if (isPluginAllowed()) {\n const $contentArea = testRunner.getAreaBroker().getContentArea();\n const $extendedTextinteractionTextAreas = $contentArea.find('.qti-extendedTextInteraction textarea.text-container');\n const $ckeEditorsContent = $contentArea.find('.qti-extendedTextInteraction div.cke_contents');\n\n /**\n * Updates the height of textarea element of all extended text interactions based on the height of the content\n */\n if($extendedTextinteractionTextAreas.length) {\n $extendedTextinteractionTextAreas.each(function() {\n this.style.height = `${this.scrollHeight + 20}px`;\n });\n }\n\n /**\n * Updates the height of all the ckeEditor container of wysiwyg extended text interaction based on the height of the iFrame\n */\n if($ckeEditorsContent.length) {\n $ckeEditorsContent.each(function() {\n const $ckeEditorContent = $(this);\n const $ckeEditorIFrame = $ckeEditorContent.find('iframe.cke_wysiwyg_frame');\n\n /**\n * Only update the height when the iFrame has finished loading the styles because font-size may change the height\n */\n $ckeEditorIFrame.on('load', () => {\n setTimeout(() => {\n const ckeEditorBody = $ckeEditorIFrame[0].contentWindow.document.querySelector('body');\n $ckeEditorContent[0].style.height = `${ckeEditorBody.scrollHeight + 20}px`;\n }, 0);\n });\n });\n }\n }\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) 2018 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Control Plugin : Close\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/controls/close',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/hider',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/templates/button'\n], function ($, _, __, hider, pluginFactory, buttonTpl) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'close',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.hideActionBars;\n }\n\n this.$element = $(buttonTpl({\n control: 'close',\n title: __('Close the previewer'),\n icon: 'close',\n text: __('Close'),\n className: 'context-action'\n }));\n\n this.$element.on('click', function (e) {\n e.preventDefault();\n if (self.getState('enabled') !== false) {\n self.disable();\n testRunner.trigger('finish');\n }\n });\n\n this.disable();\n\n testRunner\n .on('enablenav', function () {\n if (isPluginAllowed()) {\n self.enable();\n }\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render: function render() {\n\n //attach the element to the navigation area\n var $container = this.getAreaBroker().getArea('context');\n $container.append(this.$element);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy: function destroy() {\n this.$element.remove();\n },\n\n /**\n * Enable the button\n */\n enable: function enable() {\n this.$element.prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable: function disable() {\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show: function show() {\n hider.show(this.$element);\n },\n\n /**\n * Hide the button\n */\n hide: function hide() {\n hider.hide(this.$element);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console', ['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 \n\n\n return \"
              \\n
                \\n
                \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line', ['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 += \"
              • \";\n  if (helper = helpers.time) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.time); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  buffer += escapeExpression(stack1)\n    + \"\";\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    + \"\";\n  if (helper = helpers.message) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n  else { helper = (depth0 && depth0.message); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n  if(stack1 || stack1 === 0) { buffer += stack1; }\n  buffer += \"
              • \";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer', ['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 += \"\";\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Navigation Plugin : Submit\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/navigation/submit/submit',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'moment',\n 'ui/hider',\n 'ui/autoscroll',\n 'util/strPad',\n 'taoTests/runner/plugin',\n 'taoQtiItem/qtiCommonRenderer/helpers/PciResponse',\n 'tpl!taoQtiTest/runner/plugins/templates/button',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-line',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/navigation/submit/preview-console-closer'\n], function (\n $,\n _,\n __,\n moment,\n hider,\n autoscroll,\n strPad,\n pluginFactory,\n pciResponse,\n buttonTpl,\n consoleTpl,\n consoleLineTpl,\n consoleCloserTpl\n) {\n 'use strict';\n\n /**\n * Some default config for the plugin\n * @type {Object}\n */\n const defaults = {\n submitTitle: __('Submit and show the result'),\n submitText: __('Submit'),\n submitIcon: 'forward'\n };\n\n return pluginFactory({\n\n name: 'submit',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init() {\n const testRunner = this.getTestRunner();\n const pluginConfig = _.defaults(this.getConfig(), defaults);\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n const isPluginAllowed = () => {\n const config = testRunner.getConfig();\n return !config.options.readOnly;\n };\n\n // display the console and its related controls, then auto scrolls to the last element\n const showConsole = () => {\n hider.show(this.controls.$console);\n hider.show(this.controls.$consoleBody);\n hider.show(this.controls.$consoleCloser);\n autoscroll(this.controls.$consoleBody.children().last(), this.controls.$consoleBody);\n };\n\n // hide the console and its related controls\n const hideConsole = () => {\n hider.hide(this.controls.$console);\n hider.hide(this.controls.$consoleCloser);\n };\n\n // add a line to the console\n const addConsoleLine = (type, message) => {\n const data = {\n time: strPad(moment().format('HH:mm:ss'), 12, ' '),\n type: strPad(type || '', 18, ' '),\n message: strPad(message || '', 18, ' ')\n };\n this.controls.$consoleBody.append($(consoleLineTpl(data)));\n };\n\n // display responses in the console\n const showResponses = (type, responses) => {\n _.forEach(responses, (response, identifier) => {\n addConsoleLine(type, strPad(`${identifier}: `, 15, ' ') + _.escape(pciResponse.prettyPrint(response)));\n });\n };\n\n this.controls = {\n $button: $(buttonTpl({\n control: 'submit',\n title: pluginConfig.submitTitle,\n icon: pluginConfig.submitIcon,\n text: pluginConfig.submitText\n })),\n $console: $(consoleTpl()),\n $consoleCloser: $(consoleCloserTpl())\n };\n this.controls.$consoleBody = this.controls.$console.find('.preview-console-body');\n\n this.controls.$button.on('click', e => {\n e.preventDefault();\n if (this.getState('enabled') !== false) {\n this.disable();\n testRunner.trigger('submititem');\n }\n });\n\n this.controls.$consoleCloser.on('click', e => {\n e.preventDefault();\n hideConsole();\n });\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', () => {\n if (isPluginAllowed()) {\n this.show();\n } else {\n this.hide();\n }\n })\n .on('submitresponse', responses => {\n showResponses(__('Submitted data'), responses);\n showConsole();\n })\n .on('scoreitem', responses => {\n if (responses.itemSession) {\n showResponses(__('Output data'), responses.itemSession);\n showConsole();\n }\n })\n .on('enablenav', () => {\n this.enable();\n })\n .on('disablenav', () => {\n this.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render() {\n //attach the element to the navigation area\n const $container = this.getAreaBroker().getContainer();\n const $navigation = this.getAreaBroker().getNavigationArea();\n $navigation.append(this.controls.$button);\n $navigation.append(this.controls.$consoleCloser);\n $container.append(this.controls.$console);\n },\n\n /**\n * Called during the runner's destroy phase\n */\n destroy() {\n _.forEach(this.controls, $el => $el.remove());\n this.controls = null;\n },\n\n /**\n * Enable the button\n */\n enable() {\n this.controls.$button\n .prop('disabled', false)\n .removeClass('disabled');\n },\n\n /**\n * Disable the button\n */\n disable() {\n this.controls.$button\n .prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the button\n */\n show() {\n hider.show(this.controls.$button);\n },\n\n /**\n * Hide the button\n */\n hide() {\n _.forEach(this.controls, hider.hide);\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer', ['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 += \"
                \\n
                \\n
                \\n
                \\n
                \\n
                \\n
                \\n
                \";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer',[],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) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/transformer',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-previewer',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css'\n], function ($, _, __, componentFactory, transformer, devicesPreviewerTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} size\n * @property {Number} width\n * @property {Number} height\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n deviceType: 'standard',\n deviceWith: 0,\n deviceHeight: 0,\n deviceOrientation: null\n };\n\n /**\n * Builds a devices previewer component. It will works in two modes:\n * - the standard mode will do nothing special, this is simply a sleeping mode\n * - the device mode will redesign the view to show a content using a device's layout and aspect ratio\n *\n * @example\n * var devicesPreviewer = devicesPreviewerFactory('.previewer .previewer-content);\n * ...\n * // react to changes\n * devicesPreviewer\n * .on('devicewidthchange', function(width) {\n * // the width has changed\n * })\n * .on('deviceheightchange', function(height) {\n * // the height has changed\n * })\n * .on('deviceorientationchange', function(orientation) {\n * // the orientation has changed\n * })\n * .on('devicetypechange', function(type) {\n * // the type has changed\n * })\n * .on('devicepreview', function() {\n * // the device preview mode has been applied\n * });\n * ...\n * // apply changes\n * devicesPreviewer\n * .setDeviceType(type)\n * .setDeviceOrientation(orientation)\n * .setDeviceWidth(width)\n * .setDeviceHeight(height)\n * .previewDevice();\n * ...\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.deviceType='standard'] - The preview mode to apply\n * @param {Number} [config.deviceWidth=null] - The width of the device to preview\n * @param {Number} [config.deviceHeight=null] - The height of the device to preview\n * @param {String} [config.deviceOrientation='landscape'] - The device orientation\n * @returns {devicesPreviewer}\n * @fires ready - When the component is ready to work\n */\n function devicesPreviewerFactory(container, config) {\n var controls = null;\n\n /**\n * Remove the applied scale\n */\n var resetScale = function resetScale() {\n if (controls) {\n controls.$previewContent.removeAttr('style');\n controls.$previewContainer.removeAttr('style');\n }\n };\n\n // component specific API\n var api = {\n /**\n * Gets the device width.\n * @returns {Number}\n */\n getDeviceWidth: function getDeviceWidth() {\n return this.getConfig().deviceWidth;\n },\n\n /**\n * Sets the device width.\n * @param {String|Number} width\n * @returns {devicesPreviewer}\n * @fires devicewidthchange\n */\n setDeviceWidth: function setDeviceWidth(width) {\n var componentConfig = this.getConfig();\n componentConfig.deviceWidth = parseInt(width, 10) || 0;\n\n /**\n * @event devicewidthchange\n * @param {Number} deviceWidth\n */\n this.trigger('devicewidthchange', componentConfig.deviceWidth);\n\n return this;\n },\n\n /**\n * Gets the device height.\n * @returns {Number}\n */\n getDeviceHeight: function getDeviceHeight() {\n return this.getConfig().deviceHeight;\n },\n\n /**\n * Sets the device height.\n * @param {String|Number} height\n * @returns {devicesPreviewer}\n * @fires deviceheightchange\n */\n setDeviceHeight: function setDeviceHeight(height) {\n var componentConfig = this.getConfig();\n componentConfig.deviceHeight = parseInt(height, 10) || 0;\n\n /**\n * @event deviceheightchange\n * @param {Number} deviceHeight\n */\n this.trigger('deviceheightchange', componentConfig.deviceHeight);\n\n return this;\n },\n\n /**\n * Gets the device orientation.\n * @returns {String}\n */\n getDeviceOrientation: function getDeviceOrientation() {\n return this.getConfig().deviceOrientation;\n },\n\n /**\n * Sets the device orientation.\n * @param {String} orientation\n * @returns {devicesPreviewer}\n * @fires deviceorientationchange\n */\n setDeviceOrientation: function setDeviceOrientation(orientation) {\n var componentConfig = this.getConfig();\n componentConfig.deviceOrientation = orientation;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-orientation', componentConfig.deviceOrientation);\n }\n\n /**\n * @event deviceorientationchange\n * @param {String} deviceOrientation\n */\n this.trigger('deviceorientationchange', componentConfig.deviceOrientation);\n\n return this;\n },\n\n /**\n * Tells if the previewer has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return this.getDeviceType() !== 'standard';\n },\n\n /**\n * Gets the device type.\n * @returns {String}\n */\n getDeviceType: function getDeviceType() {\n return this.getConfig().deviceType;\n },\n\n /**\n * Sets the type of device\n * @param {String} type\n * @returns {devicesPreviewer}\n * @fires devicetypechange\n */\n setDeviceType: function setDeviceType(type) {\n var componentConfig = this.getConfig();\n componentConfig.deviceType = type;\n\n if (this.is('rendered')) {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n this.getElement().attr('data-type', componentConfig.deviceType);\n }\n\n /**\n * @event devicetypechange\n * @param {String} deviceType\n */\n this.trigger('devicetypechange', componentConfig.deviceType);\n\n return this;\n },\n\n /**\n * Previews the content using the current device settings\n * @returns {devicesPreviewer}\n * @fires devicepreview after the device has been set on preview\n */\n previewDevice: function previewDevice() {\n var width, height;\n\n if (this.is('rendered')) {\n if (this.is('disabled') || this.getDeviceType() === 'standard') {\n // standard mode and disabled state both should be reflected by a \"no scale\" view\n this.clearScale();\n } else {\n // in device preview mode, we need to apply the device's size with respect to the orientation\n if (this.getDeviceOrientation() === 'portrait') {\n width = this.getDeviceHeight();\n height = this.getDeviceWidth();\n } else {\n width = this.getDeviceWidth();\n height = this.getDeviceHeight();\n }\n this.applyScale(width, height);\n }\n\n /**\n * @event devicepreview\n */\n this.trigger('devicepreview');\n }\n\n return this;\n },\n\n /**\n * Removes the scale settings applied on the devices previewer\n * @returns {devicesPreviewer}\n * @fires scaleclear after the scale settings have been cleared\n */\n clearScale: function clearScale() {\n if (this.is('rendered')) {\n resetScale();\n\n /**\n * @event scaleclear\n */\n this.trigger('scaleclear');\n }\n\n return this;\n },\n\n /**\n * Computes and applies the scale settings on the devices previewer\n * @param {Number} width\n * @param {Number} height\n * @returns {devicesPreviewer}\n * * @fires scalechange after the scale settings have been applied\n */\n applyScale: function applyScale(width, height) {\n var frameSize, frameMargins, scaleFactor;\n\n if (this.is('rendered')) {\n resetScale();\n\n frameSize = this.getFrameSize();\n frameMargins = this.getFrameMargins();\n scaleFactor = this.getScaleFactor(width, height);\n\n controls.$previewContent\n .width(width)\n .height(height);\n\n controls.$previewContainer\n .css('left', (frameSize.width - (width + frameMargins.width) * scaleFactor) / 2)\n .width(width + frameMargins.width)\n .height(height + frameMargins.height);\n\n transformer.setTransformOrigin(controls.$previewContainer, 0, 0);\n transformer.scale(controls.$previewContainer, scaleFactor);\n\n /**\n * @event scalechange\n */\n this.trigger('scalechange');\n }\n\n return this;\n },\n\n /**\n * Computes and gets the margins of the previewer frame\n * @returns {size}\n */\n getFrameMargins: function getFrameMargins() {\n var margins = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n margins.width = controls.$previewContainer.outerWidth() - controls.$previewContent.width();\n margins.height = controls.$previewContainer.outerHeight() - controls.$previewContent.height();\n }\n return margins;\n },\n\n /**\n * Computes and gets the available size in the previewer frame\n * @returns {size}\n */\n getFrameSize: function getFrameSize() {\n var size = {\n width: 0,\n height: 0\n };\n if (this.is('rendered')) {\n size.width = this.getContainer().innerWidth();\n size.height = this.getContainer().innerHeight();\n }\n return size;\n },\n\n /**\n * Computes and gets the scale factor of the previewer frame\n * @param {Number} width\n * @param {Number} height\n * @returns {Number}\n */\n getScaleFactor: function getScaleFactor(width, height) {\n var margins, frameSize;\n var scaleFactor = {\n x: 1,\n y: 1\n };\n if (this.is('rendered') && this.isDeviceMode()) {\n frameSize = this.getFrameSize();\n margins = this.getFrameMargins();\n width += margins.width;\n height += margins.height;\n\n if (width > frameSize.width) {\n scaleFactor.x = frameSize.width / width;\n }\n\n if (height > frameSize.height) {\n scaleFactor.y = frameSize.height / height;\n }\n }\n return Math.min(scaleFactor.x, scaleFactor.y);\n },\n\n /**\n * Wraps the previewed content into the previewer frame\n * @param {HTMLElement|jQuery} element\n * @returns {devicesPreviewer}\n * @fires wrap after the element has been wrapped\n */\n wrap: function wrap(element) {\n if (this.is('rendered')) {\n // restore current wrapped element to its previous place\n this.unwrap();\n\n // move the element to wrap in the preview container\n controls.$wrappedElement = $(element);\n controls.$wrappedElementContainer = controls.$wrappedElement.parent();\n controls.$previewContent.append(controls.$wrappedElement);\n\n /**\n * @event wrap\n * @param {jQuery} $wrappedElement - The element that has been wrapped\n */\n this.trigger('wrap', controls.$wrappedElement);\n }\n\n return this;\n },\n\n /**\n * Unwraps the previewed content from the previewer frame\n * @returns {devicesPreviewer}\n * @fires unwrap after the element has been unwrapped\n */\n unwrap: function unwrap() {\n var $wasWrappedElement;\n if (this.is('rendered') && controls.$wrappedElement) {\n $wasWrappedElement = controls.$wrappedElement;\n\n // restore current wrapped element to its previous place\n controls.$wrappedElementContainer.append(controls.$wrappedElement);\n controls.$wrappedElement = null;\n controls.$wrappedElementContainer = null;\n\n /**\n * @event unwrap\n * @param {jQuery} $wrappedElement - The element that was wrapped\n */\n this.trigger('unwrap', $wasWrappedElement);\n }\n\n return this;\n }\n };\n\n // build and setup the component\n var devicesPreviewer = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesPreviewerTpl)\n\n // auto render on init\n .on('init', function () {\n var componentConfig = this.getConfig();\n\n // init the internal state\n this.setDeviceType(componentConfig.deviceType);\n this.setDeviceWidth(componentConfig.deviceWidth);\n this.setDeviceHeight(componentConfig.deviceHeight);\n this.setDeviceOrientation(componentConfig.deviceOrientation);\n\n // auto render on init\n _.defer(function () {\n devicesPreviewer.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var $element = this.getElement();\n controls = {\n // internal elements\n $previewContainer: $element.find('.preview-container'),\n $previewFrame: $element.find('.preview-frame'),\n $previewContent: $element.find('.preview-content'),\n\n // placeholder for the wrapped element\n $wrappedElement: null,\n $wrappedElementContainer: null\n };\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable enable', function () {\n var self = this;\n if (this.is('rendered')) {\n // need to defer the call as the enable/disable events are emitted before the state is updated\n _.defer(function () {\n self.previewDevice();\n });\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n this.unwrap();\n controls = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesPreviewer.init(config);\n });\n\n return devicesPreviewer;\n }\n\n return devicesPreviewerFactory;\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector', ['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 \n\n\n return \"
                \\n
                \\n
                \\n
                \\n
                \\n
                \";\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector', ['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, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"selected=\\\"selected\\\"\";\n }\n\n buffer += \"\";\n return buffer;\n });\n});\n\n","\ndefine('css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector',[],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) 2019 Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/component',\n 'ui/selecter',\n 'taoQtiTestPreviewer/previewer/helpers/devices',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/devices-selector',\n 'tpl!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/tpl/selector',\n 'css!taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css'\n], function ($, _, __, componentFactory, lookupSelecter, devicesHelper, devicesSelectorTpl, selectorTpl) {\n 'use strict';\n\n /**\n * @typedef {Object} selectorEntry\n * @property {String} value - The value that identifies the entry\n * @property {String} label - The text displayed to describe the entry\n */\n\n /**\n * @typedef {selectorEntry} mainSelectorEntry\n * @property {Boolean} devicesList - tells if a list of devices is expected\n * @property {Boolean} orientation - tells if a list of orientations is expected\n */\n\n /**\n * Some default config\n * @type {Object}\n */\n var defaults = {\n type: 'standard',\n device: null,\n orientation: 'landscape'\n };\n\n /**\n * List of available types of devices\n * @type {mainSelectorEntry[]}\n */\n var deviceTypesList = [{\n value: 'standard',\n label: __('Actual size'),\n devicesList: false,\n orientation: false\n }, {\n value: 'desktop',\n label: __('Desktop preview'),\n devicesList: true,\n orientation: false\n }, {\n value: 'mobile',\n label: __('Mobile preview'),\n devicesList: true,\n orientation: true\n }];\n\n /**\n * List of available orientations\n * @type {selectorEntry[]}\n */\n var deviceOrientationsList = [{\n value: 'landscape',\n label: __('Landscape')\n }, {\n value: 'portrait',\n label: __('Portrait')\n }];\n\n /**\n * Map selector's names to setter callbacks.\n * This will be used to call the expected setter when selecting a value.\n * @see devicesSelector.select()\n * @type {Object}\n */\n var callbackMap = {\n type: 'setType',\n device: 'setDevice',\n mobile: 'setDevice',\n desktop: 'setDevice',\n orientation: 'setOrientation'\n };\n\n /**\n * Gets the data for a selected entry\n * @param {String} selected\n * @param {selectorEntry[]|deviceScreen[]} list\n * @returns {selectorEntry|deviceScreen|null}\n */\n function getSelectorData(selected, list) {\n if (selected && _.size(list)) {\n return _.find(list, {value: selected}) || null;\n }\n return null;\n }\n\n /**\n * Ensures an identifier is valid with respect to the provided list, or defaulted to null.\n * @param {String} identifier\n * @param {selectorEntry[]} list\n * @returns {String|null}\n */\n function getValidIdentifier(identifier, list) {\n if (list && list.length) {\n if (_.find(list, {value: identifier})) {\n return identifier;\n } else {\n return _.first(list).value;\n }\n }\n return null;\n }\n\n /**\n * Update a Select2 control\n * @param {jQuery} $selector\n * @param {String} value\n * @returns {jQuery}\n */\n function updateSelect2($selector, value) {\n var current = $selector.val();\n // avoid to stress the setters if the value is already set\n if (current !== value) {\n $selector.val(value);\n $selector.trigger('change');\n }\n return $selector;\n }\n\n /**\n * Uninstalls a Select2 control\n * @param {jQuery} $selector\n * @returns {jQuery}\n */\n function removeSelect2($selector) {\n if ($selector.hasClass(\"select2-offscreen\")) {\n $selector.select2('destroy');\n }\n return $selector;\n }\n\n /**\n * Builds a devices selector component. It will provides 3 selectors in cascade:\n * - the first allows to select the type of device\n * - the second allows to select the device itself, the list being filtered by the value of the first selector\n * - the third allows to select the display orientation, if applicable\n *\n * @example\n * var devicesSelector = devicesSelectorFactory('.previewer .previewer-top-bar);\n * ...\n * // react to type change\n * devicesSelector.on('typechange', function(type) {\n * if (!this.isDeviceMode()) {\n * // reset the type to standard, we can re-apply the default size\n * }\n * });\n *\n * // react to device change\n * devicesSelector.on('devicechange', function(device, data) {\n * // apply the size provided in data\n * });\n *\n * // react to orientation change\n * devicesSelector.on('orientationchange', function(orientation) {\n * // apply the orientation\n * });\n *\n * @param {HTMLElement|String} container\n * @param {Object} config\n * @param {String} [config.type='standard'] - The default selected device type\n * @param {String} [config.device=null] - The default selected device\n * @param {String} [config.orientation='landscape'] - The default selected orientation\n * @returns {devicesSelector}\n * @fires ready - When the component is ready to work\n */\n function devicesSelectorFactory(container, config) {\n // internal state\n var selected = {\n type: null,\n device: null,\n orientation: null,\n desktop: null,\n mobile: null\n };\n var devicesList = [];\n var typeData = null;\n var controls = null;\n\n /**\n * Changes a DOM property on each selector\n * @param {String} property\n * @param {String|Boolean|Number} value\n */\n var setControlsProp = function setControlsProp(property, value) {\n _.forEach(controls, function($selector) {\n $selector.prop(property, value);\n });\n };\n\n // component specific API\n var api = {\n /**\n * Tells if the selector has entered in a device mode or in the standard mode.\n * Standard mode means 'actual size'.\n * @returns {Boolean}\n */\n isDeviceMode: function isDeviceMode() {\n return selected.type !== 'standard';\n },\n\n /**\n * Reflects the mode to the DOM\n * @returns {devicesSelector}\n */\n updateMode: function updateMode() {\n // use .attr() instead of .data() to ensure the DOM will be properly updated\n // this is required as CSS must take the relay to control the display\n if (this.is('rendered')) {\n this.getElement().attr('data-type', selected.type);\n }\n return this;\n },\n\n /**\n * Gets the selected device type.\n * @returns {String} The type of device, from the list `['standard', 'mobile', 'desktop']`\n */\n getType: function getType() {\n return selected.type;\n },\n\n /**\n * Gets the selected device orientation.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String}\n */\n getOrientation: function getOrientation() {\n if (typeData && typeData.orientation) {\n return selected.orientation;\n }\n return null;\n },\n\n /**\n * Gets the identifier of the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {String|null}\n */\n getDevice: function getDevice() {\n if (typeData && typeData.devicesList) {\n return selected.device;\n }\n return null;\n },\n\n /**\n * Gets the data for the selected device.\n * If the current mode is not a device mode (i.e. actual size), null is returned.\n * @returns {deviceScreen|null}\n */\n getDeviceData: function getDeviceData() {\n return getSelectorData(this.getDevice(), devicesList);\n },\n\n /**\n * Selects a type of device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires typechange event after the type has been changed\n * @fires devicechange event after the device has been updated if a list of devices is expected\n */\n setType: function setType(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceTypesList);\n if (identifier !== selected.type) {\n selected.type = identifier;\n selected.device = null;\n\n // when the type changes, the list of devices must be updated\n devicesList = devicesHelper.getDevicesByType(selected.type);\n typeData = getSelectorData(selected.type, deviceTypesList);\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$typeSelector, selected.type);\n this.updateMode();\n }\n\n /**\n * @event typechange\n * @param {String} selectedType\n */\n this.trigger('typechange', selected.type);\n\n // the current device must be adapted if a list of devices is expected\n if (typeData.devicesList) {\n this.setDevice(selected[selected.type]);\n }\n }\n return this;\n },\n\n /**\n * Sets the selected device orientation\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires orientationchange event after the type has been changed\n */\n setOrientation: function setOrientation(identifier) {\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, deviceOrientationsList);\n if (identifier !== selected.orientation) {\n selected.orientation = identifier;\n\n // update the rendered content\n if (this.is('rendered')) {\n updateSelect2(controls.$orientationSelector, selected.orientation);\n }\n\n /**\n * @event orientationchange\n * @param {String} selectedOrientation\n */\n this.trigger('orientationchange', selected.orientation);\n }\n return this;\n },\n\n /**\n * Selects a device\n * @param {String} identifier\n * @returns {devicesSelector}\n * @fires devicechange event after the device has been changed\n */\n setDevice: function setDevice(identifier) {\n var $selector;\n\n // validate the identifier before applying the change\n identifier = getValidIdentifier(identifier, devicesList);\n if (identifier !== selected.device) {\n selected.device = identifier;\n selected[selected.type] = identifier;\n\n // update the rendered content, depending on the device's category\n if (this.is('rendered') && this.isDeviceMode()) {\n $selector = controls['$' + selected.type + 'Selector'];\n if ($selector) {\n updateSelect2($selector, selected.device);\n }\n }\n\n /**\n * @event devicechange\n * @param {String} selectedDevice\n * @param {deviceScreen} deviceData\n */\n this.trigger('devicechange', selected.device, this.getDeviceData());\n }\n return this;\n },\n\n /**\n * Selects a value in the proper selector\n * @param {String} name - The name of the selector\n * @param {String} value - The value to select\n * @returns {devicesSelector}\n */\n select: function select(name, value) {\n var setterName = callbackMap[name];\n if (setterName && _.isFunction(this[setterName])) {\n this[setterName](value);\n }\n return this;\n },\n\n /**\n * Reset to default values, from the config.\n * @returns {devicesSelector}\n */\n reset: function reset() {\n var componentConfig = this.getConfig();\n this.setType(componentConfig.type);\n this.setDevice(componentConfig.device);\n this.setOrientation(componentConfig.orientation);\n return this;\n }\n };\n\n // build and setup the component\n var devicesSelector = componentFactory(api, defaults)\n // set the component's layout\n .setTemplate(devicesSelectorTpl)\n\n // auto render on init\n .on('init', function () {\n // ensure the initial state is aligned with the config\n this.reset();\n\n // auto render on init\n _.defer(function () {\n devicesSelector.render(container);\n });\n })\n\n // renders the component\n .on('render', function () {\n var self = this;\n\n /**\n * Renders a selector from a list of entries. Takes care of the currently selected value.\n * @param {String} name - The name of the selector\n * @param {selectorEntry[]} list - The list of entries\n * @param {String} selectedValue - The currently selected value\n * @param {String} [category=name] - The category of the selector (type, device, orientation).\n * Defaulted to the name if not provided.\n * @returns {jQuery}\n */\n function renderSelector(name, list, selectedValue, category) {\n var $selector = $(selectorTpl({\n name: name,\n category: category || name,\n items: _.map(list, function(item) {\n return {\n value: item.value,\n label: item.label,\n selected: selectedValue === item.value\n };\n })\n }));\n self.getElement().find('.' + name + '-selector').html($selector);\n return $selector;\n }\n\n // create each selector, and keep access to them\n controls = {\n $typeSelector: renderSelector('type', deviceTypesList, selected.type),\n $desktopSelector: renderSelector('desktop', devicesHelper.getDesktopDevices(), selected.device, 'device'),\n $mobileSelector: renderSelector('mobile', devicesHelper.getMobileDevices(), selected.device, 'device'),\n $orientationSelector: renderSelector('orientation', deviceOrientationsList, selected.orientation)\n };\n lookupSelecter(this.getElement());\n\n // react to any change in selectors and then forward the event to the related entry\n this.getElement().on('change', '.selector', function onSelectorChange(e) {\n var $selector = $(e.target).closest('select');\n self.select($selector.attr('name'), $selector.val());\n });\n\n // initialize the display mode\n this.updateMode();\n\n /**\n * @event ready\n */\n this.trigger('ready');\n })\n\n // take care of the disable state\n .on('disable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", true);\n }\n })\n .on('enable', function () {\n if (this.is('rendered')) {\n setControlsProp(\"disabled\", false);\n }\n })\n\n // cleanup the place\n .on('destroy', function () {\n _.forEach(controls, removeSelect2);\n controls = null;\n selected = null;\n typeData = null;\n devicesList = null;\n });\n\n // initialize the component with the provided config\n // defer the call to allow to listen to the init event\n _.defer(function () {\n devicesSelector.init(config);\n });\n\n return devicesSelector;\n }\n\n return devicesSelectorFactory;\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) 2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Previewer Responsive Scale plugin : Scale\n */\ndefine('taoQtiTestPreviewer/previewer/plugins/tools/scale/scale',[\n 'jquery',\n 'lodash',\n 'lib/uuid',\n 'util/namespace',\n 'taoTests/runner/plugin',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesPreviewer',\n 'taoQtiTestPreviewer/previewer/plugins/tools/scale/component/devicesSelector'\n], function (\n $,\n _,\n uuid,\n namespaceHelper,\n pluginFactory,\n devicesPreviewerFactory,\n devicesSelectorFactory\n) {\n 'use strict';\n\n return pluginFactory({\n\n name: 'scale',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init: function init() {\n var self = this;\n var testRunner = this.getTestRunner();\n\n /**\n * Tells if the component is enabled\n * @returns {Boolean}\n */\n function isPluginAllowed() {\n var config = testRunner.getConfig();\n return !config.options.readOnly;\n }\n\n // generate unique id for global events\n this.nsId = this.getName() + uuid(6);\n\n if (!isPluginAllowed()) {\n this.hide();\n }\n\n this.disable();\n\n testRunner\n .on('render', function () {\n if (isPluginAllowed()) {\n self.show();\n } else {\n self.hide();\n }\n })\n .on('resizeitem', function (size, orientation, type) {\n if (self.devicesPreviewer) {\n self.devicesPreviewer\n .setDeviceType(type)\n .setDeviceOrientation(orientation)\n .setDeviceWidth(size && size.width)\n .setDeviceHeight(size && size.height)\n .previewDevice();\n }\n })\n .on('enablenav', function () {\n self.enable();\n })\n .on('disablenav', function () {\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n * Renders plugins controls on proper place\n */\n render: function render() {\n var self = this;\n var testRunner = this.getTestRunner();\n var areaBroker = this.getAreaBroker();\n\n /**\n * Triggers an item resize based on the current selected device\n */\n function resizeItem() {\n if (self.devicesSelector && self.getState('enabled')) {\n /**\n * @event resizeitem\n * @param {deviceScreen} deviceData - The device data, containing width and height\n * @param {String} orientation - The device orientation\n * @param {String} type - The type of device\n */\n testRunner.trigger(\n 'resizeitem',\n self.devicesSelector.getDeviceData(),\n self.devicesSelector.getOrientation(),\n self.devicesSelector.getType()\n );\n }\n }\n\n /**\n * adjust device frame position and size when browser size change\n */\n $(window).on(namespaceHelper.namespaceAll('resize orientationchange', this.nsId), _.throttle(function () {\n if (self.devicesSelector && self.devicesSelector.isDeviceMode()) {\n resizeItem();\n }\n }, 50));\n\n return Promise.all([\n new Promise(function (resolve) {\n self.devicesSelector = devicesSelectorFactory(areaBroker.getHeaderArea())\n .on('ready', function () {\n if (!self.getState('enabled')) {\n this.disable();\n }\n\n this.on('typechange', function () {\n if (!this.isDeviceMode()) {\n resizeItem();\n }\n });\n\n this.on('devicechange orientationchange', function () {\n resizeItem();\n });\n\n resolve();\n });\n }),\n new Promise(function (resolve) {\n self.devicesPreviewer = devicesPreviewerFactory(areaBroker.getArea('contentWrapper'))\n .on('ready', function () {\n this.wrap(areaBroker.getContentArea());\n resolve();\n });\n })\n ]);\n },\n\n /**\n * Called during the runner's destroy phase\n * clears all controls tied to applications DOM\n * detaches the global events\n */\n destroy: function destroy() {\n if (this.nsId) {\n $(window).off('.' + this.nsId);\n }\n if (this.devicesSelector) {\n this.devicesSelector.destroy();\n }\n if (this.devicesPreviewer) {\n this.devicesPreviewer.destroy();\n }\n this.devicesSelector = null;\n this.devicesPreviewer = null;\n },\n\n /**\n * Enable default controls\n */\n enable: function enable() {\n if (this.devicesSelector) {\n this.devicesSelector.enable();\n }\n },\n\n /**\n * Disable default controls\n */\n disable: function disable() {\n if (this.devicesSelector) {\n this.devicesSelector.disable();\n }\n },\n\n /**\n * Show default controls\n */\n show: function show() {\n if (this.devicesSelector) {\n this.devicesSelector.show();\n }\n },\n\n /**\n * Hide default controls\n */\n hide: function hide() {\n if (this.devicesSelector) {\n this.devicesSelector.hide();\n }\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item', ['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 \n\n\n return \"
                \\n
                \\n
                \\n
                \\n
                \\n
                  \\n
                  \\n
                  \\n
                  \\n\\n
                  \\n\\n \\n\\n
                  \\n
                  \\n
                  \\n
                  \\n\\n \\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) 2018-2020 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner provider for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/provider/item/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/feedback',\n 'taoTests/runner/areaBroker',\n 'taoTests/runner/testStore',\n 'taoTests/runner/proxy',\n 'taoQtiTest/runner/ui/toolbox/toolbox',\n 'taoQtiItem/runner/qtiItemRunner',\n 'taoQtiTest/runner/config/assetManager',\n 'taoItems/assets/strategies',\n 'taoQtiItem/qtiCommonRenderer/helpers/container',\n 'tpl!taoQtiTestPreviewer/previewer/provider/item/tpl/item'\n], function (\n $,\n _,\n __,\n feedback,\n areaBrokerFactory,\n testStoreFactory,\n proxyFactory,\n toolboxFactory,\n qtiItemRunner,\n assetManagerFactory,\n assetStrategies,\n containerHelper,\n layoutTpl\n) {\n 'use strict';\n\n //the asset strategies\n const assetManager = assetManagerFactory();\n assetManager.prependStrategy(assetStrategies.taomedia);\n\n //store the current execution context of the common renderer (preview)\n let _$previousContext = null;\n function setContext($context){\n _$previousContext = containerHelper.getContext();\n containerHelper.setContext($context);\n }\n function restoreContext(){\n containerHelper.setContext(_$previousContext);\n _$previousContext = null;\n }\n /**\n * A Test runner provider to be registered against the runner\n */\n return {\n\n //provider name\n name: 'qtiItemPreviewer',\n\n /**\n * Initialize and load the area broker with a correct mapping\n * @returns {areaBroker}\n */\n loadAreaBroker() {\n const $layout = $(layoutTpl());\n\n return areaBrokerFactory($layout, {\n contentWrapper: $('.content-wrapper', $layout),\n content: $('#qti-content', $layout),\n toolbox: $('.bottom-action-bar .tools-box', $layout),\n navigation: $('.bottom-action-bar .navi-box-list', $layout),\n control: $('.top-action-bar .control-box', $layout),\n actionsBar: $('.bottom-action-bar .control-box', $layout),\n panel: $('.test-sidebar-left', $layout),\n header: $('.top-action-bar .tools-box', $layout),\n context: $('.top-action-bar .navi-box-list', $layout)\n });\n },\n\n /**\n * Initialize and load the test runner proxy\n * @returns {proxy}\n */\n loadProxy() {\n const {proxyProvider, serviceCallId, bootstrap, timeout} = this.getConfig();\n return proxyFactory(proxyProvider || 'qtiItemPreviewerProxy', {serviceCallId, bootstrap, timeout});\n },\n\n /**\n * Initialize and load the test store\n * @returns {testStore}\n */\n loadTestStore() {\n const config = this.getConfig();\n\n //the test run needs to be identified uniquely\n const identifier = config.serviceCallId || `test-${Date.now()}`;\n return testStoreFactory(identifier);\n },\n\n /**\n * Installation of the provider, called during test runner init phase.\n */\n install() {\n const {plugins} = this.getConfig().options;\n if (plugins) {\n _.forEach(this.getPlugins(), plugin => {\n if (_.isPlainObject(plugin) && _.isFunction(plugin.setConfig)) {\n const config = plugins[plugin.getName()];\n if (_.isPlainObject(config)) {\n plugin.setConfig(config);\n }\n }\n });\n }\n },\n\n /**\n * Initialization of the provider, called during test runner init phase.\n *\n * We install behaviors during this phase (ie. even handlers)\n * and we call proxy.init.\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} to chain proxy.init\n */\n init() {\n const dataHolder = this.getDataHolder();\n const areaBroker = this.getAreaBroker();\n\n areaBroker.setComponent('toolbox', toolboxFactory());\n areaBroker.getToolbox().init();\n\n /*\n * Install behavior on events\n */\n this\n .on('submititem', () => {\n const itemState = this.itemRunner.getState();\n const itemResponses = this.itemRunner.getResponses();\n\n this.trigger('disabletools disablenav');\n this.trigger('submitresponse', itemResponses, itemState);\n\n return this.getProxy()\n .submitItem(dataHolder.get('itemIdentifier'), itemState, itemResponses)\n .then(response => {\n this.trigger('scoreitem', response);\n this.trigger('enabletools enablenav resumeitem');\n })\n .catch(err => {\n this.trigger('enabletools enablenav');\n\n //some server errors are valid, so we don't fail (prevent empty responses)\n if (err.code === 200) {\n this.trigger('alert.submitError',\n err.message || __('An error occurred during results submission. Please retry.'),\n () => this.trigger('resumeitem')\n );\n }\n });\n })\n .on('ready', () => {\n const itemIdentifier = dataHolder.get('itemIdentifier');\n const itemData = dataHolder.get('itemData');\n\n if (itemIdentifier) {\n if (itemData) {\n this.renderItem(itemIdentifier, itemData);\n } else {\n this.loadItem(itemIdentifier);\n }\n }\n })\n .on('loaditem', (itemRef, itemData) => {\n dataHolder.set('itemIdentifier', itemRef);\n dataHolder.set('itemData', itemData);\n })\n .on('renderitem', () => {\n this.trigger('enabletools enablenav');\n })\n .on('resumeitem', () => {\n this.trigger('enableitem enablenav');\n })\n .on('disableitem', () => {\n this.trigger('disabletools');\n })\n .on('enableitem', () => {\n this.trigger('enabletools');\n })\n .on('error', () => {\n this.trigger('disabletools enablenav');\n })\n .on('finish leave', () => {\n this.trigger('disablenav disabletools');\n this.flush();\n })\n .on('flush', () => {\n this.destroy();\n });\n\n return this.getProxy()\n .init()\n .then(data => {\n dataHolder.set('itemIdentifier', data.itemIdentifier);\n dataHolder.set('itemData', data.itemData);\n });\n },\n\n /**\n * Rendering phase of the test runner\n *\n * Attach the test runner to the DOM\n *\n * @this {runner} the runner context, not the provider\n */\n render() {\n const config = this.getConfig();\n const areaBroker = this.getAreaBroker();\n\n config.renderTo.append(areaBroker.getContainer());\n\n areaBroker.getToolbox().render(areaBroker.getToolboxArea());\n },\n\n /**\n * LoadItem phase of the test runner\n *\n * We call the proxy in order to get the item data\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @returns {Promise} that calls in parallel the state and the item data\n */\n loadItem(itemIdentifier) {\n return this.getProxy().getItem(itemIdentifier);\n },\n\n /**\n * RenderItem phase of the test runner\n *\n * Here we initialize the item runner and wrap it's call to the test runner\n *\n * @this {runner} the runner context, not the provider\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} itemData - The definition data of the item\n * @returns {Promise} resolves when the item is ready\n */\n renderItem(itemIdentifier, itemData) {\n const areaBroker = this.getAreaBroker();\n const options = this.getConfig().options;\n\n const changeState = () => {\n this.setItemState(itemIdentifier, 'changed', true);\n };\n\n setContext(areaBroker.getContentArea());\n\n return new Promise((resolve, reject) => {\n assetManager.setData('baseUrl', itemData.baseUrl);\n\n itemData.content = itemData.content || {};\n\n this.itemRunner = qtiItemRunner(itemData.content.type, itemData.content.data, Object.assign({\n assetManager: assetManager\n }, options))\n .on('error', err => {\n this.trigger('enablenav');\n reject(err);\n feedback().error(__('It seems that there is an error during item preview loading. Please, try again.'));\n })\n .on('init', function onItemRunnerInit() {\n const {state, portableElements} = itemData;\n this.render(areaBroker.getContentArea(), {state, portableElements});\n })\n .on('render', function onItemRunnerRender() {\n this.on('responsechange', changeState);\n this.on('statechange', changeState);\n resolve();\n })\n .init();\n });\n },\n\n /**\n * UnloadItem phase of the test runner\n *\n * Item clean up\n *\n * @this {runner} the runner context, not the provider\n * @returns {Promise} resolves when the item is cleared\n */\n unloadItem() {\n this.trigger('beforeunloaditem disablenav disabletools');\n\n if (this.itemRunner) {\n return new Promise(resolve => {\n this.itemRunner\n .on('clear', resolve)\n .clear();\n });\n }\n return Promise.resolve();\n },\n\n /**\n * Destroy phase of the test runner\n *\n * Clean up\n *\n * @this {runner} the runner context, not the provider\n */\n destroy() {\n const areaBroker = this.getAreaBroker();\n\n // prevent the item to be displayed while test runner is destroying\n if (this.itemRunner) {\n this.itemRunner\n .on('clear', restoreContext)\n .clear();\n }\n this.itemRunner = null;\n\n if (areaBroker) {\n areaBroker.getToolbox().destroy();\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) 2018-2019 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test runner proxy for the QTI item previewer\n *\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTestPreviewer/previewer/proxy/item',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promiseQueue',\n 'core/request',\n 'taoQtiTestPreviewer/previewer/config/item'\n], function($, _, __, promiseQueue, coreRequest, configFactory) {\n 'use strict';\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n return {\n\n name : 'qtiItemPreviewerProxy',\n\n /**\n * Installs the proxy\n */\n install : function install(){\n var self = this;\n\n /**\n * A promise queue to ensure requests run sequentially\n */\n this.queue = promiseQueue();\n\n /**\n * Some parameters needs special handling...\n * @param {Object} actionParams - the input parameters\n * @returns {Object} output parameters\n */\n this.prepareParams = function prepareParams(actionParams){\n\n //some parameters need to be JSON.stringified\n var stringifyParams = ['itemState', 'itemResponse'];\n\n if(_.isPlainObject(actionParams)){\n return _.mapValues(actionParams, function(value, key){\n if(_.contains(stringifyParams, key)){\n return JSON.stringify(value);\n }\n return value;\n });\n }\n\n return actionParams;\n };\n\n /**\n * Proxy request function. Returns a promise\n * Applied options: asynchronous call, JSON data, no cache\n * @param {String} url\n * @param {Object} [reqParams]\n * @param {String} [contentType] - to force the content type\n * @param {Boolean} [noToken] - to disable the token\n * @returns {Promise}\n */\n this.request = function request(url, reqParams, contentType, noToken) {\n return coreRequest({\n url: url,\n data: self.prepareParams(reqParams),\n method: reqParams ? 'POST' : 'GET',\n contentType: contentType,\n noToken: noToken,\n background: false,\n sequential: true,\n timeout: self.configStorage.getTimeout()\n })\n .then(function(response) {\n self.setOnline();\n\n if (response && response.success) {\n return Promise.resolve(response);\n } else {\n return Promise.reject(response);\n }\n })\n .catch(function(error) {\n if (error.data && self.isConnectivityError(error.data)) {\n self.setOffline('request');\n }\n return Promise.reject(error);\n });\n };\n },\n\n /**\n * Initializes the proxy\n * @param {Object} config - The config provided to the proxy factory\n * @param {String} config.testDefinition - The URI of the test\n * @param {String} config.testCompilation - The URI of the compiled delivery\n * @param {String} config.serviceCallId - The URI of the service call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init(config, params) {\n // store config in a dedicated configStorage\n this.configStorage = configFactory(config || {});\n\n // request for initialization\n return this.request(\n this.configStorage.getTestActionUrl('init'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // no request, just a resources cleaning\n this.configStorage = null;\n this.queue = null;\n\n // the method must return a promise\n return Promise.resolve();\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction(action, params) {\n return this.request(this.configStorage.getTestActionUrl(action), params);\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} itemIdentifier - The identifier of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction(itemIdentifier, action, params) {\n return this.request(this.configStorage.getItemActionUrl(itemIdentifier, action), params);\n },\n\n /**\n * Gets an item definition by its identifier, also gets its current state\n * @param {String} itemIdentifier - The identifier of the item to get\n * @param {Object} [params] - additional parameters\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItem: function getItem(itemIdentifier, params) {\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'),\n params,\n void 0,\n true\n );\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} itemIdentifier - The identifier of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n submitItem: function submitItem(itemIdentifier, state, response, params) {\n var body = _.merge({\n itemState: state,\n itemResponse: response\n }, params || {});\n\n return this.request(\n this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'),\n body,\n void 0,\n true\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('@-o-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-moz-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@-webkit-keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}@keyframes loadingbar{0%{left:-10%}50%{left:90%}100%{left:-10%}}.loading-bar{height:6px;position:absolute;width:100%;top:0px;display:none;z-index:10000;cursor:progress}.loading-bar.fixed{position:fixed;width:100%}.loading-bar.fixed:before{top:0 !important}.loading-bar.loading{display:block;overflow:hidden;top:58px}.loading-bar.loading:before{position:absolute;content:\\'\\';height:6px;width:20%;display:block;transform:translateZ(0);background:-webkit-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-moz-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-ms-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:-o-linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);background:linear-gradient(to right, rgba(0,0,0,0) 0%, #c35a13 20%, #c35a13 80%, rgba(0,0,0,0) 100%);-webkit-animation:loadingbar 5s linear infinite;-moz-animation:loadingbar 5s linear infinite;-ms-animation:loadingbar 5s linear infinite;-o-animation:loadingbar 5s linear infinite;animation:loadingbar 5s linear infinite}.loading-bar.loading.loadingbar-covered{top:0px;overflow-y:visible}.loading-bar.loading.loadingbar-covered:before{top:86px}.no-version-warning .loading-bar.loadingbar-covered:before{top:58px}.action-bar{background:#266d9c;padding:3px;overflow:hidden;color:#e7eff4}.action-bar li{float:left}.action-bar li .li-inner{padding-bottom:1px;text-decoration:none !important;outline:0;display:inline-block;color:inherit}.action-bar li .li-inner:hover{color:white}.action-bar li span.glyph{text-shadow:0 0 0 transparent;color:inherit}.action-bar li input{width:100%;font-size:12px;font-size:1.2rem;padding:2px 4px}.action-bar li.active .li-inner{color:white}.action-bar.horizontal-action-bar{padding:5px;height:35px}.action-bar.horizontal-action-bar .search-area{margin:2px 0 0 0;border:none;float:right;display:inline-block;position:relative;padding:0 30px 0 0}.action-bar.horizontal-action-bar .search-area input{padding-right:34px;min-width:250px !important}.action-bar.horizontal-action-bar .search-area button{position:absolute;right:32px;top:-2px;cursor:default;opacity:.5;background:transparent;width:25px;height:25px}.action-bar.horizontal-action-bar .search-area button:before{color:#666}.action-bar.horizontal-action-bar .search-area .icon-help{position:absolute;right:5px;top:-1px;text-shadow:0px 0px transparent;color:white;cursor:pointer;display:block;width:24px;height:24px;line-height:24px;text-align:center}.action-bar.horizontal-action-bar li{margin:0 1px;border:1px transparent solid;text-align:center;float:left}.action-bar.horizontal-action-bar li .glyph{width:14px}.action-bar.horizontal-action-bar li .svg-glyph{height:14px;width:14px;margin-right:9px}.action-bar.horizontal-action-bar li.btn-info{overflow:hidden;background:transparent}.action-bar.horizontal-action-bar li.btn-info:hover,.action-bar.horizontal-action-bar li.btn-info.active{border-color:rgba(255,255,255,0.3);opacity:1}.action-bar.horizontal-action-bar li.disabled{background:none !important;text-shadow:inherit !important;opacity:0.45 !important;color:inherit !important}.action-bar.horizontal-action-bar li.disabled a{cursor:not-allowed !important}.action-bar.vertical-action-bar li{max-height:60px}.action-bar.vertical-action-bar li .li-inner{height:60px;display:block;overflow:hidden;text-overflow:ellipsis;text-align:center;font-size:12px;font-size:1.2rem;line-height:12px}.action-bar.vertical-action-bar li .glyph{display:block;margin:12px auto 3px;width:20px;height:20px}.action-bar.tree-action-bar{background:#f3f1ef;position:relative;left:-1px;padding:0;margin:0 2.8571428571% 8px 2.8571428571%;width:94.6428571429%;font-size:13px;font-size:1.3rem}.action-bar.tree-action-bar li{background:rgba(255,255,255,0.5);border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px;line-height:1.3;padding:0;text-align:center;float:left;width:65px;height:65px;margin:0 1px 1px 0}.action-bar.tree-action-bar li .glyph,.action-bar.tree-action-bar li .svg-glyph{display:block;color:#0e5d91;margin:12px auto 1px !important}.action-bar.tree-action-bar li .svg-glyph{width:20px;height:20px}.action-bar.tree-action-bar li .glyph{font-size:17px !important;font-size:1.7rem !important}.action-bar.tree-action-bar li .li-inner{display:block;height:65px;padding:2px;font-size:11px;font-size:1.1rem;color:#222}.action-bar.tree-action-bar li:hover{background:#ddd;color:#666}.action-bar .tree-filters{width:160px;position:relative}.action-bar .tree-filters input{padding-right:24px}.action-bar .tree-filters span{position:absolute;right:3px;color:#555;width:22px;top:2px;line-height:20px;display:inline-block;text-align:center;text-shadow:0 0 0 transparent;border-left:1px solid #ddd;cursor:pointer}.action-bar .tree-filters span.icon-close{display:none}.action-bar .tree-filters span:hover{color:#0e5d91}@media (max-width: 1150px){.action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}.action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}.action-bar.horizontal-action-bar .search-area input:focus{width:220px}}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area{float:none;position:absolute;right:0px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input{padding-right:30px;min-width:auto !important;width:150px}body.oversized-nav:not(.delivery-scope) .action-bar.horizontal-action-bar .search-area input:focus{width:220px}.section-container{top:0 !important}.section-container .flex-container-full{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 100%;-webkit-flex:0 0 100%;flex:0 0 100%}.section-container .flex-container-half{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 50%;-webkit-flex:0 0 50%;flex:0 0 50%}.section-container .flex-container-third{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 33.3333333333%;-webkit-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%}.section-container .flex-container-quarter{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 25%;-webkit-flex:0 0 25%;flex:0 0 25%}.section-container .flex-container-remaining{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 480px;-webkit-flex:1 1 480px;flex:1 1 480px}.section-container .flex-container-main-form{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 500px;-webkit-flex:0 0 500px;flex:0 0 500px;margin:0 20px 20px 0}.section-container .flex-container-navi{-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px}.section-container .section-header{border:none}.section-container .content-panel{width:100%;height:100%;margin:0;padding:0;border:none !important;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}.section-container .tab-container{border:none;display:none;list-style-type:none;padding:0;margin:0}.section-container .tab-container li{float:left;position:relative;top:0;padding:0;margin:0 1px 0px 0;border-top:1px solid #f3f1ef !important;border-bottom:1px solid #f3f1ef !important;background:#f3f1ef !important}.section-container .tab-container li a{top:0 !important;margin-bottom:0 !important;padding:6px 16px;text-decoration:none;min-height:32px;color:#222;float:left}.section-container .tab-container li.active,.section-container .tab-container li:hover{border-bottom-color:#4a86ad !important;border-top-color:#6e9ebd !important;background:#266d9c !important}.section-container .tab-container li.active a,.section-container .tab-container li:hover a{background:transparent !important;border-color:transparent !important;color:#fff !important;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.section-container .tab-container li.disabled:hover{background:#f3f1ef !important}.section-container .tab-container li.disabled:hover a{cursor:not-allowed !important;color:#222 !important}.section-container .navi-container{display:none;background:#f3f1ef;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:0 0 280px;-webkit-flex:0 0 280px;flex:0 0 280px;border-right:1px #ddd solid}.section-container .navi-container .block-title{font-size:14px;font-size:1.4rem;padding:2px 8px;margin:0}.section-container .navi-container .tree-action-bar-box{margin:10px 0;opacity:0}.section-container .navi-container .tree-action-bar-box.active{opacity:1;-webkit-opacity:0.25s ease-in-out;-moz-opacity:0.25s ease-in-out;opacity:0.25s ease-in-out}.section-container .content-container{border:none;-ms-order:0;-webkit-order:0;order:0;flex-item-align:stretch;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1;-webkit-flex:1 1;flex:1 1}.section-container .content-block{padding:20px;overflow-y:auto;display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-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}.section-container .content-block>.grid-container{width:100%}.section-container .content-block .data-container-wrapper{padding:0px 20px 0 0}.section-container .content-block .data-container-wrapper:before,.section-container .content-block .data-container-wrapper:after{content:\\\" \\\";display:table}.section-container .content-block .data-container-wrapper:after{clear:both}.section-container .content-block .data-container-wrapper>section,.section-container .content-block .data-container-wrapper .data-container{width:260px;margin:0 20px 20px 0;float:left;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block .data-container-wrapper>section.double,.section-container .content-block .data-container-wrapper .data-container.double{width:540px}.section-container .content-block .data-container-wrapper>section .emptyContentFooter,.section-container .content-block .data-container-wrapper .data-container .emptyContentFooter{display:none}.section-container .content-block .data-container-wrapper>section .tree,.section-container .content-block .data-container-wrapper .data-container .tree{border:none;max-width:none;max-height:none}.section-container .content-block .data-container-wrapper>section form,.section-container .content-block .data-container-wrapper .data-container form{background:none;border:none;margin:0;padding:0}.section-container .content-block .data-container-wrapper>section>header,.section-container .content-block .data-container-wrapper>section .ui-widget-header,.section-container .content-block .data-container-wrapper .data-container>header,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header{background:#f3f1ef;border-width:0px !important;border-bottom:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>header h1,.section-container .content-block .data-container-wrapper>section>header h6,.section-container .content-block .data-container-wrapper>section .ui-widget-header h1,.section-container .content-block .data-container-wrapper>section .ui-widget-header h6,.section-container .content-block .data-container-wrapper .data-container>header h1,.section-container .content-block .data-container-wrapper .data-container>header h6,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h1,.section-container .content-block .data-container-wrapper .data-container .ui-widget-header h6{padding:4px;margin:0;font-size:14px;font-size:1.4rem}.section-container .content-block .data-container-wrapper>section>div,.section-container .content-block .data-container-wrapper>section .ui-widget-content,.section-container .content-block .data-container-wrapper>section .container-content,.section-container .content-block .data-container-wrapper .data-container>div,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content,.section-container .content-block .data-container-wrapper .data-container .container-content{border-width:0px !important;overflow-y:auto;min-height:250px;padding:5px}.section-container .content-block .data-container-wrapper>section>div .icon-grip,.section-container .content-block .data-container-wrapper>section .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper>section .container-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container>div .icon-grip,.section-container .content-block .data-container-wrapper .data-container .ui-widget-content .icon-grip,.section-container .content-block .data-container-wrapper .data-container .container-content .icon-grip{cursor:move}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper .data-container>footer{min-height:33px}.section-container .content-block .data-container-wrapper>section>footer,.section-container .content-block .data-container-wrapper>section .data-container-footer,.section-container .content-block .data-container-wrapper .data-container>footer,.section-container .content-block .data-container-wrapper .data-container .data-container-footer{background:#f3f1ef;text-align:right !important;padding:4px;border-width:0px !important;border-top:1px #ddd solid !important}.section-container .content-block .data-container-wrapper>section>footer .square,.section-container .content-block .data-container-wrapper>section .data-container-footer .square,.section-container .content-block .data-container-wrapper .data-container>footer .square,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square{width:28px}.section-container .content-block .data-container-wrapper>section>footer .square span,.section-container .content-block .data-container-wrapper>section .data-container-footer .square span,.section-container .content-block .data-container-wrapper .data-container>footer .square span,.section-container .content-block .data-container-wrapper .data-container .data-container-footer .square span{padding:0;left:0}.section-container .content-block .data-container-wrapper>section ol,.section-container .content-block .data-container-wrapper .data-container ol{margin:0 0 0 15px;padding:10px}.section-container .content-block #form-container.ui-widget-content{border:none !important}.section-container .content-block form:not(.list-container){border:1px #ddd solid;background:#f3f1ef;padding:30px;border:1px solid #ddd;border-radius:2px;-webkit-border-radius:2px}.section-container .content-block [class^=\\\"btn-\\\"],.section-container .content-block [class*=\\\" btn-\\\"]{margin:0 2px}.previewer,.previewer-component{position:relative}.item-previewer-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 - 0px)}.item-previewer-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}.item-previewer-scope .test-sidebar{background:#f3f1ef;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;height:calc(100vh - 80px);overflow-y:auto;max-width:350px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:350px;padding:10px}@media only screen and (max-device-width: 800px){.item-previewer-scope .test-sidebar{max-width:200px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:200px}}@media only screen and (min-device-width: 800px) and (max-device-width: 1280px){.item-previewer-scope .test-sidebar{max-width:250px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:250px}}@media only screen and (min-device-width: 1280px) and (max-device-width: 1440px){.item-previewer-scope .test-sidebar{max-width:300px}.item-previewer-scope .test-sidebar>.qti-panel{max-width:300px}}.item-previewer-scope .test-sidebar-left{border-right:1px #ddd solid}.item-previewer-scope .test-sidebar-right{border-left:1px #ddd solid}.item-previewer-scope .content-wrapper{position:relative;-webkit-flex:1 1 0%;-ms-flex:1 1 0%;flex:1 1 0%;overflow:auto;padding:0}.item-previewer-scope .content-wrapper .overlay{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;opacity:.9}.item-previewer-scope .content-wrapper .overlay-full{background-color:#fff;opacity:1}.item-previewer-scope #qti-content{-webkit-overflow-scrolling:touch;max-width:1024px;width:100%;margin:auto}.item-previewer-scope #qti-item{width:100%;min-width:100%;height:auto;overflow:visible}.item-previewer-scope .qti-item{padding:30px}.item-previewer-scope .size-wrapper{max-width:1280px;margin:auto;width:100%;padding-right:40px}.item-previewer-scope #qti-rubrics{margin:auto;max-width:1024px;width:100%}.item-previewer-scope #qti-rubrics .qti-rubricBlock{margin:20px 0}.item-previewer-scope #qti-rubrics .hidden{display:none}.no-controls .item-previewer-scope{height:100vh}.previewer-component{background:inherit}.previewer-component.fullpage{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.fullpage .item-previewer-scope{height:100vh}.previewer-component.readonly .qti-item::before{content:\\' \\';position:absolute;top:0;left:0;right:0;bottom:0;z-index:100000}.previewer-component.hideactionbars .test-sidebar{height:100%}.previewer-component.hideactionbars .action-bar{display:none}.item-previewer-scope .preview-console-closer{position:absolute;right:10px;top:10px;cursor:pointer;color:rgba(255,255,255,0.9);text-shadow:none}.item-previewer-scope .preview-console-closer:hover{color:white}.item-previewer-scope .preview-console{background:#2b2b2b;color:#fff;font-family:Consolas,\\\"Andale Mono WT\\\",\\\"Andale Mono\\\",\\\"Lucida Console\\\",\\\"Lucida Sans Typewriter\\\",\\\"DejaVu Sans Mono\\\",\\\"Bitstream Vera Sans Mono\\\",\\\"Liberation Mono\\\",\\\"Nimbus Mono L\\\",Monaco,\\\"Courier New\\\",Courier,monospace;position:relative}.item-previewer-scope .preview-console .preview-console-body{padding:5px;margin:0;height:30vh;overflow:auto}.item-previewer-scope .preview-console .preview-console-body .log-time{color:#999}.item-previewer-scope .preview-console .preview-console-body .log-type{color:#eee}.item-previewer-scope .preview-console .preview-console-body .log-message{color:#69f}.item-previewer-scope .preview-console .preview-console-body pre{margin:0}.item-previewer-scope .action-bar.content-action-bar{padding:2px}.item-previewer-scope .action-bar.content-action-bar li{margin:2px 0 0 10px;border:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info{padding-top:6px;height:33px;margin-top:0;border-bottom:solid 2px transparent;border-radius:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group{border:none !important;overflow:hidden;padding:0}.item-previewer-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}.item-previewer-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}.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a.active{border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info.btn-group a .no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar li.btn-info:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{border-bottom-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active{background:#e7eff4;border-color:rgba(255,255,255,0.8)}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active a,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active a{color:#266d9c;text-shadow:none}.item-previewer-scope .action-bar.content-action-bar li.btn-info:active:hover,.item-previewer-scope .action-bar.content-action-bar li.btn-info.active:hover{background:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar{opacity:1;height:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.top-action-bar>.control-box{height:40px;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:40px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box{color:rgba(255,255,255,0.9);text-shadow:1px 1px 0 black}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt{padding-left:20px}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:first-child,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:first-child{padding-left:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .lft:last-child ul,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box .rgt:last-child ul{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class^=\\\"btn-\\\"],.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar>.control-box [class*=\\\" btn-\\\"]{white-space:nowrap}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box{position:relative;overflow:visible}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .action{position:relative;overflow:visible}.item-previewer-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}.item-previewer-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:32px;padding:6px 15px;line-height:1;border-left:solid 3px transparent}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .icon-checkbox-checked{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active{background-color:#dbd9d7;font-weight:bold}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon-checkbox-checked,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.active .icon-checkbox-checked{display:inline-block}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover{background-color:#0e5d91;color:#fff;border-left-color:#313030 !important}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .label,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#fff}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action.hover .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action:hover .icon{color:#e7eff4}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar .tools-box .menu .action .label,.item-previewer-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}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar{overflow:visible;position:relative}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .action{line-height:1.6}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .icon.no-label{padding-right:0}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .text,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .text{display:none}.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed .btn-info .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .tool-label-collapsed-hover .btn-info:not(:hover) .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.no-tool-label .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed .icon,.item-previewer-scope .action-bar.content-action-bar.horizontal-action-bar.bottom-action-bar .btn-info.tool-label-collapsed-over:not(:hover) .icon{padding:0}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/provider/item/css/item.css.map */.devices-previewer{width:100%;height:100%}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"],.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"]{overflow:hidden}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-container,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-container{position:relative}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{position:relative;border:3px #aaa ridge;background:#5a5a5a;background:linear-gradient(135deg, #5a5a5a 0%, #565656 7%, #444 15%, #141414 30%);-webkit-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-moz-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-ms-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);-o-box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7);box-shadow:5px 5px 10px 0 rgba(0,0,0,0.7)}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-content,.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-content{background:#fff;border-radius:3px;border:2px solid;border-color:#444 #999 #999 #444;overflow:auto}.devices-previewer:not(.disabled)[data-type=\\\"mobile\\\"] .preview-frame{border-radius:25px;padding:40px}.devices-previewer:not(.disabled)[data-type=\\\"desktop\\\"] .preview-frame{border-radius:5px;padding:30px}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesPreviewer.css.map */.devices-selector{display:-ms-flex;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.devices-selector[data-type=\\\"standard\\\"] .desktop-selector,.devices-selector[data-type=\\\"standard\\\"] .mobile-selector,.devices-selector[data-type=\\\"standard\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"desktop\\\"] .mobile-selector,.devices-selector[data-type=\\\"desktop\\\"] .orientation-selector{display:none}.devices-selector[data-type=\\\"mobile\\\"] .desktop-selector{display:none}.devices-selector .selector{display:inline-block;margin-top:0.3em}.devices-selector .selector:not(:last-child){margin-right:1rem}.devices-selector .selector select{overflow:visible}.devices-selector .selector .select2-container{text-shadow:none}\\n\\n/*# sourceMappingURL=taoQtiTestPreviewer/previewer/plugins/tools/scale/component/css/devicesSelector.css.map */');\n","\ndefine(\"taoQtiTestPreviewer/loader/qtiPreviewer.bundle\", function(){});\n","define(\"taoQtiTestPreviewer/loader/qtiPreviewer.min\", [\"taoItems/loader/taoItemsRunner.min\",\"taoTests/loader/taoTestsRunner.min\",\"taoQtiItem/loader/taoQtiItemRunner.min\",\"taoQtiTest/loader/taoQtiTestRunner.min\",\"taoQtiTest/loader/testPlugins.min\"], function(){});\n"]} \ No newline at end of file diff --git a/views/js/previewer/proxy/item.js b/views/js/previewer/proxy/item.js index dd57af92..95bdfef2 100644 --- a/views/js/previewer/proxy/item.js +++ b/views/js/previewer/proxy/item.js @@ -126,7 +126,12 @@ define([ this.configStorage = configFactory(config || {}); // request for initialization - return this.request(this.configStorage.getTestActionUrl('init'), params); + return this.request( + this.configStorage.getTestActionUrl('init'), + params, + void 0, + true + ); }, /** @@ -174,7 +179,12 @@ define([ * Any error will be provided if rejected. */ getItem: function getItem(itemIdentifier, params) { - return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), params); + return this.request( + this.configStorage.getItemActionUrl(itemIdentifier, 'getItem'), + params, + void 0, + true + ); }, /** @@ -192,7 +202,12 @@ define([ itemResponse: response }, params || {}); - return this.request(this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), body); + return this.request( + this.configStorage.getItemActionUrl(itemIdentifier, 'submitItem'), + body, + void 0, + true + ); } }; }); diff --git a/views/js/test/previewer/proxy/item/test.js b/views/js/test/previewer/proxy/item/test.js index de1181ae..b29d2ee5 100644 --- a/views/js/test/previewer/proxy/item/test.js +++ b/views/js/test/previewer/proxy/item/test.js @@ -72,8 +72,6 @@ define([ QUnit .cases.init([{ title: 'success', - sendToken: '1234', - receiveToken: '4567', response: { success: true }, @@ -81,8 +79,6 @@ define([ success: true }, { title: 'failing data', - sendToken: '1234', - receiveToken: '4567', response: { errorCode: 1, errorMessage: 'oops', @@ -92,8 +88,6 @@ define([ success: false }, { title: 'failing request', - sendToken: '1234', - receiveToken: '4567', response: 'error', ajaxSuccess: false, success: false @@ -112,8 +106,6 @@ define([ serviceCallId: initConfig.serviceCallId }); - var proxy, tokenHandler, result; - assert.expect(7); proxyFactory.registerProvider('itemProxy', itemProxy); @@ -121,17 +113,15 @@ define([ $.mockjax({ url: '/*', status: caseData.ajaxSuccess ? 200 : 500, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: caseData.response, response: function(settings) { assert.equal(settings.url, expectedUrl, 'The proxy has called the right service'); } }); - proxy = proxyFactory('itemProxy', initConfig); - tokenHandler = proxy.getTokenHandler(); + const proxy = proxyFactory('itemProxy', initConfig); + const tokenHandler = proxy.getTokenHandler(); + const tokenValue = 'test'; proxy .install() @@ -139,7 +129,7 @@ define([ return tokenHandler.clearStore(); }) .then(function() { - return proxy.getTokenHandler().setToken(caseData.sendToken); + return proxy.getTokenHandler().setToken(tokenValue); }) .then(function() { proxy.on('init', function(promise, config) { @@ -148,7 +138,7 @@ define([ assert.equal(config, initConfig, 'The proxy has provided the config object through the "init" event'); }); - result = proxy.init(); + const result = proxy.init(); assert.equal(typeof result, 'object', 'The proxy.init method has returned a promise'); @@ -166,7 +156,7 @@ define([ }) .then(function() { return proxy.getTokenHandler().getToken().then(function(token) { - assert.equal(token, caseData.receiveToken, 'The proxy must update the security token'); + assert.equal(token, tokenValue, 'The proxy must not use the security token'); }); }) .then(function() { @@ -299,8 +289,6 @@ define([ serviceCallId: initConfig.serviceCallId }); - var proxy, tokenHandler, result; - assert.expect(9); proxyFactory.registerProvider('itemProxy', itemProxy); @@ -308,9 +296,6 @@ define([ $.mockjax([{ url: '/init*', status: 200, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: { success: true } @@ -326,8 +311,8 @@ define([ } }]); - proxy = proxyFactory('itemProxy', initConfig); - tokenHandler = proxy.getTokenHandler(); + const proxy = proxyFactory('itemProxy', initConfig); + const tokenHandler = proxy.getTokenHandler(); proxy .install() @@ -357,7 +342,7 @@ define([ assert.deepEqual(params, caseData.params, 'The proxy has provided the params through the "callTestAction" event'); }); - result = proxy.callTestAction(caseData.action, caseData.params); + const result = proxy.callTestAction(caseData.action, caseData.params); assert.equal(typeof result, 'object', 'The proxy.callTestAction method has returned a promise'); @@ -387,8 +372,6 @@ define([ .cases.init([{ title: 'success', uri: 'http://tao.dev/mockItemDefinition#123', - sendToken: '1234', - receiveToken: '4567', response: { itemData: { interactions: [{}] @@ -403,8 +386,6 @@ define([ }, { title: 'failing data', uri: 'http://tao.dev/mockItemDefinition#123', - sendToken: '1234', - receiveToken: '4567', response: { errorCode: 1, errorMessage: 'oops', @@ -415,8 +396,6 @@ define([ }, { title: 'failing request', uri: 'http://tao.dev/mockItemDefinition#123', - sendToken: '1234', - receiveToken: '4567', response: 'error', ajaxSuccess: false, success: false @@ -436,8 +415,6 @@ define([ itemUri: caseData.uri }); - var proxy, tokenHandler, result; - assert.expect(8); proxyFactory.registerProvider('itemProxy', itemProxy); @@ -445,26 +422,21 @@ define([ $.mockjax([{ url: '/init*', status: 200, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: { success: true } }, { url: '/*', status: caseData.ajaxSuccess ? 200 : 500, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: caseData.response, response: function(settings) { assert.equal(settings.url, expectedUrl, 'The proxy has called the right service'); } }]); - proxy = proxyFactory('itemProxy', initConfig); - tokenHandler = proxy.getTokenHandler(); + const proxy = proxyFactory('itemProxy', initConfig); + const tokenHandler = proxy.getTokenHandler(); + const tokenValue = 'test'; proxy .install() @@ -472,7 +444,7 @@ define([ return tokenHandler.clearStore(); }) .then(function() { - return proxy.getTokenHandler().setToken(caseData.sendToken); + return proxy.getTokenHandler().setToken(tokenValue); }) .then(function() { return proxy.getItem(caseData.uri); @@ -493,7 +465,7 @@ define([ assert.equal(uri, caseData.uri, 'The proxy has provided the URI through the "getItem" event'); }); - result = proxy.getItem(caseData.uri); + const result = proxy.getItem(caseData.uri); assert.equal(typeof result, 'object', 'The proxy.getItem method has returned a promise'); @@ -511,7 +483,7 @@ define([ }) .then(function() { return proxy.getTokenHandler().getToken().then(function(token) { - assert.equal(token, caseData.receiveToken, 'The proxy must update the security token'); + assert.equal(token, tokenValue, 'The proxy must not use the security token'); }); }) .then(function() { @@ -525,8 +497,6 @@ define([ uri: 'http://tao.dev/mockItemDefinition#123', itemState: {response: [{}]}, itemResponse: {response: [{}]}, - sendToken: '1234', - receiveToken: '4567', response: { success: true }, @@ -537,8 +507,6 @@ define([ uri: 'http://tao.dev/mockItemDefinition#123', itemState: {response: [{}]}, itemResponse: {response: [{}]}, - sendToken: '1234', - receiveToken: '4567', response: { errorCode: 1, errorMessage: 'oops', @@ -551,8 +519,6 @@ define([ uri: 'http://tao.dev/mockItemDefinition#123', itemState: {response: [{}]}, itemResponse: {response: [{}]}, - sendToken: '1234', - receiveToken: '4567', response: 'error', ajaxSuccess: false, success: false @@ -572,8 +538,6 @@ define([ itemUri: caseData.uri }); - var proxy, tokenHandler, result; - assert.expect(10); proxyFactory.registerProvider('itemProxy', itemProxy); @@ -581,26 +545,21 @@ define([ $.mockjax([{ url: '/init*', status: 200, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: { success: true } }, { url: '/*', status: caseData.ajaxSuccess ? 200 : 500, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: caseData.response, response: function(settings) { assert.equal(settings.url, expectedUrl, 'The proxy has called the right service'); } }]); - proxy = proxyFactory('itemProxy', initConfig); - tokenHandler = proxy.getTokenHandler(); + const proxy = proxyFactory('itemProxy', initConfig); + const tokenHandler = proxy.getTokenHandler(); + const tokenValue = 'test'; proxy .install() @@ -608,7 +567,7 @@ define([ return tokenHandler.clearStore(); }) .then(function() { - return proxy.getTokenHandler().setToken(caseData.sendToken); + return proxy.getTokenHandler().setToken(tokenValue); }) .then(function() { return proxy.submitItem(caseData.uri, caseData.itemState, caseData.itemResponse); @@ -631,7 +590,7 @@ define([ assert.deepEqual(response, caseData.itemResponse, 'The proxy has provided the response through the "submitItem" event'); }); - result = proxy.submitItem(caseData.uri, caseData.itemState, caseData.itemResponse); + const result = proxy.submitItem(caseData.uri, caseData.itemState, caseData.itemResponse); assert.equal(typeof result, 'object', 'The proxy.submitItem method has returned a promise'); @@ -649,7 +608,7 @@ define([ }) .then(function() { return proxy.getTokenHandler().getToken().then(function(token) { - assert.equal(token, caseData.receiveToken, 'The proxy must update the security token'); + assert.equal(token, tokenValue, 'The proxy must not use the security token'); }); }) .then(function() { @@ -716,8 +675,6 @@ define([ itemUri: caseData.uri }); - var proxy, tokenHandler, result; - assert.expect(10); proxyFactory.registerProvider('itemProxy', itemProxy); @@ -725,9 +682,6 @@ define([ $.mockjax([{ url: '/init*', status: 200, - headers: { - 'X-CSRF-Token': caseData.receiveToken - }, responseText: { success: true } @@ -743,8 +697,8 @@ define([ } }]); - proxy = proxyFactory('itemProxy', initConfig); - tokenHandler = proxy.getTokenHandler(); + const proxy = proxyFactory('itemProxy', initConfig); + const tokenHandler = proxy.getTokenHandler(); proxy .install() @@ -775,7 +729,7 @@ define([ assert.deepEqual(params, caseData.params, 'The proxy has provided the params through the "callItemAction" event'); }); - result = proxy.callItemAction(caseData.uri, caseData.action, caseData.params); + const result = proxy.callItemAction(caseData.uri, caseData.action, caseData.params); assert.equal(typeof result, 'object', 'The proxy.callItemAction method has returned a promise');