comparison test_create.html @ 2916:300bb2bbba4a

Merge branch 'master' of https://github.com/BrechtDeMan/WebAudioEvaluationTool
author www-data <www-data@sucuk.dcs.qmul.ac.uk>
date Tue, 01 Aug 2017 15:23:47 +0100
parents 7b6cdd27f3ee
children c496aef6448b a5a6c44bab6e
comparison
equal deleted inserted replaced
2904:0e4b84497040 2916:300bb2bbba4a
10 <script type="text/javascript" src="js/specification.js"></script> 10 <script type="text/javascript" src="js/specification.js"></script>
11 <script type="text/javascript" src="test_create/test_core.js"></script> 11 <script type="text/javascript" src="test_create/test_core.js"></script>
12 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 12 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
13 <script type="text/javascript" src="js/xmllint.js"></script> 13 <script type="text/javascript" src="js/xmllint.js"></script>
14 14
15 <title>WAET 1.2.1 Test Creator</title> 15 <title>WAET 1.2.2 Test Creator</title>
16 </head> 16 </head>
17 17
18 <body ng-app="creator" ng-controller="view"> 18 <body ng-app="creator" ng-controller="view">
19 <div class="container"> 19 <div class="container">
20 <div id="pageRoot"> 20 <div id="pageRoot">
21 <h1>Web Audio Evaluation Tool - Test Creator</h1> 21 <h1>Web Audio Evaluation Tool</h1>
22 <h3>Test Creator <span class="label label-primary">v1.2.2</span></h3>
22 </div> 23 </div>
23 <button type="button" class="btn btn-info" ng-click="validate()">Validate</button> 24 <button type="button" class="btn btn-info" ng-click="validate()">Validate</button>
24 <button type="button" class="btn btn-success" ng-click="exportXML()" ng-disabled="validated == false">Export XML</button> 25 <button type="button" class="btn btn-success" ng-click="exportXML()" ng-disabled="validated == false">Export XML</button>
25 <div ng-switch on="validated" ng-show="showValidationMessages"> 26 <div ng-switch on="validated" ng-show="showValidationMessages">
26 <div class="panel panel-danger" ng-switch-when="false"> 27 <div class="panel panel-danger" ng-switch-when="false">
43 <div id="setupNode" class="node" ng-controller="setup"> 44 <div id="setupNode" class="node" ng-controller="setup">
44 <h2>Setup</h2> 45 <h2>Setup</h2>
45 <div class="attributes"> 46 <div class="attributes">
46 <div class="attribute"> 47 <div class="attribute">
47 <span>Interface: </span> 48 <span>Interface: </span>
48 <input type="text" ng-model="specification.interface" required/> 49 <select type="text" ng-model="specification.interface" required>
50 <option value="{{i.name}}" ng-repeat="i in availableInterfaceModules">{{i.name}}</option>
51 </select>
49 </div> 52 </div>
50 <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"> 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">
51 <span>Save URL: </span> 54 <span>Save URL: </span>
52 <input type="text" ng-model="specification.projectReturn" placeholder="save.php" /> 55 <input type="text" ng-model="specification.projectReturn" placeholder="save.php" />
53 </div> 56 </div>
54 <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."> 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.">
55 <span>Exit URL: </span> 58 <span>Exit URL: </span>
56 <input type="text" ng-model="specification.returnURL" /> 59 <input type="text" ng-model="specification.returnURL" placeholder="{{placeholder('returnURL')}}" />
57 </div> 60 </div>
58 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Randomise the page order"> 61 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Randomise the page order">
59 <span>Randomise Page Order: </span> 62 <span>Randomise Page Order: </span>
60 <input type="checkbox" ng-model="specification.randomiseOrder" /> 63 <input type="checkbox" ng-model="specification.randomiseOrder" />
61 </div> 64 </div>
62 <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."> 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.">
63 <span>Page Pool Size: </span> 66 <span>Page Pool Size: </span>
64 <input type="number" ng-model="specification.poolSize" min="0" /> 67 <input type="number" ng-model="specification.poolSize" min="0" placeholder="{{placeholder('poolSize')}}" />
65 </div> 68 </div>
66 <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"> 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">
67 <span>Loudness Normalisation (LUFS): </span> 70 <span>Loudness Normalisation (LUFS): </span>
68 <input type="number" ng-model="specification.loudness" max="0" /> 71 <input type="number" ng-model="specification.loudness" max="0" placeholder="{{placeholder('loudness')}}" />
69 </div> 72 </div>
70 <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."> 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.">
71 <span>Fixed Sampling Rate: </span> 74 <span>Fixed Sampling Rate: </span>
72 <input type="number" ng-model="specification.sampleRate" min="0" /> 75 <input type="number" ng-model="specification.sampleRate" min="0" placeholder="{{placeholder('sampleRate')}}" />
73 </div> 76 </div>
74 <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."> 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.">
75 <span>Pre-Test audio calibration: </span> 78 <span>Pre-Test audio calibration: </span>
76 <input type="checkbox" ng-model="specification.calibration" /> 79 <input type="checkbox" ng-model="specification.calibration" />
77 </div> 80 </div>
78 <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"> 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">
79 <span>Global Cross-fade time: </span> 82 <span>Global Cross-fade time: </span>
80 <input type="number" ng-model="specification.crossFade" min="0" step="0.1" /> 83 <input type="number" ng-model="specification.crossFade" min="0" step="0.1" placeholder="{{placeholder('crossFade')}}" />
81 </div> 84 </div>
82 <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"> 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">
83 <span>Global Fragment Pre-Silence: </span> 86 <span>Global Fragment Pre-Silence: </span>
84 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" /> 87 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" placeholder="{{placeholder('preSilence')}}" />
85 </div> 88 </div>
86 <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"> 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">
87 <span>Global Fragment Post-Silence: </span> 90 <span>Global Fragment Post-Silence: </span>
88 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" /> 91 <input type="number" ng-model="specification.postSilence" min="0" step="0.1" placeholder="{{placeholder('postSilence')}}" />
89 </div> 92 </div>
90 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio elements"> 93 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio elements">
91 <span>Play audio one-at-a-time: </span> 94 <span>Play audio one-at-a-time: </span>
92 <input type="checkbox" ng-model="specification.playOne" /> 95 <input type="checkbox" ng-model="specification.playOne" />
93 </div> 96 </div>
94 <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"> 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">
95 <span>Minimum number of fragment plays</span> 98 <span>Minimum number of fragment plays</span>
96 <input type="number" ng-model="specification.minNumberPlays" min="0" max="{{specification.maxNumberPlays}}" /> 99 <input type="number" ng-model="specification.minNumberPlays" min="0" max="{{specification.maxNumberPlays}}" placeholder="{{placeholder('minNumberPlays')}}" />
97 </div> 100 </div>
98 <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"> 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">
99 <span>Maximum number of fragment plays</span> 102 <span>Maximum number of fragment plays</span>
100 <input type="number" ng-model="specification.maxNumberPlays" min="{{specification.minNumberPlays || 0}}" /> 103 <input type="number" ng-model="specification.maxNumberPlays" min="{{specification.minNumberPlays || 0}}" placeholder="{{placeholder('maxNumberPlays')}}" />
101 </div> 104 </div>
102 </div> 105 </div>
103 <div class="node"> 106 <div class="node">
104 <h2>Test Completed Message</h2> 107 <h2>Test Completed Message</h2>
105 <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> 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>
138 </div> 141 </div>
139 </div> 142 </div>
140 <div id="globalpresurvey" class="node" ng-controller="survey" ng-init="survey = specification.preTest"> 143 <div id="globalpresurvey" class="node" ng-controller="survey" ng-init="survey = specification.preTest">
141 <h2>Pre Test Survey</h2> 144 <h2>Pre Test Survey</h2>
142 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button> 145 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
143 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption"> 146 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
144 <h3>Survey Entry</h3> 147 <h3>Survey Entry</h3>
145 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button> 148 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
146 <div class="attributes"> 149 <div class="attributes">
147 <div class="attribute"> 150 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
148 <span>Survey Type: </span> 151 <span>Survey Type: </span>
149 <select ng-model="opt.type"> 152 <select ng-model="opt.type">
150 <option value="question">Question</option> 153 <option value="question">Question</option>
151 <option value="radio">Radio</option> 154 <option value="radio">Radio</option>
152 <option value="checkbox">Checkbox</option> 155 <option value="checkbox">Checkbox</option>
155 <option value="slider">Slider</option> 158 <option value="slider">Slider</option>
156 <option value="video">Video</option> 159 <option value="video">Video</option>
157 <option value="youtube">YouTube</option> 160 <option value="youtube">YouTube</option>
158 </select> 161 </select>
159 </div> 162 </div>
160 <div class="attribute"> 163 <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. ">
161 <span>Unique Survey Entry ID:</span> 164 <span>Unique Survey Entry ID:</span>
162 <input type="text" ng-model="opt.id" required/> 165 <input type="text" ng-model="opt.id" required/>
163 </div> 166 </div>
164 <div class="attribute"> 167 <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.">
165 <span>Entry Name:</span> 168 <span>Entry Name:</span>
166 <input type="text" ng-model="opt.name" /> 169 <input type="text" ng-model="opt.name" />
167 </div> 170 </div>
168 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0"> 171 <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.">
169 <span>Mandatory:</span> 172 <span>Mandatory:</span>
170 <input type="checkbox" ng-model="opt.mandatory" /> 173 <input type="checkbox" ng-model="opt.mandatory" />
171 </div> 174 </div>
172 <div class="attribute"> 175 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
173 <span>Minimum Wait Time (s):</span> 176 <span>Minimum Wait Time (s):</span>
174 <input type="number" ng-model="opt.minWait" min="0" /> 177 <input type="number" ng-model="opt.minWait" min="0" />
175 </div> 178 </div>
176 <div class="attribute" ng-show="opt.type == 'question'"> 179 <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.">
177 <span>Box Size:</span> 180 <span>Box Size:</span>
178 <select ng-model="opt.boxsize"> 181 <select ng-model="opt.boxsize">
179 <option value="small">Small</option> 182 <option value="small">Small</option>
180 <option value="normal">Normal</option> 183 <option value="normal">Normal</option>
181 <option value="large">Large</option> 184 <option value="large">Large</option>
182 <option value="huge">Huge</option> 185 <option value="huge">Huge</option>
183 </select> 186 </select>
184 </div> 187 </div>
185 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 188 <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">
186 <span>Minimum Selected:</span> 189 <span>Minimum Selected:</span>
187 <input type="number" ng-model="opt.min" min="0" /> 190 <input type="number" ng-model="opt.min" min="0" />
188 </div> 191 </div>
189 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 192 <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.">
190 <span>Maximum Selected:</span> 193 <span>Maximum Selected:</span>
191 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" /> 194 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
192 </div> 195 </div>
193 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 196 <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">
194 <span>Minimum Value:</span> 197 <span>Minimum Value:</span>
195 <input type="number" ng-model="opt.min" /> 198 <input type="number" ng-model="opt.min" />
196 </div> 199 </div>
197 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 200 <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">
198 <span>Maximum Value:</span> 201 <span>Maximum Value:</span>
199 <input type="number" ng-model="opt.max" /> 202 <input type="number" ng-model="opt.max" />
200 </div> 203 </div>
201 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0"> 204 <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.">
202 <span>Video URL:</span> 205 <span>Video URL:</span>
203 <input type="text" ng-model="opt.url" /> 206 <input type="text" ng-model="opt.url" />
204 </div> 207 </div>
205 </div> 208 </div>
206 <div class="node"> 209 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
207 <h4>Statement</h4> 210 <h4>Statement</h4>
208 <textarea ng-model="opt.statement"></textarea> 211 <textarea ng-model="opt.statement"></textarea>
209 </div> 212 </div>
210 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 213 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
211 <h4>Options</h4> 214 <h4>Options</h4>
269 </div> 272 </div>
270 </div> 273 </div>
271 <div id="globalpostsurvey" class="node" ng-controller="survey" ng-init="survey = specification.postTest"> 274 <div id="globalpostsurvey" class="node" ng-controller="survey" ng-init="survey = specification.postTest">
272 <h2>Post Test Survey</h2> 275 <h2>Post Test Survey</h2>
273 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button> 276 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
274 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption"> 277 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
275 <h3>Survey Entry</h3> 278 <h3>Survey Entry</h3>
276 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button> 279 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
277 <div class="attributes"> 280 <div class="attributes">
278 <div class="attribute"> 281 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
279 <span>Survey Type: </span> 282 <span>Survey Type: </span>
280 <select ng-model="opt.type"> 283 <select ng-model="opt.type">
281 <option value="question">Question</option> 284 <option value="question">Question</option>
282 <option value="radio">Radio</option> 285 <option value="radio">Radio</option>
283 <option value="checkbox">Checkbox</option> 286 <option value="checkbox">Checkbox</option>
286 <option value="slider">Slider</option> 289 <option value="slider">Slider</option>
287 <option value="video">Video</option> 290 <option value="video">Video</option>
288 <option value="youtube">YouTube</option> 291 <option value="youtube">YouTube</option>
289 </select> 292 </select>
290 </div> 293 </div>
291 <div class="attribute"> 294 <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. ">
292 <span>Unique Survey Entry ID:</span> 295 <span>Unique Survey Entry ID:</span>
293 <input type="text" ng-model="opt.id" required/> 296 <input type="text" ng-model="opt.id" required/>
294 </div> 297 </div>
295 <div class="attribute"> 298 <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.">
296 <span>Entry Name:</span> 299 <span>Entry Name:</span>
297 <input type="text" ng-model="opt.name" /> 300 <input type="text" ng-model="opt.name" />
298 </div> 301 </div>
299 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0"> 302 <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.">
300 <span>Mandatory:</span> 303 <span>Mandatory:</span>
301 <input type="checkbox" ng-model="opt.mandatory" /> 304 <input type="checkbox" ng-model="opt.mandatory" />
302 </div> 305 </div>
303 <div class="attribute"> 306 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
304 <span>Minimum Wait Time (s):</span> 307 <span>Minimum Wait Time (s):</span>
305 <input type="number" ng-model="opt.minWait" min="0" /> 308 <input type="number" ng-model="opt.minWait" min="0" />
306 </div> 309 </div>
307 <div class="attribute" ng-show="opt.type == 'question'"> 310 <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.">
308 <span>Box Size:</span> 311 <span>Box Size:</span>
309 <select ng-model="opt.boxsize"> 312 <select ng-model="opt.boxsize">
310 <option value="small">Small</option> 313 <option value="small">Small</option>
311 <option value="normal">Normal</option> 314 <option value="normal">Normal</option>
312 <option value="large">Large</option> 315 <option value="large">Large</option>
313 <option value="huge">Huge</option> 316 <option value="huge">Huge</option>
314 </select> 317 </select>
315 </div> 318 </div>
316 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 319 <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">
317 <span>Minimum Selected:</span> 320 <span>Minimum Selected:</span>
318 <input type="number" ng-model="opt.min" min="0" /> 321 <input type="number" ng-model="opt.min" min="0" />
319 </div> 322 </div>
320 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 323 <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.">
321 <span>Maximum Selected:</span> 324 <span>Maximum Selected:</span>
322 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" /> 325 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
323 </div> 326 </div>
324 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 327 <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">
325 <span>Minimum Value:</span> 328 <span>Minimum Value:</span>
326 <input type="number" ng-model="opt.min" /> 329 <input type="number" ng-model="opt.min" />
327 </div> 330 </div>
328 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 331 <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">
329 <span>Maximum Value:</span> 332 <span>Maximum Value:</span>
330 <input type="number" ng-model="opt.max" /> 333 <input type="number" ng-model="opt.max" />
331 </div> 334 </div>
332 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0"> 335 <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.">
333 <span>Video URL:</span> 336 <span>Video URL:</span>
334 <input type="text" ng-model="opt.url" /> 337 <input type="text" ng-model="opt.url" />
335 </div> 338 </div>
336 </div> 339 </div>
337 <div class="node"> 340 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
338 <h4>Statement</h4> 341 <h4>Statement</h4>
339 <textarea ng-model="opt.statement"></textarea> 342 <textarea ng-model="opt.statement"></textarea>
340 </div> 343 </div>
341 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 344 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
342 <h4>Options</h4> 345 <h4>Options</h4>
401 </div> 404 </div>
402 <div id="globalinterface" class="node" ng-controller="interfaceNode" ng-init="interface = specification.interfaces"> 405 <div id="globalinterface" class="node" ng-controller="interfaceNode" ng-init="interface = specification.interfaces">
403 <h2>Interface (Globals)</h2> 406 <h2>Interface (Globals)</h2>
404 <div class="node interfaceOptions"> 407 <div class="node interfaceOptions">
405 <div class="attributes"> 408 <div class="attributes">
406 <div class="attribute" name="fragmentPlayed" type="check"> 409 <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">
407 <span>Check all fragments played: </span> 410 <span>Check all fragments played: </span>
408 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 411 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
409 </div> 412 </div>
410 <div class="attribute" name="fragmentFullPlayback" type="check"> 413 <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.">
411 <span>Check all fragments fully played: </span> 414 <span>Check all fragments fully played: </span>
412 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 415 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
413 </div> 416 </div>
414 <div class="attribute" name="fragmentMoved" type="check"> 417 <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">
415 <span>Check all fragments have been moved: </span> 418 <span>Check all fragments have been moved: </span>
416 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 419 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
417 </div> 420 </div>
418 <div class="attribute" name="fragmentComments" type="check"> 421 <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.">
419 <span>Check all fragments have comments: </span> 422 <span>Check all fragments have comments: </span>
420 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 423 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
421 </div> 424 </div>
422 <div class="attribute" name="scalerange" type="check"> 425 <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.">
423 <span>Enforce a scale usage: </span> 426 <span>Enforce a scale usage: </span>
424 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 427 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
425 <span>Minimum:</span> 428 <span>Minimum:</span>
426 <input type="number" min="0" max="100" name="min" /> 429 <input type="number" min="0" max="100" name="min" />
427 <span>Maximum:</span> 430 <span>Maximum:</span>
428 <input type="number" min="0" max="100" name="max" /> 431 <input type="number" min="0" max="100" name="max" />
429 </div> 432 </div>
430 <div class="attribute" name="volume" type="show"> 433 <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.">
431 <span>Show master volume control: </span> 434 <span>Show master volume control: </span>
432 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 435 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
433 </div> 436 </div>
434 <div class="attribute" name="playhead" type="show"> 437 <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.">
435 <span>Show playhead: </span> 438 <span>Show playhead: </span>
436 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 439 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
437 </div> 440 </div>
438 <div class="attribute" name="page-count" type="show"> 441 <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.">
439 <span>Show Page Count: </span> 442 <span>Show Page Count: </span>
440 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 443 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
441 </div> 444 </div>
442 <div class="attribute" name="comments" type="show"> 445 <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.">
443 <span>Show Fragment Comments: </span> 446 <span>Show Fragment Comments: </span>
444 <input type="checkbox" ng-click="enableInterfaceOption($event)" /> 447 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
445 </div> 448 </div>
446 </div> 449 </div>
447 </div> 450 </div>
465 <div class="attribute"> 468 <div class="attribute">
466 <span>Randomise Fragment Order: </span> 469 <span>Randomise Fragment Order: </span>
467 <input type="checkbox" ng-model="page.randomiseOrder" /> 470 <input type="checkbox" ng-model="page.randomiseOrder" />
468 </div> 471 </div>
469 <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."> 472 <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.">
470 <span>Repeat Page N-times: </span> 473 <span>Numer of repetitions: </span>
471 <input type="number" ng-model="page.repeatCount" value="0" step="1" /> 474 <input type="number" ng-model="page.repeatCount" value="0" step="1" placeholder="{{placeholder('repeatCount')}}" />
472 </div> 475 </div>
473 <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"> 476 <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">
474 <span>Loop audio: </span> 477 <span>Loop audio: </span>
475 <input type="checkbox" ng-model="page.loop" /> 478 <input type="checkbox" ng-model="page.loop" />
476 </div> 479 </div>
478 <span>Synchronous audio playback: </span> 481 <span>Synchronous audio playback: </span>
479 <input type="checkbox" ng-model="page.synchronous" /> 482 <input type="checkbox" ng-model="page.synchronous" />
480 </div> 483 </div>
481 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global loudness normalisation"> 484 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global loudness normalisation">
482 <span>Loudness (page): </span> 485 <span>Loudness (page): </span>
483 <input type="number" ng-model="page.loudness" max="0" /> 486 <input type="number" ng-model="page.loudness" max="0" placeholder="{{specification.loudness || placeholder('loudness')}}" />
484 </div> 487 </div>
485 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Label type to display on the fragments."> 488 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Label type to display on the fragments.">
486 <span>Label type: </span> 489 <span>Label type: </span>
487 <select ng-model="page.label"> 490 <select ng-model="page.label">
488 <option value="default">Default</option> 491 <option value="default">Default</option>
497 <span>Label Start: </span> 500 <span>Label Start: </span>
498 <input type="text" ng-model="page.labelStart" /> 501 <input type="text" ng-model="page.labelStart" />
499 </div> 502 </div>
500 <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."> 503 <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.">
501 <span>Fragment pool size: </span> 504 <span>Fragment pool size: </span>
502 <input type="number" ng-model="page.poolSize" min="0" max="page.audioElements.length" /> 505 <input type="number" ng-model="page.poolSize" min="0" max="page.audioElements.length" placeholder="{{placeholder('poolSize')}}" />
503 </div> 506 </div>
504 <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"> 507 <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">
505 <span>Always include page: </span> 508 <span>Always include page: </span>
506 <input type="checkbox" ng-model="page.alwaysInclude" /> 509 <input type="checkbox" ng-model="page.alwaysInclude" />
507 </div> 510 </div>
509 <span>Fixed Page Position: </span> 512 <span>Fixed Page Position: </span>
510 <input type="number" ng-model="page.position" min="0" max="{{specification.pages.length}}" /> 513 <input type="number" ng-model="page.position" min="0" max="{{specification.pages.length}}" />
511 </div> 514 </div>
512 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global pre-silence"> 515 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global pre-silence">
513 <span>Fragment pre-silence: </span> 516 <span>Fragment pre-silence: </span>
514 <input type="number" ng-model="page.preSilence" min="0" step="0.1" /> 517 <input type="number" ng-model="page.preSilence" min="0" step="0.1" placeholder="{{specification.preSilence || placeholder('preSilence')}}" />
515 </div> 518 </div>
516 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global post-silence"> 519 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global post-silence">
517 <span>Fragment post-silence: </span> 520 <span>Fragment post-silence: </span>
518 <input type="number" ng-model="page.postSilence" min="0" step="0.1" /> 521 <input type="number" ng-model="page.postSilence" min="0" step="0.1" placeholder="{{specification.postSilence || placeholder('postSilence')}}" />
519 </div> 522 </div>
520 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio"> 523 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio">
521 <span>Cannot interupt audio: </span> 524 <span>Cannot interupt audio: </span>
522 <input type="checkbox" ng-model="page.playOne" /> 525 <input type="checkbox" ng-model="page.playOne" />
523 </div> 526 </div>
525 <span>Only move playing audio: </span> 528 <span>Only move playing audio: </span>
526 <input type="checkbox" ng-model="page.restrictMovement" /> 529 <input type="checkbox" ng-model="page.restrictMovement" />
527 </div> 530 </div>
528 <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"> 531 <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">
529 <span>Minimum number of fragment plays</span> 532 <span>Minimum number of fragment plays</span>
530 <input type="number" ng-model="page.minNumberPlays" min="0" max="{{page.maxNumberPlays || specification.maxNumberPlays}}" /> 533 <input type="number" ng-model="page.minNumberPlays" min="0" max="{{page.maxNumberPlays || specification.maxNumberPlays}}" placeholder="{{specification.minNumberPlays || placeholder('minNumberPlays')}}" />
531 </div> 534 </div>
532 <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"> 535 <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">
533 <span>Maximum number of fragment plays</span> 536 <span>Maximum number of fragment plays</span>
534 <input type="number" ng-model="page.maxNumberPlays" min="{{page.minNumberPlays || specification.minNumberPlays || 0}}" /> 537 <input type="number" ng-model="page.maxNumberPlays" min="{{page.minNumberPlays || specification.minNumberPlays || 0}}" placeholder="{{specification.maxNumberPlays || placeholder('maxNumberPlays')}}" />
535 </div> 538 </div>
536 </div> 539 </div>
537 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the title of the page"> 540 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the title of the page">
538 <h3>Page Title</h3> 541 <h3>Page Title</h3>
539 <textarea ng-model="page.title"></textarea> 542 <textarea ng-model="page.title"></textarea>
546 </p> 549 </p>
547 </div> 550 </div>
548 <div class="node" ng-controller="survey" ng-init="survey = page.preTest"> 551 <div class="node" ng-controller="survey" ng-init="survey = page.preTest">
549 <h2>Pre Page Survey</h2> 552 <h2>Pre Page Survey</h2>
550 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button> 553 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
551 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption"> 554 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
552 <h3>Survey Entry</h3> 555 <h3>Survey Entry</h3>
553 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button> 556 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
554 <div class="attributes"> 557 <div class="attributes">
555 <div class="attribute"> 558 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
556 <span>Survey Type: </span> 559 <span>Survey Type: </span>
557 <select ng-model="opt.type"> 560 <select ng-model="opt.type">
558 <option value="question">Question</option> 561 <option value="question">Question</option>
559 <option value="radio">Radio</option> 562 <option value="radio">Radio</option>
560 <option value="checkbox">Checkbox</option> 563 <option value="checkbox">Checkbox</option>
563 <option value="slider">Slider</option> 566 <option value="slider">Slider</option>
564 <option value="video">Video</option> 567 <option value="video">Video</option>
565 <option value="youtube">YouTube</option> 568 <option value="youtube">YouTube</option>
566 </select> 569 </select>
567 </div> 570 </div>
568 <div class="attribute"> 571 <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. ">
569 <span>Unique Survey Entry ID:</span> 572 <span>Unique Survey Entry ID:</span>
570 <input type="text" ng-model="opt.id" required/> 573 <input type="text" ng-model="opt.id" required/>
571 </div> 574 </div>
572 <div class="attribute"> 575 <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.">
573 <span>Entry Name:</span> 576 <span>Entry Name:</span>
574 <input type="text" ng-model="opt.name" /> 577 <input type="text" ng-model="opt.name" />
575 </div> 578 </div>
576 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0"> 579 <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.">
577 <span>Mandatory:</span> 580 <span>Mandatory:</span>
578 <input type="checkbox" ng-model="opt.mandatory" /> 581 <input type="checkbox" ng-model="opt.mandatory" />
579 </div> 582 </div>
580 <div class="attribute"> 583 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
581 <span>Minimum Wait Time (s):</span> 584 <span>Minimum Wait Time (s):</span>
582 <input type="number" ng-model="opt.minWait" min="0" /> 585 <input type="number" ng-model="opt.minWait" min="0" />
583 </div> 586 </div>
584 <div class="attribute" ng-show="opt.type == 'question'"> 587 <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.">
585 <span>Box Size:</span> 588 <span>Box Size:</span>
586 <select ng-model="opt.boxsize"> 589 <select ng-model="opt.boxsize">
587 <option value="small">Small</option> 590 <option value="small">Small</option>
588 <option value="normal">Normal</option> 591 <option value="normal">Normal</option>
589 <option value="large">Large</option> 592 <option value="large">Large</option>
590 <option value="huge">Huge</option> 593 <option value="huge">Huge</option>
591 </select> 594 </select>
592 </div> 595 </div>
593 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 596 <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">
594 <span>Minimum Selected:</span> 597 <span>Minimum Selected:</span>
595 <input type="number" ng-model="opt.min" min="0" /> 598 <input type="number" ng-model="opt.min" min="0" />
596 </div> 599 </div>
597 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 600 <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.">
598 <span>Maximum Selected:</span> 601 <span>Maximum Selected:</span>
599 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" /> 602 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
600 </div> 603 </div>
601 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 604 <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">
602 <span>Minimum Value:</span> 605 <span>Minimum Value:</span>
603 <input type="number" ng-model="opt.min" /> 606 <input type="number" ng-model="opt.min" />
604 </div> 607 </div>
605 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 608 <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">
606 <span>Maximum Value:</span> 609 <span>Maximum Value:</span>
607 <input type="number" ng-model="opt.max" /> 610 <input type="number" ng-model="opt.max" />
608 </div> 611 </div>
609 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0"> 612 <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.">
610 <span>Video URL:</span> 613 <span>Video URL:</span>
611 <input type="text" ng-model="opt.url" /> 614 <input type="text" ng-model="opt.url" />
612 </div> 615 </div>
613 </div> 616 </div>
614 <div class="node"> 617 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
615 <h4>Statement</h4> 618 <h4>Statement</h4>
616 <textarea ng-model="opt.statement"></textarea> 619 <textarea ng-model="opt.statement"></textarea>
617 </div> 620 </div>
618 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 621 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
619 <h4>Options</h4> 622 <h4>Options</h4>
677 </div> 680 </div>
678 </div> 681 </div>
679 <div class="node" ng-controller="survey" ng-init="survey = page.postTest"> 682 <div class="node" ng-controller="survey" ng-init="survey = page.postTest">
680 <h2>Post Page Survey</h2> 683 <h2>Post Page Survey</h2>
681 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button> 684 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
682 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption"> 685 <div class="node surveyentry" ng-repeat="opt in survey.options" ng-controller="surveyOption">
683 <h3>Survey Entry</h3> 686 <h3>Survey Entry</h3>
684 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button> 687 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
685 <div class="attributes"> 688 <div class="attributes">
686 <div class="attribute"> 689 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Type of survey entry.">
687 <span>Survey Type: </span> 690 <span>Survey Type: </span>
688 <select ng-model="opt.type"> 691 <select ng-model="opt.type">
689 <option value="question">Question</option> 692 <option value="question">Question</option>
690 <option value="radio">Radio</option> 693 <option value="radio">Radio</option>
691 <option value="checkbox">Checkbox</option> 694 <option value="checkbox">Checkbox</option>
694 <option value="slider">Slider</option> 697 <option value="slider">Slider</option>
695 <option value="video">Video</option> 698 <option value="video">Video</option>
696 <option value="youtube">YouTube</option> 699 <option value="youtube">YouTube</option>
697 </select> 700 </select>
698 </div> 701 </div>
699 <div class="attribute"> 702 <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. ">
700 <span>Unique Survey Entry ID:</span> 703 <span>Unique Survey Entry ID:</span>
701 <input type="text" ng-model="opt.id" required /> 704 <input type="text" ng-model="opt.id" required/>
702 </div> 705 </div>
703 <div class="attribute"> 706 <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.">
704 <span>Entry Name:</span> 707 <span>Entry Name:</span>
705 <input type="text" ng-model="opt.name" /> 708 <input type="text" ng-model="opt.name" />
706 </div> 709 </div>
707 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0"> 710 <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.">
708 <span>Mandatory:</span> 711 <span>Mandatory:</span>
709 <input type="checkbox" ng-model="opt.mandatory" /> 712 <input type="checkbox" ng-model="opt.mandatory" />
710 </div> 713 </div>
711 <div class="attribute"> 714 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum time in seconds before continuing.">
712 <span>Minimum Wait Time (s):</span> 715 <span>Minimum Wait Time (s):</span>
713 <input type="number" ng-model="opt.minWait" min="0" /> 716 <input type="number" ng-model="opt.minWait" min="0" />
714 </div> 717 </div>
715 <div class="attribute" ng-show="opt.type == 'question'"> 718 <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.">
716 <span>Box Size:</span> 719 <span>Box Size:</span>
717 <select ng-model="opt.boxsize"> 720 <select ng-model="opt.boxsize">
718 <option value="small">Small</option> 721 <option value="small">Small</option>
719 <option value="normal">Normal</option> 722 <option value="normal">Normal</option>
720 <option value="large">Large</option> 723 <option value="large">Large</option>
721 <option value="huge">Huge</option> 724 <option value="huge">Huge</option>
722 </select> 725 </select>
723 </div> 726 </div>
724 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 727 <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">
725 <span>Minimum Selected:</span> 728 <span>Minimum Selected:</span>
726 <input type="number" ng-model="opt.min" min="0" /> 729 <input type="number" ng-model="opt.min" min="0" />
727 </div> 730 </div>
728 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 731 <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.">
729 <span>Maximum Selected:</span> 732 <span>Maximum Selected:</span>
730 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" /> 733 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
731 </div> 734 </div>
732 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 735 <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">
733 <span>Minimum Value:</span> 736 <span>Minimum Value:</span>
734 <input type="number" ng-model="opt.min" /> 737 <input type="number" ng-model="opt.min" />
735 </div> 738 </div>
736 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0"> 739 <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">
737 <span>Maximum Value:</span> 740 <span>Maximum Value:</span>
738 <input type="number" ng-model="opt.max" /> 741 <input type="number" ng-model="opt.max" />
739 </div> 742 </div>
740 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0"> 743 <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.">
741 <span>Video URL:</span> 744 <span>Video URL:</span>
742 <input type="text" ng-model="opt.url" /> 745 <input type="text" ng-model="opt.url" />
743 </div> 746 </div>
744 </div> 747 </div>
745 <div class="node"> 748 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Statement / Question to pose to the subject.">
746 <h4>Statement</h4> 749 <h4>Statement</h4>
747 <textarea ng-model="opt.statement"></textarea> 750 <textarea ng-model="opt.statement"></textarea>
748 </div> 751 </div>
749 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0"> 752 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
750 <h4>Options</h4> 753 <h4>Options</h4>
806 </div> 809 </div>
807 </div> 810 </div>
808 </div> 811 </div>
809 </div> 812 </div>
810 <button type="button" class="btn btn-success" ng-show="specification.interface == 'APE' || page.interfaces.length == 0" ng-click="addInterface()">Add Interface/Axis</button> 813 <button type="button" class="btn btn-success" ng-show="specification.interface == 'APE' || page.interfaces.length == 0" ng-click="addInterface()">Add Interface/Axis</button>
811 <div class="node" ng-repeat="interface in page.interfaces" ng-controller="interfaceNode"> 814 <div class="node interface" ng-repeat="interface in page.interfaces" ng-controller="interfaceNode">
812 <h2>Interface</h2> 815 <h2>Interface</h2>
813 <button type="button" class="btn btn-danger" ng-click="removeInterface(interface)">Remove Interface/Axis</button> 816 <button type="button" class="btn btn-danger" ng-click="removeInterface(interface)">Remove Interface/Axis</button>
814 <div class="node interfaceOptions"> 817 <div class="node interfaceOptions">
815 <div class="attributes"> 818 <div class="attributes">
816 <div class="attribute" name="fragmentPlayed" type="check"> 819 <div class="attribute" name="fragmentPlayed" type="check">
953 </div> 956 </div>
954 </div> 957 </div>
955 </div> 958 </div>
956 </div> 959 </div>
957 <button type="button" class="btn btn-success" ng-click="addAudioElement()">Add Fragment</button> 960 <button type="button" class="btn btn-success" ng-click="addAudioElement()">Add Fragment</button>
958 <div class="node" ng-repeat="fragment in page.audioElements"> 961 <div class="node audioelement" ng-repeat="fragment in page.audioElements">
959 <h3>Audio Fragment</h3> 962 <h3>Audio Fragment</h3>
960 <button type="button" class="btn btn-danger" ng-click="removeAudioElement(fragment)">Remove Fragment</button> 963 <button type="button" class="btn btn-danger" ng-click="removeAudioElement(fragment)">Remove Fragment</button>
961 <div class="attributes"> 964 <div class="attributes">
962 <div class="attribute"> 965 <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">
963 <span>Unique ID: </span> 966 <span>Unique ID: </span>
964 <input type="text" ng-model="fragment.id" required/> 967 <input type="text" ng-model="fragment.id" required/>
965 </div> 968 </div>
966 <div class="attribute"> 969 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="URL of the fragment.">
967 <span>URL: </span> 970 <span>URL: </span>
968 <input type="text" ng-model="fragment.url" required/> 971 <input type="text" ng-model="fragment.url" required/>
969 <span>Full URL: </span><span style="font-weight=600">{{page.hostURL}}{{fragment.url}}</span> 972 <span>Full URL: </span><span style="font-weight=600">{{page.hostURL}}{{fragment.url}}</span>
970 </div> 973 </div>
971 <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"> 974 <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">
989 <option value="outside-reference">Outside Reference</option> 992 <option value="outside-reference">Outside Reference</option>
990 </select> 993 </select>
991 </div> 994 </div>
992 <div class="attribute" ng-show="fragment.type == 'anchor'"> 995 <div class="attribute" ng-show="fragment.type == 'anchor'">
993 <span>Anchor must be below: </span> 996 <span>Anchor must be below: </span>
994 <input type="number" ng-model="fragment.marker" min="0" max="100" /> 997 <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." />
995 </div> 998 </div>
996 <div class="attribute" ng-show="fragment.type == 'reference'"> 999 <div class="attribute" ng-show="fragment.type == 'reference'">
997 <span>Reference must be above: </span> 1000 <span>Reference must be above: </span>
998 <input type="number" ng-model="fragment.marker" min="0" max="100" /> 1001 <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." />
999 </div> 1002 </div>
1000 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global and page loudness"> 1003 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global and page loudness">
1001 <span>Loudness: </span> 1004 <span>Loudness: </span>
1002 <input type="number" ng-model="fragment.loudness" max="0" /> 1005 <input type="number" ng-model="fragment.loudness" max="0" placeholder="{{page.loudness || specification.loudness || ''}}" />
1003 </div> 1006 </div>
1004 <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"> 1007 <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">
1005 <span>Always include fragment: </span> 1008 <span>Always include fragment: </span>
1006 <input type="checkbox" ng-model="fragment.alwaysInclude" max="0" /> 1009 <input type="checkbox" ng-model="fragment.alwaysInclude" max="0" />
1007 </div> 1010 </div>
1042 </div> 1045 </div>
1043 </div> 1046 </div>
1044 <div id="popupHolder" ng-show="popupVisible"> 1047 <div id="popupHolder" ng-show="popupVisible">
1045 <div ng-controller="introduction" class="popup" ng-show="popupVisible"> 1048 <div ng-controller="introduction" class="popup" ng-show="popupVisible">
1046 <div class="popupTitle" ng-switch="state"> 1049 <div class="popupTitle" ng-switch="state">
1047 <span ng-switch-when="0">Test Creator</span> 1050 <span ng-switch-when="0">Test Creator <span class="label label-primary">v1.2.2</span></span>
1048 <span ng-switch-when="1">Create New Test</span> 1051 <span ng-switch-when="1">Create New Test</span>
1049 </div> 1052 </div>
1050 <div class="popupContent container-fluid" ng-switch="state"> 1053 <div class="popupContent container-fluid" ng-switch="state">
1051 <div ng-switch-when="0"> 1054 <div ng-switch-when="0">
1052 <div> 1055 <div>
1053 <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.1 version.</span> 1056 <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>
1054 </div> 1057 </div>
1055 <div> 1058 <div>
1056 <input type="file" id="files" ng-model="files" onchange="handleFiles(event)" /> 1059 <input type="file" id="files" ng-model="files" onchange="handleFiles(event)" />
1057 </div> 1060 </div>
1058 </div> 1061 </div>
1060 <div> 1063 <div>
1061 <span>Please select the interface you would like to use below. Selecting an interface will give a brief description of the interface type.</span> 1064 <span>Please select the interface you would like to use below. Selecting an interface will give a brief description of the interface type.</span>
1062 </div> 1065 </div>
1063 <div class="row"> 1066 <div class="row">
1064 <div class="col-md-6" style="overflow-y: scroll;height: 333px;"> 1067 <div class="col-md-6" style="overflow-y: scroll;height: 333px;">
1065 <div class="new-test" ng-repeat="i in testSpecifications.interfaces" ng-mouseover="mouseover(i.name)" ng-click="initialise(i.name)"> 1068 <div class="new-test" ng-repeat="i in testSpecifications.interfaces" ng-mouseover="mouseover(i.name)" ng-click="select(i.name)">
1066 <label style="cursor:pointer"> 1069 <label style="cursor:pointer">
1067 <input type="radio" name="new-test" value="{{i.name}}" id="i.name" style="cursor:pointer" /> {{i.name}} 1070 <input type="radio" name="new-test" value="{{i.name}}" id="i.name" style="cursor:pointer" /> {{i.name}}
1068 </label> 1071 </label>
1069 </div> 1072 </div>
1070 </div> 1073 </div>