annotate test_create.html @ 3042:fb29981a2fad

Close #78. Implemented into test_create
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Tue, 26 Sep 2017 14:45:09 +0100
parents ae0950bc1c99
children aa86f045d338
rev   line source
nicholas@2859 1 <html>
nicholas@2859 2
nicholas@2859 3 <head>
nicholas@2859 4 <meta http-equiv="content-type" content="text/html; charset=utf-8">
nicholas@2859 5 <!-- This defines the test creator tool for the Web Audio Evaluation Toolbox -->
nicholas@2859 6 <link rel="stylesheet" type="text/css" href="test_create/style.css" />
nicholas@2859 7 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
nicholas@2859 8 <script src="js/jquery-2.1.4.js"></script>
nicholas@2859 9 <script src="js/angular.min.js"></script>
nicholas@2859 10 <script type="text/javascript" src="js/specification.js"></script>
nicholas@2859 11 <script type="text/javascript" src="test_create/test_core.js"></script>
nicholas@2859 12 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
nicholas@2887 13 <script type="text/javascript" src="js/xmllint.js"></script>
nicholas@2859 14
n@2907 15 <title>WAET 1.2.2 Test Creator</title>
nicholas@2859 16 </head>
nicholas@2859 17
nicholas@2887 18 <body ng-app="creator" ng-controller="view">
nicholas@2887 19 <div class="container">
nicholas@2859 20 <div id="pageRoot">
n@2907 21 <h1>Web Audio Evaluation Tool</h1>
n@2907 22 <h3>Test Creator <span class="label label-primary">v1.2.2</span></h3>
nicholas@2859 23 </div>
nicholas@2887 24 <button type="button" class="btn btn-info" ng-click="validate()">Validate</button>
nicholas@2887 25 <button type="button" class="btn btn-success" ng-click="exportXML()" ng-disabled="validated == false">Export XML</button>
nicholas@2887 26 <div ng-switch on="validated" ng-show="showValidationMessages">
nicholas@2887 27 <div class="panel panel-danger" ng-switch-when="false">
nicholas@2887 28 <div class="panel-heading">
nicholas@2887 29 <button type="button" class="close" data-dismiss="alert" aria-label="Close" ng-click="hideValidationMessages"><span aria-hidden="true">&times;</span></button>
nicholas@2887 30 <h3 class="panel-title">Invalid Specification!</h3>
nicholas@2887 31 </div>
nicholas@2887 32 <div class="panel-body">
nicholas@2887 33 <p>Your specification is invalid. Please fix the following issues!</p>
nicholas@2887 34 <ul id="validation-error-list">
nicholas@2887 35 <li>Errors</li>
nicholas@2887 36 </ul>
nicholas@2887 37 </div>
nicholas@2887 38 </div>
nicholas@2887 39 <div class="alert alert-success" role="alert" ng-switch-when="true">
nicholas@2887 40 <button type="button" class="close" data-dismiss="alert" aria-label="Close" ng-click="hideValidationMessages"><span aria-hidden="true">&times;</span></button>
nicholas@2887 41 <strong>Validates!</strong><span>Well done, you can export this specification!</span>
nicholas@2887 42 </div>
nicholas@2887 43 </div>
nicholas@2859 44 <div id="setupNode" class="node" ng-controller="setup">
nicholas@2859 45 <h2>Setup</h2>
nicholas@2859 46 <div class="attributes">
nicholas@2859 47 <div class="attribute">
nicholas@2859 48 <span>Interface: </span>
n@2912 49 <select type="text" ng-model="specification.interface" required>
n@2912 50 <option value="{{i.name}}" ng-repeat="i in availableInterfaceModules">{{i.name}}</option>
n@2912 51 </select>
nicholas@2859 52 </div>
nicholas@2884 53 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="If you would like to save to a server other than your hosting server, you can place the full WAET URL here">
nicholas@2859 54 <span>Save URL: </span>
nicholas@2877 55 <input type="text" ng-model="specification.projectReturn" placeholder="save.php" />
nicholas@2859 56 </div>
nicholas@2884 57 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Once the test is completed and save confirmed, the browser will redirect to this page, if not defined.">
nicholas@2859 58 <span>Exit URL: </span>
n@2907 59 <input type="text" ng-model="specification.returnURL" placeholder="{{placeholder('returnURL')}}" />
nicholas@2859 60 </div>
nicholas@2884 61 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Randomise the page order">
nicholas@2859 62 <span>Randomise Page Order: </span>
nicholas@2859 63 <input type="checkbox" ng-model="specification.randomiseOrder" />
nicholas@2859 64 </div>
nicholas@2884 65 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the number of pages to present to the user. This includes repeated pages. Set to '0' or blank to ignore. Randomise page order must be selected.">
nicholas@2859 66 <span>Page Pool Size: </span>
n@2907 67 <input type="number" ng-model="specification.poolSize" min="0" placeholder="{{placeholder('poolSize')}}" />
nicholas@2859 68 </div>
nicholas@2884 69 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Automatically analyse and normalsie audio to this target LUFS. If unsure, use -25LUFS. 0 or blank disables normalisation">
nicholas@2859 70 <span>Loudness Normalisation (LUFS): </span>
n@2907 71 <input type="number" ng-model="specification.loudness" max="0" placeholder="{{placeholder('loudness')}}" />
nicholas@2859 72 </div>
nicholas@2884 73 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Only perform the test if the browser reported sampling rate matches this.">
nicholas@2859 74 <span>Fixed Sampling Rate: </span>
n@2907 75 <input type="number" ng-model="specification.sampleRate" min="0" placeholder="{{placeholder('sampleRate')}}" />
nicholas@2859 76 </div>
nicholas@2884 77 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show a 'method of adjustment' audio calibration before testing.">
nicholas@2859 78 <span>Pre-Test audio calibration: </span>
nicholas@2859 79 <input type="checkbox" ng-model="specification.calibration" />
nicholas@2859 80 </div>
nicholas@2884 81 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default cross-fade time when switching between elements. Can be over-ridden on each page">
nicholas@2859 82 <span>Global Cross-fade time: </span>
n@2907 83 <input type="number" ng-model="specification.crossFade" min="0" step="0.1" placeholder="{{placeholder('crossFade')}}" />
nicholas@2859 84 </div>
nicholas@2884 85 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default pre-play element silence. Can be over-ridden on each page and element">
nicholas@2859 86 <span>Global Fragment Pre-Silence: </span>
n@2907 87 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" placeholder="{{placeholder('preSilence')}}" />
nicholas@2859 88 </div>
nicholas@2884 89 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default post-play element silence. Can be over-ridden on each page and element">
nicholas@2859 90 <span>Global Fragment Post-Silence: </span>
n@2907 91 <input type="number" ng-model="specification.postSilence" min="0" step="0.1" placeholder="{{placeholder('postSilence')}}" />
nicholas@2859 92 </div>
nicholas@2884 93 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio elements">
nicholas@2859 94 <span>Play audio one-at-a-time: </span>
nicholas@2859 95 <input type="checkbox" ng-model="specification.playOne" />
nicholas@2859 96 </div>
nicholas@2884 97 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum number of times an audio fragment must be played">
nicholas@2874 98 <span>Minimum number of fragment plays</span>
n@2907 99 <input type="number" ng-model="specification.minNumberPlays" min="0" max="{{specification.maxNumberPlays}}" placeholder="{{placeholder('minNumberPlays')}}" />
nicholas@2874 100 </div>
nicholas@2884 101 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of times an audio fragment can be played">
nicholas@2874 102 <span>Maximum number of fragment plays</span>
n@2907 103 <input type="number" ng-model="specification.maxNumberPlays" min="{{specification.minNumberPlays || 0}}" placeholder="{{placeholder('maxNumberPlays')}}" />
nicholas@2874 104 </div>
nicholas@2859 105 </div>
nicholas@2859 106 <div class="node">
nicholas@2859 107 <h2>Test Completed Message</h2>
nicholas@2884 108 <textarea ng-model="specification.exitText" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Once the test is completed, you can show a message to the user. Markdown syntax is supported for formatting."></textarea>
nicholas@2859 109 </div>
nicholas@2859 110 <div id="metricsNode" class="node">
nicholas@2859 111 <h3>Session Metrics</h3>
nicholas@2859 112 <div class="attributes">
nicholas@2884 113 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Report the total test participation time">
nicholas@2859 114 <span>Collect Total Test Time: </span>
nicholas@2859 115 <input type="checkbox" value="testTimer" ng-click="enableMetric($event)" />
nicholas@2859 116 </div>
nicholas@2884 117 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Collect the accumulative listening time for each fragment">
nicholas@2859 118 <span>Collect Fragment Listen Time: </span>
nicholas@2859 119 <input type="checkbox" value="elementTimer" ng-click="enableMetric($event)" />
nicholas@2859 120 </div>
nicholas@2884 121 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store the initial position of the fragment">
nicholas@2859 122 <span>Collect Fragment Initial Position: </span>
nicholas@2859 123 <input type="checkbox" value="elementInitialPosition" ng-click="enableMetric($event)" />
nicholas@2859 124 </div>
nicholas@2884 125 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store each movement / value change of each fragment with page-relative timestamps.">
nicholas@2884 126 <span>Collect Fragment Movements: </span>
nicholas@2859 127 <input type="checkbox" value="elementTracker" ng-click="enableMetric($event)" />
nicholas@2859 128 </div>
nicholas@2884 129 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store boolean reporting if a fragment has been played">
nicholas@2859 130 <span>Collect Fragment Listened To Flag: </span>
nicholas@2859 131 <input type="checkbox" value="elementFlagListenedTo" ng-click="enableMetric($event)" />
nicholas@2859 132 </div>
nicholas@2884 133 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store boolean reporting if a fragment has been moved">
nicholas@2859 134 <span>Collect Fragment Moved Flag: </span>
nicholas@2859 135 <input type="checkbox" value="elementFlagMoved" ng-click="enableMetric($event)" />
nicholas@2859 136 </div>
nicholas@2884 137 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store each time a fragment starts and stops playback with page relative timestamps. Also holds fragment relative timestamps.">
nicholas@2859 138 <span>Collect Fragment Listened Flag: </span>
nicholas@2859 139 <input type="checkbox" value="elementListenTracker" ng-click="enableMetric($event)" />
nicholas@2859 140 </div>
nicholas@2859 141 </div>
nicholas@2859 142 </div>
nicholas@2859 143 <div id="globalpresurvey" class="node" ng-controller="survey" ng-init="survey = specification.preTest">
nicholas@2859 144 <h2>Pre Test Survey</h2>
nicholas@3021 145 <div class="attributes">
nicholas@3021 146 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Allow users to go both back and forward in the test">
nicholas@3021 147 <span>Show back button: </span>
nicholas@3021 148 <input type="checkbox" ng-model="survey.showBackButton" />
nicholas@3021 149 </div>
nicholas@3021 150 </div>
nicholas@2859 151 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
n@2911 152 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 153 <h3>Survey Entry</h3>
nicholas@2859 154 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 155 <div class="attributes">
n@2911 156 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
nicholas@2859 157 <span>Survey Type: </span>
nicholas@2859 158 <select ng-model="opt.type">
nicholas@2859 159 <option value="question">Question</option>
nicholas@2859 160 <option value="radio">Radio</option>
nicholas@2859 161 <option value="checkbox">Checkbox</option>
nicholas@2859 162 <option value="statement">Statement</option>
nicholas@2859 163 <option value="number">Number</option>
nicholas@2859 164 <option value="slider">Slider</option>
nicholas@2859 165 <option value="video">Video</option>
nicholas@2859 166 <option value="youtube">YouTube</option>
nicholas@2859 167 </select>
nicholas@2859 168 </div>
n@2911 169 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Unique across the entire session of all ID entries. ">
nicholas@2859 170 <span>Unique Survey Entry ID:</span>
nicholas@2877 171 <input type="text" ng-model="opt.id" required/>
nicholas@2859 172 </div>
n@2911 173 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Friendly name. Will be used in test results parsers instead of the ID, if defined.">
nicholas@2859 174 <span>Entry Name:</span>
nicholas@2859 175 <input type="text" ng-model="opt.name" />
nicholas@2859 176 </div>
n@2911 177 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="An answer must be given to continue with the test.">
nicholas@2859 178 <span>Mandatory:</span>
nicholas@2859 179 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 180 </div>
n@2911 181 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
nicholas@2859 182 <span>Minimum Wait Time (s):</span>
nicholas@2859 183 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 184 </div>
n@2911 185 <div class="attribute" ng-show="opt.type == 'question'" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Size of the displayed text box. Does not limit entry but may discourage (or encourage) longer ansewrs if bigger.">
nicholas@2859 186 <span>Box Size:</span>
nicholas@2859 187 <select ng-model="opt.boxsize">
nicholas@2859 188 <option value="small">Small</option>
nicholas@2859 189 <option value="normal">Normal</option>
nicholas@2859 190 <option value="large">Large</option>
nicholas@2859 191 <option value="huge">Huge</option>
nicholas@2859 192 </select>
nicholas@2859 193 </div>
n@2911 194 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="The minimum number of options that must be selected before continuing">
nicholas@2859 195 <span>Minimum Selected:</span>
nicholas@2859 196 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 197 </div>
n@2911 198 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of options that can be selected to continue.">
nicholas@2859 199 <span>Maximum Selected:</span>
nicholas@2859 200 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 201 </div>
n@2911 202 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum numerical value">
nicholas@2859 203 <span>Minimum Value:</span>
nicholas@2859 204 <input type="number" ng-model="opt.min" />
nicholas@2859 205 </div>
n@2911 206 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum numerical value">
nicholas@2859 207 <span>Maximum Value:</span>
nicholas@2859 208 <input type="number" ng-model="opt.max" />
nicholas@2859 209 </div>
n@2911 210 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the video to embed.">
nicholas@2859 211 <span>Video URL:</span>
nicholas@2859 212 <input type="text" ng-model="opt.url" />
nicholas@2859 213 </div>
nicholas@2859 214 </div>
n@2911 215 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
nicholas@2859 216 <h4>Statement</h4>
nicholas@2859 217 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 218 </div>
nicholas@2859 219 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 220 <h4>Options</h4>
nicholas@2859 221 <div>
nicholas@2859 222 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 223 </div>
nicholas@2859 224 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 225 <div class="attributes">
nicholas@2859 226 <div class="attribute">
nicholas@2859 227 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 228 </div>
nicholas@2859 229 <div class="attribute">
nicholas@2859 230 <span>Name: </span>
nicholas@2877 231 <input type="text" ng-model="option.name" required/>
nicholas@2859 232 </div>
nicholas@2859 233 <div class="attribute">
nicholas@2859 234 <span>Displayed Text: </span>
nicholas@2877 235 <input type="text" ng-model="option.text" required/>
nicholas@2859 236 </div>
nicholas@2859 237 </div>
nicholas@2859 238 </div>
nicholas@2859 239 </div>
nicholas@2859 240 <div class="node">
nicholas@2859 241 <h4>Conditionals</h4>
nicholas@2859 242 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 243 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 244 <div class="attributes">
nicholas@2859 245 <div class="attribute">
nicholas@2859 246 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 247 </div>
nicholas@2859 248 <div class="attribute">
nicholas@2859 249 <span>Check Type:</span>
nicholas@2859 250 <select ng-model="condition.check">
nicholas@2859 251 <option value="equals">Equal To</option>
nicholas@2859 252 <option value="lessThan">Less Than</option>
nicholas@2859 253 <option value="greaterThan">Greater Than</option>
nicholas@2859 254 <option value="stringContains">String Contains</option>
nicholas@2859 255 </select>
nicholas@2859 256 </div>
nicholas@2859 257 <div class="attribute">
nicholas@2859 258 <span>Value: </span>
nicholas@2877 259 <input type="text" ng-model="condition.value" required/>
nicholas@2859 260 </div>
nicholas@2859 261 <div class="attribute">
nicholas@2859 262 <span>Jump To On Pass: </span>
nicholas@2859 263 <select ng-model="condition.jumpToOnPass">
nicholas@2859 264 <option value="">None</option>
nicholas@2859 265 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 266 </select>
nicholas@2859 267 </div>
nicholas@2859 268 <div class="attribute">
nicholas@2859 269 <span>Jump To On Fail: </span>
nicholas@2859 270 <select ng-model="condition.jumpToOnFail">
nicholas@2859 271 <option value="">None</option>
nicholas@2859 272 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 273 </select>
nicholas@2859 274 </div>
nicholas@2859 275 </div>
nicholas@2859 276 </div>
nicholas@2859 277 </div>
nicholas@2859 278 </div>
nicholas@2859 279 </div>
nicholas@2859 280 <div id="globalpostsurvey" class="node" ng-controller="survey" ng-init="survey = specification.postTest">
nicholas@2859 281 <h2>Post Test Survey</h2>
nicholas@3021 282 <div class="attributes">
nicholas@3021 283 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Allow users to go both back and forward in the test">
nicholas@3021 284 <span>Show back button: </span>
nicholas@3021 285 <input type="checkbox" ng-model="survey.showBackButton" />
nicholas@3021 286 </div>
nicholas@3021 287 </div>
nicholas@2859 288 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
n@2911 289 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 290 <h3>Survey Entry</h3>
nicholas@2859 291 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 292 <div class="attributes">
n@2911 293 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
nicholas@2859 294 <span>Survey Type: </span>
nicholas@2859 295 <select ng-model="opt.type">
nicholas@2859 296 <option value="question">Question</option>
nicholas@2859 297 <option value="radio">Radio</option>
nicholas@2859 298 <option value="checkbox">Checkbox</option>
nicholas@2859 299 <option value="statement">Statement</option>
nicholas@2859 300 <option value="number">Number</option>
nicholas@2859 301 <option value="slider">Slider</option>
nicholas@2859 302 <option value="video">Video</option>
nicholas@2859 303 <option value="youtube">YouTube</option>
nicholas@2859 304 </select>
nicholas@2859 305 </div>
n@2911 306 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Unique across the entire session of all ID entries. ">
nicholas@2859 307 <span>Unique Survey Entry ID:</span>
nicholas@2877 308 <input type="text" ng-model="opt.id" required/>
nicholas@2859 309 </div>
n@2911 310 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Friendly name. Will be used in test results parsers instead of the ID, if defined.">
nicholas@2859 311 <span>Entry Name:</span>
nicholas@2859 312 <input type="text" ng-model="opt.name" />
nicholas@2859 313 </div>
n@2911 314 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="An answer must be given to continue with the test.">
nicholas@2859 315 <span>Mandatory:</span>
nicholas@2859 316 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 317 </div>
n@2911 318 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
nicholas@2859 319 <span>Minimum Wait Time (s):</span>
nicholas@2859 320 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 321 </div>
n@2911 322 <div class="attribute" ng-show="opt.type == 'question'" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Size of the displayed text box. Does not limit entry but may discourage (or encourage) longer ansewrs if bigger.">
nicholas@2859 323 <span>Box Size:</span>
nicholas@2859 324 <select ng-model="opt.boxsize">
nicholas@2859 325 <option value="small">Small</option>
nicholas@2859 326 <option value="normal">Normal</option>
nicholas@2859 327 <option value="large">Large</option>
nicholas@2859 328 <option value="huge">Huge</option>
nicholas@2859 329 </select>
nicholas@2859 330 </div>
n@2911 331 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="The minimum number of options that must be selected before continuing">
nicholas@2859 332 <span>Minimum Selected:</span>
nicholas@2859 333 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 334 </div>
n@2911 335 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of options that can be selected to continue.">
nicholas@2859 336 <span>Maximum Selected:</span>
nicholas@2859 337 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 338 </div>
n@2911 339 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum numerical value">
nicholas@2859 340 <span>Minimum Value:</span>
nicholas@2859 341 <input type="number" ng-model="opt.min" />
nicholas@2859 342 </div>
n@2911 343 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum numerical value">
nicholas@2859 344 <span>Maximum Value:</span>
nicholas@2859 345 <input type="number" ng-model="opt.max" />
nicholas@2859 346 </div>
n@2911 347 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the video to embed.">
nicholas@2859 348 <span>Video URL:</span>
nicholas@2859 349 <input type="text" ng-model="opt.url" />
nicholas@2859 350 </div>
nicholas@2859 351 </div>
n@2911 352 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
nicholas@2859 353 <h4>Statement</h4>
nicholas@2859 354 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 355 </div>
nicholas@2859 356 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 357 <h4>Options</h4>
nicholas@2859 358 <div>
nicholas@2859 359 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 360 </div>
nicholas@2859 361 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 362 <div class="attributes">
nicholas@2859 363 <div class="attribute">
nicholas@2859 364 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 365 </div>
nicholas@2859 366 <div class="attribute">
nicholas@2859 367 <span>Name: </span>
nicholas@2877 368 <input type="text" ng-model="option.name" required/>
nicholas@2859 369 </div>
nicholas@2859 370 <div class="attribute">
nicholas@2859 371 <span>Displayed Text: </span>
nicholas@2877 372 <input type="text" ng-model="option.text" required/>
nicholas@2859 373 </div>
nicholas@2859 374 </div>
nicholas@2859 375 </div>
nicholas@2859 376 </div>
nicholas@2859 377 <div class="node">
nicholas@2859 378 <h4>Conditionals</h4>
nicholas@2859 379 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 380 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 381 <div class="attributes">
nicholas@2859 382 <div class="attribute">
nicholas@2859 383 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 384 </div>
nicholas@2859 385 <div class="attribute">
nicholas@2859 386 <span>Check Type:</span>
nicholas@2859 387 <select ng-model="condition.check">
nicholas@2859 388 <option value="equals">Equal To</option>
nicholas@2859 389 <option value="lessThan">Less Than</option>
nicholas@2859 390 <option value="greaterThan">Greater Than</option>
nicholas@2859 391 <option value="stringContains">String Contains</option>
nicholas@2859 392 </select>
nicholas@2859 393 </div>
nicholas@2859 394 <div class="attribute">
nicholas@2859 395 <span>Value: </span>
nicholas@2877 396 <input type="text" ng-model="condition.value" required/>
nicholas@2859 397 </div>
nicholas@2859 398 <div class="attribute">
nicholas@2859 399 <span>Jump To On Pass: </span>
nicholas@2859 400 <select ng-model="condition.jumpToOnPass">
nicholas@2859 401 <option value="">None</option>
nicholas@2859 402 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 403 </select>
nicholas@2859 404 </div>
nicholas@2859 405 <div class="attribute">
nicholas@2859 406 <span>Jump To On Fail: </span>
nicholas@2859 407 <select ng-model="condition.jumpToOnFail">
nicholas@2859 408 <option value="">None</option>
nicholas@2859 409 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 410 </select>
nicholas@2859 411 </div>
nicholas@2859 412 </div>
nicholas@2859 413 </div>
nicholas@2859 414 </div>
nicholas@2859 415 </div>
nicholas@2859 416 </div>
nicholas@2859 417 <div id="globalinterface" class="node" ng-controller="interfaceNode" ng-init="interface = specification.interfaces">
nicholas@2859 418 <h2>Interface (Globals)</h2>
nicholas@2859 419 <div class="node interfaceOptions">
nicholas@2859 420 <div class="attributes">
n@2911 421 <div class="attribute" name="fragmentPlayed" type="check" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="A page can only be submitted if all fragments have been played">
nicholas@2859 422 <span>Check all fragments played: </span>
nicholas@2859 423 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 424 </div>
n@2911 425 <div class="attribute" name="fragmentFullPlayback" type="check" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="A page can only be submitted if all fragments have been played completely.">
nicholas@2859 426 <span>Check all fragments fully played: </span>
nicholas@2859 427 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 428 </div>
n@2911 429 <div class="attribute" name="fragmentMoved" type="check" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="A page can only be submitted if all fragments have been moved">
nicholas@2859 430 <span>Check all fragments have been moved: </span>
nicholas@2859 431 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 432 </div>
n@2911 433 <div class="attribute" name="fragmentComments" type="check" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="A page can only be submitted if all fragments have their comment boxes completed.">
nicholas@2859 434 <span>Check all fragments have comments: </span>
nicholas@2859 435 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 436 </div>
n@2911 437 <div class="attribute" name="scalerange" type="check" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="A page can only be submitted if there are fragments above and below the maximum and minimum ranges.">
nicholas@2859 438 <span>Enforce a scale usage: </span>
nicholas@2859 439 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 440 <span>Minimum:</span>
nicholas@2859 441 <input type="number" min="0" max="100" name="min" />
nicholas@2859 442 <span>Maximum:</span>
nicholas@2859 443 <input type="number" min="0" max="100" name="max" />
nicholas@2859 444 </div>
n@2911 445 <div class="attribute" name="volume" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show the master volume control on each page.">
nicholas@2859 446 <span>Show master volume control: </span>
nicholas@2859 447 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 448 </div>
n@2911 449 <div class="attribute" name="playhead" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show the playhead for the fragments.">
nicholas@2859 450 <span>Show playhead: </span>
nicholas@2859 451 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 452 </div>
n@2911 453 <div class="attribute" name="page-count" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show number of completed and remaining pages.">
nicholas@2859 454 <span>Show Page Count: </span>
nicholas@2859 455 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 456 </div>
n@2911 457 <div class="attribute" name="comments" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show comment boxes for each fragment.">
nicholas@2859 458 <span>Show Fragment Comments: </span>
nicholas@2859 459 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 460 </div>
nicholas@3042 461 <div class="attribute" name="ticks" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show tick marks for each scale label">
nicholas@3042 462 <span>Show Scale Ticks: </span>
nicholas@3042 463 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@3042 464 </div>
nicholas@2859 465 </div>
nicholas@2859 466 </div>
nicholas@2859 467 </div>
nicholas@2859 468 </div>
nicholas@2859 469 <div style="text-align: center;">
nicholas@2859 470 <button type="button" class="btn btn-success" ng-click="addPage()">Add Page</button>
nicholas@2859 471 </div>
nicholas@2859 472 <div class="node pageNode" ng-controller="page" ng-repeat="page in specification.pages">
nicholas@2859 473 <h2>Page</h2>
nicholas@2862 474 <button type="button" class="btn btn-danger" ng-click="removePage(page)">Remove Page</button>
nicholas@2859 475 <div class="attributes">
nicholas@2859 476 <div class="attribute">
nicholas@2859 477 <span>Unique ID: </span>
nicholas@2877 478 <input type="text" ng-model="page.id" required/>
nicholas@2859 479 </div>
nicholas@2884 480 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Define the common root of each fragment URL. For example if every fragment URL starts with 'http://example.org/media/' then this can be placed here and the remainder for each fragment in their respective URL boxed.">
nicholas@2859 481 <span>Fragment common-root URL: </span>
nicholas@2859 482 <input type="text" ng-model="page.hostURL" />
nicholas@2859 483 </div>
nicholas@2859 484 <div class="attribute">
nicholas@2859 485 <span>Randomise Fragment Order: </span>
nicholas@2859 486 <input type="checkbox" ng-model="page.randomiseOrder" />
nicholas@2859 487 </div>
nicholas@2884 488 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Specify if this page should be repeated and how many times. Please note, that if page-pooling is also selected then it 'may' not repeat as many times.">
n@2911 489 <span>Numer of repetitions: </span>
n@2907 490 <input type="number" ng-model="page.repeatCount" value="0" step="1" placeholder="{{placeholder('repeatCount')}}" />
nicholas@2859 491 </div>
nicholas@2884 492 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Loop audio playback until manually stopped or the page submit button is pressed">
nicholas@2859 493 <span>Loop audio: </span>
nicholas@2859 494 <input type="checkbox" ng-model="page.loop" />
nicholas@2859 495 </div>
nicholas@2884 496 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Synchronise playback of each fragment in this page. If all fragments have the same audio (such as mix evaluations) then this can enable users to seemlessly transition. Otherwise audio will start from the beginning of each fragment">
nicholas@2859 497 <span>Synchronous audio playback: </span>
nicholas@2859 498 <input type="checkbox" ng-model="page.synchronous" />
nicholas@2859 499 </div>
nicholas@2884 500 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global loudness normalisation">
nicholas@2859 501 <span>Loudness (page): </span>
n@2907 502 <input type="number" ng-model="page.loudness" max="0" placeholder="{{specification.loudness || placeholder('loudness')}}" />
nicholas@2859 503 </div>
nicholas@2884 504 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Label type to display on the fragments.">
nicholas@2859 505 <span>Label type: </span>
nicholas@2859 506 <select ng-model="page.label">
nicholas@2859 507 <option value="default">Default</option>
nicholas@2859 508 <option value="none">None</option>
nicholas@2859 509 <option value="number">[1, 2, 3...]</option>
nicholas@2859 510 <option value="letter">[a, b, c...]</option>
nicholas@2859 511 <option value="capital">[A, B, C...]</option>
nicholas@2859 512 <option value="samediff" ng-show="specification.interface == 'AB'">[Same, Different]</option>
nicholas@2859 513 </select>
nicholas@2859 514 </div>
nicholas@2859 515 <div class="attribute" ng-show="page.label != 'default' && page.label != 'none'">
nicholas@2859 516 <span>Label Start: </span>
nicholas@2859 517 <input type="text" ng-model="page.labelStart" />
nicholas@2859 518 </div>
nicholas@2884 519 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Select a subgroup of the given audio fragments to display. 0 or blank means all fragments will be displayed.">
nicholas@2859 520 <span>Fragment pool size: </span>
n@2907 521 <input type="number" ng-model="page.poolSize" min="0" max="page.audioElements.length" placeholder="{{placeholder('poolSize')}}" />
nicholas@2859 522 </div>
nicholas@2884 523 <div class="attribute" ng-show="specification.poolSize > 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always display this page, even after sub-pooling of pages">
nicholas@2859 524 <span>Always include page: </span>
nicholas@2859 525 <input type="checkbox" ng-model="page.alwaysInclude" />
nicholas@2859 526 </div>
nicholas@2884 527 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always show this page in this position. Useful for training pages to ensure they are always positioned first.">
nicholas@2859 528 <span>Fixed Page Position: </span>
nicholas@2859 529 <input type="number" ng-model="page.position" min="0" max="{{specification.pages.length}}" />
nicholas@2859 530 </div>
nicholas@2884 531 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global pre-silence">
nicholas@2859 532 <span>Fragment pre-silence: </span>
n@2907 533 <input type="number" ng-model="page.preSilence" min="0" step="0.1" placeholder="{{specification.preSilence || placeholder('preSilence')}}" />
nicholas@2859 534 </div>
nicholas@2884 535 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global post-silence">
nicholas@2859 536 <span>Fragment post-silence: </span>
n@2907 537 <input type="number" ng-model="page.postSilence" min="0" step="0.1" placeholder="{{specification.postSilence || placeholder('postSilence')}}" />
nicholas@2859 538 </div>
nicholas@2884 539 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio">
nicholas@2859 540 <span>Cannot interupt audio: </span>
nicholas@2859 541 <input type="checkbox" ng-model="page.playOne" />
nicholas@2859 542 </div>
nicholas@2884 543 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Only allow playing fragments' interface handle to be manipulated during playback.">
nicholas@2859 544 <span>Only move playing audio: </span>
nicholas@2859 545 <input type="checkbox" ng-model="page.restrictMovement" />
nicholas@2859 546 </div>
nicholas@2884 547 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global minimum number of fragment plays">
nicholas@2874 548 <span>Minimum number of fragment plays</span>
n@2907 549 <input type="number" ng-model="page.minNumberPlays" min="0" max="{{page.maxNumberPlays || specification.maxNumberPlays}}" placeholder="{{specification.minNumberPlays || placeholder('minNumberPlays')}}" />
nicholas@2874 550 </div>
nicholas@2884 551 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global maximum number of fragment plays">
nicholas@2874 552 <span>Maximum number of fragment plays</span>
n@2907 553 <input type="number" ng-model="page.maxNumberPlays" min="{{page.minNumberPlays || specification.minNumberPlays || 0}}" placeholder="{{specification.maxNumberPlays || placeholder('maxNumberPlays')}}" />
nicholas@2874 554 </div>
nicholas@2859 555 </div>
nicholas@2884 556 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the title of the page">
nicholas@2859 557 <h3>Page Title</h3>
nicholas@2859 558 <textarea ng-model="page.title"></textarea>
nicholas@2859 559 </div>
nicholas@2859 560 <div class="node">
nicholas@2859 561 <h3>Comment box text prefix</h3>
nicholas@2859 562 <textarea ng-model="page.commentboxprefix"></textarea>
nicholas@2859 563 <p>Example:
nicholas@2859 564 <span style="font-weight:600">{{page.commentboxprefix}} A</span>
nicholas@2859 565 </p>
nicholas@2859 566 </div>
nicholas@2859 567 <div class="node" ng-controller="survey" ng-init="survey = page.preTest">
nicholas@2859 568 <h2>Pre Page Survey</h2>
nicholas@3021 569 <div class="attributes">
nicholas@3021 570 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Allow users to go both back and forward in the test">
nicholas@3021 571 <span>Show back button: </span>
nicholas@3021 572 <input type="checkbox" ng-model="survey.showBackButton" />
nicholas@3021 573 </div>
nicholas@3021 574 </div>
nicholas@2859 575 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
n@2911 576 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 577 <h3>Survey Entry</h3>
nicholas@2859 578 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 579 <div class="attributes">
n@2911 580 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
nicholas@2859 581 <span>Survey Type: </span>
nicholas@2859 582 <select ng-model="opt.type">
nicholas@2859 583 <option value="question">Question</option>
nicholas@2859 584 <option value="radio">Radio</option>
nicholas@2859 585 <option value="checkbox">Checkbox</option>
nicholas@2859 586 <option value="statement">Statement</option>
nicholas@2859 587 <option value="number">Number</option>
nicholas@2859 588 <option value="slider">Slider</option>
nicholas@2859 589 <option value="video">Video</option>
nicholas@2859 590 <option value="youtube">YouTube</option>
nicholas@2859 591 </select>
nicholas@2859 592 </div>
n@2911 593 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Unique across the entire session of all ID entries. ">
nicholas@2859 594 <span>Unique Survey Entry ID:</span>
nicholas@2877 595 <input type="text" ng-model="opt.id" required/>
nicholas@2859 596 </div>
n@2911 597 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Friendly name. Will be used in test results parsers instead of the ID, if defined.">
nicholas@2859 598 <span>Entry Name:</span>
nicholas@2859 599 <input type="text" ng-model="opt.name" />
nicholas@2859 600 </div>
n@2911 601 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="An answer must be given to continue with the test.">
nicholas@2859 602 <span>Mandatory:</span>
nicholas@2859 603 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 604 </div>
n@2911 605 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
nicholas@2859 606 <span>Minimum Wait Time (s):</span>
nicholas@2859 607 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 608 </div>
n@2911 609 <div class="attribute" ng-show="opt.type == 'question'" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Size of the displayed text box. Does not limit entry but may discourage (or encourage) longer ansewrs if bigger.">
nicholas@2859 610 <span>Box Size:</span>
nicholas@2859 611 <select ng-model="opt.boxsize">
nicholas@2859 612 <option value="small">Small</option>
nicholas@2859 613 <option value="normal">Normal</option>
nicholas@2859 614 <option value="large">Large</option>
nicholas@2859 615 <option value="huge">Huge</option>
nicholas@2859 616 </select>
nicholas@2859 617 </div>
n@2911 618 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="The minimum number of options that must be selected before continuing">
nicholas@2859 619 <span>Minimum Selected:</span>
nicholas@2859 620 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 621 </div>
n@2911 622 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of options that can be selected to continue.">
nicholas@2859 623 <span>Maximum Selected:</span>
nicholas@2859 624 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 625 </div>
n@2911 626 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum numerical value">
nicholas@2859 627 <span>Minimum Value:</span>
nicholas@2859 628 <input type="number" ng-model="opt.min" />
nicholas@2859 629 </div>
n@2911 630 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum numerical value">
nicholas@2859 631 <span>Maximum Value:</span>
nicholas@2859 632 <input type="number" ng-model="opt.max" />
nicholas@2859 633 </div>
n@2911 634 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the video to embed.">
nicholas@2859 635 <span>Video URL:</span>
nicholas@2859 636 <input type="text" ng-model="opt.url" />
nicholas@2859 637 </div>
nicholas@2859 638 </div>
n@2911 639 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
nicholas@2859 640 <h4>Statement</h4>
nicholas@2859 641 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 642 </div>
nicholas@2859 643 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 644 <h4>Options</h4>
nicholas@2859 645 <div>
nicholas@2859 646 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 647 </div>
nicholas@2859 648 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 649 <div class="attributes">
nicholas@2859 650 <div class="attribute">
nicholas@2859 651 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 652 </div>
nicholas@2859 653 <div class="attribute">
nicholas@2859 654 <span>Name: </span>
nicholas@2877 655 <input type="text" ng-model="option.name" required/>
nicholas@2859 656 </div>
nicholas@2859 657 <div class="attribute">
nicholas@2859 658 <span>Displayed Text: </span>
nicholas@2877 659 <input type="text" ng-model="option.text" required/>
nicholas@2859 660 </div>
nicholas@2859 661 </div>
nicholas@2859 662 </div>
nicholas@2859 663 </div>
nicholas@2859 664 <div class="node">
nicholas@2859 665 <h4>Conditionals</h4>
nicholas@2859 666 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 667 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 668 <div class="attributes">
nicholas@2859 669 <div class="attribute">
nicholas@2859 670 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 671 </div>
nicholas@2859 672 <div class="attribute">
nicholas@2859 673 <span>Check Type:</span>
nicholas@2859 674 <select ng-model="condition.check">
nicholas@2859 675 <option value="equals">Equal To</option>
nicholas@2859 676 <option value="lessThan">Less Than</option>
nicholas@2859 677 <option value="greaterThan">Greater Than</option>
nicholas@2859 678 <option value="stringContains">String Contains</option>
nicholas@2859 679 </select>
nicholas@2859 680 </div>
nicholas@2859 681 <div class="attribute">
nicholas@2859 682 <span>Value: </span>
nicholas@2877 683 <input type="text" ng-model="condition.value" required/>
nicholas@2859 684 </div>
nicholas@2859 685 <div class="attribute">
nicholas@2859 686 <span>Jump To On Pass: </span>
nicholas@2859 687 <select ng-model="condition.jumpToOnPass">
nicholas@2859 688 <option value="">None</option>
nicholas@2859 689 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 690 </select>
nicholas@2859 691 </div>
nicholas@2859 692 <div class="attribute">
nicholas@2859 693 <span>Jump To On Fail: </span>
nicholas@2859 694 <select ng-model="condition.jumpToOnFail">
nicholas@2859 695 <option value="">None</option>
nicholas@2859 696 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 697 </select>
nicholas@2859 698 </div>
nicholas@2859 699 </div>
nicholas@2859 700 </div>
nicholas@2859 701 </div>
nicholas@2859 702 </div>
nicholas@2859 703 </div>
nicholas@2867 704 <div class="node" ng-controller="survey" ng-init="survey = page.postTest">
nicholas@2859 705 <h2>Post Page Survey</h2>
nicholas@3021 706 <div class="attributes">
nicholas@3021 707 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Allow users to go both back and forward in the test">
nicholas@3021 708 <span>Show back button: </span>
nicholas@3021 709 <input type="checkbox" ng-model="survey.showBackButton" />
nicholas@3021 710 </div>
nicholas@3021 711 </div>
nicholas@2859 712 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
n@2911 713 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 714 <h3>Survey Entry</h3>
nicholas@2859 715 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 716 <div class="attributes">
n@2911 717 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
nicholas@2859 718 <span>Survey Type: </span>
nicholas@2859 719 <select ng-model="opt.type">
nicholas@2859 720 <option value="question">Question</option>
nicholas@2859 721 <option value="radio">Radio</option>
nicholas@2859 722 <option value="checkbox">Checkbox</option>
nicholas@2859 723 <option value="statement">Statement</option>
nicholas@2859 724 <option value="number">Number</option>
nicholas@2859 725 <option value="slider">Slider</option>
nicholas@2859 726 <option value="video">Video</option>
nicholas@2859 727 <option value="youtube">YouTube</option>
nicholas@2859 728 </select>
nicholas@2859 729 </div>
n@2911 730 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Unique across the entire session of all ID entries. ">
nicholas@2859 731 <span>Unique Survey Entry ID:</span>
n@2911 732 <input type="text" ng-model="opt.id" required/>
nicholas@2859 733 </div>
n@2911 734 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Friendly name. Will be used in test results parsers instead of the ID, if defined.">
nicholas@2859 735 <span>Entry Name:</span>
nicholas@2859 736 <input type="text" ng-model="opt.name" />
nicholas@2859 737 </div>
n@2911 738 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="An answer must be given to continue with the test.">
nicholas@2859 739 <span>Mandatory:</span>
nicholas@2859 740 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 741 </div>
n@2911 742 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
nicholas@2859 743 <span>Minimum Wait Time (s):</span>
nicholas@2859 744 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 745 </div>
n@2911 746 <div class="attribute" ng-show="opt.type == 'question'" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Size of the displayed text box. Does not limit entry but may discourage (or encourage) longer ansewrs if bigger.">
nicholas@2859 747 <span>Box Size:</span>
nicholas@2859 748 <select ng-model="opt.boxsize">
nicholas@2859 749 <option value="small">Small</option>
nicholas@2859 750 <option value="normal">Normal</option>
nicholas@2859 751 <option value="large">Large</option>
nicholas@2859 752 <option value="huge">Huge</option>
nicholas@2859 753 </select>
nicholas@2859 754 </div>
n@2911 755 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="The minimum number of options that must be selected before continuing">
nicholas@2859 756 <span>Minimum Selected:</span>
nicholas@2859 757 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 758 </div>
n@2911 759 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of options that can be selected to continue.">
nicholas@2859 760 <span>Maximum Selected:</span>
nicholas@2859 761 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 762 </div>
n@2911 763 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum numerical value">
nicholas@2859 764 <span>Minimum Value:</span>
nicholas@2859 765 <input type="number" ng-model="opt.min" />
nicholas@2859 766 </div>
n@2911 767 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum numerical value">
nicholas@2859 768 <span>Maximum Value:</span>
nicholas@2859 769 <input type="number" ng-model="opt.max" />
nicholas@2859 770 </div>
n@2911 771 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the video to embed.">
nicholas@2859 772 <span>Video URL:</span>
nicholas@2859 773 <input type="text" ng-model="opt.url" />
nicholas@2859 774 </div>
nicholas@2859 775 </div>
n@2911 776 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
nicholas@2859 777 <h4>Statement</h4>
nicholas@2859 778 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 779 </div>
nicholas@2859 780 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 781 <h4>Options</h4>
nicholas@2859 782 <div>
nicholas@2859 783 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 784 </div>
nicholas@2859 785 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 786 <div class="attributes">
nicholas@2859 787 <div class="attribute">
nicholas@2859 788 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 789 </div>
nicholas@2859 790 <div class="attribute">
nicholas@2859 791 <span>Name: </span>
nicholas@2877 792 <input type="text" ng-model="option.name" required/>
nicholas@2859 793 </div>
nicholas@2859 794 <div class="attribute">
nicholas@2859 795 <span>Displayed Text: </span>
nicholas@2877 796 <input type="text" ng-model="option.text" required/>
nicholas@2859 797 </div>
nicholas@2859 798 </div>
nicholas@2859 799 </div>
nicholas@2859 800 </div>
nicholas@2859 801 <div class="node">
nicholas@2859 802 <h4>Conditionals</h4>
nicholas@2859 803 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 804 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 805 <div class="attributes">
nicholas@2859 806 <div class="attribute">
nicholas@2859 807 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 808 </div>
nicholas@2859 809 <div class="attribute">
nicholas@2859 810 <span>Check Type:</span>
nicholas@2859 811 <select ng-model="condition.check">
nicholas@2859 812 <option value="equals">Equal To</option>
nicholas@2859 813 <option value="lessThan">Less Than</option>
nicholas@2859 814 <option value="greaterThan">Greater Than</option>
nicholas@2859 815 <option value="stringContains">String Contains</option>
nicholas@2859 816 </select>
nicholas@2859 817 </div>
nicholas@2859 818 <div class="attribute">
nicholas@2859 819 <span>Value: </span>
nicholas@2877 820 <input type="text" ng-model="condition.value" required/>
nicholas@2859 821 </div>
nicholas@2859 822 <div class="attribute">
nicholas@2859 823 <span>Jump To On Pass: </span>
nicholas@2859 824 <select ng-model="condition.jumpToOnPass">
nicholas@2859 825 <option value="">None</option>
nicholas@2859 826 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 827 </select>
nicholas@2859 828 </div>
nicholas@2859 829 <div class="attribute">
nicholas@2859 830 <span>Jump To On Fail: </span>
nicholas@2859 831 <select ng-model="condition.jumpToOnFail">
nicholas@2859 832 <option value="">None</option>
nicholas@2859 833 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 834 </select>
nicholas@2859 835 </div>
nicholas@2859 836 </div>
nicholas@2859 837 </div>
nicholas@2859 838 </div>
nicholas@2859 839 </div>
nicholas@2859 840 </div>
nicholas@2859 841 <button type="button" class="btn btn-success" ng-show="specification.interface == 'APE' || page.interfaces.length == 0" ng-click="addInterface()">Add Interface/Axis</button>
n@2911 842 <div class="node interface" ng-repeat="interface in page.interfaces" ng-controller="interfaceNode">
nicholas@2859 843 <h2>Interface</h2>
nicholas@2859 844 <button type="button" class="btn btn-danger" ng-click="removeInterface(interface)">Remove Interface/Axis</button>
nicholas@2859 845 <div class="node interfaceOptions">
nicholas@2859 846 <div class="attributes">
nicholas@2859 847 <div class="attribute" name="fragmentPlayed" type="check">
nicholas@2859 848 <span>Check all fragments played: </span>
nicholas@2859 849 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 850 </div>
nicholas@2859 851 <div class="attribute" name="fragmentFullPlayback" type="check">
nicholas@2859 852 <span>Check all fragments fully played: </span>
nicholas@2859 853 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 854 </div>
nicholas@2859 855 <div class="attribute" name="fragmentMoved" type="check">
nicholas@2859 856 <span>Check all fragments have been moved: </span>
nicholas@2859 857 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 858 </div>
nicholas@2859 859 <div class="attribute" name="fragmentComments" type="check">
nicholas@2859 860 <span>Check all fragments have comments: </span>
nicholas@2859 861 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 862 </div>
nicholas@2859 863 <div class="attribute" name="scalerange" type="check">
nicholas@2859 864 <span>Enforce a scale usage: </span>
nicholas@2859 865 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 866 <span>Minimum:</span>
nicholas@2859 867 <input type="number" min="0" max="100" name="min" />
nicholas@2859 868 <span>Maximum:</span>
nicholas@2859 869 <input type="number" min="0" max="100" name="max" />
nicholas@2859 870 </div>
nicholas@2859 871 <div class="attribute" name="volume" type="show">
nicholas@2859 872 <span>Show master volume control: </span>
nicholas@2859 873 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 874 </div>
nicholas@2859 875 <div class="attribute" name="playhead" type="show">
nicholas@2859 876 <span>Show playhead: </span>
nicholas@2859 877 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 878 </div>
nicholas@2859 879 <div class="attribute" name="page-count" type="show">
nicholas@2859 880 <span>Show Page Count: </span>
nicholas@2859 881 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 882 </div>
nicholas@2859 883 <div class="attribute" name="comments" type="show">
nicholas@2859 884 <span>Show Fragment Comments: </span>
nicholas@2859 885 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 886 </div>
nicholas@3042 887 <div class="attribute" name="ticks" type="show" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show tick marks for each scale label">
nicholas@3042 888 <span>Show Scale Ticks: </span>
nicholas@3042 889 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@3042 890 </div>
nicholas@2859 891 </div>
nicholas@2859 892 </div>
nicholas@2859 893 <div class="node">
nicholas@2859 894 <h3>Axis Title</h3>
nicholas@2859 895 <textarea ng-model="interface.title"></textarea>
nicholas@2859 896 <div class="attributes">
nicholas@2859 897 <div class="attribute">
nicholas@2859 898 <span>Axis name (in saves): </span>
nicholas@2859 899 <input type="text" ng-model="interface.name" />
nicholas@2859 900 </div>
nicholas@2859 901 </div>
nicholas@2859 902 </div>
nicholas@2859 903 <div class="node">
nicholas@2859 904 <h3>Axis Image</h3>
nicholas@2859 905 <textarea ng-model="interface.image"></textarea>
nicholas@2859 906 </div>
nicholas@2886 907 <div class="node" name="scale-selection">
nicholas@2859 908 <h3>Axis Scales</h3>
nicholas@2864 909 <button type="button" class="btn btn-success" ng-click="addScale();">Add</button>
nicholas@2864 910 <button type="button" class="btn btn-danger" ng-click="clearScales()" ng-show="interface.scales.length > 0">Clear Scales</button>
nicholas@2864 911 <div class="dropdown" style="display: inline-block;">
nicholas@2864 912 <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
nicholas@2886 913 Scales: {{selectedScale}}
nicholas@2864 914 <span class="caret"></span>
nicholas@2864 915 </button>
nicholas@2864 916 <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
nicholas@2886 917 <li ng-repeat="scale in scales" ng-click="useScales(scale)"><a href="#">{{scale.name}}</a></li>
nicholas@2864 918 </ul>
nicholas@2864 919 </div>
nicholas@2859 920 <div class="node" ng-repeat="scale in interface.scales">
nicholas@2859 921 <div class="attributes">
nicholas@2859 922 <div class="attribute">
nicholas@2859 923 <button type="button" class="btn btn-danger" ng-click="removeScale(scale);">Remove</button>
nicholas@2859 924 </div>
nicholas@2859 925 <div class="attribute">
nicholas@2859 926 <span>Position: </span>
nicholas@2877 927 <input type="number" min="0" max="100" ng-model="scale.position" required/>
nicholas@2859 928 </div>
nicholas@2859 929 <div class="attribute">
nicholas@2859 930 <span>Text: </span>
nicholas@2877 931 <input type="text" ng-model="scale.text" required/>
nicholas@2859 932 </div>
nicholas@2859 933 </div>
nicholas@2859 934 </div>
nicholas@2859 935 </div>
nicholas@2859 936 </div>
nicholas@2859 937 <div class="node">
nicholas@2859 938 <h3>Comment Questions</h3>
nicholas@2859 939 <button type="button" class="btn btn-success" ng-click="addCommentQuestion()">Add Comment Question</button>
nicholas@2859 940 <div class="node" ng-repeat="cq in page.commentQuestions">
nicholas@2859 941 <button type="button" class="btn btn-danger" ng-click="removeCommentQuestion(cq)">Remove Comment Question</button>
nicholas@2859 942 <div class="attributes">
nicholas@2859 943 <div class="attribute">
nicholas@3036 944 <span>Type:</span>
nicholas@3036 945 <select ng-model="cq.type">
nicholas@3036 946 <option value="question">Question</option>
nicholas@3036 947 <option value="checkbox">Checkbox</option>
nicholas@3036 948 <option value="radio">Radio</option>
nicholas@3036 949 <option value="slider">Slider</option>
nicholas@3036 950 </select>
nicholas@3036 951 </div>
nicholas@3036 952 <div class="attribute">
nicholas@2859 953 <span>Unique ID:</span>
nicholas@2877 954 <input type="text" ng-model="cq.id" required/>
nicholas@2859 955 </div>
nicholas@2859 956 <div class="attribute">
nicholas@2859 957 <span>Common Name:</span>
nicholas@2859 958 <input type="text" ng-model="cq.name" />
nicholas@2859 959 </div>
nicholas@3036 960 <div class="attribute">
nicholas@3036 961 <span>Mandatory:</span>
nicholas@3036 962 <input type="checkbox" ng-model="cq.mandatory" />
nicholas@3036 963 </div>
nicholas@2859 964 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 965 <span>Minimum:</span>
nicholas@2859 966 <input type="number" ng-model="cq.min" />
nicholas@2859 967 </div>
nicholas@2859 968 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 969 <span>Maximum:</span>
nicholas@2859 970 <input type="number" ng-model="cq.max" />
nicholas@2859 971 </div>
nicholas@2859 972 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 973 <span>Step size:</span>
nicholas@2859 974 <input type="number" ng-model="cq.step" />
nicholas@2859 975 </div>
nicholas@2859 976 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 977 <span>Initial Value:</span>
nicholas@2859 978 <input type="number" ng-model="cq.value" />
nicholas@2859 979 </div>
nicholas@2859 980 </div>
nicholas@2859 981 <div class="node">
nicholas@2859 982 <h4>Question:</h4>
nicholas@2859 983 <textarea ng-model="cq.statement"></textarea>
nicholas@2859 984 </div>
nicholas@2859 985 <div class="node" ng-show="['radio', 'checkbox'].indexOf(cq.type) >= 0">
nicholas@2859 986 <h4>Options</h4>
nicholas@2859 987 <div class="node" ng-repeat="option in cq.options">
nicholas@2859 988 <div class="attributes">
nicholas@2859 989 <div class="attribute">
nicholas@2859 990 <button type="button" class="btn btn-danger" ng-click="removeCommentQuestionOption(cq,option)">Remove</button>
nicholas@2859 991 </div>
nicholas@2859 992 <div class="attribute">
nicholas@2859 993 <span>Name: </span>
nicholas@2877 994 <input type="text" ng-model="option.name" required/>
nicholas@2859 995 </div>
nicholas@2859 996 <div class="attribute">
nicholas@2859 997 <span>Display Text: </span>
nicholas@2877 998 <input type="text" ng-model="option.text" required/>
nicholas@2859 999 </div>
nicholas@2859 1000 </div>
nicholas@2859 1001 </div>
nicholas@2859 1002 </div>
nicholas@2859 1003 </div>
nicholas@2859 1004 </div>
nicholas@2859 1005 <button type="button" class="btn btn-success" ng-click="addAudioElement()">Add Fragment</button>
n@2911 1006 <div class="node audioelement" ng-repeat="fragment in page.audioElements">
nicholas@2859 1007 <h3>Audio Fragment</h3>
nicholas@2859 1008 <button type="button" class="btn btn-danger" ng-click="removeAudioElement(fragment)">Remove Fragment</button>
nicholas@2859 1009 <div class="attributes">
n@2911 1010 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="The unique ID of this fragment. Must be unique across the entire session">
nicholas@2859 1011 <span>Unique ID: </span>
nicholas@2877 1012 <input type="text" ng-model="fragment.id" required/>
nicholas@2859 1013 </div>
n@2911 1014 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the fragment.">
nicholas@2859 1015 <span>URL: </span>
nicholas@2877 1016 <input type="text" ng-model="fragment.url" required/>
nicholas@2859 1017 <span>Full URL: </span><span style="font-weight=600">{{page.hostURL}}{{fragment.url}}</span>
nicholas@2859 1018 </div>
nicholas@2884 1019 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the gain of this fragment. This is applied after any normalisation">
nicholas@2859 1020 <span>Fragment Gain (dB): </span>
nicholas@2859 1021 <input type="number" ng-model="fragment.gain" />
nicholas@2859 1022 </div>
nicholas@2884 1023 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Manually set the label">
nicholas@2859 1024 <span>Fragment Label: </span>
nicholas@2859 1025 <input type="text" ng-model="fragment.label" />
nicholas@2859 1026 </div>
nicholas@2859 1027 <div class="attribute">
nicholas@2859 1028 <span>Fragment Common name: </span>
nicholas@2859 1029 <input type="text" ng-model="fragment.name" />
nicholas@2859 1030 </div>
nicholas@2859 1031 <div class="attribute">
nicholas@2859 1032 <span>Fragment Type: </span>
nicholas@2859 1033 <select ng-model="fragment.type">
nicholas@2859 1034 <option value="normal">Normal</option>
nicholas@2859 1035 <option value="anchor">Hidden Anchor</option>
nicholas@2859 1036 <option value="reference">Hidden Reference</option>
nicholas@2859 1037 <option value="outside-reference">Outside Reference</option>
nicholas@2859 1038 </select>
nicholas@2859 1039 </div>
nicholas@2859 1040 <div class="attribute" ng-show="fragment.type == 'anchor'">
nicholas@2859 1041 <span>Anchor must be below: </span>
n@2911 1042 <input type="number" ng-model="fragment.marker" min="0" max="100" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="If this is set, the page cannot be submitted if this fragment is above this point." />
nicholas@2859 1043 </div>
nicholas@2859 1044 <div class="attribute" ng-show="fragment.type == 'reference'">
nicholas@2859 1045 <span>Reference must be above: </span>
n@2911 1046 <input type="number" ng-model="fragment.marker" min="0" max="100" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="If this is set, the page cannot be submitted if this fragment is below this point." />
nicholas@2859 1047 </div>
nicholas@2884 1048 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global and page loudness">
nicholas@2859 1049 <span>Loudness: </span>
n@2907 1050 <input type="number" ng-model="fragment.loudness" max="0" placeholder="{{page.loudness || specification.loudness || ''}}" />
nicholas@2859 1051 </div>
nicholas@2884 1052 <div class="attribute" ng-show="page.poolSize > 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always include this fragment after any sub-pooling">
nicholas@2859 1053 <span>Always include fragment: </span>
nicholas@2859 1054 <input type="checkbox" ng-model="fragment.alwaysInclude" max="0" />
nicholas@2859 1055 </div>
nicholas@2884 1056 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global / page pre-silence">
nicholas@2859 1057 <span>Fragment Pre-Silence: </span>
nicholas@2859 1058 <input type="number" ng-model="fragment.preSilence" max="0" step="0.1" />
nicholas@2859 1059 </div>
nicholas@2884 1060 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global / page post-silence">
nicholas@2859 1061 <span>Fragment Post-Silence: </span>
nicholas@2859 1062 <input type="number" ng-model="fragment.postSilence" max="0" step="0.1" />
nicholas@2859 1063 </div>
nicholas@2884 1064 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="By default the fragment will start playback at the beginning.">
nicholas@2859 1065 <span>Fragment playback start position (s): </span>
nicholas@2859 1066 <input type="number" ng-model="fragment.startTime" min="0" max="{{fragment.stopTime}}" />
nicholas@2859 1067 </div>
nicholas@2884 1068 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="By default the fragment will play until the end">
nicholas@2859 1069 <span>Fragment playback stop position (s): </span>
nicholas@2859 1070 <input type="number" ng-model="fragment.stopTime" min="{{fragment.startTime}}" />
nicholas@2859 1071 </div>
nicholas@2859 1072 <div class="attribute">
nicholas@2859 1073 <span>Fragment sampling rate: </span>
nicholas@2859 1074 <input type="number" ng-model="fragment.sampleRate" min="1" />
nicholas@2859 1075 </div>
nicholas@2884 1076 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Associate an image with this fragment">
nicholas@2859 1077 <span>Fragment Image (URL): </span>
nicholas@2859 1078 <input type="text" ng-model="fragment.image" />
nicholas@2859 1079 </div>
nicholas@2874 1080 <div class="attribute">
nicholas@2874 1081 <span>Minimum number of plays</span>
nicholas@2874 1082 <input type="number" ng-model="fragment.minNumberPlays" min="0" max="{{fragment.maxNumberPlays || page.maxNumberPlays || specification.maxNumberPlays}}" />
nicholas@2874 1083 </div>
nicholas@2874 1084 <div class="attribute">
nicholas@2874 1085 <span>Maximum number of plays</span>
nicholas@2874 1086 <input type="number" ng-model="fragment.maxNumberPlays" min="{{fragment.minNumberPlays || page.minNumberPlays || specification.minNumberPlays || 0}}" />
nicholas@2874 1087 </div>
nicholas@2859 1088 </div>
nicholas@2859 1089 </div>
nicholas@2859 1090 </div>
nicholas@2887 1091 </div>
nicholas@2887 1092 <div id="popupHolder" ng-show="popupVisible">
nicholas@2887 1093 <div ng-controller="introduction" class="popup" ng-show="popupVisible">
nicholas@2887 1094 <div class="popupTitle" ng-switch="state">
n@2907 1095 <span ng-switch-when="0">Test Creator <span class="label label-primary">v1.2.2</span></span>
nicholas@2887 1096 <span ng-switch-when="1">Create New Test</span>
nicholas@2887 1097 </div>
nicholas@2887 1098 <div class="popupContent container-fluid" ng-switch="state">
nicholas@2887 1099 <div ng-switch-when="0">
nicholas@2887 1100 <div>
n@2907 1101 <span>Welcome to the WAET test creator tool. This will allow you to create a new test from scratch to suit your testing needs. If you wish to update a test file, please drag and drop the XML document into the area below for processing, otherwise press 'Next' to start a new test. This tool generates files for the WAET 1.2.2 version.</span>
nicholas@2887 1102 </div>
nicholas@2887 1103 <div>
nicholas@2887 1104 <input type="file" id="files" ng-model="files" onchange="handleFiles(event)" />
nicholas@2887 1105 </div>
nicholas@2859 1106 </div>
nicholas@2887 1107 <div ng-switch-when="1">
nicholas@2887 1108 <div>
nicholas@2887 1109 <span>Please select the interface you would like to use below. Selecting an interface will give a brief description of the interface type.</span>
nicholas@2887 1110 </div>
nicholas@2887 1111 <div class="row">
nicholas@2887 1112 <div class="col-md-6" style="overflow-y: scroll;height: 333px;">
n@2908 1113 <div class="new-test" ng-repeat="i in testSpecifications.interfaces" ng-mouseover="mouseover(i.name)" ng-click="select(i.name)">
nicholas@2887 1114 <label style="cursor:pointer">
nicholas@2887 1115 <input type="radio" name="new-test" value="{{i.name}}" id="i.name" style="cursor:pointer" /> {{i.name}}
nicholas@2887 1116 </label>
nicholas@2887 1117 </div>
nicholas@2859 1118 </div>
nicholas@2887 1119 <div class="col-md-6">
nicholas@2887 1120 <span>{{description}}</span>
nicholas@2859 1121 </div>
nicholas@2859 1122 </div>
nicholas@2859 1123 </div>
nicholas@2887 1124 </div>
nicholas@2887 1125 <div class="popupButtons">
nicholas@2887 1126 <button id="popupBack" type="button" class="btn btn-default" ng-show="state>0" ng-click="back()">Back</button>
nicholas@2887 1127 <button id="popupNext" type="button" class="btn btn-default" ng-click="next()">Next</button>
nicholas@2859 1128 </div>
nicholas@2859 1129 </div>
nicholas@2859 1130 </div>
nicholas@2887 1131 <div id="screenblank" ng-show="popupVisible"></div>
nicholas@2859 1132 </body>
nicholas@2859 1133
nicholas@2859 1134 </html>