From 4bb6d212209fdd1f29cb16036ea40577d7a8ec5e Mon Sep 17 00:00:00 2001 From: lionel Date: Thu, 21 Jan 2016 16:58:32 +0100 Subject: [PATCH] recompile js --- views/js/controllers.min.js.map | 2 +- views/js/qtiTestRunner.min.js | 30 +++++++++++++++--------------- views/js/qtiTestRunner.min.js.map | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/views/js/controllers.min.js.map b/views/js/controllers.min.js.map index b5099e2b16..0fd08fa164 100644 --- a/views/js/controllers.min.js.map +++ b/views/js/controllers.min.js.map @@ -1 +1 @@ -{"version":3,"file":"taoQtiTest/controller/routes.js","sources":["routes.js","creator/templates/testpart!tpl","creator/templates/section!tpl","creator/templates/rubricblock!tpl","creator/templates/itemref!tpl","creator/templates/item!tpl","tpl!taoQtiTest/controller/creator/templates/test-props","tpl!taoQtiTest/controller/creator/templates/testpart-props","tpl!taoQtiTest/controller/creator/templates/section-props","tpl!taoQtiTest/controller/creator/templates/itemref-props","tpl!taoQtiTest/controller/creator/templates/rubricblock-props","creator/templates/index.js","creator/views/item.js","creator/views/property.js","creator/views/actions.js","creator/views/itemref.js","creator/helpers/ckConfigurator.js","creator/views/rubricblock.js","creator/helpers/qtiTest.js","creator/helpers/sectionCategory.js","creator/views/section.js","creator/views/testpart.js","creator/views/test.js","creator/encoders/dom2qti.js","creator/creator.js","../testRunner/actionBarHook.js","../testRunner/actionBarTools.js","../testRunner/tpl/navigator!tpl","../testRunner/tpl/navigatorTree!tpl","../testRunner/testReview.js","../testRunner/testMetaData.js","../../serviceApi/ServiceApi.js","../../serviceApi/UserInfoService.js","../../serviceApi/StateStorage.js","runtime/testRunner.js"],"names":["define","Creator","css","actions","index","hb","template","Handlebars","depth0","helpers","partials","data","this","compilerInfo","merge","stack1","helper","buffer","functionType","escapeExpression","identifier","call","hash","options","helperMissing","title","__","href","label","program1","uri","parent","inverse","self","noop","fn","program","program2","each","testPart","section","rubricBlock","itemRef","item","testProps","testPartProps","sectionProps","itemRefProps","rubricBlockProps","testpart","itemref","rubricblock","properties","test","$","templates","itemTemplate","itemView","loadItems","setUpLiveSearch","timeout","liveSearch","pattern","$search","val","length","clearTimeout","setTimeout","items","update","keyup","siblings","click","disableSelection","$itemBox","empty","append","enableSelection","$panel","selectable","filter","selected","event","ui","addClass","unselected","removeClass","stop","trigger","undefined","DataBinder","propView","tmplName","model","propValidation","$view","on","e","isValid","namespace","$togglers","groupValidator","$container","open","databinder","children","hide","appendTo","startDomComponent","bind","getView","isOpen","onOpen","cb","stopPropagation","onClose","destroy","remove","toggle","not","show","propertyView","find","preventDefault","$elt","hasClass","disabledClass","blur","activeClass","btnOnClass","move","$actionContainer","containerClass","elementClass","$element","parents","$elements","is","fadeOut","insertBefore","fadeIn","insertAfter","movable","actionContainerElt","$moveUp","$moveDown","removable","$delete","disable","enable","_","setUp","$itemRef","propHandler","removePropHandler","categoriesProperty","initCategories","$select","select2","categories","width","tags","multiple","tokenSeparators","formatNoMatches","maximumInputLength","resize","listenActionState","document","$parent","$target","target","throttle","$refs","first","$actions","innerWidth","outerWidth","ckConfigurator","mathJax","getConfig","editor","toolbarType","underline","ckeditor","ckConfig","filterPlugin","plugin","contains","plugins","reject","split","join","extraPlugins","$rubricBlock","rbViews","$propContainer","setUpEditor","$rubricBlockBinding","$rubricBlockContent","syncRubricBlockContent","html","inline","qtiTestHelper","extractIdentifiers","obj","identifiers","has","concat","toLowerCase","flatten","forEach","value","getIdentifier","qtiType","lockedIdentifiers","suggestion","glue","push","idFormatValidator","qtiIdPattern","name","message","validate","callback","testidFormatValidator","qtiTestIdPattern","idAvailableValidator","values","original","filterQtiType","type","addMissingQtiType","collection","parentType","key","isObject","isArray","isNumber","replace","consolidateModel","testParts","assessmentSections","assessmentSection","ordering","shuffle","rubricBlocks","content","views","errorHandler","isValidSectionModel","sectionParts","setCategories","oldCategories","getCategories","removed","difference","all","propagated","addCategories","removeCategories","map","compact","arrays","union","apply","intersection","partial","sort","_ns","itemRefView","rubricBlockView","sectionCategory","$section","$selectionSwitcher","$selectionSelect","$selectionWithRep","switchSelection","prop","incrementer","selection","$title","text","itemRefs","labels","encode","acceptItemRefs","$selected","$items","Array","prototype","slice","arguments","$placeholder","$placeholders","off","defaultItemData","itemSessionControl","isUndefined","maxAttempts","clone","$item","addItemRef","defaults","decode","trim","end","qti-type","attr","$refList","itemData","eq","addRubricBlock","adder","templateData","$li","indexOf","$sections","sectionView","$testPart","$identifier","sections","addSection","sectionIndex","$testParts","testPartView","testView","addTestPart","testPartIndex","navigationMode","submissionMode","added","getAttributes","object","omit","attrToStr","attributes","reduce","acc","isString","isEmpty","Dom2QtiEncoder","modelValue","result","startTag","nodeValue","$nodeValue","elt","nodeType","xmlBase","nodeName","id","class","lang","transform","childNodes","module","history","feedback","DataBindController","itemrefView","validators","url","search","getJSON","notempty","Controller","routes","start","$saver","config","back","binderOptions","filters","isItemRef","isSection","encoders","dom2qti","beforeSave","binder","takeControl","get","register","window","save","success","Promise","isValidConfig","toolconfig","hook","triggerItemLoaded","tool","itemLoaded","initQtiTool","$toolsContainer","testContext","testRunner","itemIsLoaded","tools","resolve","require","$button","$existingBtn","isValidHook","init","clear","isVisible","render","_appendInOrder","$after","$before","order","prepend","parseInt","isNaN","$btn","_order","after","before","method","isFunction","$doc","eventifier","actionBarHook","registeredQtiTools","qtiTools","actionBarTools","registerTools","getRegisteredTools","getRegistered","isRegistered","list","container","promises","forIn","then","getId","region","hidden","active","program4","program29","program6","program7","answered","program8","program9","flagged","program11","program13","viewed","program17","program15","position","program21","program19","program24","program22","program27","program25","itemId","parts","navigatorTpl","navigatorTreeTpl","capitalize","_cssCls","collapsed","collapsible","masked","disabled","unseen","icon","scope","testSection","_selectors","component","filterBar","tree","collapseHandle","linearState","infoAnswered","infoViewed","infoUnanswered","infoFlagged","infoPanel","infoPanelLabels","partLabels","sectionLabels","itemLabels","itemIcons","icons","linearStart","counters","actives","collapsiblePanels","notFlagged","notAnswered","_filterMap","unanswered","filtered","_optionsMap","reviewScope","reviewPreventsUnseen","canCollapse","_reviewScopes","testReview","element","initOptions","putOnRight","insertMethod","currentFilter","$component","Error","_loadDOM","_initEvents","_updateDisplayOptions","$infoAnswered","$infoViewed","$infoUnanswered","$infoFlagged","$filterBar","$filters","$tree","$linearState","toggleClass","_openSelected","closest","_togglePanel","_openOnly","_mark","_select","_jump","mode","_filter","criteria","_updateSectionCounters","jquery","hierarchy","parentsUntil","add","opened","root","panel","collapseSelector","_setItemIcon","_adjustItemIcon","defaultIcon","iconCls","cls","_toggleFlag","flag","itemPosition","$filtered","total","nb","_writeCount","scopeClass","$root","_updateOptions","optionKey","contextKey","_updateInfos","progression","Number","$place","count","_getProgressionOfTest","numberItems","numberCompleted","numberPresented","numberFlagged","_getProgressionOfTestPart","numberItemsPart","numberCompletedPart","numberPresentedPart","numberFlaggedPart","_getProgressionOfTestSection","numberItemsSection","numberCompletedSection","numberPresentedSection","numberFlaggedSection","_updateTree","navigatorMap","reviewScopePart","reviewScopeSection","_partsFilter","part","preventsUnseen","setItemFlag","updateNumberFlagged","fields","currentPosition","currentFound","currentSection","currentPart","itemFound","itemSection","itemPart","field","getProgression","progressInfoMethod","eventName","dom","extraParameters","testReviewFactory","testMetaDataFactory","_testServiceCallId","testServiceCallId","testMetaData","setData","getLocalStorageData","setLocalStorageData","currentKey","getLocalStorageKey","localStorage","setItem","domException","i","removeItem","getItem","JSON","parse","_storageKeyPrefix","_data","TypeError","SECTION_EXIT_CODE","COMPLETED_NORMALLY","QUIT","COMPLETE_TIMEOUT","TIMEOUT","FORCE_QUIT","IN_PROGRESS","ERROR","TEST_EXIT_CODE","COMPLETE","TERMINATED","INCOMPLETE","INCOMPLETE_QUIT","INACTIVE","CANDIDATE_DISAGREED_WITH_NDA","getTestServiceCallId","setTestServiceCallId","stringify","addData","overwrite","getData","clearData","UrlParser","ServiceApi","baseUrl","parameters","serviceCallId","stateStorage","userService","paused","connected","state","hasBeenPaused","SIG_SUCCESS","SIG_ERROR","loadInto","frame","$frame","callUrl","getCallUrl","isCORSAllowed","checkCORS","connect","contentWindow","__knownParent__","onServiceApiReady","params","param","getUserPropertyValues","property","getServiceCallId","getState","setState","set","getHasBeenPaused","setHasBeenPaused","getParameter","onFinish","onFinishCallback","onKill","onKillCallback","onExit","onExitCallback","kill","exit","finish","valueArray","UserInfoService","requestUrl","hasOwnProperty","ajax","dataType","service","r","StateStorage","submitUrl","progressUpdater","iframeNotifier","MathJax","deleter","moment","modal","timerIds","currentTimes","lastDates","timeDiffs","waitingTime","$timers","$controls","timerIndex","sessionStateService","optionNextSection","optionNextSectionWarning","optionReviewScreen","TestRunner","TEST_STATE_INITIAL","TEST_STATE_INTERACTING","TEST_STATE_MODAL_FEEDBACK","TEST_STATE_SUSPENDED","TEST_STATE_CLOSED","TEST_NAVIGATION_LINEAR","TEST_NAVIGATION_NONLINEAR","TEST_ITEM_STATE_INTERACTING","beforeTransition","disableGui","$itemFrame","$rubricBlocks","$timerWrapper","afterTransition","enableGui","ITEM","ITEM_START_TIME_CLIENT","Date","now","jump","action","isJumpOutOfSection","isCurrentItemActive","isTimedSection","exitTimedSection","killItemSession","actionCall","keepItemTimed","duration","markForReview","markForReviewUrl","cache","async","itemFlagged","updateTools","moveForward","itemPositionSection","isTimeout","exitSection","moveBackward","jumpPosition","getCurrentSectionItems","isJumpToOtherSection","isValidPosition","exitCode","SECTION","qtiRunner","getQtiRunner","updateItemApi","displayExitMessage","nextSection","doNextSection","hasOption","scopeSuffixMap","scopeSuffix","$confirmBox","unansweredCount","flaggedCount","isCurrentItemAnswered","toString","ITEM_END_TIME_CLIENT","ITEM_TIMEZONE","utcOffset","format","itemServiceApi","itemSessionState","getCurrentItemState","response","base","option","itemFrame","getElementById","itemWindow","itemContainerFrame","itemContainerWindow","timeConstraints","qtiClassName","sectionItems","partId","testPartId","navMap","partIndex","skip","updateTimer","confirmBox","confirmBtn","setTestContext","eval","itemServiceApiCall","initMetadata","getSessionStateService","accuracy","$runner","restart","updateContext","updateProgress","updateNavigation","updateTestReview","updateInformation","updateRubrics","updateExitButton","resetCurrentItemState","$contentBox","adjustFrame","visibility","error","itemIdentifier","showSkip","showSkipEnd","showNextSection","allowSkipping","isLast","$skip","$skipEnd","$nextSection","createTimer","cst","$timer","$label","$time","formatTime","seconds","hasTimers","$topActionBar","allowLateSubmission","warningTime","NEGATIVE_INFINITY","timerWarning","setInterval","getTime","Math","round","clearInterval","isFinite","timeWarning","humanize","warning","rubrics","prependTo","Hub","Queue","$exit","$moveForward","$moveEnd","$moveBackward","canMoveBackward","considerProgress","$progressBox","testTitle","sectionText","isDeepestSectionVisible","sectionTitle","$position","$titleGroup","$logout","logoutButton","exitButton","frameContentHeight","rubricHeight","outerHeight","finalHeight","innerHeight","$bottomActionBar","height","$sideBars","$sideBar","contents","max","$naviButtons","hideGui","showGui","totalSeconds","sec_num","hours","floor","minutes","time","processError","serviceApi","extraParams","metaData","assign","TEST","setCurrentItemState","currentItemState","$skipButtons","$forwardButtons","$progressBar","$progressLabel","$contentPanel","ajaxError","jqxhr","status","getDuration","reviewScreen","reviewRegion","reviewCanCollapse","animate","opacity","responseId"],"mappings":"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AAAygB,oBACApzB,GAAA,OAAA,SAAAd,MAAAmX,UACA0Q,WAAAoB,KAAA9R,YACArW,GAAA,OAAA,SAAAd,MAAAod,KAAAjG,UACA0Q,WAAA8B,cAAAvM,KAAAjG,YAEAoQ,UAAA2K,UAAA9zB,EAAA,kBAGAypB,WAAAgG,iBACAhG,WAAAkG,mBAEAnH,eAAA/pB,OAAA,gBAGAgrB,WAAAwG,cAEA9G,UAAAkI,cAAAhT,IAAA8K,UAAAyK,kBAAAmC,SAAAC,QAAA,GAAA,KAEAtN,QAAA1oB,EAAA,kBACA4oB,MAAA5oB,EAAA,SAGAA,EAAAkH,UAAAxE,GAAA,iBAAA,SAAAC,EAAAszB,WAAApI;AACAoI,A5BlvCA,Y4BkvCApI,UACApE,WAAAwL,oBAAAgB,YAAApI,SAAAA,aAEAnrB,GAAA,aAAA,SAAAC,EAAA8P,GAAAiT,OACAjT,IAAAiT,OACA+D,WAAAwL,oBAAAxiB,GAAAiT,SAEAhjB,GAAA,eAAA,SAAAC,EAAAkxB,QACA1K,UAAAiB,WAAAyJ,OAAAA;A5BzvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9EA,AD+EA;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClGA,ADmGA;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpCA,ADqCA;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzJA,AD0JA;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvJA,ADwJA;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9HA,AD+HA;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5KA,AD6KA;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7HA,AD8HA;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvIA,ADwIA;ACvIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjNA,ADkNA;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtNA,ADuNA;ACtNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC13BA,AD23BA;AC13BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChNA,ADiNA;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AChDA,ADiDA;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sourcesContent":["/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n * \n * \n */\n\n//@see http://forge.taotesting.com/projects/tao/wiki/Front_js\ndefine('taoQtiTest/controller/routes',[],function(){\n 'use strict';\n\n return {\n 'Creator': {\n 'css': 'creator', \n 'actions': {\n 'index' : 'controller/creator/creator'\n }\n }\n };\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/testpart', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, functionType=\"function\", escapeExpression=this.escapeExpression;\n\n\n buffer += \"
\\n\\n

\";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n
\\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 \\n
\\n
\\n
\\n \\n

\\n
\\n \\n \\n
\\n\\n \\n
\\n
\\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/section', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
\\n\\n\\n

\";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\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

\\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Rubric Blocks\", options) : helperMissing.call(depth0, \"__\", \"Rubric Blocks\", options)))\n + \"\\n

\\n
    \\n \\n
    \\n
    \\n

    \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Items\", options) : helperMissing.call(depth0, \"__\", \"Items\", options)))\n + \"\\n

    \\n
      \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Add selected item(s) here.\", options) : helperMissing.call(depth0, \"__\", \"Add selected item(s) here.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/rubricblock', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;\n\n\n buffer += \"
    1. \\n
      \\n
      \\n
      \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
      \\n
      \\n
      \\n
      \\n
      \\n
    2. \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/itemref', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
    3. \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n
      \\n
      \\n
      \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
      \\n
      \\n
      \\n
    4. \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/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 var buffer = \"\", stack1, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
    5. \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \" \\n \";\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.parent), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
    6. \\n\";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\";\n if (helper = helpers.parent) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.parent); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\";\n return buffer;\n }\n\n stack1 = helpers.each.call(depth0, depth0, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/test-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\";\n\n\n buffer += \"
      \\n\\n \\n

      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The principle identifier of the test.\", options) : helperMissing.call(depth0, \"__\", \"The principle identifier of the test.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The test title.\", options) : helperMissing.call(depth0, \"__\", \"The test title.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"

      \\n\\n\\n
      \\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for the all test.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for the all test.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Late submission allowed\", options) : helperMissing.call(depth0, \"__\", \"Late submission allowed\", options)))\n + \"\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration should still be accepted.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n\\n
      \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/testpart-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
      \\n

      \";\n if (helper = helpers.identifier) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.identifier); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \\n\\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The test part identifier.\", options) : helperMissing.call(depth0, \"__\", \"The test part identifier.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Navigation\", options) : helperMissing.call(depth0, \"__\", \"Navigation\", options)))\n + \" *\\n
      \\n
      \\n \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.\", options) : helperMissing.call(depth0, \"__\", \"The navigation mode determines the general paths that the candidate may take. A linear mode restricts the candidate to attempt each item in turn. Non Linear removes this restriction.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Submission\", options) : helperMissing.call(depth0, \"__\", \"Submission\", options)))\n + \" *\\n
      \\n
      \\n \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.\", options) : helperMissing.call(depth0, \"__\", \"The submission mode determines when the candidate's responses are submitted for response processing. A testPart in individual mode requires the candidate to submit their responses on an item-by-item basis. In simultaneous mode the candidate's responses are all submitted together at the end of the testPart.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"

      \\n\\n\\n\\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response.\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"

      \\n\\n\\n
      \\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this test part.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this test part.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the test part should still be accepted.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n
      \\n
      \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/section-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
      \\n

      \";\n if (helper = helpers.title) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.title); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The identifier of the section.\", options) : helperMissing.call(depth0, \"__\", \"The identifier of the section.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The section title.\", options) : helperMissing.call(depth0, \"__\", \"The section title.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"A visible section is one that is identifiable by the candidate.\", options) : helperMissing.call(depth0, \"__\", \"A visible section is one that is identifiable by the candidate.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n\\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.\", options) : helperMissing.call(depth0, \"__\", \"An invisible section with a parent that is subject to shuffling can specify whether or not its children, which will appear to the candidate as if they were part of the parent, are shuffled as a block or mixed up with the other children of the parent section.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.\", options) : helperMissing.call(depth0, \"__\", \"Section level category enables configuring the categories of its composing items all at once. A category in gray means that all items have that category. A category in white means that only a few items have that category.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Selection\", options) : helperMissing.call(depth0, \"__\", \"Selection\", options)))\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
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The number of child elements to be selected.\", options) : helperMissing.call(depth0, \"__\", \"The number of child elements to be selected.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n\\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"When selecting child elements each element is normally eligible for selection once only.\", options) : helperMissing.call(depth0, \"__\", \"When selecting child elements each element is normally eligible for selection once only.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Ordering\", options) : helperMissing.call(depth0, \"__\", \"Ordering\", options)))\n + \"

      \\n\\n\\n
      \\n\\n
      \\n
      \\n \\n
      \\n\\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.\", options) : helperMissing.call(depth0, \"__\", \"If set, it causes the order of the child elements to be randomized, otherwise it uses the order in which the child elements are defined.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"

      \\n\\n\\n
      \\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response.\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"

      \\n\\n\\n
      \\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this section.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this section.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the section should still be accepted.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n
      \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/itemref-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\n\n buffer += \"
      \\n\\n

      \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The identifier of the item reference.\", options) : helperMissing.call(depth0, \"__\", \"The identifier of the item reference.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"The reference.\", options) : helperMissing.call(depth0, \"__\", \"The reference.\", options)))\n + \"\\n
      \\n
      \\n
      \\n \\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Items can optionally be assigned to one or more categories.\", options) : helperMissing.call(depth0, \"__\", \"Items can optionally be assigned to one or more categories.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If required it must appear (at least once) in the selection.\", options) : helperMissing.call(depth0, \"__\", \"If required it must appear (at least once) in the selection.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Not shuffled, the position remains fixed.\", options) : helperMissing.call(depth0, \"__\", \"Not shuffled, the position remains fixed.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Item Session Control\", options) : helperMissing.call(depth0, \"__\", \"Item Session Control\", options)))\n + \"

      \\n\\n\\n
      \\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options) : helperMissing.call(depth0, \"__\", \"Controls the maximum number of attempts allowed. 0 means unlimited.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint affects the visibility of feedback after the end of the last attempt.\", options) : helperMissing.call(depth0, \"__\", \"This constraint affects the visibility of feedback after the end of the last attempt.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options) : helperMissing.call(depth0, \"__\", \"This constraint controls whether or not the candidate is allowed to provide a comment on the item during the session. Comments are not part of the assessed responses.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"If the candidate can skip the item, without submitting a response.\", options) : helperMissing.call(depth0, \"__\", \"If the candidate can skip the item, without submitting a response.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Time Limits\", options) : helperMissing.call(depth0, \"__\", \"Time Limits\", options)))\n + \"

      \\n\\n\\n
      \\n\\n\\n\\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Maximum duration for this item.\", options) : helperMissing.call(depth0, \"__\", \"Maximum duration for this item.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n\\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.\", options) : helperMissing.call(depth0, \"__\", \"Whether a candidate's response that is beyond the maximum duration of the item should still be accepted.\", options)))\n + \"\\n
      \\n
      \\n
      \\n
      \\n
      \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/controller/creator/templates/rubricblock-props', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType=\"function\";\n\n\n buffer += \"
      \\n\\n

      \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Rubric Block\", options) : helperMissing.call(depth0, \"__\", \"Rubric Block\", options)))\n + \": \";\n if (helper = helpers.index) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.index); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"

      \\n\\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n
      \\n \\n
      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"Who can view the rubric block during the delivery.\", options) : helperMissing.call(depth0, \"__\", \"Who can view the rubric block during the delivery.\", options)))\n + \"\\n
      \\n
      \\n
      \\n\\n
      \\n\";\n return buffer;\n });\n});\n\n","define('taoQtiTest/controller/creator/templates/index',[\n'tpl!taoQtiTest/controller/creator/templates/testpart',\n'tpl!taoQtiTest/controller/creator/templates/section', \n'tpl!taoQtiTest/controller/creator/templates/rubricblock', \n'tpl!taoQtiTest/controller/creator/templates/itemref',\n'tpl!taoQtiTest/controller/creator/templates/item',\n'tpl!taoQtiTest/controller/creator/templates/test-props',\n'tpl!taoQtiTest/controller/creator/templates/testpart-props', \n'tpl!taoQtiTest/controller/creator/templates/section-props', \n'tpl!taoQtiTest/controller/creator/templates/itemref-props', \n'tpl!taoQtiTest/controller/creator/templates/rubricblock-props'], \n\nfunction(testPart, section, rubricBlock, itemRef, item, testProps, testPartProps, sectionProps, itemRefProps, rubricBlockProps){\n 'use strict';\n\n /**\n * Expose all the templates used by the test creator\n * @exports taoQtiTest/controller/creator/templates/index\n */\n return {\n 'testpart' : testPart,\n 'section' : section,\n 'itemref' : itemRef,\n 'item' : item,\n 'rubricblock' : rubricBlock,\n 'properties' : {\n 'test' : testProps,\n 'testpart' : testPartProps,\n 'section' : sectionProps,\n 'itemref' : itemRefProps,\n 'rubricblock' : rubricBlockProps\n }\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/item',['jquery', 'taoQtiTest/controller/creator/templates/index'], function($, templates){\n 'use strict';\n \n var itemTemplate = templates.item;\n \n /**\n * The ItemView setup items related components\n * @exports taoQtiTest/controller/creator/views/item\n * @param {Function} loadItems - the function used to get items from the server\n */\n var itemView = function(loadItems){\n \n var $panel = $('.test-creator-items .item-selection'); \n var $search = $('#item-filter');\n var $itemBox = $('.item-box', $panel);\n \n if(typeof loadItems === 'function'){\n //search pattern is empty the 1st time, give it undefined\n loadItems(undefined, function(items){\n update(items);\n setUpLiveSearch();\n });\n }\n \n /**\n * Set up the search behavior: once 3 chars are enters into the field,\n * we load the items that matches the given search pattern.\n * @private\n */\n function setUpLiveSearch (){\n var timeout;\n \n var liveSearch = function(){\n var pattern = $search.val();\n if(pattern.length > 1 || pattern.length === 0){\n clearTimeout(timeout);\n timeout = setTimeout(function(){\n loadItems(pattern, function(items){\n update(items);\n });\n }, 300);\n }\n };\n \n //trigger the search on keyp and on the magnifer button click\n $search.keyup(liveSearch)\n .siblings('.ctrl').click(liveSearch);\n }\n \n /**\n * Update the items list\n * @private\n * @param {Array} items - the new items\n */\n function update (items){\n disableSelection();\n $itemBox.empty().append(itemTemplate(items));\n enableSelection();\n }\n \n /**\n * Disable the selectable component\n * @private\n * @param {Array} items - the new items\n */\n function disableSelection (){\n if($panel.data('selectable')){\n $panel.selectable('disable');\n }\n }\n \n /**\n * Enable to select items to be added to sections\n * using the jquery-ui selectable.\n * @private\n */\n function enableSelection (){\n \n if($panel.data('selectable')){\n $panel.selectable('enable');\n } else {\n $panel.selectable({\n filter: 'li',\n selected: function( event, ui ) {\n $(ui.selected).addClass('selected');\n },\n unselected: function( event, ui ) {\n $(ui.unselected).removeClass('selected');\n },\n stop: function(){\n $(this).trigger('itemselect.creator', $('.selected')); \n }\n });\n }\n }\n };\n \n return itemView;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/property',[\n'jquery', \n'ui', \n'core/databinder', \n'taoQtiTest/controller/creator/templates/index'], \nfunction($, ui, DataBinder, templates){\n 'use strict';\n\n /**\n * @callback PropertyViewCallback\n * @param {propertyView} propertyView - the view object \n */\n \n /**\n * The PropertyView setup the property panel component\n * \n * @exports taoQtiTest/controller/creator/views/property\n */\n var propView = function propView(tmplName, model){\n var $container = $('.test-creator-props');\n var template = templates.properties[tmplName];\n var $view; \n\n /**\n * Opens the view for the 1st time\n */ \n var open = function propOpen(){\n var databinder;\n $container.children('.props').hide().trigger('propclose.propview');\n $view = $(template(model)).appendTo($container).filter('.props'); \n \n //start listening for DOM compoenents inside the view\n ui.startDomComponent($view);\n\n //start the data binding\n databinder = new DataBinder($view, model);\n databinder.bind();\n \n propValidation(); \n\n $view.trigger('propopen.propview');\n };\n\n /**\n * Get the view container element\n * @returns {jQueryElement}\n */ \n var getView = function propGetView(){\n return $view;\n };\n \n /**\n * Check wheter the view is displayed\n * @returns {boolean} true id opened\n */ \n var isOpen = function propIsOpen(){\n return $view.css('display') !== 'none';\n };\n\n /**\n * Bind a callback on view open\n * @param {PropertyViewCallback} cb\n */ \n var onOpen = function propOnOpen(cb){\n $view.on('propopen.propview', function(e){\n e.stopPropagation();\n cb(); \n });\n };\n\n \n /**\n * Bind a callback on view close\n * @param {PropertyViewCallback} cb\n */ \n var onClose = function propOnClose(cb){\n $view.on('propclose.propview', function(e){\n e.stopPropagation();\n cb(); \n });\n };\n\n /**\n * Removes the property view\n */ \n var destroy = function propDestroy(){\n $view.remove();\n };\n \n /**\n * Toggles the property view display\n */ \n var toggle = function propToggle(){\n $container.children('.props').not($view).hide().trigger('propclose.propview');\n if(isOpen()){\n $view.hide().trigger('propclose.propview');\n } else {\n $view.show().trigger('propopen.propview');\n }\n };\n \n /**\n * Set up the validation on the property view\n * @private\n */ \n function propValidation() {\n $view.on('validated.group', function(e, isValid){\n if(e.namespace === 'group'){\n var $togglers = $('#test-creator .property-toggler, #saver');\n if(isValid === true){\n $togglers.removeClass('disabled');\n } else {\n $togglers.addClass('disabled');\n }\n }\n });\n $view.groupValidator();\n }\n\n return {\n open : open,\n getView : getView,\n isOpen : isOpen,\n onOpen : onOpen,\n onClose : onClose,\n destroy : destroy,\n toggle : toggle\n }; \n };\n\n return propView;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/actions',[\n'jquery',\n'taoQtiTest/controller/creator/views/property'],\nfunction($, propertyView){\n 'use strict';\n\n var disabledClass = 'disabled';\n var activeClass = 'active';\n var btnOnClass = 'tlb-button-on';\n\n /**\n * Set up the property view for an element\n * @param {jQueryElement} $container - that contains the property opener\n * @param {String} template - the name of the template to give to the propertyView\n * @param {Object} model - the model to bind\n * @param {PropertyViewCallback} cb - execute at view setup phase\n */\n function properties ($container, template, model, cb) {\n var propView = null;\n $container.find('.property-toggler').on('click', function(e){\n e.preventDefault();\n var $elt = $(this);\n if(!$(this).hasClass(disabledClass)){\n\n $elt.blur(); //to remove the focus\n\n if(propView === null){\n\n $container.addClass(activeClass);\n $elt.addClass(btnOnClass);\n\n propView = propertyView(template, model);\n propView.open();\n\n propView.onOpen(function(){\n $container.addClass(activeClass);\n $elt.addClass(btnOnClass);\n });\n propView.onClose(function(){\n $container.removeClass(activeClass);\n $elt.removeClass(btnOnClass);\n });\n\n if(typeof cb === 'function'){\n cb(propView);\n }\n } else {\n propView.toggle();\n }\n }\n });\n }\n\n\n /**\n * Enable to move an element\n * @param {jQueryElement} $actionContainer - where the mover is\n * @param {String} containerClass - the cssClass of the element container\n * @param {String} elementClass - the cssClass to identify elements\n */\n function move ($actionContainer, containerClass, elementClass) {\n var $element = $actionContainer.parents('.' + elementClass);\n var $container = $element.parents('.' + containerClass );\n\n //move up an element\n $('.move-up', $actionContainer).click(function(e){\n var $elements, index;\n\n //prevent default and click during animation\n e.preventDefault();\n if($element.is(':animated')){\n return false;\n }\n\n //get the position\n $elements = $('.' + elementClass, $container);\n index = $elements.index($element);\n if (index > 0) {\n $element.fadeOut(200, function(){\n $element\n .insertBefore($('.' + elementClass + ' :eq(' + (index - 1) + ')', $container))\n .fadeIn(400, function(){\n $container.trigger('change');\n });\n });\n }\n });\n\n //move down an element\n $('.move-down', $actionContainer).click(function(e){\n var $elements, index;\n\n //prevent default and click during animation\n e.preventDefault();\n if($element.is(':animated')){\n return false;\n }\n\n //get the position\n $elements = $('.' + elementClass, $container);\n index = $elements.index($element);\n if (index < ($elements.length - 1) && $elements.length > 1) {\n $element.fadeOut(200, function(){\n $element\n .insertAfter($('.' + elementClass + ' :eq(' + (index + 1) + ')', $container))\n .fadeIn(400, function(){\n $container.trigger('change');\n });\n });\n }\n });\n }\n\n /**\n * Update the movable state of an element\n * @param {jQueryElement} $container - the movable elements (scopped)\n * @param {String} elementClass - the cssClass to identify elements\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function movable ($container, elementClass, actionContainerElt){\n $container.each(function(){\n var $elt = $(this);\n var $actionContainer = $(actionContainerElt, $elt);\n\n var index = $container.index($elt);\n var $moveUp = $('.move-up', $actionContainer);\n var $moveDown = $('.move-down', $actionContainer);\n\n //only one test part, no moving\n if( $container.length === 1 ){\n $moveUp.addClass(disabledClass);\n $moveDown.addClass(disabledClass);\n\n //testpart is the first, only moving down\n } else if(index === 0) {\n $moveUp.addClass(disabledClass);\n $moveDown.removeClass(disabledClass);\n\n //testpart is the lasst, only moving up\n } else if ( index >= ($container.length - 1) ) {\n $moveDown.addClass(disabledClass);\n $moveUp.removeClass(disabledClass);\n\n //or enable moving top/bottom\n } else {\n $moveUp.removeClass(disabledClass);\n $moveDown.removeClass(disabledClass);\n }\n });\n }\n\n /**\n * Update the removable state of an element\n * @param {jQueryElement} $container - that contains the removable action\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function removable ($container, actionContainerElt){\n $container.each(function(){\n var $elt = $(this);\n var $actionContainer = $(actionContainerElt, $elt);\n var $delete = $('[data-delete]', $actionContainer);\n\n if($container.length <= 1){\n $delete.addClass(disabledClass);\n } else {\n $delete.removeClass(disabledClass);\n }\n });\n }\n\n /**\n * Disable all the actions of the target\n * @param {jQueryElement} $container - that contains the the actions\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function disable($container, actionContainerElt){\n $container.find(actionContainerElt).find('[data-delete],.move-up,.move-down').addClass(disabledClass);\n }\n\n /**\n * Enable all the actions of the target\n * @param {jQueryElement} $container - that contains the the actions\n * @param {String} actionContainerElt - the element name that contains the actions\n */\n function enable($container, actionContainerElt){\n $container.find(actionContainerElt).find('[data-delete],.move-up,.move-down').removeClass(disabledClass);\n }\n\n /**\n * The actions gives you shared behavior for some actions.\n *\n * @exports taoQtiTest/controller/creator/views/actions\n */\n return {\n properties : properties,\n move : move,\n removable : removable,\n movable : movable,\n disable : disable,\n enable : enable\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/itemref',[\n'jquery',\n'lodash', \n'i18n',\n'taoQtiTest/controller/creator/views/actions'],\nfunction($, _, __, actions){\n 'use strict';\n\n /**\n * Set up an item ref: init action beahviors. Called for each one.\n *\n * @param {jQueryElement} $itemRef - the itemRef element to set up\n * @param {Object} model - the data model to bind to the ref\n */\n var setUp = function setUp ($itemRef, model){\n\n var $actionContainer = $('.actions', $itemRef);\n \n actions.properties($actionContainer, 'itemref', model, propHandler);\n actions.move($actionContainer, 'itemrefs', 'itemref');\n\n resize();\n\n /**\n * Perform some binding once the property view is create\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n\n categoriesProperty(propView.getView());\n \n $itemRef.parents('.testpart').on('delete', removePropHandler);\n $itemRef.parents('.section').on('delete', removePropHandler);\n $itemRef.on('delete', removePropHandler);\n \n function removePropHandler(e){\n if(propView !== null){\n propView.destroy();\n }\n }\n }\n\n /**\n * Set up the category property\n * @private\n * @param {jQueryElement} $view - the $view object containing the $select\n */\n function categoriesProperty($view){\n \n var $select = $view.find('[name=itemref-category]');\n $select.select2({\n width: '100%',\n tags : [],\n multiple : true,\n tokenSeparators: [\",\", \" \", \";\"],\n formatNoMatches : function(){\n return __('Enter a category');\n },\n maximumInputLength : 32\n });\n \n initCategories();\n $view.on('propopen.propview', function(){\n initCategories();\n });\n \n /**\n * save the categories into the model\n * @private\n */\n function initCategories(){\n $select.select2('val', model.categories);\n }\n }\n };\n\n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n var listenActionState = function listenActionState (){\n\n var $actionContainer;\n \n $('.itemrefs').each(function(){\n actions.movable($('.itemref', $(this)), 'itemref', '.actions');\n });\n \n $(document)\n .on('delete', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('itemref')){\n $parent = $target.parents('.itemrefs');\n actions.disable($parent.find('.itemref'), '.actions');\n }\n })\n .on('add change undo.deleter deleted.deleter', '.itemrefs', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('itemref') || $target.hasClass('itemrefs')){\n $parent = $('.itemref', $target.hasClass('itemrefs') ? $target : $target.parents('.itemrefs'));\n actions.enable($parent, '.actions');\n actions.movable($parent, 'itemref', '.actions');\n }\n });\n };\n\n /**\n * We need to resize the itemref in case of long labels\n */\n var resize = _.throttle(function resize(){\n var $refs = $('.itemrefs').first();\n var $actions = $('.itemref .actions').first();\n var width = $refs.innerWidth() - $actions.outerWidth();\n $('.itemref > .title').width(width); \n }, 100);\n \n /**\n * The itemrefView setup itemref related components and beahvior\n * \n * @exports taoQtiTest/controller/creator/views/itemref\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState,\n resize : resize\n };\n \n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/controller/creator/helpers/ckConfigurator',['ui/ckeditor/ckConfigurator', 'mathJax'], function(ckConfigurator, mathJax) {\n 'use strict';\n\n /**\n * Generate a configuration object for CKEDITOR\n *\n * @param editor instance of ckeditor\n * @param toolbarType block | inline | flow | qtiBlock | qtiInline | qtiFlow | reset to get back to normal\n * @param {Object} [options] - is based on the CKEDITOR config object with some additional sugar\n * Note that it's here you need to add parameters for the resource manager.\n * Some options are not covered in http://docs.ckeditor.com/#!/api/CKEDITOR.config\n * @param [options.dtdOverrides] - @see dtdOverrides which pre-defines them\n * @param {Object} [options.positionedPlugins] - @see ckConfig.positionedPlugins\n * @param {Boolean} [options.qtiImage] - enables the qtiImage plugin\n * @param {Boolean} [options.qtiInclude] - enables the qtiInclude plugin\n * @param {Boolean} [options.underline] - enables the underline plugin\n * @param {Boolean} [options.mathJax] - enables the mathJax plugin\n *\n * @see http://docs.ckeditor.com/#!/api/CKEDITOR.config\n */\n var getConfig = function(editor, toolbarType, options){\n options = options || {};\n\n options.underline = true;\n\n return ckConfigurator.getConfig(editor, toolbarType, options);\n };\n\n return {\n getConfig : getConfig\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/rubricblock',[\n 'jquery',\n 'lodash',\n 'taoQtiTest/controller/creator/views/actions',\n 'helpers',\n 'ckeditor',\n 'taoQtiTest/controller/creator/helpers/ckConfigurator'\n], function($, _, actions, helpers, ckeditor, ckConfigurator){ // qtiClasses, creatorRenderer, XmlRenderer, simpleParser){\n 'use strict';\n\n //compute ckeditor config only once\n var ckConfig = ckConfigurator.getConfig(ckeditor, 'qtiBlock');\n\n var filterPlugin = function filterPlugin(plugin){\n return _.contains(['taoqtiimage', 'taoqtimedia','taoqtimaths', 'taoqtiinclude'], plugin);\n };\n ckConfig.plugins = _.reject(ckConfig.plugins.split(','), filterPlugin).join(',');\n ckConfig.extraPlugins = _.reject(ckConfig.extraPlugins.split(','), filterPlugin).join(',');\n\n /**\n * Set up a rubric block: init action beahviors. Called for each one.\n *\n * @param {jQueryElement} $rubricBlock - the rubricblock to set up\n */\n var setUp = function setUp($rubricBlock, model, data){\n\n actions.properties($rubricBlock, 'rubricblock', model, propHandler);\n setUpEditor();\n\n /**\n * Perform some binding once the property view is create\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler(propView){\n\n rbViews(propView.getView());\n\n $rubricBlock.parents('.testpart').on('delete', removePropHandler);\n $rubricBlock.parents('.section').on('delete', removePropHandler);\n $rubricBlock.on('delete', removePropHandler);\n\n function removePropHandler(e){\n if(propView !== null){\n propView.destroy();\n }\n }\n }\n\n /**\n * Set up the views select box\n * @private\n * @param {jQuerElement} $propContainer - the element container\n */\n function rbViews($propContainer){\n var $select = $('select', $propContainer);\n\n $select.select2({\n 'width' : '100%'\n }).on(\"select2-removed\", function(e){\n if($select.select2('val').length === 0){\n $select.select2('val', [1]);\n }\n });\n\n if($select.select2('val').length === 0){\n $select.select2('val', [1]);\n }\n }\n\n /**\n * Set up ck editor\n * @private\n */\n function setUpEditor(){\n var editor;\n\n //we need to synchronize the ck elt with an hidden elt that has data-binding\n var $rubricBlockBinding = $('.rubricblock-binding', $rubricBlock);\n var $rubricBlockContent = $('.rubricblock-content', $rubricBlock);\n var syncRubricBlockContent = _.throttle(function(){\n $rubricBlockBinding\n .html($rubricBlockContent.html())\n .trigger('change');\n }, 100);\n\n $rubricBlockContent.empty().html($rubricBlockBinding.html());\n\n editor = ckeditor.inline($rubricBlockContent[0], ckConfig);\n editor.on('change', function(e) {\n syncRubricBlockContent();\n });\n }\n };\n\n /**\n * The rubriclockView setup RB related components and beahvior\n *\n * @exports taoQtiTest/controller/creator/views/rubricblock\n */\n return {\n setUp : setUp\n };\n\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/helpers/qtiTest',['lodash', 'i18n'], function(_, __){\n 'use strict';\n\n /**\n * Utils to manage the QTI Test model\n * @exports taoQtiTest/controller/creator/qtiTestHelper\n */\n var qtiTestHelper = {\n\n /**\n * Extract qti identifiers from a model\n * @param {Object} obj - the model to extract id from\n * @returns {Array} the extracted identifiers\n */\n extractIdentifiers : function extractIdentifiers(obj){\n var self = this;\n var identifiers = [];\n if(_.has(obj, 'identifier')){\n identifiers = identifiers.concat(obj.identifier.toLowerCase());\n }\n _.flatten(_.forEach(obj, function(value) {\n identifiers = identifiers.concat(typeof value === \"object\" ? self.extractIdentifiers(value) : []);\n }), true);\n return identifiers;\n },\n\n /**\n * Get a valid and avialable qti identifier\n * @param {String} qtiType - the type of element you want an id for\n * @param {Array} lockedIdentifiers - the list of identifiers you cannot use anymore\n * @returns {String} the identifier\n */\n getIdentifier : function getIdentifier(qtiType, lockedIdentifiers){\n var index = 1;\n var suggestion;\n var glue = '-';\n\n do {\n suggestion = qtiType + glue + (index++);\n } while(_.contains(lockedIdentifiers, suggestion.toLowerCase()));\n\n lockedIdentifiers.push(suggestion.toLowerCase());\n\n return suggestion;\n },\n\n /**\n * Gives you a validator that check QTI id format\n * @returns {Object} the validator\n */\n idFormatValidator : function idFormatValidator(){\n var qtiIdPattern = /^[_a-zA-Z]{1}[a-zA-Z0-9\\-._]{0,31}$/i;\n return {\n name : 'idFormat',\n message : __('is not a valid identifier (alphanum, underscore, dash and dots)'),\n validate : function(value, callback){\n if(typeof callback === 'function'){\n callback(qtiIdPattern.test(value));\n }\n }\n };\n },\n\n /**\n * Gives you a validator that check QTI id format of the test (it is different from the others...)\n * @returns {Object} the validator\n */\n testidFormatValidator : function testidFormatValidator(){\n var qtiTestIdPattern = /^\\S+$/;\n return {\n name : 'testIdFormat',\n message : __('is not a valid identifier (everything except spaces)'),\n validate : function(value, callback){\n if(typeof callback === 'function'){\n callback(qtiTestIdPattern.test(value));\n }\n }\n };\n },\n\n /**\n * Gives you a validator that check if a QTI id is available\n * @param {Array} lockedIdentifiers - the list of identifiers you cannot use anymore\n * @returns {Object} the validator\n */\n idAvailableValidator : function idAvailableValidator(lockedIdentifiers){\n return {\n name : 'testIdAvailable',\n message : __('is already used in the test.'),\n validate : function(value, callback, options){\n if(typeof callback === 'function'){\n callback(!_.contains(_.values(lockedIdentifiers), value.toLowerCase()) || (options.original && value === options.original));\n }\n }\n };\n },\n\n /**\n * Does the value contains the type type\n * @param {Object} value\n * @param {string} type\n * @returns {boolean}\n */\n filterQtiType : function filterQtiType (value, type){\n return value['qti-type'] && value['qti-type'] === type;\n },\n\n /**\n * Add the 'qti-type' properties to object that miss it, using the parent key name\n * @param {Object|Array} collection\n * @param {string} parentType\n */\n addMissingQtiType : function addMissingQtiType(collection, parentType) {\n var self = this;\n _.forEach(collection, function(value, key) {\n if (_.isObject(value) && !_.isArray(value) && !_.has(value, 'qti-type')) {\n if (_.isNumber(key)) {\n if (parentType) {\n value['qti-type'] = parentType;\n }\n } else {\n value['qti-type'] = key;\n }\n }\n if (_.isArray(value)) {\n self.addMissingQtiType(value, key.replace(/s$/, ''));\n } else if (_.isObject(value)) {\n self.addMissingQtiType(value);\n }\n });\n },\n\n /**\n * Applies consolidation rules to the model\n * @param {Object} model\n * @returns {Object}\n */\n consolidateModel : function consolidateModel(model){\n if(model && model.testParts && _.isArray(model.testParts) && model.testParts[0]){\n var testPart = model.testParts[0];\n if(testPart.assessmentSections && _.isArray(testPart.assessmentSections)){\n _.forEach(testPart.assessmentSections, function(assessmentSection, key) {\n\n //remove ordering is shuffle is false\n if(assessmentSection.ordering &&\n assessmentSection.ordering.shuffle !== undefined && assessmentSection.ordering.shuffle === false){\n delete assessmentSection.ordering;\n }\n\n if(assessmentSection.rubricBlocks && _.isArray(assessmentSection.rubricBlocks)) {\n\n //remove rubrick blocks if empty\n if (assessmentSection.rubricBlocks.length === 0 ||\n (assessmentSection.rubricBlocks.length === 1 && assessmentSection.rubricBlocks[0].content.length === 0) ) {\n\n delete assessmentSection.rubricBlocks;\n }\n //ensure the view attribute is present\n else if(assessmentSection.rubricBlocks.length > 0){\n _.forEach(assessmentSection.rubricBlocks, function(rubricBlock){\n rubricBlock.views = ['candidate'];\n //change once views are supported\n //if(rubricBlock && rubricBlock.content && (!rubricBlock.views || (_.isArray(rubricBlock.views) && rubricBlock.views.length === 0))){\n //rubricBlock.views = ['candidate'];\n //}\n });\n }\n }\n });\n }\n }\n return model;\n }\n };\n\n return qtiTestHelper;\n});\n\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n */\ndefine('taoQtiTest/controller/creator/helpers/sectionCategory',[\n 'lodash',\n 'core/errorHandler'\n], function (_, errorHandler){\n\n 'use strict';\n\n var _ns = '.sectionCategory';\n \n /**\n * Check if the given object is a valid assessmentSection model object\n * \n * @param {object} model\n * @returns {boolean}\n */\n function isValidSectionModel(model){\n return (_.isObject(model) && model['qti-type'] === 'assessmentSection' && _.isArray(model.sectionParts));\n }\n \n /**\n * Set an array of categories to the section model (affect the childen itemRef)\n * \n * @param {object} model\n * @param {array} categories\n * @returns {undefined}\n */\n function setCategories(model, categories){\n\n var oldCategories = getCategories(model);\n \n //the categories that are no longer in the new list of categories should be removed\n var removed = _.difference(oldCategories.all, categories);\n \n //the categories that are not in the old categories collection should be added to the children\n var propagated = _.difference(categories, oldCategories.all);\n \n //process the modification\n addCategories(model, propagated);\n removeCategories(model, removed);\n }\n \n /**\n * Get the categories assign to the section model, infered by its interal itemRefs\n * \n * @param {object} model\n * @returns {object}\n */\n function getCategories(model){\n\n if(isValidSectionModel(model)){\n var categories = _.map(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef' && _.isArray(itemRef.categories)){\n return _.compact(itemRef.categories);\n }\n });\n //array of categories\n var arrays = _.values(categories);\n var union = _.union.apply(null, arrays);\n \n //categories that are common to all itemRef\n var propagated = _.intersection.apply(null, arrays);\n \n //the categories that are only partially covered on the section level : complementary of \"propagated\"\n var partial = _.difference(union, propagated);\n \n return {\n all : union.sort(),\n propagated : propagated.sort(),\n partial : partial.sort()\n };\n }else{\n errorHandler.throw(_ns, 'invalid tool config format');\n }\n }\n \n /**\n * Add an array of categories to a section model (affect the childen itemRef)\n * \n * @param {object} model\n * @param {array} categories\n * @returns {undefined}\n */\n function addCategories(model, categories){\n if(isValidSectionModel(model)){\n _.each(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef'){\n if(!_.isArray(itemRef.categories)){\n itemRef.categories = [];\n }\n itemRef.categories = _.union(itemRef.categories, categories);\n }\n });\n }else{\n errorHandler.throw(_ns, 'invalid tool config format');\n }\n }\n \n /**\n * Remove an array of categories from a section model (affect the childen itemRef)\n * \n * @param {object} model\n * @param {array} categories\n * @returns {undefined}\n */\n function removeCategories(model, categories){\n if(isValidSectionModel(model)){\n _.each(model.sectionParts, function (itemRef){\n if(itemRef['qti-type'] === 'assessmentItemRef' && _.isArray(itemRef.categories)){\n itemRef.categories = _.difference(itemRef.categories, categories);\n }\n });\n }else{\n errorHandler.throw(_ns, 'invalid tool config format');\n }\n }\n\n return {\n isValidSectionModel : isValidSectionModel,\n setCategories : setCategories,\n getCategories : getCategories,\n addCategories : addCategories,\n removeCategories : removeCategories\n };\n});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/section',[\n 'jquery',\n 'lodash',\n 'uri',\n 'i18n',\n 'taoQtiTest/controller/creator/views/actions',\n 'taoQtiTest/controller/creator/views/itemref',\n 'taoQtiTest/controller/creator/views/rubricblock',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest',\n 'taoQtiTest/controller/creator/helpers/sectionCategory'\n],\nfunction($, _, uri, __, actions, itemRefView, rubricBlockView, templates, qtiTestHelper, sectionCategory){\n 'use strict';\n\n /**\n * Set up a section: init action beahviors. Called for each section.\n *\n * @param {jQueryElement} $sectuin - the section to set up\n * @param {Object} model - the data model to bind to the test part\n * @param {Object} [data] - additionnal data used by the setup\n * @param {Array} [data.identifiers] - the locked identifiers\n */\n var setUp = function setUp ($section, model, data){\n\n var $actionContainer = $('h2', $section);\n\n actions.properties($actionContainer, 'section', model, propHandler);\n actions.move($actionContainer, 'sections', 'section');\n itemRefs();\n acceptItemRefs();\n rubricBlocks();\n addRubricBlock();\n\n //trigger for the case the section is added an a selection is ongoing\n\n\n /**\n * Perform some binding once the property view is create\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n\n var $view = propView.getView();\n \n //enable/disable selection\n var $selectionSwitcher = $('[name=section-enable-selection]', $view);\n var $selectionSelect = $('[name=section-select]', $view);\n var $selectionWithRep = $('[name=section-with-replacement]', $view);\n\n var switchSelection = function switchSelection(){\n if($selectionSwitcher.prop('checked') === true){\n $selectionSelect.incrementer('enable');\n $selectionWithRep.removeClass('disabled');\n } else {\n $selectionSelect.incrementer('disable');\n $selectionWithRep.addClass('disabled');\n }\n };\n $selectionSwitcher.on('change', switchSelection);\n $selectionSwitcher.on('change', function updateModel(){\n if(!$selectionSwitcher.prop('checked')){\n $selectionSelect.val(0);\n $selectionWithRep.prop('checked', false);\n delete model.selection;\n }\n });\n\n $selectionSwitcher.prop('checked', !!model.selection).trigger('change');\n\n //listen for databinder change to update the test part title\n var $title = $('[data-bind=title]', $section);\n $view.on('change.binder', function(e, model){\n if(e.namespace === 'binder' && model['qti-type'] === 'assessmentSection'){\n $title.text(model.title);\n }\n });\n\n $section.parents('.testpart').on('deleted.deleter', removePropHandler);\n $section.on('deleted.deleter', removePropHandler);\n \n //section level category configuration\n categoriesProperty($view);\n \n function removePropHandler(){\n if(propView !== null){\n propView.destroy();\n }\n }\n }\n \n /**\n * Set up the item refs that already belongs to the section\n * @private\n */\n function itemRefs(){\n\n if(!model.sectionParts){\n model.sectionParts = [];\n }\n $('.itemref', $section).each(function(){\n var $itemRef = $(this);\n var index = $itemRef.data('bind-index');\n if(!model.sectionParts[index]){\n model.sectionParts[index] = {};\n }\n\n itemRefView.setUp($itemRef, model.sectionParts[index]);\n $itemRef.find('.title').text(\n data.labels[uri.encode($itemRef.data('uri'))]\n );\n });\n }\n\n /**\n * Make the section to accept the selected items\n * @private\n */\n function acceptItemRefs(){\n var $selected;\n var $items = $('.test-creator-items');\n\n //the item selector trigger a select event\n $items.on('itemselect.creator', function(e){\n var selection = Array.prototype.slice.call(arguments, 1);\n var $placeholder = $('.itemref-placeholder', $section);\n var $placeholders = $('.itemref-placeholder');\n \n if(selection.length > 0){\n $placeholder.show().off('click').on('click', function(e){\n \n //prepare the item data \n var categories, \n defaultItemData = {};\n \n if(model.itemSessionControl && !_.isUndefined(model.itemSessionControl.maxAttempts)){\n \n //for a matter of consistency, the itemRef will \"inherit\" the itemSessionControl configuration from its parent section\n defaultItemData.itemSessionControl = _.clone(model.itemSessionControl);\n }\n \n //the itemRef should also \"inherit\" the categories set at the item level\n categories = sectionCategory.getCategories(model);\n defaultItemData.categories = categories.propagated;\n \n _.forEach(selection, function(item){\n var $item = $(item);\n\n addItemRef($('.itemrefs', $section), undefined, _.defaults({\n href : uri.decode($item.data('uri')),\n label : $.trim($item.clone().children().remove().end().text()),\n 'qti-type' : 'assessmentItemRef'\n }, defaultItemData));\n });\n\n //reset the current selection\n $('.ui-selected', $items).removeClass('ui-selected').removeClass('selected');\n $placeholders.hide().off('click');\n });\n } else {\n $placeholders.hide().off('click');\n }\n });\n\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '#' + $section.attr('id') + ' .itemrefs')\n .on('add.binder', '#' + $section.attr('id') + ' .itemrefs', function(e, $itemRef){\n if(e.namespace === 'binder' && $itemRef.hasClass('itemref')){\n var index = $itemRef.data('bind-index');\n\n //initialize the new item ref\n itemRefView.setUp($itemRef, model.sectionParts[index]);\n }\n });\n\n //on set up, if there is a selection ongoing, we trigger the event\n $selected = $('.selected', $items);\n if($selected.length > 0){\n $items.trigger('itemselect.creator', $selected);\n }\n\n }\n\n /**\n * Add a new item ref to the section\n * @param {jQueryElement} $refList - the element to add the item to\n * @param {Number} [index] - the position of the item to add\n * @param {Object} [itemData] - the data to bind to the new item ref\n */\n function addItemRef($refList, index, itemData){\n var $itemRef;\n var $items = $refList.children('li');\n index = index || $items.length;\n itemData.identifier = qtiTestHelper.getIdentifier('item', data.identifiers);\n itemData.index = index + 1;\n $itemRef = $(templates.itemref(itemData));\n if(index > 0){\n $itemRef.insertAfter($items.eq(index - 1));\n } else {\n $itemRef.appendTo($refList);\n }\n $refList.trigger('add', [$itemRef, itemData]);\n }\n\n\n /**\n * Set up the rubric blocks that already belongs to the section\n * @private\n */\n function rubricBlocks () {\n if(!model.rubricBlocks){\n model.rubricBlocks = [];\n }\n $('.rubricblock', $section).each(function(){\n var $rubricBlock = $(this);\n var index = $rubricBlock.data('bind-index');\n if(!model.rubricBlocks[index]){\n model.rubricBlocks[index] = {};\n }\n\n rubricBlockView.setUp($rubricBlock, model.rubricBlocks[index], data);\n });\n\n //opens the rubric blocks section if they are there.\n if(model.rubricBlocks.length > 0){\n $('.rub-toggler', $section).trigger('click');\n }\n }\n\n /**\n * Enable to add new rubrick block\n * @private\n */\n function addRubricBlock () {\n\n $('.rublock-adder', $section).adder({\n target: $('.rubricblocks', $section),\n content : templates.rubricblock,\n templateData : function(cb){\n cb({\n 'qti-type' : 'rubricBlock',\n index : $('.rubricblock', $section).length,\n content : [],\n views : [1]\n });\n }\n });\n\n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document).on('add.binder', '#' + $section.attr('id') + ' .rubricblocks', function(e, $rubricBlock){\n if(e.namespace === 'binder' && $rubricBlock.hasClass('rubricblock')){\n var index = $rubricBlock.data('bind-index');\n $('.rubricblock-binding', $rubricBlock).html('

       

      ');\n rubricBlockView.setUp($rubricBlock, model.rubricBlocks[index], data);\n }\n });\n }\n \n /**\n * Set up the category property\n * @private\n * @param {jQueryElement} $view - the $view object containing the $select\n */\n function categoriesProperty($view){\n \n var $select = $('[name=section-category]', $view);\n $select.select2({\n width: '100%',\n tags : [],\n multiple : true,\n tokenSeparators: [\",\", \" \", \";\"],\n formatNoMatches : function(){\n return __('Enter a category');\n },\n maximumInputLength : 32\n }).on('change', function(e){\n setCategories(e.val);\n });\n \n initCategories();\n $view.on('propopen.propview', function(){\n initCategories();\n });\n \n /**\n * Start the categories editing\n * @private\n */\n function initCategories(){\n \n var categories = sectionCategory.getCategories(model);\n \n //set categories found in the model in the select2 input\n $select.select2('val', categories.all);\n \n //color partial categories\n $select.siblings('.select2-container').find('.select2-search-choice').each(function(){\n var $li = $(this);\n var content = $li.find('div').text();\n if(_.indexOf(categories.partial, content) >= 0){\n $li.addClass('partial');\n }\n });\n }\n \n /**\n * save the categories into the model\n * @private\n */\n function setCategories(categories){\n sectionCategory.setCategories(model, categories);\n }\n \n }\n };\n\n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n var listenActionState = function listenActionState (){\n\n var $sections;\n var $actionContainer;\n\n $('.sections').each(function(){\n $sections = $('.section', $(this));\n\n actions.removable($sections, 'h2');\n actions.movable($sections, 'section', 'h2');\n });\n\n $(document)\n .on('delete', function(e){\n var $parent;\n var $target = $(e.target);\n if($target.hasClass('section')){\n $parent = $target.parents('.sections');\n actions.disable($parent.find('.section'), 'h2');\n }\n })\n .on('add change undo.deleter deleted.deleter', function(e){\n var $target = $(e.target);\n if($target.hasClass('section') || $target.hasClass('sections')){\n $sections = $('.section', $target.hasClass('sections') ? $target : $target.parents('.sections'));\n actions.removable($sections, 'h2');\n actions.movable($sections, 'section', 'h2');\n }\n })\n .on('open.toggler', '.rub-toggler', function(e){\n if(e.namespace === 'toggler'){\n $(this).parents('h2').addClass('active');\n }\n })\n .on('close.toggler', '.rub-toggler', function(e){\n if(e.namespace === 'toggler'){\n $(this).parents('h2').removeClass('active');\n }\n });\n };\n\n\n /**\n * The sectionView setup section related components and beahvior\n *\n * @exports taoQtiTest/controller/creator/views/section\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/testpart',[\n'jquery', 'lodash', \n'taoQtiTest/controller/creator/views/actions', \n'taoQtiTest/controller/creator/views/section',\n'taoQtiTest/controller/creator/templates/index', \n'taoQtiTest/controller/creator/helpers/qtiTest'],\nfunction($, _, actions, sectionView, templates, qtiTestHelper){\n 'use strict';\n\n /**\n * Set up a test part: init action beahviors. Called for each test part.\n *\n * @param {jQueryElement} $testPart - the testpart to set up\n * @param {Object} model - the data model to bind to the test part\n * @param {Object} [data] - additionnal data used by the setup\n * @param {Array} [data.identifiers] - the locked identifiers\n */\n var setUp = function setUp ($testPart, model, data){\n\n var $actionContainer = $('h1', $testPart);\n\n //run setup methods\n actions.properties($actionContainer, 'testpart', model, propHandler);\n actions.move($actionContainer, 'testparts', 'testpart');\n sections();\n addSection();\n\n /**\n * Perform some binding once the property view is created\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n \n var $view = propView.getView();\n\n //listen for databinder change to update the test part title\n var $identifier = $('[data-bind=identifier]', $testPart);\n $view.on('change.binder', function(e, model){\n if(e.namespace === 'binder' && model['qti-type'] === 'testPart'){\n $identifier.text(model.identifier);\n }\n });\n\n //destroy it when it's testpart is removed\n $testPart.on('delete', function(e){\n if(propView !== null){\n propView.destroy();\n }\n });\n }\n\n /**\n * Set up sections that already belongs to the test part\n * @private\n */\n function sections(){\n if(!model.assessmentSections){\n model.assessmentSections = [];\n } \n $('.section', $testPart).each(function(){\n var $section = $(this);\n var index = $section.data('bind-index');\n if(!model.assessmentSections[index]){\n model.assessmentSections[index] = {};\n }\n\n sectionView.setUp($section, model.assessmentSections[index], data);\n });\n }\n\n /**\n * Enable to add new sections\n * @private\n */\n function addSection(){\n $('.section-adder', $testPart).adder({\n target: $('.sections', $testPart),\n content : templates.section,\n templateData : function(cb){\n\n //create a new section model object to be bound to the template\n var sectionIndex = $('.section', $testPart).length;\n cb({\n 'qti-type' : 'assessmentSection',\n identifier : qtiTestHelper.getIdentifier('assessmentSection', data.identifiers),\n title : 'Section ' + (sectionIndex + 1),\n index : 0,\n sectionParts : [] \n });\n }\n });\n \n \n \n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '#' + $testPart.attr('id') + ' .sections')\n .on ('add.binder', '#' + $testPart.attr('id') + ' .sections', function(e, $section){\n if(e.namespace === 'binder' && $section.hasClass('section')){\n var index = $section.data('bind-index'); \n //initialize the new test part\n sectionView.setUp($section, model.assessmentSections[index], data);\n }\n });\n }\n\n };\n \n /**\n * Listen for state changes to enable/disable . Called globally.\n */\n var listenActionState = function listenActionState (){\n\n var $testParts = $('.testpart');\n \n actions.removable($testParts, 'h1');\n actions.movable($testParts, 'testpart', 'h1');\n\n $('.testparts')\n .on('delete', function(e){\n var $target = $(e.target);\n if($target.hasClass('testpart')){\n actions.disable($('.testpart'), 'h1');\n }\n })\n .on('add change undo.deleter deleted.deleter', function(e){\n var $target = $(e.target);\n\n if($target.hasClass('testpart') || $target.hasClass('testparts')){\n \n //refresh\n $testParts = $('.testpart');\n\n //check state\n actions.removable($testParts, 'h1');\n actions.movable($testParts, 'testpart', 'h1');\n }\n });\n };\n \n /**\n * The testPartView setup testpart related components and beahvior\n * \n * @exports taoQtiTest/controller/creator/views/testpart\n */\n return {\n setUp : setUp,\n listenActionState: listenActionState\n }; \n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/views/test',[\n'jquery', 'lodash',\n'taoQtiTest/controller/creator/views/actions', \n'taoQtiTest/controller/creator/views/testpart',\n'taoQtiTest/controller/creator/templates/index',\n'taoQtiTest/controller/creator/helpers/qtiTest'\n], \nfunction($, _, actions, testPartView, templates, qtiTestHelper){\n 'use strict';\n \n /**\n * The TestView setup test related components and beahvior\n * \n * @exports taoQtiTest/controller/creator/views/test\n * @param {Object} model - the data model to bind to the test\n * @param {Object} [data] - additionnal data used by the setup\n * @param {Array} [data.identifiers] - the locked identifiers\n */\n var testView = function testView (model, data) {\n \n actions.properties($('.test-creator-test > h1'), 'test', model, propHandler);\n testParts();\n addTestPart();\n\n /**\n * set up the exisiting test part views\n * @private\n */\n function testParts () {\n if(!model.testParts){\n model.testParts = [];\n } \n $('.testpart').each(function(){\n var $testPart = $(this);\n var index = $testPart.data('bind-index');\n if(!model.testParts[index]){\n model.testParts[index] = {};\n }\n\n testPartView.setUp($testPart, model.testParts[index], data);\n });\n }\n \n /**\n * Perform some binding once the property view is created\n * @private\n * @param {propView} propView - the view object\n */\n function propHandler (propView) {\n \n var $view = propView.getView();\n\n //listen for databinder change to update the test part title\n var $title = $('.test-creator-test > h1 [data-bind=title]');\n $view.on('change.binder', function(e, model){\n if(e.namespace === 'binder' && model['qti-type'] === 'assessmentTest'){\n $title.text(model.title);\n }\n });\n }\n\n /**\n * Enable to add new test parts\n * @private\n */\n function addTestPart () {\n\n $('.testpart-adder').adder({\n target: $('.testparts'),\n content : templates.testpart,\n templateData : function(cb){\n\n //create an new testPart model object to be bound to the template\n var testPartIndex = $('.testpart').length;\n cb({\n 'qti-type' : 'testPart',\n identifier : qtiTestHelper.getIdentifier('testPart', data.identifiers),\n index : testPartIndex,\n navigationMode : 0,\n submissionMode : 0,\n assessmentSections : [{\n 'qti-type' : 'assessmentSection',\n identifier : qtiTestHelper.getIdentifier('assessmentSection', data.identifiers),\n title : 'Section 1',\n index : 0,\n sectionParts : [] \n }]\n });\n }\n });\n \n //we listen the event not from the adder but from the data binder to be sure the model is up to date\n $(document)\n .off('add.binder', '.testparts')\n .on ('add.binder', '.testparts', function(e, $testPart, added){\n if(e.namespace === 'binder' && $testPart.hasClass('testpart')){\n //initialize the new test part\n testPartView.setUp($testPart, model.testParts[added.index], data);\n }\n });\n }\n };\n\n return testView;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/encoders/dom2qti',['jquery', 'lodash'], function($, _){\n 'use strict';\n\n /**\n * Get the list of objects attributes to encode\n * @param {Object} object\n * @returns {Array}\n */\n var getAttributes = function getAttributes(object){\n return _.omit(object, [\n 'qti-type',\n 'content',\n 'xmlBase',\n 'lang',\n 'label'\n ]);\n };\n\n /**\n * Encode object's properties to xml/html string attributes\n * @param {Object} attributes\n * @returns {string}\n */\n var attrToStr = function attrToStr(attributes){\n return _.reduce(attributes, function(acc, value, key){\n if(_.isNumber(value) || (_.isString(value) && !_.isEmpty(value)) ){\n return acc + ' ' + key + '=\"'+ value + '\" ';\n }\n return acc;\n }, '');\n };\n\n /**\n * This encoder is used to transform DOM to JSON QTI and JSON QTI to DOM.\n * It works now for the rubricBlocks components.\n * @exports creator/encoders/dom2qti\n */\n var Dom2QtiEncoder = {\n\n /**\n * Encode an object to a dom string\n * @param {Object} modelValue\n * @returns {string}\n */\n encode : function(modelValue){\n var self = this;\n\n if(_.isArray(modelValue)){\n return _.reduce(modelValue, function(result, value){\n return result + self.encode(value);\n }, '');\n } else if(_.isObject(modelValue) && modelValue['qti-type']){\n if(modelValue['qti-type'] === 'textRun'){\n return modelValue.content;\n }\n var startTag = '<' + modelValue['qti-type'] + attrToStr(getAttributes(modelValue));\n if(modelValue.content){\n return startTag + '>' + self.encode(modelValue.content) + '';\n } else {\n return startTag + '/>';\n }\n }\n return modelValue;\n },\n\n /**\n * Decode a string that represents a DOM to a QTI formated object\n * @param {string} nodeValue\n * @returns {Array}\n */\n decode : function(nodeValue){\n var self = this;\n var $nodeValue = (nodeValue instanceof $) ? nodeValue : $(nodeValue);\n var result = [];\n\n _.forEach($nodeValue, function(elt){\n var object;\n if (elt.nodeType === 3) {\n if (!_.isEmpty($.trim(elt.nodeValue))) {\n result.push({\n 'qti-type': 'textRun',\n 'content': elt.nodeValue,\n \"xmlBase\": \"\"\n });\n }\n } else if (elt.nodeType === 1){\n object = _.merge({\n 'qti-type': elt.nodeName.toLowerCase(),\n 'id' : '',\n 'class' : '',\n 'xmlBase' : '',\n 'lang' : '',\n 'label' : ''\n },\n _.transform(elt.attributes, function(acc, value) {\n if(value.nodeName){\n acc[value.nodeName] = value.nodeValue;\n }\n })\n );\n if (elt.childNodes.length > 0) {\n object.content = self.decode(elt.childNodes);\n }\n result.push(object);\n }\n });\n return result;\n }\n };\n\n return Dom2QtiEncoder;\n});\n\n\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\n/**\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/controller/creator/creator',[\n 'module',\n 'jquery',\n 'lodash',\n 'helpers',\n 'i18n',\n 'history',\n 'ui/feedback',\n 'core/databindcontroller',\n 'taoQtiTest/controller/creator/views/item',\n 'taoQtiTest/controller/creator/views/test',\n 'taoQtiTest/controller/creator/views/testpart',\n 'taoQtiTest/controller/creator/views/section',\n 'taoQtiTest/controller/creator/views/itemref',\n 'taoQtiTest/controller/creator/encoders/dom2qti',\n 'taoQtiTest/controller/creator/templates/index',\n 'taoQtiTest/controller/creator/helpers/qtiTest',\n 'core/validator/validators'\n], function(\n module,\n $,\n _,\n helpers,\n __,\n history,\n feedback,\n DataBindController,\n itemView, testView,\n testPartView,\n sectionView,\n itemrefView,\n Dom2QtiEncoder,\n templates,\n qtiTestHelper,\n validators\n ){\n\n 'use strict';\n\n /**\n * Generic callback used when retrieving data from the server\n * @callback DataCallback\n * @param {Object} data - the received data\n */\n\n /**\n * Call the server to get the list of items\n * @param {string} url\n * @param {string} search - a posix pattern to filter items\n * @param {DataCallback} cb - with items\n */\n function loadItems(url, search, cb){\n $.getJSON(url, {pattern : search, notempty : 'true'}, function(data){\n if(data && typeof cb === 'function'){\n cb(data);\n }\n });\n }\n\n\n /**\n * The test creator controller is the main entry point\n * and orchestrates data retrieval and view/components loading.\n * @exports creator/controller\n */\n var Controller = {\n\n routes : {},\n\n identifiers: [],\n\n /**\n * Start the controller, main entry method.\n * @public\n * @param {Object} options\n * @param {Object} options.labels - the list of item's labels to give to the ItemView\n * @param {Object} options.routes - action's urls\n */\n start : function(options){\n var self = this;\n var $container = $('#test-creator');\n var $saver = $('#saver');\n\n self.identifiers = [];\n\n options = _.merge(module.config(), options || {});\n options.routes = options.routes || {};\n options.labels = options.labels || {};\n\n\n //back button\n $('#authoringBack').on('click', function(e){\n e.preventDefault();\n\n if (history) {\n history.back();\n }\n });\n\n //set up the ItemView, give it a configured loadItems ref\n itemView( _.partial(loadItems, options.routes.items) );\n\n //Print data binder chandes for DEBUGGING ONLY\n //$container.on('change.binder', function(e, model){\n //if(e.namespace === 'binder'){\n //console.log(model);\n //}\n //});\n\n //Data Binding options\n var binderOptions = _.merge(options.routes, {\n filters : {\n 'isItemRef' : function(value){\n return qtiTestHelper.filterQtiType(value, 'assessmentItemRef');\n },\n 'isSection' : function(value){\n return qtiTestHelper.filterQtiType(value, 'assessmentSection');\n }\n },\n encoders : {\n 'dom2qti' : Dom2QtiEncoder\n },\n templates : templates,\n beforeSave : function(model){\n //ensure the qti-type is present\n qtiTestHelper.addMissingQtiType(model);\n\n //apply consolidation rules\n qtiTestHelper.consolidateModel(model);\n return true;\n }\n });\n\n //set up the databinder\n var binder = DataBindController\n .takeControl($container, binderOptions)\n .get(function(model){\n\n //extract ids\n self.identifiers = qtiTestHelper.extractIdentifiers(model);\n\n //register validators\n validators.register('idFormat', qtiTestHelper.idFormatValidator());\n validators.register('testIdFormat', qtiTestHelper.testidFormatValidator());\n validators.register('testIdAvailable', qtiTestHelper.idAvailableValidator(self.identifiers), true);\n\n //once model is loaded, we set up the test view\n testView(model, {\n uri : options.uri,\n identifiers : self.identifiers,\n labels : options.labels\n });\n\n //listen for changes to update available actions\n testPartView.listenActionState();\n sectionView.listenActionState();\n itemrefView.listenActionState();\n itemrefView.resize();\n\n $(window)\n .off('resize.qti-test-creator')\n .on('resize.qti-test-creator', function(){\n itemrefView.resize();\n });\n });\n\n //the save button triggers binder's save action.\n $saver.on('click', function(event){\n event.preventDefault();\n\n if(!$saver.hasClass('disabled')){\n $saver.attr('disabled', true).addClass('disabled');\n binder.save(function(){\n\n $saver.attr('disabled', false).removeClass('disabled');\n\n feedback().success(__('Test Saved'));\n\n }, function(){\n\n $saver.attr('disabled', false).removeClass('disabled');\n });\n }\n });\n }\n };\n\n return Controller;\n});\n\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n *\n */\n\n/**\n * This module allows adding extra buttons in the action bar of the test runner\n *\n */\ndefine('taoQtiTest/testRunner/actionBarHook',[\n 'jquery',\n 'lodash',\n 'core/errorHandler',\n 'core/promise'\n], function ($, _, errorHandler, Promise) {\n\n 'use strict';\n\n /**\n * Events namespace\n * @type {String}\n * @private\n */\n var _ns = '.actionBarHook';\n\n /**\n * We need to access the root document to listen for some events\n * @type {jQuery}\n * @private\n */\n var $doc = $(document);\n\n /**\n * List of loaded and visible hooks\n * @type {Object}\n * @private\n */\n var tools = {};\n\n /**\n * Flag set to true when the item is loaded\n * @type {Boolean}\n * @private\n */\n var itemIsLoaded = false;\n\n // catch the item loaded event\n $doc.off(_ns).on('serviceloaded' + _ns, function() {\n itemIsLoaded = true;\n _.forEach(tools, function(tool) {\n triggerItemLoaded(tool);\n });\n });\n\n /**\n * Check that the toolConfig is correct\n *\n * @param {Object} toolconfig\n * @param {String} toolconfig.hook - the amd module to be loaded to initialize the button\n * @param {String} [toolconfig.label] - the label to be displayed in the button\n * @param {String} [toolconfig.icon] - the icon to be displayed in the button\n * @param {String} [toolconfig.title] - the title to be displayed in the button\n * @param {Array} [toolconfig.items] - an optional list of menu items\n * @returns {Boolean}\n */\n function isValidConfig(toolconfig) {\n return !!(_.isObject(toolconfig) && toolconfig.hook);\n }\n\n /**\n * Triggers the itemLoaded event inside the provided actionBar hook\n * @param {Object} tool\n */\n function triggerItemLoaded(tool) {\n if (tool && tool.itemLoaded) {\n tool.itemLoaded();\n }\n }\n\n /**\n * Init a test runner button from its config\n *\n * @param {String} id\n * @param {Object|String} toolconfig\n * @param {String} toolconfig.hook - the amd module to be loaded to initialize the button\n * @param {String} [toolconfig.label] - the label to be displayed in the button\n * @param {String} [toolconfig.icon] - the icon to be displayed in the button\n * @param {String} [toolconfig.title] - the title to be displayed in the button\n * @param {Array} [toolconfig.items] - an optional list of menu items\n * @param {Object} testContext - the complete state of the test\n * @param {Object} testRunner - the test runner instance\n * @fires ready.actionBarHook when the hook has been initialized\n * @returns {Promise}\n */\n function initQtiTool($toolsContainer, id, toolconfig, testContext, testRunner) {\n\n // the tool is always initialized before the item is loaded, so we can safely false the flag\n itemIsLoaded = false;\n tools[id] = null;\n\n if (_.isString(toolconfig)) {\n toolconfig = {\n hook: toolconfig\n };\n }\n\n return new Promise(function(resolve) {\n if (isValidConfig(toolconfig)) {\n\n require([toolconfig.hook], function (hook) {\n\n var $button;\n var $existingBtn;\n\n if (isValidHook(hook)) {\n //init the control\n hook.init(id, toolconfig, testContext, testRunner);\n\n //if an instance of the tool is already attached, remove it:\n $existingBtn = $toolsContainer.children('[data-control=\"' + id + '\"]');\n if ($existingBtn.length) {\n hook.clear($existingBtn);\n $existingBtn.remove();\n }\n\n //check if the tool is to be available\n if (hook.isVisible()) {\n //keep access to the tool\n tools[id] = hook;\n\n // renders the button from the config\n $button = hook.render();\n\n //only attach the button to the dom when everything is ready\n _appendInOrder($toolsContainer, $button);\n\n //ready !\n $button.trigger('ready' + _ns, [hook]);\n\n //fires the itemLoaded event if the item has already been loaded\n if (itemIsLoaded) {\n triggerItemLoaded(hook);\n }\n }\n\n resolve(hook);\n } else {\n errorHandler.throw(_ns, 'invalid hook format');\n resolve(null);\n }\n\n }, function (e) {\n errorHandler.throw(_ns, 'the hook amd module cannot be found');\n resolve(null);\n });\n\n } else {\n errorHandler.throw(_ns, 'invalid tool config format');\n resolve(null);\n }\n });\n }\n\n /**\n * Append a dom element $button to a $container in a specific order\n * The orders are provided by data-order attribute set to the $button\n *\n * @param {JQuery} $container\n * @param {JQuery} $button\n */\n function _appendInOrder($container, $button) {\n\n var $after, $before;\n var order = $button.data('order');\n\n if ('last' === order) {\n\n $container.append($button);\n\n } else if ('first' === order) {\n\n $container.prepend($button);\n\n } else {\n\n order = _.parseInt(order);\n if (!_.isNaN(order)) {\n\n $container.children('.action').each(function () {\n\n var $btn = $(this),\n _order = $btn.data('order');\n\n if ('last' === _order) {\n\n $before = $btn;\n $after = null;\n\n } else if ('first' === _order) {\n\n $before = null;\n $after = $btn;\n\n } else {\n\n _order = _.parseInt(_order);\n\n if (_.isNaN(_order) || _order > order) {\n $before = $btn;\n $after = null;\n //stops here because $container children returns the dom elements in the dom order\n return false;\n } else if (_order === order) {\n $after = $btn;\n } else if (_order < order) {\n $after = $btn;\n $before = null;\n }\n\n }\n\n });\n\n if ($after) {\n $after.after($button);\n } else if ($before) {\n $before.before($button);\n } else {\n $container.append($button);\n }\n\n } else {\n //unordered buttons are append at the end (including when order equals 0)\n $container.append($button);\n }\n }\n }\n\n /**\n * Check if the hook object is valid\n *\n * @param {Object} hook\n * @param {Function} hook.init\n * @param {Function} hook.clear\n * @param {Function} hook.isVisible\n * @returns {Boolean}\n */\n function isValidHook(hook) {\n return (_.isObject(hook) && _(['init', 'render', 'clear', 'isVisible']).reduce(function (result, method) {\n return result && _.isFunction(hook[method]);\n }, true));\n }\n\n return {\n isValid: isValidConfig,\n initQtiTool: initQtiTool\n };\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/testRunner/actionBarTools',[\n 'jquery',\n 'lodash',\n 'core/eventifier',\n 'core/promise',\n 'taoQtiTest/testRunner/actionBarHook'\n], function ($, _, eventifier, Promise, actionBarHook) {\n 'use strict';\n\n /**\n * The list of registered actionBar tools\n * @type {Object}\n */\n var registeredQtiTools;\n\n /**\n * The list of actionBar tools instances\n * @type {Object}\n */\n var qtiTools;\n\n /**\n * Manages the actionBar tools\n * @type {Object}\n */\n var actionBarTools = {\n /**\n * Registers the actionBar tools\n * @param {Object} tools\n */\n register : function register(tools) {\n var registerTools = tools || {};\n\n /**\n * @event actionBarTools#beforeregister\n * @param {Object} tools\n * @param {actionBarTools} this\n */\n this.trigger('beforeregister', registerTools, this);\n\n registeredQtiTools = registerTools;\n\n /**\n * @event actionBarTools#afterregister\n * @param {Object} tools\n * @param {actionBarTools} this\n */\n this.trigger('afterregister', registerTools, this);\n },\n\n /**\n * Gets the list of registered tools\n * @returns {Object}\n */\n getRegisteredTools : function getRegisteredTools() {\n return registeredQtiTools || {};\n },\n\n /**\n * Gets a particular tool config\n * @param {String} id\n * @returns {Object}\n */\n getRegistered : function getRegistered(id) {\n return registeredQtiTools && registeredQtiTools[id];\n },\n\n /**\n * Checks if a particular tool is registered\n * @param {String} id\n * @returns {Boolean}\n */\n isRegistered : function isRegistered(id) {\n return !!(registeredQtiTools && registeredQtiTools[id]);\n },\n\n /**\n * Gets a particular tool\n * @param {String} id\n * @returns {Object}\n */\n get : function get(id) {\n return qtiTools && qtiTools[id];\n },\n\n /**\n * Gets the list of tools instances\n * @returns {Array}\n */\n list : function list() {\n return _.values(qtiTools || {});\n },\n\n /**\n * Renders the actionBar\n * @param {String|jQuery|HTMLElement} container - The container in which renders the tools\n * @param {Object} testContext - The assessment test context\n * @param {Object} testRunner - The assessment test runner\n * @param {Function} [callback] - An optional callback fired when all tools have been rendered\n */\n render : function render(container, testContext, testRunner, callback) {\n var self = this;\n var $container = $(container);\n var promises = [];\n\n /**\n * @event actionBarTools#beforerender\n * @param {jQuery} $container\n * @param {Object} testContext\n * @param {Object} testRunner\n * @param {actionBarTools} this\n */\n this.trigger('beforerender', $container, testContext, testRunner, this);\n\n _.forIn(this.getRegisteredTools(), function(toolconfig, id){\n promises.push(actionBarHook.initQtiTool($container, id, toolconfig, testContext, testRunner));\n });\n\n Promise.all(promises).then(function(values) {\n var tools = [];\n qtiTools = {};\n\n _.forEach(values, function(tool) {\n if (tool) {\n tools.push(tool);\n qtiTools[tool.getId()] = tool;\n }\n });\n\n if (_.isFunction(callback)) {\n callback.call(self, tools, $container, testContext, testRunner, self);\n }\n\n /**\n * @event actionBarTools#afterrender\n * @param {Array} tools\n * @param {jQuery} $container\n * @param {Object} testContext\n * @param {Object} testRunner\n * @param {actionBarTools} this\n */\n self.trigger('afterrender', tools, $container, testContext, testRunner, self);\n });\n }\n };\n\n return eventifier(actionBarTools);\n});\n\n","\ndefine('tpl!taoQtiTest/testRunner/tpl/navigator', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, helper, options, functionType=\"function\", escapeExpression=this.escapeExpression, self=this, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n \n return \" masked\";\n }\n\n buffer += \" \\n\";\n return buffer;\n });\n});\n\n","\ndefine('tpl!taoQtiTest/testRunner/tpl/navigatorTree', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n var buffer = \"\", stack1, self=this, functionType=\"function\", escapeExpression=this.escapeExpression, helperMissing=helpers.helperMissing;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
    7. \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n \\n \\n \";\n stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 && depth0.sections)),stack1 == null || stack1 === false ? stack1 : stack1.length), {hash:{},inverse:self.program(29, program29, data),fn:self.program(6, program6, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
    8. \\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \"active\";\n }\n\nfunction program4(depth0,data) {\n \n \n return \"collapsed\";\n }\n\nfunction program6(depth0,data) {\n \n var buffer = \"\", stack1;\n buffer += \"\\n
        \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.sections), {hash:{},inverse:self.noop,fn:self.program(7, program7, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      \\n \";\n return buffer;\n }\nfunction program7(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
    9. \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n if (helper = helpers.answered) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.answered); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"/\"\n + escapeExpression(((stack1 = ((stack1 = (depth0 && depth0.items)),stack1 == null || stack1 === false ? stack1 : stack1.length)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1))\n + \"\\n \\n
        \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.items), {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      \\n
    10. \\n \";\n return buffer;\n }\nfunction program8(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n
    11. \\n \\n \\n \";\n if (helper = helpers.label) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.label); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
    12. \\n \";\n return buffer;\n }\nfunction program9(depth0,data) {\n \n \n return \" active\";\n }\n\nfunction program11(depth0,data) {\n \n \n return \" flagged\";\n }\n\nfunction program13(depth0,data) {\n \n \n return \" answered\";\n }\n\nfunction program15(depth0,data) {\n \n \n return \" viewed\";\n }\n\nfunction program17(depth0,data) {\n \n \n return \" unseen\";\n }\n\nfunction program19(depth0,data) {\n \n \n return \"flagged\";\n }\n\nfunction program21(depth0,data) {\n \n var stack1;\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.answered), {hash:{},inverse:self.program(24, program24, data),fn:self.program(22, program22, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }\nfunction program22(depth0,data) {\n \n \n return \"answered\";\n }\n\nfunction program24(depth0,data) {\n \n var stack1;\n stack1 = helpers['if'].call(depth0, (depth0 && depth0.viewed), {hash:{},inverse:self.program(27, program27, data),fn:self.program(25, program25, data),data:data});\n if(stack1 || stack1 === 0) { return stack1; }\n else { return ''; }\n }\nfunction program25(depth0,data) {\n \n \n return \"viewed\";\n }\n\nfunction program27(depth0,data) {\n \n \n return \"unseen\";\n }\n\nfunction program29(depth0,data) {\n \n var buffer = \"\", stack1, helper, options;\n buffer += \"\\n
      \\n \\n

      \\n \"\n + escapeExpression((helper = helpers.__ || (depth0 && depth0.__),options={hash:{},data:data},helper ? helper.call(depth0, \"In this part of the test navigation is not allowed.\", options) : helperMissing.call(depth0, \"__\", \"In this part of the test navigation is not allowed.\", options)))\n + \"\\n

      \\n

      \\n \\n

      \\n
      \\n \";\n return buffer;\n }\n\n buffer += \"
        \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.parts), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      \\n\";\n return buffer;\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/testRunner/testReview',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'tpl!taoQtiTest/testRunner/tpl/navigator',\n 'tpl!taoQtiTest/testRunner/tpl/navigatorTree',\n 'util/capitalize'\n], function ($, _, __, navigatorTpl, navigatorTreeTpl, capitalize) {\n 'use strict';\n\n /**\n * List of CSS classes\n * @type {Object}\n * @private\n */\n var _cssCls = {\n active : 'active',\n collapsed : 'collapsed',\n collapsible : 'collapsible',\n masked : 'masked',\n disabled : 'disabled',\n flagged : 'flagged',\n answered : 'answered',\n viewed : 'viewed',\n unseen : 'unseen',\n icon : 'qti-navigator-icon',\n scope : {\n test : 'scope-test',\n testPart : 'scope-test-part',\n testSection : 'scope-test-section'\n }\n };\n\n /**\n * List of common CSS selectors\n * @type {Object}\n * @private\n */\n var _selectors = {\n component : '.qti-navigator',\n filterBar : '.qti-navigator-filters',\n tree : '.qti-navigator-tree',\n collapseHandle : '.qti-navigator-collapsible',\n linearState : '.qti-navigator-linear',\n infoAnswered : '.qti-navigator-answered .qti-navigator-counter',\n infoViewed : '.qti-navigator-viewed .qti-navigator-counter',\n infoUnanswered : '.qti-navigator-unanswered .qti-navigator-counter',\n infoFlagged : '.qti-navigator-flagged .qti-navigator-counter',\n infoPanel : '.qti-navigator-info',\n infoPanelLabels : '.qti-navigator-info > .qti-navigator-label',\n parts : '.qti-navigator-part',\n partLabels : '.qti-navigator-part > .qti-navigator-label',\n sections : '.qti-navigator-section',\n sectionLabels : '.qti-navigator-section > .qti-navigator-label',\n items : '.qti-navigator-item',\n itemLabels : '.qti-navigator-item > .qti-navigator-label',\n itemIcons : '.qti-navigator-item > .qti-navigator-icon',\n icons : '.qti-navigator-icon',\n linearStart : '.qti-navigator-linear-part button',\n counters : '.qti-navigator-counter',\n actives : '.active',\n collapsible : '.collapsible',\n collapsiblePanels : '.collapsible-panel',\n unseen : '.unseen',\n answered : '.answered',\n flagged : '.flagged',\n notFlagged : ':not(.flagged)',\n notAnswered : ':not(.answered)',\n masked : '.masked'\n };\n\n /**\n * Maps the filter mode to filter criteria.\n * Each filter criteria is a CSS selector used to find and mask the items to be discarded by the filter.\n * @type {Object}\n * @private\n */\n var _filterMap = {\n all : \"\",\n unanswered : _selectors.answered,\n flagged : _selectors.notFlagged,\n answered : _selectors.notAnswered,\n filtered : _selectors.masked\n };\n\n /**\n * Maps of config options translated from the context object to the local options\n * @type {Object}\n * @private\n */\n var _optionsMap = {\n 'reviewScope' : 'reviewScope',\n 'reviewPreventsUnseen' : 'preventsUnseen',\n 'canCollapse' : 'canCollapse'\n };\n\n /**\n * Maps the handled review scopes\n * @type {Object}\n * @private\n */\n var _reviewScopes = {\n test : 'test',\n testPart : 'testPart',\n testSection : 'testSection'\n };\n\n /**\n * Provides a test review manager\n * @type {Object}\n */\n var testReview = {\n /**\n * Initializes the component\n * @param {String|jQuery|HTMLElement} element The element on which install the component\n * @param {Object} [options] A list of extra options\n * @param {String} [options.region] The region on which put the component: left or right\n * @param {String} [options.reviewScope] Limit the review screen to a particular scope:\n * the whole test, the current test part or the current test section)\n * @param {Boolean} [options.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {testReview}\n */\n init: function init(element, options) {\n var initOptions = _.isObject(options) && options || {};\n var putOnRight = 'right' === initOptions.region;\n var insertMethod = putOnRight ? 'append' : 'prepend';\n\n this.options = initOptions;\n this.disabled = false;\n this.hidden = !!initOptions.hidden;\n this.currentFilter = 'all';\n\n // clean the DOM if the init method is called after initialisation\n if (this.$component) {\n this.$component.remove();\n }\n\n // build the component structure and inject it into the DOM\n this.$container = $(element);\n insertMethod = this.$container[insertMethod];\n if (insertMethod) {\n insertMethod.call(this.$container, navigatorTpl({\n region: putOnRight ? 'right' : 'left',\n hidden: this.hidden\n }));\n } else {\n throw new Error(\"Unable to inject the component structure into the DOM\");\n }\n\n // install the component behaviour\n this._loadDOM();\n this._initEvents();\n this._updateDisplayOptions();\n\n return this;\n },\n\n /**\n * Links the component to the underlying DOM elements\n * @private\n */\n _loadDOM: function() {\n this.$component = this.$container.find(_selectors.component);\n\n // access to info panel displaying counters\n this.$infoAnswered = this.$component.find(_selectors.infoAnswered);\n this.$infoViewed = this.$component.find(_selectors.infoViewed);\n this.$infoUnanswered = this.$component.find(_selectors.infoUnanswered);\n this.$infoFlagged = this.$component.find(_selectors.infoFlagged);\n\n // access to filter switches\n this.$filterBar = this.$component.find(_selectors.filterBar);\n this.$filters = this.$filterBar.find('li');\n\n // access to the tree of parts/sections/items\n this.$tree = this.$component.find(_selectors.tree);\n\n // access to the panel displayed when a linear part is reached\n this.$linearState = this.$component.find(_selectors.linearState);\n },\n\n /**\n * Installs the event handlers on the underlying DOM elements\n * @private\n */\n _initEvents: function() {\n var self = this;\n\n // click on the collapse handle: collapse/expand the review panel\n this.$component.on('click' + _selectors.component, _selectors.collapseHandle, function() {\n if (self.disabled) {\n return;\n }\n\n self.$component.toggleClass(_cssCls.collapsed);\n if (self.$component.hasClass(_cssCls.collapsed)) {\n self._openSelected();\n }\n });\n\n // click on the info panel title: toggle the related panel\n this.$component.on('click' + _selectors.component, _selectors.infoPanelLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.infoPanel);\n self._togglePanel($panel, _selectors.infoPanel);\n });\n\n // click on a part title: toggle the related panel\n this.$tree.on('click' + _selectors.component, _selectors.partLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.parts);\n var open = self._togglePanel($panel, _selectors.parts);\n\n if (open) {\n if ($panel.hasClass(_cssCls.active)) {\n self._openSelected();\n } else {\n self._openOnly($panel.find(_selectors.sections).first(), $panel);\n }\n }\n });\n\n // click on a section title: toggle the related panel\n this.$tree.on('click' + _selectors.component, _selectors.sectionLabels, function() {\n if (self.disabled) {\n return;\n }\n\n var $panel = $(this).closest(_selectors.sections);\n\n self._togglePanel($panel, _selectors.sections);\n });\n\n // click on an item: jump to the position\n this.$tree.on('click' + _selectors.component, _selectors.itemLabels, function(event) {\n if (self.disabled) {\n return;\n }\n\n var $item = $(this).closest(_selectors.items);\n var $target;\n\n if (!$item.hasClass(_cssCls.disabled)) {\n $target = $(event.target);\n if ($target.is(_selectors.icons) && !self.$component.hasClass(_cssCls.collapsed)) {\n if (!$item.hasClass(_cssCls.unseen)) {\n self._mark($item);\n }\n } else {\n self._select($item);\n self._jump($item);\n }\n }\n });\n\n // click on the start button inside a linear part: jump to the position\n this.$tree.on('click' + _selectors.component, _selectors.linearStart, function() {\n if (self.disabled) {\n return;\n }\n\n var $btn = $(this);\n\n if (!$btn.hasClass(_cssCls.disabled)) {\n $btn.addClass(_cssCls.disabled);\n self._jump($btn);\n }\n });\n\n // click on a filter button\n this.$filterBar.on('click' + _selectors.component, 'li', function() {\n if (self.disabled) {\n return;\n }\n\n var $btn = $(this);\n var mode = $btn.data('mode');\n\n self.$filters.removeClass(_cssCls.active);\n self.$component.removeClass(_cssCls.collapsed);\n $btn.addClass(_cssCls.active);\n\n self._filter(mode);\n });\n },\n\n /**\n * Filters the items by a criteria\n * @param {String} criteria\n * @private\n */\n _filter: function(criteria) {\n var $items = this.$tree.find(_selectors.items).removeClass(_cssCls.masked);\n var filter = _filterMap[criteria];\n if (filter) {\n $items.filter(filter).addClass(_cssCls.masked);\n }\n this._updateSectionCounters(!!filter);\n this.currentFilter = criteria;\n },\n\n /**\n * Selects an item\n * @param {String|jQuery} position The item's position\n * @param {Boolean} [open] Forces the tree to be opened on the selected item\n * @returns {jQuery} Returns the selected item\n * @private\n */\n _select: function(position, open) {\n // find the item to select and extract its hierarchy\n var selected = position && position.jquery ? position : this.$tree.find('[data-position=' + position + ']');\n var hierarchy = selected.parentsUntil(this.$tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n if (open) {\n this._openOnly(hierarchy);\n }\n\n // select the item\n this.$tree.find(_selectors.actives).removeClass(_cssCls.active);\n hierarchy.add(selected).addClass(_cssCls.active);\n return selected;\n },\n\n /**\n * Opens the tree on the selected item only\n * @returns {jQuery} Returns the selected item\n * @private\n */\n _openSelected: function() {\n // find the selected item and extract its hierarchy\n var selected = this.$tree.find(_selectors.items + _selectors.actives);\n var hierarchy = selected.parentsUntil(this.$tree);\n\n // collapse the full tree and open only the hierarchy of the selected item\n this._openOnly(hierarchy);\n\n return selected;\n },\n\n /**\n * Collapses the full tree and opens only the provided branch\n * @param {jQuery} opened The element to be opened\n * @param {jQuery} [root] The root element from which collapse the panels\n * @private\n */\n _openOnly: function(opened, root) {\n (root || this.$tree).find(_selectors.collapsible).addClass(_cssCls.collapsed);\n opened.removeClass(_cssCls.collapsed);\n },\n\n /**\n * Toggles a panel\n * @param {jQuery} panel The panel to toggle\n * @param {String} [collapseSelector] Selector of panels to collapse\n * @returns {Boolean} Returns `true` if the panel just expanded now\n */\n _togglePanel: function(panel, collapseSelector) {\n var collapsed = panel.hasClass(_cssCls.collapsed);\n\n if (collapseSelector) {\n this.$tree.find(collapseSelector).addClass(_cssCls.collapsed);\n }\n\n if (collapsed) {\n panel.removeClass(_cssCls.collapsed);\n } else {\n panel.addClass(_cssCls.collapsed);\n }\n return collapsed;\n },\n\n /**\n * Sets the icon of a particular item\n * @param {jQuery} $item\n * @param {String} icon\n * @private\n */\n _setItemIcon: function($item, icon) {\n $item.find(_selectors.icons).attr('class', _cssCls.icon + ' icon-' + icon);\n },\n\n /**\n * Sets the icon of a particular item according to its state\n * @param {jQuery} $item\n * @private\n */\n _adjustItemIcon: function($item) {\n var icon = null;\n var defaultIcon = _cssCls.unseen;\n var iconCls = [\n _cssCls.flagged,\n _cssCls.answered,\n _cssCls.viewed\n ];\n\n _.forEach(iconCls, function(cls) {\n if ($item.hasClass(cls)) {\n icon = cls;\n return false;\n }\n });\n\n this._setItemIcon($item, icon || defaultIcon);\n },\n\n /**\n * Toggle the marked state of an item\n * @param {jQuery} $item\n * @param {Boolean} [flag]\n * @private\n */\n _toggleFlag: function($item, flag) {\n $item.toggleClass(_cssCls.flagged, flag);\n this._adjustItemIcon($item);\n },\n\n /**\n * Marks an item for later review\n * @param {jQuery} $item\n * @private\n */\n _mark: function($item) {\n var itemId = $item.data('id');\n var itemPosition = $item.data('position');\n var flag = !$item.hasClass(_cssCls.flagged);\n\n this._toggleFlag($item);\n\n /**\n * A storage of the flag is required\n * @event testReview#mark\n * @param {Boolean} flag - Tells whether the item is marked for review or not\n * @param {Number} position - The item position on which jump\n * @param {String} itemId - The identifier of the target item\n * @param {testReview} testReview - The client testReview component\n */\n this.trigger('mark', [flag, itemPosition, itemId]);\n },\n\n /**\n * Jumps to an item\n * @param {jQuery} $item\n * @private\n */\n _jump: function($item) {\n var itemId = $item.data('id');\n var itemPosition = $item.data('position');\n\n /**\n * A jump to a particular item is required\n * @event testReview#jump\n * @param {Number} position - The item position on which jump\n * @param {String} itemId - The identifier of the target item\n * @param {testReview} testReview - The client testReview component\n */\n this.trigger('jump', [itemPosition, itemId]);\n },\n\n /**\n * Updates the sections related items counters\n * @param {Boolean} filtered\n */\n _updateSectionCounters: function(filtered) {\n var self = this;\n var filter = _filterMap[filtered ? 'filtered' : 'answered'];\n this.$tree.find(_selectors.sections).each(function() {\n var $section = $(this);\n var $items = $section.find(_selectors.items);\n var $filtered = $items.filter(filter);\n var total = $items.length;\n var nb = total - $filtered.length;\n self._writeCount($section.find(_selectors.counters), nb, total);\n });\n },\n\n /**\n * Updates the display according to options\n * @private\n */\n _updateDisplayOptions: function() {\n var reviewScope = _reviewScopes[this.options.reviewScope] || 'test';\n var scopeClass = _cssCls.scope[reviewScope];\n var $root = this.$component;\n _.forEach(_cssCls.scope, function(cls) {\n $root.removeClass(cls);\n });\n if (scopeClass) {\n $root.addClass(scopeClass);\n }\n $root.toggleClass(_cssCls.collapsible, this.options.canCollapse);\n },\n\n /**\n * Updates the local options from the provided context\n * @param {Object} testContext The progression context\n * @private\n */\n _updateOptions: function(testContext) {\n var options = this.options;\n _.forEach(_optionsMap, function(optionKey, contextKey) {\n if (undefined !== testContext[contextKey]) {\n options[optionKey] = testContext[contextKey];\n }\n });\n },\n\n /**\n * Updates the info panel\n */\n _updateInfos: function() {\n var progression = this.progression,\n unanswered = Number(progression.total) - Number(progression.answered);\n\n // update the info panel\n this._writeCount(this.$infoAnswered, progression.answered, progression.total);\n this._writeCount(this.$infoUnanswered, unanswered, progression.total);\n this._writeCount(this.$infoViewed, progression.viewed, progression.total);\n this._writeCount(this.$infoFlagged, progression.flagged, progression.total);\n },\n\n /**\n * Updates a counter\n * @param {jQuery} $place\n * @param {Number} count\n * @param {Number} total\n * @private\n */\n _writeCount: function($place, count, total) {\n $place.text(count + '/' + total);\n },\n\n /**\n * Gets the progression stats for the whole test\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTest: function(testContext) {\n return {\n total : testContext.numberItems || 0,\n answered : testContext.numberCompleted || 0,\n viewed : testContext.numberPresented || 0,\n flagged : testContext.numberFlagged || 0\n };\n },\n\n /**\n * Gets the progression stats for the current test part\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTestPart: function(testContext) {\n return {\n total : testContext.numberItemsPart || 0,\n answered : testContext.numberCompletedPart || 0,\n viewed : testContext.numberPresentedPart || 0,\n flagged : testContext.numberFlaggedPart || 0\n };\n },\n\n /**\n * Gets the progression stats for the current test section\n * @param {Object} testContext The progression context\n * @returns {{total: (Number), answered: (Number), viewed: (Number), flagged: (Number)}}\n * @private\n */\n _getProgressionOfTestSection: function(testContext) {\n return {\n total : testContext.numberItemsSection || 0,\n answered : testContext.numberCompletedSection || 0,\n viewed : testContext.numberPresentedSection || 0,\n flagged : testContext.numberFlaggedSection || 0\n };\n },\n\n /**\n * Updates the navigation tre\n * @param {Object} testContext The progression context\n */\n _updateTree: function(testContext) {\n var navigatorMap = testContext.navigatorMap;\n var reviewScope = this.options.reviewScope;\n var reviewScopePart = reviewScope === 'testPart';\n var reviewScopeSection = reviewScope === 'testSection';\n var _partsFilter = function(part) {\n if (reviewScopeSection && part.sections) {\n part.sections = _.filter(part.sections, _partsFilter);\n }\n return part.active;\n };\n\n // rebuild the tree\n if (navigatorMap) {\n if (reviewScopePart || reviewScopeSection) {\n // display only the current section\n navigatorMap = _.filter(navigatorMap, _partsFilter);\n }\n\n this.$filterBar.show();\n this.$linearState.hide();\n this.$tree.html(navigatorTreeTpl({\n parts: navigatorMap\n }));\n\n if (this.options.preventsUnseen) {\n // disables all unseen items to prevent the test taker has access to.\n this.$tree.find(_selectors.unseen).addClass(_cssCls.disabled);\n }\n } else {\n this.$filterBar.hide();\n this.$linearState.show();\n this.$tree.empty();\n }\n\n // apply again the current filter\n this._filter(this.$filters.filter(_selectors.actives).data('mode'));\n },\n\n /**\n * Set the marked state of an item\n * @param {Number|String|jQuery} position\n * @param {Boolean} flag\n */\n setItemFlag: function setItemFlag(position, flag) {\n var $item = position && position.jquery ? position : this.$tree.find('[data-position=' + position + ']');\n var progression = this.progression;\n\n // update the item flag\n this._toggleFlag($item, flag);\n\n // update the info panel\n progression.flagged = this.$tree.find(_selectors.flagged).length;\n this._writeCount(this.$infoFlagged, progression.flagged, progression.total);\n this._filter(this.currentFilter);\n },\n\n /**\n * Update the number of flagged items in the test context\n * @param {Object} testContext The test context\n * @param {Number} position The position of the flagged item\n * @param {Boolean} flag The flag state\n */\n updateNumberFlagged: function(testContext, position, flag) {\n var fields = ['numberFlagged'];\n var currentPosition = testContext.itemPosition;\n var currentFound = false, currentSection = null, currentPart = null;\n var itemFound = false, itemSection = null, itemPart = null;\n\n if (testContext.navigatorMap) {\n // find the current item and the marked item inside the navigator map\n // check if the marked item is in the current section\n _.forEach(testContext.navigatorMap, function(part) {\n _.forEach(part && part.sections, function(section) {\n _.forEach(section && section.items, function(item) {\n if (item) {\n if (item.position === position) {\n itemPart = part;\n itemSection = section;\n itemFound = true;\n }\n if (item.position === currentPosition) {\n currentPart = part;\n currentSection = section;\n currentFound = true;\n\n }\n if (itemFound && currentFound) {\n return false;\n }\n }\n });\n\n if (itemFound && currentFound) {\n return false;\n }\n });\n\n if (itemFound && currentFound) {\n return false;\n }\n });\n\n // select the context to update\n if (itemFound && currentPart === itemPart) {\n fields.push('numberFlaggedPart');\n }\n if (itemFound && currentSection === itemSection) {\n fields.push('numberFlaggedSection');\n }\n } else {\n // no navigator map, the current the marked item is in the current section\n fields.push('numberFlaggedPart');\n fields.push('numberFlaggedSection');\n }\n\n _.forEach(fields, function(field) {\n if (field in testContext) {\n testContext[field] += flag ? 1 : -1;\n }\n });\n },\n\n /**\n * Get progression\n * @param {Object} testContext The progression context\n * @returns {object} progression\n */\n getProgression: function getProgression(testContext) {\n var reviewScope = _reviewScopes[this.options.reviewScope] || 'test',\n progressInfoMethod = '_getProgressionOf' + capitalize(reviewScope),\n getProgression = this[progressInfoMethod] || this._getProgressionOfTest,\n progression = getProgression && getProgression(testContext) || {};\n\n return progression;\n },\n\n /**\n * Updates the review screen\n * @param {Object} testContext The progression context\n * @returns {testReview}\n */\n update: function update(testContext) {\n this.progression = this.getProgression(testContext);\n this._updateOptions(testContext);\n this._updateInfos(testContext);\n this._updateTree(testContext);\n this._updateDisplayOptions(testContext);\n return this;\n },\n\n /**\n * Disables the component\n * @returns {testReview}\n */\n disable: function disable() {\n this.disabled = true;\n this.$component.addClass(_cssCls.disabled);\n return this;\n },\n\n /**\n * Enables the component\n * @returns {testReview}\n */\n enable: function enable() {\n this.disabled = false;\n this.$component.removeClass(_cssCls.disabled);\n return this;\n },\n\n /**\n * Hides the component\n * @returns {testReview}\n */\n hide: function hide() {\n this.disabled = true;\n this.hidden = true;\n this.$component.addClass(_cssCls.masked);\n return this;\n },\n\n /**\n * Shows the component\n * @returns {testReview}\n */\n show: function show() {\n this.disabled = false;\n this.hidden = false;\n this.$component.removeClass(_cssCls.masked);\n return this;\n },\n\n /**\n * Toggles the display state of the component\n * @param {Boolean} [show] External condition that's tells if the component must be shown or hidden\n * @returns {testReview}\n */\n toggle: function toggle(show) {\n if (undefined === show) {\n show = this.hidden;\n }\n\n if (show) {\n this.show();\n } else {\n this.hide();\n }\n\n return this;\n },\n\n /**\n * Install an event handler on the underlying DOM element\n * @param {String} eventName\n * @returns {testReview}\n */\n on: function on(eventName) {\n var dom = this.$component;\n if (dom) {\n dom.on.apply(dom, arguments);\n }\n\n return this;\n },\n\n /**\n * Uninstall an event handler from the underlying DOM element\n * @param {String} eventName\n * @returns {testReview}\n */\n off: function off(eventName) {\n var dom = this.$component;\n if (dom) {\n dom.off.apply(dom, arguments);\n }\n\n return this;\n },\n\n /**\n * Triggers an event on the underlying DOM element\n * @param {String} eventName\n * @param {Array|Object} extraParameters\n * @returns {testReview}\n */\n trigger : function trigger(eventName, extraParameters) {\n var dom = this.$component;\n\n if (undefined === extraParameters) {\n extraParameters = [];\n }\n if (!_.isArray(extraParameters)) {\n extraParameters = [extraParameters];\n }\n\n extraParameters.push(this);\n\n if (dom) {\n dom.trigger(eventName, extraParameters);\n }\n\n return this;\n }\n };\n\n /**\n * Builds an instance of testReview\n * @param {String|jQuery|HTMLElement} element The element on which install the component\n * @param {Object} [options] A list of extra options\n * @param {String} [options.region] The region on which put the component: left or right\n * @param {String} [options.reviewScope] Limit the review screen to a particular scope:\n * the whole test, the current test part or the current test section)\n * @param {Boolean} [options.preventsUnseen] Prevents the test taker to access unseen items\n * @returns {testReview}\n */\n var testReviewFactory = function(element, options) {\n var component = _.clone(testReview, true);\n return component.init(element, options);\n };\n\n return testReviewFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n */\n\n/**\n * Metadata to be sent to the server. Will be saved in result storage as a trace variable.\n * Usage example:\n *
      \n * var testMetaData = testMetaDataFactory({\n *   testServiceCallId : this.itemServiceApi.serviceCallId\n * });\n *\n * testMetaData.setData({\n *   'TEST' : {\n *      'TEST_EXIT_CODE' : 'T'\n *   },\n *   'SECTION' : {\n *      'SECTION_EXIT_CODE' : 704\n *   }\n * });\n *\n * testMetaData.addData({'ITEM' : {\n *      'ITEM_START_TIME_CLIENT' : 1443596730143,\n *      'ITEM_END_TIME_CLIENT' : 1443596731301\n *    }\n * });\n * 
      \n *\n * Data for each service call id will be stored in local storage to be able get data\n * after reloading the page or resuming the test session.\n *\n * To clear all data related to current test_call_id used clearData method.\n */\ndefine('taoQtiTest/testRunner/testMetaData',[\n 'lodash'\n], function (_) {\n 'use strict';\n\n /**\n * @param {Object} options\n * @param {string} options.testServiceCallId - test call id.\n */\n var testMetaDataFactory = function testMetaDataFactory(options) {\n var _testServiceCallId,\n _storageKeyPrefix = 'testMetaData_',\n _data = {};\n\n if (!options || options.testServiceCallId === undefined) {\n throw new TypeError(\"testServiceCallId option is required\");\n }\n\n var testMetaData = {\n SECTION_EXIT_CODE : {\n 'COMPLETED_NORMALLY': 700,\n 'QUIT': 701,\n 'COMPLETE_TIMEOUT': 703,\n 'TIMEOUT': 704,\n 'FORCE_QUIT': 705,\n 'IN_PROGRESS': 706,\n 'ERROR': 300\n },\n TEST_EXIT_CODE : {\n 'COMPLETE': 'C',\n 'TERMINATED': 'T',\n 'INCOMPLETE': 'IC',\n 'INCOMPLETE_QUIT': 'IQ',\n 'INACTIVE': 'IA',\n 'CANDIDATE_DISAGREED_WITH_NDA': 'DA'\n },\n /**\n * Return test call id.\n * @returns {string}- Test call id\n */\n getTestServiceCallId : function getTestServiceCallId () {\n return _testServiceCallId;\n },\n\n /**\n * Set test call id.\n * @param {string} value\n */\n setTestServiceCallId : function setTestServiceCallId (value) {\n _testServiceCallId = value;\n },\n\n /**\n * Set meta data. Current data object will be overwritten.\n * @param {Object} data - metadata object\n */\n setData : function setData(data) {\n _data = data;\n setLocalStorageData(JSON.stringify(_data));\n },\n\n /**\n * Add data.\n * @param {Object} data - metadata object\n * @param {Boolean} overwrite - whether the same data should be overwritten. Default - false\n */\n addData : function addData(data, overwrite) {\n data = _.clone(data);\n if (overwrite === undefined) {\n overwrite = false;\n }\n\n if (overwrite) {\n _.merge(_data, data);\n } else {\n _data = _.merge(data, _data);\n }\n setLocalStorageData(JSON.stringify(_data));\n },\n\n /**\n * Get the saved data.\n * The cloned object will be returned to avoid unwanted affecting of the original data.\n * @returns {Object} - metadata object.\n */\n getData : function getData() {\n return _.clone(_data);\n },\n\n /**\n * Clear all data saved in current object and in local storage related to current test call id.\n * @returns {Object} - metadata object.\n */\n clearData : function clearData() {\n _data = {};\n window.localStorage.removeItem(testMetaData.getLocalStorageKey());\n },\n\n getLocalStorageKey : function getLocalStorageKey () {\n return _storageKeyPrefix + _testServiceCallId;\n }\n };\n\n /**\n * Initialize test meta data manager\n */\n function init() {\n _testServiceCallId = options.testServiceCallId;\n testMetaData.setData(getLocalStorageData());\n }\n\n /**\n * Set data to local storage\n * @param {string} val - data to be stored.\n */\n function setLocalStorageData(val) {\n var currentKey = testMetaData.getLocalStorageKey();\n try {\n window.localStorage.setItem(currentKey, val);\n } catch(domException) {\n if (domException.name === 'QuotaExceededError' ||\n domException.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n var removed = 0,\n i = window.localStorage.length,\n key;\n while (i--) {\n key = localStorage.key(i);\n if (/^testMetaData_.*/.test(key) && key !== currentKey) {\n window.localStorage.removeItem(key);\n removed++;\n }\n }\n if (removed) {\n setLocalStorageData(val);\n } else {\n throw domException;\n }\n } else {\n throw domException;\n }\n }\n }\n\n /**\n * Get data from local storage stored for current call id\n * @returns {*} saved data or empty object\n */\n function getLocalStorageData() {\n var data = window.localStorage.getItem(testMetaData.getLocalStorageKey()),\n result = JSON.parse(data) || {};\n\n return result;\n }\n\n init();\n\n return testMetaData;\n };\n\n return testMetaDataFactory;\n});\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2014 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);\n */\ndefine('serviceApi/ServiceApi',['jquery', 'urlParser'], function($, UrlParser){\n 'use strict';\n\n /**\n * @constructor\n */\n function ServiceApi(baseUrl, parameters, serviceCallId, stateStorage, userService, paused){\n this.baseUrl = baseUrl;\n this.parameters = parameters;\n this.connected = false;\n\n this.serviceCallId = serviceCallId;\n this.state = stateStorage;\n this.userService = userService;\n this.hasBeenPaused = paused;\n }\n\n ServiceApi.SIG_SUCCESS = 0;\n ServiceApi.SIG_ERROR = 1;\n\n ServiceApi.prototype.loadInto = function(frame, connected){\n var self = this;\n var $frame = $(frame);\n var callUrl = this.getCallUrl();\n var isCORSAllowed = new UrlParser(callUrl).checkCORS();\n\n $frame.on('load', function(e){\n //if we are in the same domain, we add a variable\n //to the frame window, so the frame knows it can communicate\n //with the parent\n $(document).on('serviceready', function(){\n self.connect(frame, function(){\n $(document).off('serviceready');\n if(typeof connected === 'function'){\n connected();\n }\n });\n });\n if(isCORSAllowed === true){\n frame.contentWindow.__knownParent__ = true;\n }\n });\n\n $frame.attr('src', callUrl);\n };\n\n ServiceApi.prototype.connect = function(frame, connected){\n if(this.connected === false && frame.contentWindow){\n //frame.contentWindow.serviceApi = this;\n if (typeof(frame.contentWindow.onServiceApiReady) === \"function\") {\n frame.contentWindow.onServiceApiReady(this);\n this.connected = true;\n if(typeof connected === 'function'){\n connected();\n }\n }\n }\n };\n\n /**\n * Get the service call URL\n * @returns {String} the URI\n */\n ServiceApi.prototype.getCallUrl = function(){\n var params = this.parameters || {};\n params.serviceCallId = this.serviceCallId;\n return this.baseUrl + '?' + $.param(params);\n };\n\n ServiceApi.prototype.getUserPropertyValues = function(property, callback){\n \tthis.userService.get(property, callback);\n };\n\n //Context\n ServiceApi.prototype.getServiceCallId = function(){\n return this.serviceCallId;\n };\n\n //Context\n ServiceApi.prototype.getState = function(){\n return this.state.get();\n };\n\n ServiceApi.prototype.setState = function(state, callback){\n return this.state.set(state, callback);\n };\n\n //Context\n ServiceApi.prototype.getHasBeenPaused = function(){\n return this.hasBeenPaused;\n };\n\n ServiceApi.prototype.setHasBeenPaused = function(paused){\n this.hasBeenPaused = paused;\n };\n\n // Variables\n ServiceApi.prototype.getParameter = function(identifier){\n if (typeof(this.parameters[identifier]) !== \"undefined\") {\n return this.parameters[identifier];\n } else {\n return null;\n }\n };\n\n /**\n * Sets a callback on the finish action\n * @param {Function} callback\n * @returns {ServiceApi}\n */\n ServiceApi.prototype.onFinish = function(callback) {\n this.onFinishCallback = callback;\n return this;\n };\n\n /**\n * Sets a callback on the kill action\n * @param {Function} callback\n * @returns {ServiceApi}\n */\n ServiceApi.prototype.onKill = function(callback) {\n this.onKillCallback = callback;\n return this;\n };\n\n /**\n * Sets a callback on the exit action\n * @param {Function} callback\n * @returns {ServiceApi}\n */\n ServiceApi.prototype.onExit = function(callback) {\n this.onExitCallback = callback;\n return this;\n };\n\n /**\n * @param {Function} callback - Function called if no dedicated callback is found\n */\n ServiceApi.prototype.kill = function(callback) {\n \tif (typeof this.onKillCallback === 'function') {\n \t\tthis.onKillCallback(callback);\n \t} else {\n \t\tcallback(0);\n \t}\n };\n\n /**\n * Exits the flow\n * @param {Function} callback - Function called if no dedicated callback is found\n */\n ServiceApi.prototype.exit = function(callback) {\n \tif (typeof this.onExitCallback === 'function') {\n \t\tthis.onExitCallback(callback);\n \t} else {\n \t\tcallback(0);\n \t}\n };\n\n /**\n * Finishes the flow\n * @param valueArray - return parameters of the service.\n */\n ServiceApi.prototype.finish = function(valueArray) {\n //return execution to service caller\n if (typeof this.onFinishCallback === 'function') {\n this.onFinishCallback(valueArray);\n }\n };\n\n return ServiceApi;\n\n});\n\n","define('serviceApi/UserInfoService',['jquery'], function($){\n \n function UserInfoService(requestUrl, data) {\n this.data = data;\n this.requestUrl = requestUrl;\n }\n\n UserInfoService.prototype.get = function(property, callback){\n if (this.data.hasOwnProperty(property)) {\n if (typeof callback === \"function\") {\n callback(this.data[property]);\n }\n } else {\n $.ajax({\n url : this.requestUrl,\n data \t\t: {\n 'property' : property\n },\n type : 'post',\n dataType\t: 'json',\n success : (function(service, callback) {return function(r) {\n \t\tfor (key in r.data) {\n \t\t\tservice.data[key] = r.data[key];\n \t\t}\n if (typeof callback === \"function\") {\n callback(service.data[property]);\n }\n\n }})(this, callback)\n /*\t\n \tfunction(r){\n if(r.success){\n \tconsole.log(this.data);\n \tthis.data[property] = r.values;\n \t//console.log(this.data);\n\t if (typeof callback === \"function\") {\n\t callback(this.data[property]);\n\t }\n }\n }\n */\n \n \n });\n }\n };\n\n return UserInfoService;\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) 2013 (original work) Open Assessment Technologies SA ;\n */\ndefine('serviceApi/StateStorage',['jquery'], function($){\n 'use strict';\n \n function StateStorage(state, submitUrl) {\n this.state = state;\n this.submitUrl = submitUrl;\n }\n\n StateStorage.prototype.get = function(callback){\n if (typeof callback === 'function') {\n callback(this.state);\n }\n return this.state;\n };\n\n StateStorage.prototype.set = function(state, callback){\n\n if (state === this.state) {\n if (typeof callback === \"function\") {\n callback();\n }\n } else {\n this.state = state;\n $.ajax({\n url : this.submitUrl,\n data \t\t: {\n 'state' : state\n },\n type : 'post',\n dataType\t: 'json',\n success : typeof callback === \"function\" ? callback : null\n });\n }\n };\n\n return StateStorage;\n});\n","/*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA;\n *\n */\n\ndefine('taoQtiTest/controller/runtime/testRunner',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'module',\n 'taoQtiTest/testRunner/actionBarTools',\n 'taoQtiTest/testRunner/testReview',\n 'taoQtiTest/testRunner/progressUpdater',\n 'taoQtiTest/testRunner/testMetaData',\n 'serviceApi/ServiceApi',\n 'serviceApi/UserInfoService',\n 'serviceApi/StateStorage',\n 'iframeNotifier',\n 'mathJax',\n 'ui/feedback',\n 'ui/deleter',\n 'moment',\n 'ui/modal',\n 'ui/progressbar'\n],\nfunction (\n $,\n _,\n __,\n module,\n actionBarTools,\n testReview,\n progressUpdater,\n testMetaDataFactory,\n ServiceApi,\n UserInfoService,\n StateStorage,\n iframeNotifier,\n MathJax,\n feedback,\n deleter,\n moment,\n modal\n) {\n\n 'use strict';\n\n var timerIds = [],\n currentTimes = [],\n lastDates = [],\n timeDiffs = [],\n waitingTime = 0,\n $timers,\n $controls,\n timerIndex,\n testMetaData,\n sessionStateService,\n $doc = $(document),\n optionNextSection = 'x-tao-option-nextSection',\n optionNextSectionWarning = 'x-tao-option-nextSectionWarning',\n optionReviewScreen = 'x-tao-option-reviewScreen',\n TestRunner = {\n // Constants\n 'TEST_STATE_INITIAL': 0,\n 'TEST_STATE_INTERACTING': 1,\n 'TEST_STATE_MODAL_FEEDBACK': 2,\n 'TEST_STATE_SUSPENDED': 3,\n 'TEST_STATE_CLOSED': 4,\n 'TEST_NAVIGATION_LINEAR': 0,\n 'TEST_NAVIGATION_NONLINEAR': 1,\n 'TEST_ITEM_STATE_INTERACTING': 1,\n\n /**\n * Prepare a transition to another item\n * @param {Function} [callback]\n */\n beforeTransition: function (callback) {\n // Ask the top window to start the loader.\n iframeNotifier.parent('loading');\n\n // Disable buttons.\n this.disableGui();\n\n $controls.$itemFrame.hide();\n $controls.$rubricBlocks.hide();\n $controls.$timerWrapper.hide();\n\n // Wait at least waitingTime ms for a better user experience.\n if (typeof callback === 'function') {\n setTimeout(callback, waitingTime);\n }\n },\n\n /**\n * Complete a transition to another item\n */\n afterTransition: function () {\n this.enableGui();\n\n //ask the top window to stop the loader\n iframeNotifier.parent('unloading');\n testMetaData.addData({\n 'ITEM' : {'ITEM_START_TIME_CLIENT' : Date.now() / 1000}\n });\n },\n\n /**\n * Jumps to a particular item in the test\n * @param {Number} position The position of the item within the test\n */\n jump: function(position) {\n var self = this,\n action = 'jump',\n params = {position: position};\n this.disableGui();\n\n if( this.isJumpOutOfSection(position) && this.isCurrentItemActive() && this.isTimedSection() ){\n this.exitTimedSection(action, params);\n } else {\n this.killItemSession(function() {\n self.actionCall(action, params);\n });\n }\n },\n\n /**\n * Push to server how long user seen that item before to track duration\n * @param {Number} duration\n */\n keepItemTimed: function(duration){\n if (duration) {\n var self = this,\n action = 'keepItemTimed',\n params = {duration: duration};\n self.actionCall(action, params);\n }\n },\n\n /**\n * Marks an item for later review\n * @param {Boolean} flag The state of the flag\n * @param {Number} position The position of the item within the test\n */\n markForReview: function(flag, position) {\n var self = this;\n\n // Ask the top window to start the loader.\n iframeNotifier.parent('loading');\n\n // Disable buttons.\n this.disableGui();\n\n $.ajax({\n url: self.testContext.markForReviewUrl,\n cache: false,\n async: true,\n type: 'POST',\n dataType: 'json',\n data: {\n flag: flag,\n position: position\n },\n success: function(data) {\n // update the item flagged state\n if (self.testReview) {\n self.testReview.setItemFlag(position, flag);\n self.testReview.updateNumberFlagged(self.testContext, position, flag);\n if (self.testContext.itemPosition === position) {\n self.testContext.itemFlagged = flag;\n }\n self.updateTools(self.testContext);\n }\n\n // Enable buttons.\n self.enableGui();\n\n //ask the top window to stop the loader\n iframeNotifier.parent('unloading');\n }\n });\n },\n\n /**\n * Move to the next available item\n */\n moveForward: function () {\n var self = this,\n action = 'moveForward';\n\n this.disableGui();\n\n if( (( this.testContext.numberItemsSection - this.testContext.itemPositionSection - 1) == 0) && this.isCurrentItemActive()){\n if( this.isTimedSection() && !this.testContext.isTimeout){\n this.exitTimedSection(action);\n } else {\n this.exitSection(action);\n }\n } else {\n this.killItemSession(function () {\n self.actionCall(action);\n });\n }\n },\n\n /**\n * Move to the previous available item\n */\n moveBackward: function () {\n var self = this,\n action = 'moveBackward';\n\n this.disableGui();\n\n if( (this.testContext.itemPositionSection == 0) && this.isCurrentItemActive() && this.isTimedSection() ){\n this.exitTimedSection(action);\n } else {\n this.killItemSession(function () {\n self.actionCall(action);\n });\n }\n },\n\n /**\n * Checks if a position is out of the current section\n * @param {Number} jumpPosition\n * @returns {Boolean}\n */\n isJumpOutOfSection: function(jumpPosition){\n var items = this.getCurrentSectionItems(),\n isJumpToOtherSection = true,\n isValidPosition = (jumpPosition >= 0) && ( jumpPosition < this.testContext.numberItems );\n\n if( isValidPosition){\n for(var i in items ) {\n if (!items.hasOwnProperty(i)) {\n continue;\n }\n if( items[i].position == jumpPosition ){\n isJumpToOtherSection = false;\n break;\n }\n }\n } else {\n isJumpToOtherSection = false;\n }\n\n return isJumpToOtherSection;\n },\n\n /**\n * Exit from the current section. Set the exit code.de\n * @param {String} action\n * @param {Object} params\n * @param {Number} [exitCode]\n */\n exitSection: function(action, params, exitCode){\n var self = this;\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : exitCode || testMetaData.SECTION_EXIT_CODE.COMPLETED_NORMALLY}});\n self.killItemSession(function () {\n self.actionCall(action, params);\n });\n },\n\n /**\n * Tries to exit a timed section. Display a confirm message.\n * @param {String} action\n * @param {Object} params\n */\n exitTimedSection: function(action, params){\n var self = this;\n var qtiRunner = this.getQtiRunner();\n\n if (qtiRunner) {\n qtiRunner.updateItemApi();\n }\n\n this.displayExitMessage(\n __('After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?'),\n function() {\n self.exitSection(action, params);\n },\n 'testSection'\n );\n\n this.enableGui();\n },\n\n /**\n * Tries to leave the current section and go to the next\n */\n nextSection: function(){\n var self = this;\n var qtiRunner = this.getQtiRunner();\n var doNextSection = function() {\n self.exitSection('nextSection', null, testMetaData.SECTION_EXIT_CODE.QUIT);\n };\n\n if (qtiRunner) {\n qtiRunner.updateItemApi();\n }\n\n if (this.hasOption(optionNextSectionWarning)) {\n this.displayExitMessage(\n __('After you complete the section it would be impossible to return to this section to make changes. Are you sure you want to end the section?'),\n doNextSection,\n 'testSection'\n );\n } else {\n doNextSection();\n }\n\n this.enableGui();\n },\n\n /**\n * Gets the current progression within a particular scope\n * @param {String} [scope]\n * @returns {Object}\n */\n getProgression: function(scope) {\n var scopeSuffixMap = {\n test : '',\n testPart : 'Part',\n testSection : 'Section'\n };\n var scopeSuffix = scope && scopeSuffixMap[scope] || '';\n\n return {\n total : this.testContext['numberItems' + scopeSuffix] || 0,\n answered : this.testContext['numberCompleted' + scopeSuffix] || 0,\n viewed : this.testContext['numberPresented' + scopeSuffix] || 0,\n flagged : this.testContext['numberFlagged' + scopeSuffix] || 0\n };\n },\n\n /**\n * Displays an exit message for a particular scope\n * @param {String} message\n * @param {Function} [action]\n * @param {String} [scope]\n * @returns {jQuery} Returns the message box\n */\n displayExitMessage: function(message, action, scope) {\n var self = this;\n var $confirmBox = $('.exit-modal-feedback');\n var progression = this.getProgression(scope);\n var unansweredCount = (progression.total - progression.answered);\n var flaggedCount = progression.flagged;\n\n if (unansweredCount && this.isCurrentItemAnswered()) {\n unansweredCount--;\n }\n\n if (flaggedCount && unansweredCount) {\n message = __('You have %s unanswered question(s) and have %s item(s) marked for review.',\n unansweredCount.toString(),\n flaggedCount.toString()\n ) + ' ' + message;\n } else {\n if (flaggedCount) {\n message = __('You have %s item(s) marked for review.', flaggedCount.toString()) + ' ' + message;\n }\n\n if (unansweredCount) {\n message = __('You have %s unanswered question(s).', unansweredCount.toString()) + ' ' + message;\n }\n }\n\n $confirmBox.find('.message').html(message);\n $confirmBox.modal({ width: 500 });\n\n $confirmBox.find('.js-exit-cancel, .modal-close').off('click').on('click', function () {\n $confirmBox.modal('close');\n });\n\n $confirmBox.find('.js-exit-confirm').off('click').on('click', function () {\n $confirmBox.modal('close');\n if (_.isFunction(action)) {\n action.call(self);\n }\n });\n\n return $confirmBox;\n },\n\n /**\n * Kill current item section and execute callback function given as first parameter.\n * Item end execution time will be stored in metadata object to be sent to the server.\n * @param {function} callback\n */\n killItemSession : function (callback) {\n testMetaData.addData({\n 'ITEM' : {\n 'ITEM_END_TIME_CLIENT' : Date.now() / 1000,\n 'ITEM_TIMEZONE' : moment().utcOffset(moment().utcOffset()).format('Z')\n }\n });\n if (typeof callback !== 'function') {\n callback = _.noop;\n }\n this.itemServiceApi.kill(callback);\n },\n\n /**\n * Checks if the current item is active\n * @returns {Boolean}\n */\n isCurrentItemActive: function(){\n return (this.testContext.itemSessionState != 4);\n },\n\n /**\n * Tells is the current item has been answered or not\n * The item is considered answered when at least one response has been set to not empty {base : null}\n *\n * @returns {Boolean}\n */\n isCurrentItemAnswered: function(){\n var answered = false;\n _.each(this.getCurrentItemState(), function(state){\n if(state && _.isObject(state.response) && state.response.base !== null){\n answered = true;//at least one response is not null so consider the item answered\n return false;\n }\n });\n return answered;\n },\n\n /**\n * Checks if a particular option is enabled for the current item\n * @param {String} option\n * @returns {Boolean}\n */\n hasOption: function(option) {\n return _.indexOf(this.testContext.categories, option) >= 0;\n },\n\n /**\n * Gets access to the qtiRunner instance\n * @returns {Object}\n */\n getQtiRunner: function(){\n var itemFrame = document.getElementById('qti-item');\n var itemWindow = itemFrame && itemFrame.contentWindow;\n var itemContainerFrame = itemWindow && itemWindow.document.getElementById('item-container');\n var itemContainerWindow = itemContainerFrame && itemContainerFrame.contentWindow;\n return itemContainerWindow && itemContainerWindow.qtiRunner;\n },\n\n /**\n * Checks if the current section is timed\n * @returns {Boolean}\n */\n isTimedSection: function(){\n var timeConstraints = this.testContext.timeConstraints,\n isTimedSection = false;\n for( var index in timeConstraints ){\n if(timeConstraints.hasOwnProperty(index) &&\n timeConstraints[index].qtiClassName === 'assessmentSection' ){\n isTimedSection = true;\n }\n }\n\n return isTimedSection;\n },\n\n /**\n * Gets the list of items owned by the current section\n * @returns {Array}\n */\n getCurrentSectionItems: function(){\n var partId = this.testContext.testPartId,\n navMap = this.testContext.navigatorMap,\n sectionItems;\n\n for( var partIndex in navMap ){\n if( !navMap.hasOwnProperty(partIndex)){\n continue;\n }\n if( navMap[partIndex].id !== partId ){\n continue;\n }\n\n for(var sectionIndex in navMap[partIndex].sections){\n if( !navMap[partIndex].sections.hasOwnProperty(sectionIndex)){\n continue;\n }\n if( navMap[partIndex].sections[sectionIndex].active === true ){\n sectionItems = navMap[partIndex].sections[sectionIndex].items;\n break;\n }\n }\n }\n\n return sectionItems;\n },\n\n /**\n * Skips the current item\n */\n skip: function () {\n this.disableGui();\n this.actionCall('skip');\n },\n\n /**\n * Handles the timeout state\n */\n timeout: function () {\n var self = this;\n this.disableGui();\n this.testContext.isTimeout = true;\n this.updateTimer();\n\n this.killItemSession(function () {\n var confirmBox = $('.timeout-modal-feedback'),\n testContext = self.testContext,\n confirmBtn = confirmBox.find('.js-timeout-confirm, .modal-close');\n\n if (testContext.numberCompletedSection === testContext.numberItemsSection) {\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : testMetaData.SECTION_EXIT_CODE.COMPLETE_TIMEOUT}});\n } else {\n testMetaData.addData({\"SECTION\" : {\"SECTION_EXIT_CODE\" : testMetaData.SECTION_EXIT_CODE.TIMEOUT}});\n }\n\n self.enableGui();\n confirmBox.modal({width: 500});\n confirmBtn.off('click').on('click', function () {\n confirmBox.modal('close');\n self.actionCall('timeout');\n });\n });\n },\n\n /**\n * Sets the assessment test context object\n * @param {Object} testContext\n */\n setTestContext: function(testContext) {\n this.testContext = testContext;\n this.itemServiceApi = eval(testContext.itemServiceApiCall);\n this.itemServiceApi.setHasBeenPaused(testContext.hasBeenPaused);\n },\n\n\n /**\n * Handles Metadata initialization\n */\n initMetadata: function (){\n testMetaData = testMetaDataFactory({\n testServiceCallId: this.itemServiceApi.serviceCallId\n });\n },\n\n /**\n * Retrieve service responsible for broken session tracking\n * @returns {*}\n */\n getSessionStateService: function () {\n if (!sessionStateService) {\n sessionStateService = this.testContext.sessionStateService({accuracy: 1000});\n }\n return sessionStateService;\n },\n\n /**\n * Updates the GUI\n * @param {Object} testContext\n */\n update: function (testContext) {\n var self = this;\n $controls.$itemFrame.remove();\n\n var $runner = $('#runner');\n $runner.css('height', 'auto');\n\n this.getSessionStateService().restart();\n\n this.setTestContext(testContext);\n this.updateContext();\n this.updateProgress();\n this.updateNavigation();\n this.updateTestReview();\n this.updateInformation();\n this.updateRubrics();\n this.updateTools(testContext);\n this.updateTimer();\n this.updateExitButton();\n this.resetCurrentItemState();\n this.initMetadata();\n\n $controls.$itemFrame = $('':\"\"),a._keyEvent=!1,K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,\"changeMonth\"),j=this._get(a,\"changeYear\"),k=this._get(a,\"showMonthAfterYear\"),l='
      ',m=\"\";if(f||!i)m+=''+g[b]+\"\";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='\"}k||(l+=m+(f||!i||!j?\" \":\"\"));if(!a.yearshtml){a.yearshtml=\"\";if(f||!j)l+=''+c+\"\";else{var q=this._get(a,\"yearRange\").split(\":\"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||\"\"));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='\",l+=a.yearshtml,a.yearshtml=null}}return l+=this._get(a,\"yearSuffix\"),k&&(l+=(f||!i||!j?\" \":\"\")+m),l+=\"
      \",l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c==\"Y\"?b:0),e=a.drawMonth+(c==\"M\"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c==\"D\"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c==\"M\"||c==\"Y\")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,\"min\"),d=this._getMinMaxDate(a,\"max\"),e=c&&bd?d:e,e},_notifyChange:function(a){var b=this._get(a,\"onChangeMonthYear\");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,\"numberOfMonths\");return b==null?[1,1]:typeof b==\"number\"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+\"Date\"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));return b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth())),this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,\"min\"),d=this._getMinMaxDate(a,\"max\");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,\"shortYearCutoff\");return b=typeof b!=\"string\"?b:(new Date).getFullYear()%100+parseInt(b,10),{shortYearCutoff:b,dayNamesShort:this._get(a,\"dayNamesShort\"),dayNames:this._get(a,\"dayNames\"),monthNamesShort:this._get(a,\"monthNamesShort\"),monthNames:this._get(a,\"monthNames\")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b==\"object\"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,\"dateFormat\"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find(\"body\").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);return typeof a!=\"string\"||a!=\"isDisabled\"&&a!=\"getDate\"&&a!=\"widget\"?a==\"option\"&&arguments.length==2&&typeof arguments[1]==\"string\"?$.datepicker[\"_\"+a+\"Datepicker\"].apply($.datepicker,[this[0]].concat(b)):this.each(function(){typeof a==\"string\"?$.datepicker[\"_\"+a+\"Datepicker\"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)}):$.datepicker[\"_\"+a+\"Datepicker\"].apply($.datepicker,[this[0]].concat(b))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version=\"1.8.23\",window[\"DP_jQuery_\"+dpuuid]=$})(jQuery);;\n/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.core.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\njQuery.effects||function(a,b){function c(b){var c;return b&&b.constructor==Array&&b.length==3?b:(c=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(b))?[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)]:(c=/rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(b))?[parseFloat(c[1])*2.55,parseFloat(c[2])*2.55,parseFloat(c[3])*2.55]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))?[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)]:(c=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))?[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)]:(c=/rgba\\(0, 0, 0, 0\\)/.exec(b))?e.transparent:e[a.trim(b).toLowerCase()]}function d(b,d){var e;do{e=(a.curCSS||a.css)(b,d);if(e!=\"\"&&e!=\"transparent\"||a.nodeName(b,\"body\"))break;d=\"backgroundColor\"}while(b=b.parentNode);return c(e)}function h(){var a=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,b={},c,d;if(a&&a.length&&a[0]&&a[a[0]]){var e=a.length;while(e--)c=a[e],typeof a[c]==\"string\"&&(d=c.replace(/\\-(\\w)/g,function(a,b){return b.toUpperCase()}),b[d]=a[c])}else for(c in a)typeof a[c]==\"string\"&&(b[c]=a[c]);return b}function i(b){var c,d;for(c in b)d=b[c],(d==null||a.isFunction(d)||c in g||/scrollbar/.test(c)||!/color/i.test(c)&&isNaN(parseFloat(d)))&&delete b[c];return b}function j(a,b){var c={_:0},d;for(d in b)a[d]!=b[d]&&(c[d]=b[d]);return c}function k(b,c,d,e){typeof b==\"object\"&&(e=c,d=null,c=b,b=c.effect),a.isFunction(c)&&(e=c,d=null,c={});if(typeof c==\"number\"||a.fx.speeds[c])e=d,d=c,c={};return a.isFunction(d)&&(e=d,d=null),c=c||{},d=d||c.duration,d=a.fx.off?0:typeof d==\"number\"?d:d in a.fx.speeds?a.fx.speeds[d]:a.fx.speeds._default,e=e||c.complete,[b,c,d,e]}function l(b){return!b||typeof b==\"number\"||a.fx.speeds[b]?!0:typeof b==\"string\"&&!a.effects[b]?!0:!1}a.effects={},a.each([\"backgroundColor\",\"borderBottomColor\",\"borderLeftColor\",\"borderRightColor\",\"borderTopColor\",\"borderColor\",\"color\",\"outlineColor\"],function(b,e){a.fx.step[e]=function(a){a.colorInit||(a.start=d(a.elem,e),a.end=c(a.end),a.colorInit=!0),a.elem.style[e]=\"rgb(\"+Math.max(Math.min(parseInt(a.pos*(a.end[0]-a.start[0])+a.start[0],10),255),0)+\",\"+Math.max(Math.min(parseInt(a.pos*(a.end[1]-a.start[1])+a.start[1],10),255),0)+\",\"+Math.max(Math.min(parseInt(a.pos*(a.end[2]-a.start[2])+a.start[2],10),255),0)+\")\"}});var e={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},f=[\"add\",\"remove\",\"toggle\"],g={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(b,c,d,e){return a.isFunction(d)&&(e=d,d=null),this.queue(function(){var g=a(this),k=g.attr(\"style\")||\" \",l=i(h.call(this)),m,n=g.attr(\"class\")||\"\";a.each(f,function(a,c){b[c]&&g[c+\"Class\"](b[c])}),m=i(h.call(this)),g.attr(\"class\",n),g.animate(j(l,m),{queue:!1,duration:c,easing:d,complete:function(){a.each(f,function(a,c){b[c]&&g[c+\"Class\"](b[c])}),typeof g.attr(\"style\")==\"object\"?(g.attr(\"style\").cssText=\"\",g.attr(\"style\").cssText=k):g.attr(\"style\",k),e&&e.apply(this,arguments),a.dequeue(this)}})})},a.fn.extend({_addClass:a.fn.addClass,addClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{add:b},c,d,e]):this._addClass(b)},_removeClass:a.fn.removeClass,removeClass:function(b,c,d,e){return c?a.effects.animateClass.apply(this,[{remove:b},c,d,e]):this._removeClass(b)},_toggleClass:a.fn.toggleClass,toggleClass:function(c,d,e,f,g){return typeof d==\"boolean\"||d===b?e?a.effects.animateClass.apply(this,[d?{add:c}:{remove:c},e,f,g]):this._toggleClass(c,d):a.effects.animateClass.apply(this,[{toggle:c},d,e,f])},switchClass:function(b,c,d,e,f){return a.effects.animateClass.apply(this,[{add:c,remove:b},d,e,f])}}),a.extend(a.effects,{version:\"1.8.23\",save:function(a,b){for(var c=0;c\").addClass(\"ui-effects-wrapper\").css({fontSize:\"100%\",background:\"transparent\",border:\"none\",margin:0,padding:0}),e=document.activeElement;try{e.id}catch(f){e=document.body}return b.wrap(d),(b[0]===e||a.contains(b[0],e))&&a(e).focus(),d=b.parent(),b.css(\"position\")==\"static\"?(d.css({position:\"relative\"}),b.css({position:\"relative\"})):(a.extend(c,{position:b.css(\"position\"),zIndex:b.css(\"z-index\")}),a.each([\"top\",\"left\",\"bottom\",\"right\"],function(a,d){c[d]=b.css(d),isNaN(parseInt(c[d],10))&&(c[d]=\"auto\")}),b.css({position:\"relative\",top:0,left:0,right:\"auto\",bottom:\"auto\"})),d.css(c).show()},removeWrapper:function(b){var c,d=document.activeElement;return b.parent().is(\".ui-effects-wrapper\")?(c=b.parent().replaceWith(b),(b[0]===d||a.contains(b[0],d))&&a(d).focus(),c):b},setTransition:function(b,c,d,e){return e=e||{},a.each(c,function(a,c){var f=b.cssUnit(c);f[0]>0&&(e[c]=f[0]*d+f[1])}),e}}),a.fn.extend({effect:function(b,c,d,e){var f=k.apply(this,arguments),g={options:f[1],duration:f[2],callback:f[3]},h=g.options.mode,i=a.effects[b];return a.fx.off||!i?h?this[h](g.duration,g.callback):this.each(function(){g.callback&&g.callback.call(this)}):i.call(this,g)},_show:a.fn.show,show:function(a){if(l(a))return this._show.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode=\"show\",this.effect.apply(this,b)},_hide:a.fn.hide,hide:function(a){if(l(a))return this._hide.apply(this,arguments);var b=k.apply(this,arguments);return b[1].mode=\"hide\",this.effect.apply(this,b)},__toggle:a.fn.toggle,toggle:function(b){if(l(b)||typeof b==\"boolean\"||a.isFunction(b))return this.__toggle.apply(this,arguments);var c=k.apply(this,arguments);return c[1].mode=\"toggle\",this.effect.apply(this,c)},cssUnit:function(b){var c=this.css(b),d=[];return a.each([\"em\",\"px\",\"%\",\"pt\"],function(a,b){c.indexOf(b)>0&&(d=[parseFloat(c),b])}),d}});var m={};a.each([\"Quad\",\"Cubic\",\"Quart\",\"Quint\",\"Expo\"],function(a,b){m[b]=function(b){return Math.pow(b,a+2)}}),a.extend(m,{Sine:function(a){return 1-Math.cos(a*Math.PI/2)},Circ:function(a){return 1-Math.sqrt(1-a*a)},Elastic:function(a){return a===0||a===1?a:-Math.pow(2,8*(a-1))*Math.sin(((a-1)*80-7.5)*Math.PI/15)},Back:function(a){return a*a*(3*a-2)},Bounce:function(a){var b,c=4;while(a<((b=Math.pow(2,--c))-1)/11);return 1/Math.pow(4,3-c)-7.5625*Math.pow((b*3-2)/22-a,2)}}),a.each(m,function(b,c){a.easing[\"easeIn\"+b]=c,a.easing[\"easeOut\"+b]=function(a){return 1-c(1-a)},a.easing[\"easeInOut\"+b]=function(a){return a<.5?c(a*2)/2:c(a*-2+2)/-2+1}})}(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.blind.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.blind=function(b){return this.queue(function(){var c=a(this),d=[\"position\",\"top\",\"bottom\",\"left\",\"right\"],e=a.effects.setMode(c,b.options.mode||\"hide\"),f=b.options.direction||\"vertical\";a.effects.save(c,d),c.show();var g=a.effects.createWrapper(c).css({overflow:\"hidden\"}),h=f==\"vertical\"?\"height\":\"width\",i=f==\"vertical\"?g.height():g.width();e==\"show\"&&g.css(h,0);var j={};j[h]=e==\"show\"?i:0,g.animate(j,b.duration,b.options.easing,function(){e==\"hide\"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.bounce.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.bounce=function(b){return this.queue(function(){var c=a(this),d=[\"position\",\"top\",\"bottom\",\"left\",\"right\"],e=a.effects.setMode(c,b.options.mode||\"effect\"),f=b.options.direction||\"up\",g=b.options.distance||20,h=b.options.times||5,i=b.duration||250;/show|hide/.test(e)&&d.push(\"opacity\"),a.effects.save(c,d),c.show(),a.effects.createWrapper(c);var j=f==\"up\"||f==\"down\"?\"top\":\"left\",k=f==\"up\"||f==\"left\"?\"pos\":\"neg\",g=b.options.distance||(j==\"top\"?c.outerHeight(!0)/3:c.outerWidth(!0)/3);e==\"show\"&&c.css(\"opacity\",0).css(j,k==\"pos\"?-g:g),e==\"hide\"&&(g=g/(h*2)),e!=\"hide\"&&h--;if(e==\"show\"){var l={opacity:1};l[j]=(k==\"pos\"?\"+=\":\"-=\")+g,c.animate(l,i/2,b.options.easing),g=g/2,h--}for(var m=0;m\").css({position:\"absolute\",visibility:\"visible\",left:-j*(g/d),top:-i*(h/c)}).parent().addClass(\"ui-effects-explode\").css({position:\"absolute\",overflow:\"hidden\",width:g/d,height:h/c,left:f.left+j*(g/d)+(b.options.mode==\"show\"?(j-Math.floor(d/2))*(g/d):0),top:f.top+i*(h/c)+(b.options.mode==\"show\"?(i-Math.floor(c/2))*(h/c):0),opacity:b.options.mode==\"show\"?0:1}).animate({left:f.left+j*(g/d)+(b.options.mode==\"show\"?0:(j-Math.floor(d/2))*(g/d)),top:f.top+i*(h/c)+(b.options.mode==\"show\"?0:(i-Math.floor(c/2))*(h/c)),opacity:b.options.mode==\"show\"?1:0},b.duration||500);setTimeout(function(){b.options.mode==\"show\"?e.css({visibility:\"visible\"}):e.css({visibility:\"visible\"}).hide(),b.callback&&b.callback.apply(e[0]),e.dequeue(),a(\"div.ui-effects-explode\").remove()},b.duration||500)})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.fade.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.fade=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||\"hide\");c.animate({opacity:d},{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.fold.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.fold=function(b){return this.queue(function(){var c=a(this),d=[\"position\",\"top\",\"bottom\",\"left\",\"right\"],e=a.effects.setMode(c,b.options.mode||\"hide\"),f=b.options.size||15,g=!!b.options.horizFirst,h=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(c,d),c.show();var i=a.effects.createWrapper(c).css({overflow:\"hidden\"}),j=e==\"show\"!=g,k=j?[\"width\",\"height\"]:[\"height\",\"width\"],l=j?[i.width(),i.height()]:[i.height(),i.width()],m=/([0-9]+)%/.exec(f);m&&(f=parseInt(m[1],10)/100*l[e==\"hide\"?0:1]),e==\"show\"&&i.css(g?{height:0,width:f}:{height:f,width:0});var n={},p={};n[k[0]]=e==\"show\"?l[0]:f,p[k[1]]=e==\"show\"?l[1]:0,i.animate(n,h,b.options.easing).animate(p,h,b.options.easing,function(){e==\"hide\"&&c.hide(),a.effects.restore(c,d),a.effects.removeWrapper(c),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.highlight.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.highlight=function(b){return this.queue(function(){var c=a(this),d=[\"backgroundImage\",\"backgroundColor\",\"opacity\"],e=a.effects.setMode(c,b.options.mode||\"show\"),f={backgroundColor:c.css(\"backgroundColor\")};e==\"hide\"&&(f.opacity=0),a.effects.save(c,d),c.show().css({backgroundImage:\"none\",backgroundColor:b.options.color||\"#ffff99\"}).animate(f,{queue:!1,duration:b.duration,easing:b.options.easing,complete:function(){e==\"hide\"&&c.hide(),a.effects.restore(c,d),e==\"show\"&&!a.support.opacity&&this.style.removeAttribute(\"filter\"),b.callback&&b.callback.apply(this,arguments),c.dequeue()}})})}})(jQuery);;/*! jQuery UI - v1.8.23 - 2012-08-15\n* https://github.com/jquery/jquery-ui\n* Includes: jquery.effects.pulsate.js\n* Copyright (c) 2012 AUTHORS.txt; Licensed MIT, GPL */\n(function(a,b){a.effects.pulsate=function(b){return this.queue(function(){var c=a(this),d=a.effects.setMode(c,b.options.mode||\"show\"),e=(b.options.times||5)*2-1,f=b.duration?b.duration/2:a.fx.speeds._default/2,g=c.is(\":visible\"),h=0;g||(c.css(\"opacity\",0).show(),h=1),(d==\"hide\"&&g||d==\"show\"&&!g)&&e--;for(var i=0;i').appendTo(document.body).addClass(b.options.className).css({top:g.top,left:g.left,height:c.innerHeight(),width:c.innerWidth(),position:\"absolute\"}).animate(f,b.duration,b.options.easing,function(){h.remove(),b.callback&&b.callback.apply(c[0],arguments),c.dequeue()})})}})(jQuery);\n});\n\n","/*\r\n * Helpers\r\n */\r\ndefine('helpers',[\r\n 'lodash',\r\n 'jquery',\r\n 'context',\r\n 'layout/loading-bar',\r\n 'jqueryui'\r\n], function (_, $, context, loadingBar) {\r\n\r\n\r\n var Helpers = {\r\n init: function () {\r\n /**\r\n * Extends the JQuery post method for convenience use with Json\r\n * @param {String} url\r\n * @param {Object} data\r\n * @param {Function} callback\r\n */\r\n $.postJson = function (url, data, callback) {\r\n $.post(url, data, callback, \"json\");\r\n };\r\n },\r\n\r\n getMainContainer: function () {\r\n console.warn('deprecated, use section instead');\r\n var sectionId,\r\n sectionIndex;\r\n if (!context.section) {\r\n sectionIndex = $('.section-container').tabs('options', 'selected');\r\n $('.content-panel').eq(sectionIndex).find('.content-block');\r\n }\r\n return $('#panel-' + context.section + ' .content-block');\r\n },\r\n\r\n /**\r\n * @return {String} the current main container jQuery selector (from the opened tab)\r\n */\r\n getMainContainerSelector: function ($tabs) {\r\n console.warn('deprecated, use section instead');\r\n var $container = this.getMainContainer();\r\n if ($container && $container.length > 0) {\r\n return $container.selector;\r\n }\r\n return false;\r\n },\r\n\r\n /**\r\n * @param {String} name the name of the tab to select\r\n */\r\n selectTabByName: function (name) {\r\n console.warn('deprecated, use section instead');\r\n $(\"#\" + name).click();\r\n },\r\n\r\n /**\r\n * get the index of the tab identified by name\r\n * @param {String} name\r\n * @return the index or -1 if not found\r\n */\r\n getTabIndexByName: function (name) {\r\n console.warn('deprecated, use section instead');\r\n var elts = $(\"div#tabs ul.ui-tabs-nav li a\");\r\n var i = 0;\r\n while (i < elts.length) {\r\n var elt = elts[i];\r\n if (elt && elt.id && elt.id === name) {\r\n return i;\r\n }\r\n i++;\r\n }\r\n return -1;\r\n },\r\n\r\n openTab: function (title, url, open) {\r\n console.warn('deprecated, use section instead');\r\n open = open || true;\r\n var idx = this.getTabIndexByUrl(url),\r\n $tabs = $('#tabs');\r\n if (idx == -1) {\r\n $tabs.tabs(\"add\", url, title);\r\n idx = $tabs.tabs(\"length\") - 1;\r\n }\r\n //If control pressed, not select\r\n if (open) {\r\n $tabs.tabs(\"select\", idx);\r\n }\r\n },\r\n\r\n getTabIndexByUrl: function (url) {\r\n console.warn('deprecated, use section instead');\r\n var elts = $(\"#tabs ul.ui-tabs-nav li a\");\r\n var i = 0;\r\n var ret = -1;\r\n elts.each(function () {\r\n var href = $.data(this, 'href.tabs');\r\n if (url === href) {\r\n ret = i;\r\n return;\r\n }\r\n i++;\r\n });\r\n return ret;\r\n },\r\n\r\n closeTab: function (index) {\r\n console.warn('deprecated, use section instead');\r\n if (index > -1) {\r\n $('#tabs').tabs(\"remove\", index);\r\n }\r\n },\r\n\r\n /**\r\n * Add parameters to a tab\r\n * @param {Object} tabObj\r\n * @param {String} tabName\r\n * @param {Object} parameters\r\n */\r\n updateTabUrl: function (tabObj, tabName, url) {\r\n console.warn('deprecated, use section instead');\r\n var index = this.getTabIndexByName(tabName);\r\n tabObj.tabs('url', index, url);\r\n tabObj.tabs('enable', index);\r\n },\r\n\r\n /*\r\n * Navigation and ajax helpers\r\n */\r\n\r\n /**\r\n * Begin an async request, while loading:\r\n * - show the loader img\r\n * - disable the submit buttons\r\n */\r\n loading: function () {\r\n console.warn('deprecated, this should be automated');\r\n $(window).on('click', function (e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n return false;\r\n });\r\n loadingBar.start();\r\n },\r\n\r\n /**\r\n * Complete an async request, once loaded:\r\n * - hide the loader img\r\n * - enable back the submit buttons\r\n */\r\n loaded: function () {\r\n console.warn('deprecated, this should be automated');\r\n $(window).off('click');\r\n loadingBar.stop();\r\n },\r\n\r\n /**\r\n * Load url asyncly into selector container\r\n * @param {String} selector\r\n * @param {String} url\r\n */\r\n _load: function (selector, url, data) {\r\n\r\n url = url || '';\r\n\r\n if (data) {\r\n data.nc = new Date().getTime();\r\n }\r\n else {\r\n data = {nc: new Date().getTime()};\r\n }\r\n $(selector).hide().empty().show();\r\n if (url.indexOf('?') === -1) {\r\n $(selector).load(url, data);\r\n }\r\n else {\r\n url += '&' + ($.param(data));\r\n $(selector).load(url);\r\n }\r\n },\r\n\r\n /**\r\n * Make a nocache url, using a timestamp\r\n * @param {String} ref\r\n */\r\n _href: function (ref) {\r\n return (ref.indexOf('?') > -1) ? ref + '&nc=' + new Date().getTime() : ref + '?nc=' + new Date().getTime();\r\n },\r\n\r\n /*\r\n * others\r\n */\r\n\r\n /**\r\n * apply effect to elements that are only present\r\n */\r\n _autoFx: function () {\r\n \r\n console.warn('deprecated');\r\n setTimeout(function () {\r\n $(\".auto-highlight\").effect(\"highlight\", {color: \"#9FC9FF\"}, 2500);\r\n }, 1000);\r\n setTimeout(function () {\r\n $(\".auto-hide\").fadeOut(\"slow\");\r\n }, 3000);\r\n setTimeout(function () {\r\n $(\".auto-slide\").slideUp(1500);\r\n }, 11000);\r\n },\r\n\r\n /**\r\n * Check and cut the text of the selector container only if the text is longer than the maxLength parameter\r\n * @param {String} selector JQuery selector\r\n * @param {int} maxLength\r\n */\r\n textCutter: function (selector, maxLength) {\r\n console.warn('deprecated, use css instead');\r\n if (!maxLength) {\r\n maxLength = 100;\r\n }\r\n $(selector).each(function () {\r\n if ($(this).text().length > maxLength && !$(this).hasClass(\"text-cutted\")) {\r\n $(this).prop('title', $(this).text());\r\n $(this).css('cursor', 'pointer');\r\n $(this).html($(this).text().substring(0, maxLength) + \"[...]\");\r\n $(this).addClass(\"text-cutted\");\r\n }\r\n });\r\n },\r\n\r\n createMessage: function (message) {\r\n console.warn('deprecated, use feedback instead');\r\n if (!$('#info-box').length) {\r\n $(\"body\").append(\"
      \" + message + \"
      \")\r\n }\r\n else {\r\n $('#info-box').html(message).show();\r\n }\r\n this._autoFx();\r\n },\r\n\r\n /**\r\n * Create a error popup to display an error message\r\n * @param {String} message\r\n */\r\n createErrorMessage: function (message) {\r\n this.createMessage(message);\r\n $('#info-box').addClass('ui-state-error');\r\n },\r\n\r\n /**\r\n * Create an info popup to display a message\r\n * @param {String} message\r\n */\r\n createInfoMessage: function (message) {\r\n this.createMessage(message);\r\n $('#info-box').removeClass('ui-state-error');\r\n },\r\n\r\n /**\r\n * Check if a flahs player is found in the plugins list\r\n * @return {boolean}\r\n */\r\n isFlashPluginEnabled: function () {\r\n return (typeof navigator.plugins !== \"undefined\" && typeof navigator.plugins[\"Shockwave Flash\"] === \"object\") || \r\n (window.ActiveXObject && (new window.ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\")) !== false);\r\n },\r\n\r\n //http://requirejs.org/docs/faq-advanced.html\r\n loadCss: function (url) {\r\n console.warn('deprecated');\r\n var link = document.createElement(\"link\");\r\n link.type = \"text/css\";\r\n link.rel = \"stylesheet\";\r\n link.href = url;\r\n document.getElementsByTagName(\"head\")[0].appendChild(link);\r\n },\r\n\r\n /**\r\n * simple _url implementation, requires layout_header to set some global variables\r\n */\r\n _url: function (action, controller, extension, params) {\r\n \r\n var url;\r\n\r\n if(typeof action !== 'string' || typeof controller !== 'string' || typeof extension !== 'string'){\r\n throw new TypeError('All parts are required to build an URL');\r\n }\r\n\r\n url = context.root_url + extension + '/' + controller + '/' + action;\r\n\r\n if(_.isString(params)) {\r\n url += '?' + params;\r\n } else if (_.isPlainObject(params)) {\r\n url += '?' + $.param(params);\r\n }\r\n return url;\r\n }\r\n };\r\n\r\n return Helpers;\r\n});\r\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/runner/config/qtiServiceConfig',[\n 'lodash',\n 'helpers'\n], function(_, helpers) {\n 'use strict';\n\n /**\n * Some default config values\n * @type {Object}\n * @private\n */\n var _defaults = {\n serviceController : 'Runner',\n serviceExtension : 'taoQtiTest'\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 testDefinition : true,\n testCompilation : true,\n serviceCallId : true,\n serviceController : false,\n serviceExtension : false\n };\n\n /**\n * Extract the handled config entries.\n * @param {Object} config\n * @returns {Object}\n * @throws Error if a required entry is missing\n */\n function getConfig(config) {\n var storage = {};\n _.forEach(_entries, function(value, name) {\n if ('undefined' !== typeof config[name]) {\n storage[name] = config[name];\n } else if (value) {\n throw new Error('The config entry \"' + name + '\" is required!');\n }\n });\n return _.defaults(storage, _defaults);\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.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 {String} [config.serviceController] - The name of the service controller\n * @param {String} [config.serviceExtension] - The name of the extension containing the service controller\n * @returns {Object}\n */\n function configFactory(config) {\n // protected storage\n var storage = getConfig(config);\n\n // returns only a proxy storage object : no direct access to data is provided\n return {\n /**\n * Gets the URI of the test\n * @returns {String}\n */\n getTestDefinition : function getTestDefinition() {\n return storage.testDefinition;\n },\n\n /**\n * Gets the URI of the compiled delivery\n * @returns {String}\n */\n getTestCompilation : function getTestCompilation() {\n return storage.testCompilation;\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.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.serviceExtension;\n },\n\n /**\n * Gets an URL of a service action related to the test\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 helpers._url(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition : this.getTestDefinition(),\n testCompilation : this.getTestCompilation(),\n serviceCallId : this.getServiceCallId()\n });\n },\n\n /**\n * Gets an URL of a service action related to a particular item\n * @param {String} uri - 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(uri, action) {\n return helpers._url(action, this.getServiceController(), this.getServiceExtension(), {\n testDefinition : this.getTestDefinition(),\n testCompilation : this.getTestCompilation(),\n testServiceCallId : this.getServiceCallId(),\n itemDefinition : uri\n });\n }\n };\n }\n\n return configFactory;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/runner/proxy/qtiServiceProxy',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'core/promise',\n 'helpers',\n 'taoQtiTest/runner/config/qtiServiceConfig'\n], function($, _, __, Promise, helpers, configFactory) {\n 'use strict';\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} [params]\n * @param {String} [contentType] - to force the content type\n * @returns {Promise}\n */\n function request(url, params, contentType) {\n return new Promise(function(resolve, reject) {\n $.ajax({\n url: url,\n type: params ? 'POST' : 'GET',\n cache: false,\n data: params,\n async: true,\n dataType: 'json',\n contentType : contentType\n })\n .done(function(data) {\n if (data && data.success) {\n resolve(data);\n } else {\n reject(data);\n }\n })\n .fail(function(jqXHR, textStatus, errorThrown) {\n var data;\n try {\n data = JSON.parse(jqXHR.responseText);\n } catch (e) {\n data = {\n success: false,\n code: jqXHR.status,\n type: textStatus || 'error',\n message: errorThrown || __('An error occurred!')\n };\n }\n reject(data);\n });\n });\n }\n\n /**\n * QTI proxy definition\n * Related to remote services calls\n * @type {Object}\n */\n var qtiServiceProxy = {\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 * @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) {\n var initConfig = config || {};\n\n // store config in a dedicated storage\n this.storage = configFactory(initConfig);\n\n // request for initialization\n return request(this.storage.getTestActionUrl('init'));\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 var self = this;\n // the method must return a promise\n return new Promise(function(resolve) {\n // no request, just a resources cleaning\n self.storage = null;\n resolve();\n });\n },\n\n /**\n * Gets the test definition data\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestData: function getTestData() {\n return request(this.storage.getTestActionUrl('getTestData'));\n },\n\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n return request(this.storage.getTestActionUrl('getTestContext'));\n },\n\n /**\n * Gets the test map\n * @returns {Promise} - Returns a promise. The test map object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestMap: function getTestMap() {\n return request(this.storage.getTestActionUrl('getTestMap'));\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 request(this.storage.getTestActionUrl(action), params);\n },\n\n /**\n * Gets an item definition by its URI\n * @param {String} uri - The URI of the item to get\n * @returns {Promise} - Returns a promise. The item definition data will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires getItemData\n */\n getItemData: function getItemData(uri) {\n return request(this.storage.getItemActionUrl(uri, 'getItemData'));\n },\n\n /**\n * Gets an item state by the item URI\n * @param {String} uri - The URI of the item for which get the state\n * @returns {Promise} - Returns a promise. The item state object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getItemState: function getItemState(uri) {\n return request(this.storage.getItemActionUrl(uri, 'getItemState'));\n },\n\n /**\n * Submits the state of a particular item\n * @param {String} uri - The URI of the item to update\n * @param {Object} state - The state to submit\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 submitItemState: function submitItemState(uri, state) {\n return request(this.storage.getItemActionUrl(uri, 'submitItemState'), { state : state });\n },\n\n /**\n * Stores the response for a particular item\n * @param {String} uri - The URI of the item to update\n * @param {Object} responses - The response object to submit\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 storeItemResponse: function storeItemResponse(uri, responses) {\n return request(this.storage.getItemActionUrl(uri, 'storeItemResponse'), JSON.stringify(responses), 'application/json');\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} uri - The URI 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(uri, action, params) {\n return request(this.storage.getItemActionUrl(uri, action), params);\n }\n };\n\n return qtiServiceProxy;\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n *\n * Runner plugin\n *\n * TODO usage example\n *\n * @author Sam \n * @author Bertrand Chevrier \n */\ndefine('taoTests/runner/plugin',[\n 'lodash',\n 'core/promise'\n], function (_, Promise){\n 'use strict';\n\n /**\n * Meta factory for plugins. Let's you create a plugin definition.\n *\n * @param {Object} provider - the list of implemented methods\n * @param {String} provider.name - the plugin name\n * @param {Function} provider.init - the plugin initialization method\n * @param {Function} [provider.render] - plugin render behaviorV\n * @param {Function} [provider.finish] - plugin render behaviorV\n * @param {Function} [provider.destroy] - plugin destroy behavior\n * @param {Function} [provider.show] - plugin show behavior\n * @param {Function} [provider.hide] - plugin hide behavior\n * @param {Function} [provider.enable] - plugin enable behavior\n * @param {Function} [provider.disable] - plugin disable behavior\n * @param {Object} defaults - default configuration to be assigned\n * @returns {Function} - the generated plugin factory\n */\n function pluginFactory(provider, defaults){\n var pluginName;\n\n if(!_.isPlainObject(provider) || !_.isString(provider.name) || _.isEmpty(provider.name) || !_.isFunction(provider.init)){\n throw new TypeError('A plugin should be defined at least by a name property and an init method');\n }\n\n //TODO verify the name isn't already in use\n pluginName = provider.name;\n\n defaults = defaults || {};\n\n\n /**\n * The configured plugin factory\n *\n * @param {testRunner} runner - a test runner instance\n * @param {areaBroker} areaBroker - an instance of an areaBrokee\n * @param {Object} [config] - plugin configuration\n * @returns {plugin} the plugin instance\n */\n return function instanciatePlugin(runner, areaBroker, config){\n var plugin;\n\n var states = {};\n\n /**\n * Delegate a function call to the provider\n *\n * @param {String} fnName - the function name\n * @param {...} args - additional args are given to the provider\n * @returns {*} up to the provider\n */\n function delegate(fnName){\n var args = [].slice.call(arguments, 1);\n return new Promise(function(resolve){\n if(!_.isFunction(provider[fnName])){\n return resolve();\n }\n return resolve(provider[fnName].apply(plugin, args));\n });\n }\n\n\n config = _.defaults(config || {}, defaults);\n\n /**\n * The plugin instance.\n * @typedef {plugin}\n */\n plugin = {\n\n /**\n * Called when the testRunner is initializing\n * @returns {Promise} to resolve async delegation\n */\n init : function init(){\n var self = this;\n states = {};\n\n return delegate('init').then(function(){\n self.setState('init', true)\n .trigger('init');\n });\n },\n\n /**\n * Called when the testRunner is rendering\n * @returns {Promise} to resolve async delegation\n */\n render : function render(){\n var self = this;\n\n return delegate('render').then(function(){\n self.setState('ready', true)\n .trigger('render')\n .trigger('ready');\n });\n },\n\n /**\n * Called when the testRunner is finishing\n * @returns {Promise} to resolve async delegation\n */\n finish : function finish(){\n var self = this;\n\n return delegate('finish').then(function(){\n self.setState('finish', true)\n .trigger('finish');\n });\n },\n\n /**\n * Called when the testRunner is destroying\n * @returns {Promise} to resolve async delegation\n */\n destroy : function destroy(){\n var self = this;\n\n return delegate('destroy').then(function(){\n\n config = {};\n states = {};\n\n self.setState('init', false);\n self.trigger('destroy');\n });\n },\n\n /**\n * Triggers the events on the test runner using the pluginName as namespace\n * and prefixed by plugin-\n * For example trigger('foo') will trigger('plugin-foo.pluginA') on the runner.\n *\n * @param {String} name - the event name\n * @param {...} args - additional args are given to the event\n * @returns {plugin} chains\n */\n trigger : function trigger(name){\n var args = [].slice.call(arguments, 1);\n runner.trigger.apply(runner, ['plugin-' + name + '.' + pluginName, plugin].concat(args));\n return this;\n },\n\n /**\n * Get the test runner\n * @returns {testRunner} the plugins's testRunner\n */\n getTestRunner : function getTestRunner(){\n return runner;\n },\n\n /**\n * Get the test runner\n * @returns {testRunner} the plugins's testRunner\n */\n getAreaBroker : function getAreaBroker(){\n return areaBroker;\n },\n\n /**\n * Get the config\n * @returns {Object} config\n */\n getConfig : function getConfig(){\n return config;\n },\n\n /**\n * Set a config entry\n * @param {String|Object} name - the entry name or an object to merge\n * @param {*} [value] - the config value if name is an entry\n * @returns {plugin} chains\n */\n setConfig : function setConfig(name, value){\n if(_.isPlainObject(name)){\n config = _.defaults(name, config);\n }else{\n config[name] = value;\n }\n return this;\n },\n\n /**\n * Get a state of the plugin\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getState : function getState(name){\n return !!states[name];\n },\n\n /**\n * Set a state to the plugin\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {plugin} chains\n * @throws {TypeError} if the state name is not a valid string\n */\n setState : function setState(name, active){\n if(!_.isString(name) || _.isEmpty(name)){\n throw new TypeError('The state must have a name');\n }\n states[name] = !!active;\n\n return this;\n },\n\n\n /**\n * Shows the component related to this plugin\n * @returns {Promise} to resolve async delegation\n */\n show : function show(){\n var self = this;\n\n return delegate('show').then(function(){\n self.setState('visible', true)\n .trigger('show');\n });\n },\n\n /**\n * Hides the component related to this plugin\n * @returns {Promise} to resolve async delegation\n */\n hide : function hide(){\n var self = this;\n\n return delegate('hide').then(function(){\n self.setState('visible', false)\n .trigger('hide');\n });\n },\n\n /**\n * Enables the plugin\n * @returns {Promise} to resolve async delegation\n */\n enable : function enable(){\n var self = this;\n\n return delegate('enable').then(function(){\n self.setState('enabled', true)\n .trigger('enable');\n });\n },\n\n /**\n * Disables the plugin\n * @returns {Promise} to resolve async delegation\n */\n disable : function disable(){\n var self = this;\n\n return delegate('disable').then(function(){\n self.setState('enabled', false)\n .trigger('disable');\n });\n }\n };\n\n return plugin;\n };\n }\n\n return pluginFactory;\n});\n\n","\ndefine('tpl!taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock', ['handlebars'], function(hb){ \nreturn hb.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\nhelpers = this.merge(helpers, Handlebars.helpers); data = data || {};\n \n\n\n return \"
      \\n\";\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Content Plugin : RubricBlock\n *\n * TODO require mathjax on demand\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/content/rubricBlock/rubricBlock'\n], function ($, __, pluginFactory, containerTpl){\n 'use strict';\n\n /**\n * Ensure the links opens to blank pages\n * @param {jQueryElement} $container - lookup scope\n */\n var blankifyLinks = function blankifyLinks($container){\n $('a', $container).attr('target', '_blank');\n };\n\n /**\n * Returns the configured plugin\n */\n return pluginFactory({\n name : 'rubricBlock',\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 this.$element = $(containerTpl());\n\n this.hide();\n\n //change plugin state\n testRunner\n .on('ready', function(){\n self.hide();\n })\n .on('loaditem', function(){\n var context = testRunner.getTestContext();\n\n //load rubric content based on the context\n if(context.numberRubrics){\n testRunner.getProxy().callItemAction(context.itemUri, 'getRubrics').then(function(result){\n self.$element.html(result.content);\n blankifyLinks(self.$element);\n });\n }\n })\n .on('renderitem', function(){\n self.show();\n })\n .on('unloaditem', function(){\n self.hide();\n self.$element.empty();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render : function render(){\n\n //attach the element before the content area\n var $container = this.getAreaBroker().getContentArea();\n $container.before(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 container\n */\n enable : function enable (){\n this.$element.removeProp('disabled')\n .removeClass('disabled');\n },\n\n /**\n * Disable the container\n */\n disable : function disable (){\n this.$element.prop('disabled', true)\n .addClass('disabled');\n },\n\n /**\n * Show the container\n */\n show: function show(){\n this.$element.show();\n },\n\n /**\n * Hide the container\n */\n hide: function hide(){\n this.$element.hide();\n }\n });\n});\n\n","\ndefine('tpl!taoQtiTest/runner/plugins/controls/title/title', ['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, functionType=\"function\", escapeExpression=this.escapeExpression, self=this;\n\nfunction program1(depth0,data) {\n \n var buffer = \"\", stack1, helper;\n buffer += \"\\n \";\n stack1 = helpers.unless.call(depth0, (data == null || data === false ? data : data.first), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \";\n return buffer;\n }\nfunction program2(depth0,data) {\n \n \n return \" - \";\n }\n\n buffer += \"
      \\n \";\n stack1 = helpers.each.call(depth0, (depth0 && depth0.titles), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});\n if(stack1 || stack1 === 0) { buffer += stack1; }\n buffer += \"\\n
      \\n\";\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) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Control Plugin : Title\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/controls/title/title',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/controls/title/title'\n], function ($, __, pluginFactory, titleTpl){\n 'use strict';\n\n return pluginFactory({\n name : 'title',\n init : function init(){\n var self = this;\n var testRunner = this.getTestRunner();\n var testData = testRunner.getTestData();\n\n var createElement = function(){\n\n var context = testRunner.getTestContext();\n var showSection = !!context.isDeepestSectionVisible;\n var titles = [{\n control : 'qti-test-title',\n text : testData.title\n }];\n if(context.isDeepestSectionVisible){\n titles.push({\n control : 'qti-test-position', //WTF !? isn't it the section title... ?\n text : context.sectionTitle\n });\n }\n\n return $(titleTpl({ titles : titles }));\n };\n\n this.$element = createElement();\n\n\n testRunner\n .after('move', function(){\n self.$element = self.$element.replaceWith(createElement());\n });\n\n },\n render : function render(){\n var $container = this.getAreaBroker().getControlArea();\n $container.append(this.$element);\n },\n });\n});\n\n","/**\n * @author Bertrand Chevrier \n * @requires jquery\n * @requires lodash\n */\ndefine('core/pluginifier',['jquery', 'lodash'], function($, _){\n 'use strict';\n\n /**\n * Abstract plugin used to provide common behavior to the plugins\n */\n var basePlugin = {\n\n /**\n * Set options of the plugin\n *\n * @example $('selector').pluginName('options', { key: value });\n * @param {String} dataNs - the data namespace\n * @param {String} ns - the event namespace\n * @param {Object} options - the options to set\n */\n options : function(dataNs, ns, options){\n return this.each(function(){\n var $elt = $(this);\n var currentOptions = $elt.data(dataNs);\n if(currentOptions){\n $elt.data(dataNs, _.merge(currentOptions, options));\n }\n });\n },\n\n /**\n * Disable the component. \n * \n * It can be called prior to the plugin initilization.\n * \n * Called the jQuery way once registered by the Pluginifier.\n * @example $('selector').pluginName('disable');\n * @param {String} dataNs - the data namespace\n * @param {String} ns - the event namespace\n * @fires basePlugin#disable.ns\n */\n disable : function(dataNs, ns){\n return this.each(function(){\n var $elt = $(this);\n var options = $elt.data(dataNs);\n if(options){\n $elt.addClass(options.disableClass || 'disabled')\n .trigger('disable.'+ ns);\n }\n });\n },\n\n /** \n * Enable the component. \n * \n * Called the jQuery way once registered by the Pluginifier.\n * @example $('selector').pluginName('enable');\n * @param {String} dataNs - the data namespace\n * @param {String} ns - the event namespace\n * @fires basePlugin#enable.ns\n */\n enable : function(dataNs, ns){\n return this.each(function(){\n var $elt = $(this);\n var options = $elt.data(dataNs);\n if(options){\n $elt.removeClass(options.disableClass || 'disabled')\n .trigger('enable.'+ ns);\n }\n });\n },\n };\n \n /** \n * Helps you to create a jQuery plugin, the Cards way\n * @exports core/pluginifer\n */\n var Pluginifier = {\n \n /**\n * Regsiter a new jQuery plugin, the Cards way\n * @param {string} pluginName - the name of the plugin to regsiter. ie $('selector').pluginName();\n * @param {Object} plugin - the plugin as a plain object \n * @param {Function} plugin.init - the entry point of the plugin is always an init method\n * @param {Object} [config] - plugin configuration \n * @param {String} [config.ns = pluginName] - plugin namespace (used for events and data-attr)\n * @param {String} [config.dataNs = ui.pluginName] - plugin namespace (used for events and data-attr)\n * @param {Array} [config.expose] - list of methods to expose\n */\n register : function(pluginName, plugin, config){\n config = config || {};\n var ns = config.ns || pluginName.toLowerCase();\n var dataNs = config.dataNs || 'ui.' + ns;\n var expose = config.expose || [];\n\n //checks\n if(_.isFunction($.fn[pluginName])){\n return $.error('A plugin named ' + pluginName + ' is already registered');\n }\n if(!_.isPlainObject(plugin) || !_.isFunction(plugin.init)){\n return $.error('The object to register as a jQuery plugin must be a plain object with an `init` method.');\n }\n \n //configure and augments the plugin\n _.assign(plugin, _.transform(basePlugin, function(result, prop, key){\n if(_.isFunction(prop)){\n result[key] = _.partial(basePlugin[key], dataNs, ns);\n }\n }));\n \n //set up public methods to wrap privates the jquery way\n _.forEach(expose, function(toExposeName){\n var privateMethod = toExposeName; \n var publicMethod = toExposeName; \n if(!/^_/.test(expose)){\n privateMethod = '_' + privateMethod;\n } else {\n publicMethod = publicMethod.replace(/^_/, '');\n }\n \n //do not override if exists\n if(_.isFunction(plugin[privateMethod]) && !_.isFunction(plugin[publicMethod])){\n plugin[publicMethod] = function(){\n var returnValue;\n var args = Array.prototype.slice.call(arguments, 0);\n this.each(function(){\n //call plugin._method($element, [remainingArgs...]);\n returnValue = plugin[privateMethod].apply(plugin, [$(this)].concat(args));\n });\n return returnValue || this;\n };\n }\n });\n\n // map $('selector').pluginName() to plugin.init\n // map $('selector').pluginName('method', params) to plugin.method(params) to plugin._method($elt, params);\n // disable direct call to private (starting with _) methods\n $.fn[pluginName] = function(method){\n if(plugin[method]){\n if(/^_/.test(method)){\n $.error( 'Trying to call a private method `' + method + '`' );\n } else {\n return plugin[method].apply( this, Array.prototype.slice.call( arguments, 1 ));\n }\n } else if ( typeof method === 'object' || ! method) {\n return plugin.init.apply( this, arguments );\n } \n $.error( 'Method ' + method + ' does not exist on plugin' );\n };\n }\n };\n \n return Pluginifier;\n});\n\n\n","/**\n * @author Bertrand Chevrier \n * @requires jquery\n * @requires lodash\n * @requires core/pluginifier\n */\ndefine('ui/progressbar',['jquery', 'lodash', 'core/pluginifier'],\nfunction($, _, Pluginifier){\n 'use strict';\n\n var ns = 'progressbar';\n var dataNs = 'ui.' + ns;\n\n\n var defaults = {\n disableClass : 'disabled',\n style : 'info',\n value : 0,\n showProgress: false\n };\n\n /**\n * The Progressbar component.\n * @exports ui/progressbar\n */\n var progressBar = {\n\n /**\n * Initialize the plugin.\n *\n * Called the jQuery way once registered by the Pluginifier.\n * @example $('selector').progressbar({ value : 15 });\n *\n * @constructor\n * @param {Object} [options] - the plugin options\n * @param {Number} [options.value] - the progress value in %\n * @param {String} [options.style = 'info'] - the progress bar style in info, success, warning, error\n *\n * @fires progressBar#create.progressbar\n * @returns {jQueryElement} for chaining\n */\n init : function(options){\n options = _.defaults(options || {}, defaults);\n\n return this.each(function() {\n var $elt = $(this);\n var $pgElt, percent;\n\n if(!$elt.data(dataNs)){\n\n options.value = parseInt(options.value, 10);\n\n //add data to the element\n $elt.data(dataNs, options);\n\n percent = options.value + '%';\n\n $pgElt = $('')\n .width(percent)\n .attr('title', percent);\n\n\n if(options.showProgress){\n $pgElt.text(percent);\n }\n\n $elt.addClass('progressbar')\n .addClass(options.style)\n .empty()\n .append($pgElt);\n\n /**\n * The plugin have been created.\n * @event progressBar#create.progressbar\n */\n $elt.trigger('create.' + ns);\n }\n });\n },\n\n /**\n * Trigger the progress value\n *\n * Called the jQuery way once registered by the Pluginifier.\n *\n * @example $('selector').progressbar('update', 50);\n *\n * @param {jQueryElement} $elt - plugin's element\n * @param {Number} value - the new value\n *\n * @fires progressBar#update.progressbar\n */\n _update : function($elt, value){\n var options = $elt.data(dataNs);\n var $pgElt, percent;\n\n value = parseInt(value, 10);\n if(value >= 0 && value <= 100){\n percent = value + '%';\n $pgElt = $elt.children('span');\n\n $pgElt.width( value + '%')\n .attr('title', percent);\n\n if(options.showProgress){\n $pgElt.text(percent);\n }\n\n options.value = value;\n $elt.data(dataNs, options);\n\n /**\n * The progress value has been updated\n * @event progressBar#create.progressbar\n */\n $elt.trigger('update.' + ns, value);\n }\n },\n\n /**\n * Get/Set the value\n *\n * Called the jQuery way once registered by the Pluginifier.\n *\n * @example var value = $('selector').progressbar('value');\n *\n * @param {jQueryElement} $elt - plugin's element\n * @param {Number} [value] - the new value in setter mode only\n * @returns {Number} the value in getter mode\n */\n _value : function($elt, value){\n var options = $elt.data(dataNs);\n if(typeof value !== 'undefined'){\n return progressBar._update($elt, value);\n }\n\n return options.value;\n },\n\n /**\n * Destroy completely the plugin.\n *\n * Called the jQuery way once registered by the Pluginifier.\n * @example $('selector').progressbar('destroy');\n *\n * @fires progressBar#destroy.progressbar\n */\n destroy : function(){\n return this.each(function() {\n var $elt = $(this);\n var options = $elt.data(dataNs);\n if(options){\n\n $elt.removeClass('progressbar')\n .empty()\n .removeData(dataNs);\n\n /**\n * The plugin have been destroyed.\n * @event progressBar#destroy.progressbar\n */\n $elt.trigger('destroy.' + ns);\n }\n });\n }\n };\n\n //Register the toggler to behave as a jQuery plugin.\n Pluginifier.register(ns, progressBar, {\n expose : ['update', 'value']\n });\n});\n\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n/**\n * @author Jean-Sébastien Conan \n */\ndefine('taoQtiTest/testRunner/progressUpdater',[\n 'jquery',\n 'lodash',\n 'i18n',\n 'ui/progressbar'\n], function ($, _, __) {\n 'use strict';\n\n /**\n * Provides a versatile progress bar updater\n * @type {{init: Function, update: Function}}\n */\n var progressUpdaters = {\n /**\n * Initializes the progress updater\n *\n * @param {String|jQuery|HTMLElement} progressBar The element on which put the progress bar\n * @param {String|jQuery|HTMLElement} progressLabel The element on which put the progress label\n * @returns {progressUpdaters}\n */\n init: function(progressBar, progressLabel) {\n this.progressBar = $(progressBar).progressbar();\n this.progressLabel = $(progressLabel);\n return this;\n },\n\n /**\n * Writes the progress label and update the progress by ratio\n * @param {String} label\n * @param {Number} ratio\n * @returns {progressUpdaters}\n */\n write: function(label, ratio) {\n this.progressLabel.text(label);\n this.progressBar.progressbar('value', ratio);\n return this;\n },\n\n /**\n * Updates the progress bar\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n update: function(testContext) {\n var progressIndicator = testContext.progressIndicator || 'percentage';\n var progressIndicatorMethod = progressIndicator + 'Progression';\n var getProgression = this[progressIndicatorMethod] || this.percentageProgression;\n var progression = getProgression && getProgression(testContext) || {};\n\n this.write(progression.label, progression.ratio);\n return progression;\n },\n\n /**\n * Updates the progress bar displaying the percentage\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n percentageProgression: function(testContext) {\n var total = Math.max(1, testContext.numberItems);\n var ratio = Math.floor(testContext.numberCompleted / total * 100);\n return {\n ratio : ratio,\n label : ratio + '%'\n };\n },\n\n /**\n * Updates the progress bar displaying the position\n * @param {Object} testContext The progression context\n * @returns {{ratio: number, label: string}}\n */\n positionProgression: function(testContext) {\n var progressScope = testContext.progressIndicatorScope;\n var progressScopeCounter = {\n test : {\n total : 'numberItems',\n position : 'itemPosition'\n },\n testPart : {\n total : 'numberItemsPart',\n position : 'itemPositionPart'\n },\n testSection : {\n total : 'numberItemsSection',\n position : 'itemPositionSection'\n }\n };\n var counter = progressScopeCounter[progressScope] || progressScopeCounter.test;\n var total = Math.max(1, testContext[counter.total]);\n var position = testContext[counter.position] + 1;\n return {\n ratio : Math.floor(position / total * 100),\n label : __('Item %d of %d', position, total)\n };\n }\n };\n\n /**\n * Builds an instance of progressUpdaters\n * @param {String|jQuery|HTMLElement} progressBar The element on which put the progress bar\n * @param {String|jQuery|HTMLElement} progressLabel The element on which put the progress label\n * @returns {progressUpdaters}\n */\n var progressUpdaterFactory = function(progressBar, progressLabel) {\n var updater = _.clone(progressUpdaters, true);\n return updater.init(progressBar, progressLabel);\n };\n\n return progressUpdaterFactory;\n});\n\n","\ndefine('tpl!taoQtiTest/runner/plugins/controls/progressbar/progressbar', ['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 * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Control Plugin : Progress Bar\n *\n * TODO move the progressUpdater inside the plugin at some point\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/controls/progressbar/progressbar',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'taoQtiTest/testRunner/progressUpdater',\n 'tpl!taoQtiTest/runner/plugins/controls/progressbar/progressbar'\n], function ($, __, pluginFactory, progressUpdater, progressTpl){\n 'use strict';\n\n\n /**\n * Returns the configured plugin\n */\n return pluginFactory({\n\n name : 'progressBar',\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 //update the progress bar at the beginning and\n var update = function update (){\n if(self.progressUpdater){\n self.progressUpdater.update(testRunner.getTestContext());\n }\n };\n\n //create the progressbar\n this.$element = $(progressTpl());\n\n //load the updater\n this.progressUpdater = progressUpdater(\n $('[data-control=\"progress-bar\"]', this.$element),\n $('[data-control=\"progress-label\"]', this.$element)\n );\n\n update();\n\n testRunner\n .on('ready', update)\n .on('loaditem', update);\n },\n\n /**\n * Called during the runner's render phase\n */\n render : function render(){\n var $container = this.getAreaBroker().getControlArea();\n $container.append(this.$element);\n },\n });\n});\n\n","\ndefine('tpl!taoQtiTest/runner/plugins/navigation/button', ['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 += \"
    13. \\n \\n \\n \";\n if (helper = helpers.text) { stack1 = helper.call(depth0, {hash:{},data:data}); }\n else { helper = (depth0 && depth0.text); stack1 = typeof helper === functionType ? helper.call(depth0, {hash:{},data:data}) : helper; }\n buffer += escapeExpression(stack1)\n + \"\\n \\n
    14. \\n\";\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) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Navigation Plugin : Next\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/navigation/next',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/navigation/button'\n], function ($, __, pluginFactory, buttonTpl){\n 'use strict';\n\n /**\n * The display of the next button\n */\n var buttonData = {\n next : {\n control : 'move-forward',\n title : __('Submit and go to the next item'),\n icon : 'forward',\n text : __('Next')\n },\n end : {\n control : 'move-end',\n title : __('Submit and go to the end of the test'),\n icon : 'fast-forward',\n text : __('End test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Object} context - the test context\n * @returns {jQueryElement} the button\n */\n var createElement = function createElement(context){\n var dataType = !!context.isLast ? 'end' : 'next';\n return $(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {Object} context - the test context\n */\n var updateElement = function updateElement($element, context){\n var dataType = !!context.isLast ? 'end' : 'next';\n if($element.data('control') !== buttonData[dataType].control){\n\n $element.data('control', buttonData[dataType].control)\n .attr('title', buttonData[dataType].title)\n .find('.text').text(buttonData[dataType].text);\n\n if(dataType === 'next'){\n $element.find('.icon-' + buttonData.end.icon)\n .removeClass('icon-' + buttonData.end.icon)\n .addClass('icon-' + buttonData.next.icon);\n } else {\n $element.find('.icon-' + buttonData.next.icon)\n .removeClass('icon-' + buttonData.next.icon)\n .addClass('icon-' + buttonData.end.icon);\n }\n }\n };\n\n /**\n * Returns the configured plugin\n */\n return pluginFactory({\n name : 'next',\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 //create the button (detached)\n this.$element = createElement(testRunner.getTestContext());\n\n //plugin behavior\n this.$element.on('click', function(e){\n e.preventDefault();\n\n if(self.getState('enabled') !== false){\n self.disable();\n testRunner.next();\n }\n });\n\n //disabled by default\n this.disable();\n\n //change plugin state\n testRunner\n .on('loaditem', function(){\n updateElement(self.$element, testRunner.getTestContext());\n })\n .on('renderitem', function(){\n self.enable();\n })\n .on('unloaditem', 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().getNavigationArea();\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.removeProp('disabled')\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 this.$element.show();\n },\n\n /**\n * Hide the button\n */\n hide: function hide(){\n this.$element.hide();\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Navigation Plugin : Previous\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/navigation/previous',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/navigation/button'\n], function ($, __, pluginFactory, buttonTpl){\n 'use strict';\n\n /**\n * Returns the configured plugin\n */\n return pluginFactory({\n\n name : 'previous',\n\n /**\n * Initialize the plugin (called during runner's init)\n */\n init : function init(){\n var self = this;\n\n var testRunner = this.getTestRunner();\n\n /**\n * Can we move backward ? if not, then we hide the plugin\n */\n var toggle = function toggle(){\n var context = testRunner.getTestContext();\n if(context.navigationMode === 1 && context.canMoveBackward){\n self.show();\n } else {\n self.hide();\n }\n };\n\n //build element (detached)\n this.$element = $(buttonTpl({\n control : 'move-backward',\n title : __('Submit and go to the previous item'),\n icon : 'backward',\n text : __('Previous')\n }));\n\n //attach behavior\n this.$element.on('click', function(e){\n e.preventDefault();\n if(self.getState('enabled') !== false){\n self.disable();\n\n testRunner.previous();\n }\n });\n\n //start disabled\n toggle();\n self.disable();\n\n //update plugin state based on changes\n testRunner\n .on('loaditem', toggle)\n .on('renderitem', function(){\n self.enable();\n })\n .on('unloaditem', function(){\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render : function render(){\n var $container = this.getAreaBroker().getNavigationArea();\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.removeProp('disabled')\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 this.$element.show();\n },\n\n /**\n * Hide the button\n */\n hide: function hide(){\n this.$element.hide();\n }\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Navigation Plugin : Next Section\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/navigation/nextSection',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/navigation/button'\n], function ($, __, pluginFactory, buttonTpl){\n 'use strict';\n\n return pluginFactory({\n name : 'nextsection',\n init : function init(){\n var self = this;\n var testRunner = this.getTestRunner();\n\n var toggle = function toggle(){\n var context = testRunner.getTestContext();\n if(context.nextSection === true){\n self.show();\n } else {\n self.hide();\n }\n };\n\n this.$element = $(buttonTpl({\n control : 'next-section',\n title : __('Skip to the next section'),\n icon : 'fast-forward',\n text : __('Next Section')\n }));\n\n this.$element.on('click', function(e){\n e.preventDefault();\n if(self.getState('enabled') !== false){\n self.disable();\n\n testRunner.next('section');\n }\n });\n\n toggle();\n\n testRunner\n .on('ready', function(){\n self.enable();\n })\n .after('move', function(){\n toggle();\n });\n },\n render : function render(){\n var $container = this.getAreaBroker().getNavigationArea();\n $container.append(this.$element);\n },\n destroy : function destroy (){\n this.$element.remove();\n },\n enable : function enable (){\n this.$element.removeProp('disabled');\n },\n disable : function disable (){\n this.$element.prop('disabled', true);\n },\n show: function show(){\n this.$element.show();\n },\n hide: function hide(){\n this.$element.hide();\n },\n });\n});\n\n","/**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016 (original work) Open Assessment Technologies SA ;\n */\n\n/**\n * Test Runner Navigation Plugin : Skip\n *\n * @author Bertrand Chevrier \n */\ndefine('taoQtiTest/runner/plugins/navigation/skip',[\n 'jquery',\n 'i18n',\n 'taoTests/runner/plugin',\n 'tpl!taoQtiTest/runner/plugins/navigation/button'\n], function ($, __, pluginFactory, buttonTpl){\n 'use strict';\n\n /**\n * The display of the skip\n */\n var buttonData = {\n skip : {\n control : 'skip',\n title : __('Skip and go to the next item'),\n icon : 'external',\n text : __('Skip')\n },\n end : {\n control : 'skip-end',\n title : __('Skip and go to the end of the test'),\n icon : 'external',\n text : __('Skip and end test')\n }\n };\n\n /**\n * Create the button based on the current context\n * @param {Object} context - the test context\n * @returns {jQueryElement} the button\n */\n var createElement = function createElement(context){\n var dataType = context.isLast ? 'end' : 'skip';\n return $(buttonTpl(buttonData[dataType]));\n };\n\n /**\n * Update the button based on the context\n * @param {jQueryElement} $element - the element to update\n * @param {Object} context - the test context\n */\n var updateElement = function updateElement($element, context){\n var dataType = context.isLast ? 'end' : 'skip';\n if($element.data('control') !== buttonData[dataType].control){\n\n $element.data('control', buttonData[dataType].control)\n .attr('title', buttonData[dataType].title)\n .find('.text').text(buttonData[dataType].title);\n }\n };\n\n /**\n * Returns the configured plugin\n */\n return pluginFactory({\n\n name : 'skip',\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 var toggle = function toggle(){\n var context = testRunner.getTestContext();\n if(context.allowSkipping === true){\n self.show();\n return true;\n }\n\n self.hide();\n return false;\n };\n\n this.$element = createElement(testRunner.getTestContext());\n\n this.$element.on('click', function(e){\n e.preventDefault();\n\n if(self.getState('enabled') !== false){\n self.disable();\n\n testRunner.skip();\n }\n });\n\n toggle();\n self.disable();\n\n testRunner\n .on('loaditem', function(){\n if(toggle()){\n updateElement(self.$element, testRunner.getTestContext());\n }\n })\n .on('renderitem', function(){\n self.enable();\n })\n .on('unloaditem', function(){\n self.disable();\n });\n },\n\n /**\n * Called during the runner's render phase\n */\n render : function render(){\n var $container = this.getAreaBroker().getNavigationArea();\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.removeProp('disabled')\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 this.$element.show();\n },\n\n /**\n * Hide the button\n */\n hide: function hide(){\n this.$element.hide();\n }\n });\n});\n\n","//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)\n/*\n * css.normalize.js\n *\n * CSS Normalization\n *\n * CSS paths are normalized based on an optional basePath and the RequireJS config\n *\n * Usage:\n * normalize(css, fromBasePath, toBasePath);\n *\n * css: the stylesheet content to normalize\n * fromBasePath: the absolute base path of the css relative to any root (but without ../ backtracking)\n * toBasePath: the absolute new base path of the css relative to the same root\n *\n * Absolute dependencies are left untouched.\n *\n * Urls in the CSS are picked up by regular expressions.\n * These will catch all statements of the form:\n *\n * url(*)\n * url('*')\n * url(\"*\")\n *\n * @import '*'\n * @import \"*\"\n *\n * (and so also @import url(*) variations)\n *\n * For urls needing normalization\n *\n */\n\ndefine('normalize',[],function() {\n\n // regular expression for removing double slashes\n // eg http://www.example.com//my///url/here -> http://www.example.com/my/url/here\n var slashes = /([^:])\\/+/g\n var removeDoubleSlashes = function(uri) {\n return uri.replace(slashes, '$1/');\n }\n\n // given a relative URI, and two absolute base URIs, convert it from one base to another\n var protocolRegEx = /[^\\:\\/]*:\\/\\/([^\\/])*/;\n var absUrlRegEx = /^(\\/|data:)/;\n function convertURIBase(uri, fromBase, toBase) {\n if (uri.match(absUrlRegEx) || uri.match(protocolRegEx))\n return uri;\n uri = removeDoubleSlashes(uri);\n // if toBase specifies a protocol path, ensure this is the same protocol as fromBase, if not\n // use absolute path at fromBase\n var toBaseProtocol = toBase.match(protocolRegEx);\n var fromBaseProtocol = fromBase.match(protocolRegEx);\n if (fromBaseProtocol && (!toBaseProtocol || toBaseProtocol[1] != fromBaseProtocol[1] || toBaseProtocol[2] != fromBaseProtocol[2]))\n return absoluteURI(uri, fromBase);\n\n else {\n return relativeURI(absoluteURI(uri, fromBase), toBase);\n }\n };\n\n // given a relative URI, calculate the absolute URI\n function absoluteURI(uri, base) {\n if (uri.substr(0, 2) == './')\n uri = uri.substr(2);\n\n // absolute urls are left in tact\n if (uri.match(absUrlRegEx) || uri.match(protocolRegEx))\n return uri;\n\n var baseParts = base.split('/');\n var uriParts = uri.split('/');\n\n baseParts.pop();\n\n while (curPart = uriParts.shift())\n if (curPart == '..')\n baseParts.pop();\n else\n baseParts.push(curPart);\n\n return baseParts.join('/');\n };\n\n\n // given an absolute URI, calculate the relative URI\n function relativeURI(uri, base) {\n\n // reduce base and uri strings to just their difference string\n var baseParts = base.split('/');\n baseParts.pop();\n base = baseParts.join('/') + '/';\n i = 0;\n while (base.substr(i, 1) == uri.substr(i, 1))\n i++;\n while (base.substr(i, 1) != '/')\n i--;\n base = base.substr(i + 1);\n uri = uri.substr(i + 1);\n\n // each base folder difference is thus a backtrack\n baseParts = base.split('/');\n var uriParts = uri.split('/');\n out = '';\n while (baseParts.shift())\n out += '../';\n\n // finally add uri parts\n while (curPart = uriParts.shift())\n out += curPart + '/';\n\n return out.substr(0, out.length - 1);\n };\n\n var normalizeCSS = function(source, fromBase, toBase) {\n\n fromBase = removeDoubleSlashes(fromBase);\n toBase = removeDoubleSlashes(toBase);\n var urlRegEx = /@import\\s*(\"([^\"]*)\"|'([^']*)')|url\\s*\\((?!#)\\s*(\\s*\"([^\"]*)\"|'([^']*)'|[^\\)]*\\s*)\\s*\\)/ig;\n var result, url, source;\n\n //we dont want to normalize the CSS content\n //while (result = urlRegEx.exec(source)) {\n //url = result[3] || result[2] || result[5] || result[6] || result[4];\n //var newUrl;\n //newUrl = convertURIBase(url, fromBase, toBase);\n //var quoteLen = result[5] || result[6] ? 1 : 0;\n //source = source.substr(0, urlRegEx.lastIndex - url.length - quoteLen - 1) + newUrl + source.substr(urlRegEx.lastIndex - quoteLen - 1);\n //urlRegEx.lastIndex = urlRegEx.lastIndex + (newUrl.length - url.length);\n //}\n\n return source;\n };\n\n normalizeCSS.convertURIBase = convertURIBase;\n normalizeCSS.absoluteURI = absoluteURI;\n normalizeCSS.relativeURI = relativeURI;\n\n return normalizeCSS;\n});\n//>>excludeEnd('excludeRequireCss')\n;\n","/*\n * Require-CSS RequireJS css! loader plugin\n * 0.1.2\n * Guy Bedford 2013\n * MIT\n */\n\n/*\n *\n * Usage:\n * require(['css!./mycssFile']);\n *\n * Tested and working in (up to latest versions as of March 2013):\n * Android\n * iOS 6\n * IE 6 - 10\n * Chome 3 - 26\n * Firefox 3.5 - 19\n * Opera 10 - 12\n * \n * browserling.com used for virtual testing environment\n *\n * Credit to B Cavalier & J Hann for the IE 6 - 9 method,\n * refined with help from Martin Cermak\n * \n * Sources that helped along the way:\n * - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent\n * - http://www.phpied.com/when-is-a-stylesheet-really-loaded/\n * - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js\n *\n */\n\ndefine('css',[],function() {\n//>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)\n if (typeof window == 'undefined')\n return { load: function(n, r, load){ load() } };\n\n var head = document.getElementsByTagName('head')[0];\n\n var engine = window.navigator.userAgent.match(/Trident\\/([^ ;]*)|AppleWebKit\\/([^ ;]*)|Opera\\/([^ ;]*)|rv\\:([^ ;]*)(.*?)Gecko\\/([^ ;]*)|MSIE\\s([^ ;]*)|AndroidWebKit\\/([^ ;]*)/) || 0;\n\n // use