Mercurial > hg > webaudioevaluationtool
comparison test_create/test_create_advanced.html @ 1118:3edcbbea168b
Added schema for Test Specification Document for validation (wip)
author | Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk> |
---|---|
date | Wed, 23 Dec 2015 12:41:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 1118:3edcbbea168b |
---|---|
1 <!DOCTYPE html> | |
2 <html lang="en"> | |
3 <head> | |
4 <meta charset="utf-8"> | |
5 | |
6 <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame | |
7 Remove this if you use the .htaccess --> | |
8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | |
9 | |
10 <title>test_create_2</title> | |
11 <meta name="description" content=""> | |
12 <meta name="author" content="Nicholas"> | |
13 | |
14 <meta name="viewport" content="width=device-width; initial-scale=1.0"> | |
15 | |
16 <script type="text/javascript"> | |
17 window.onload = function() { | |
18 var dropBody = document.getElementById('dragFile'); | |
19 dropBody.addEventListener('dragover', handleDragOver, false); | |
20 dropBody.addEventListener('dragenter',handleDragEnter,false); | |
21 dropBody.addEventListener('dragleave',handleDragLeave,false); | |
22 dropBody.addEventListener('drop', handleDrop,false); | |
23 }; | |
24 | |
25 function handleDragOver(e) { | |
26 e.stopPropagation(); | |
27 e.preventDefault(); | |
28 } | |
29 function handleDragEnter(e) { | |
30 e.stopPropagation(); | |
31 e.preventDefault(); | |
32 this.style.backgroundColor = '#AAFFAA'; | |
33 } | |
34 function handleDragLeave(e) { | |
35 e.stopPropagation(); | |
36 e.preventDefault(); | |
37 this.style.backgroundColor = "#FFFFFF"; | |
38 } | |
39 function handleDrop(e) { | |
40 e.stopPropagation(); | |
41 e.preventDefault(); | |
42 | |
43 var file = e.dataTransfer.files[0]; | |
44 | |
45 // Uses HTML5 FileAPI - https://w3c.github.io/FileAPI/#filereader-interface | |
46 var reader = new FileReader(); | |
47 reader.onload = function() { | |
48 var parse = new DOMParser(); | |
49 var xml = parse.parseFromString(reader.result,'text/xml'); | |
50 importXML(xml); | |
51 }; | |
52 reader.readAsText(file); | |
53 | |
54 } | |
55 | |
56 function removeNode(event) { | |
57 event.srcElement.parentElement.parentElement.removeChild(event.srcElement.parentElement); | |
58 } | |
59 | |
60 function removeNodeButton() | |
61 { | |
62 var button = document.createElement('button'); | |
63 button.textContent = 'Remove'; | |
64 button.onclick = function(event){removeNode(event);}; | |
65 return button; | |
66 } | |
67 | |
68 function attributePair(type,text,name,mandatory) | |
69 { | |
70 var node = document.createElement('div'); | |
71 node.setAttribute('name','attribute'); | |
72 var span = document.createElement('span'); | |
73 span.textContent = text; | |
74 var input = document.createElement('input'); | |
75 input.type = type; | |
76 input.setAttribute('attrib-name',name); | |
77 input.setAttribute('mandatory',mandatory); | |
78 node.appendChild(span); | |
79 node.appendChild(input); | |
80 return node; | |
81 } | |
82 | |
83 function buttonClickedValidate() | |
84 { | |
85 var allInputs = document.getElementsByTagName('input'); | |
86 for (var i=0; i<allInputs.length; i++) | |
87 {goodNode(allInputs[i]);} | |
88 var errList = document.getElementById('errorMessage'); | |
89 errList.innerHTML = ""; | |
90 validate(document.getElementById('topLevelBody')); | |
91 var submit = document.getElementById('createXML'); | |
92 if (errList.innerHTML == "") | |
93 {submit.disabled = false;} | |
94 else {submit.disabled = true;} | |
95 } | |
96 | |
97 function validate(node) | |
98 { | |
99 var name = node.getAttribute('name'); | |
100 if (name != 'attribute' && name != 'element') { | |
101 var child = node.children; | |
102 for (var i=0; i<node.childElementCount; i++) | |
103 { | |
104 if (child[i].nodeName == "DIV") | |
105 { | |
106 validate(child[i]); | |
107 } | |
108 } | |
109 } else if (name == 'attribute') | |
110 { | |
111 var child = node.children; | |
112 for (var i=0; i<node.childElementCount; i++) | |
113 { | |
114 if (child[i].nodeName == "INPUT") | |
115 { | |
116 var mandatory = child[i].getAttribute('mandatory'); | |
117 if (mandatory == 'true') {mandatory = true;} | |
118 else {mandatory = false;} | |
119 if (child[i].type =='text' || child[i].type =='number') | |
120 { | |
121 if (child[i].value.length == 0) | |
122 { | |
123 if (mandatory == true) {errorNode(child[i]);} | |
124 else {warningNode(child[i]);} | |
125 } else {goodNode(child[i]);} | |
126 } | |
127 } | |
128 } | |
129 } else if (name == 'element') | |
130 { | |
131 var child = node.children; | |
132 for (var i=0; i<node.childElementCount; i++) | |
133 { | |
134 if (child[i].nodeName == "INPUT") | |
135 { | |
136 if (child[i].value.length == 0){warningNode(child[i]);} | |
137 else {goodNode(child[i]);} | |
138 } | |
139 } | |
140 } | |
141 } | |
142 | |
143 function buttonClickedSubmit() | |
144 { | |
145 var xml = document.createElement('BrowserEvalProjectDocument'); | |
146 var dom = document.getElementById('topLevelBody'); | |
147 xml = extractXML(xml,dom); | |
148 var drop = document.getElementById('errorMessage'); | |
149 createProjectSave(xml,drop); | |
150 } | |
151 | |
152 function createProjectSave(xmlDoc, injectPoint) { | |
153 var parent = document.createElement("div"); | |
154 parent.appendChild(xmlDoc); | |
155 var file = [parent.innerHTML]; | |
156 var bb = new Blob(file,{type : 'application/xml'}); | |
157 var dnlk = window.URL.createObjectURL(bb); | |
158 var a = document.createElement("a"); | |
159 a.hidden = ''; | |
160 a.href = dnlk; | |
161 a.download = "save.xml"; | |
162 a.textContent = "Save File"; | |
163 injectPoint.appendChild(a); | |
164 } | |
165 | |
166 function extractXML(xml,node) | |
167 { | |
168 if(node.getAttribute('class')=='attrib') | |
169 { | |
170 var children = node.children; | |
171 for (var i=0; i<children.length; i++) | |
172 { | |
173 if (children[i].getAttribute('name')=='attribute') | |
174 { | |
175 var input = children[i].children[1]; | |
176 if (input.type == 'checkbox') | |
177 { | |
178 xml.setAttribute(input.getAttribute('attrib-name'),input.checked); | |
179 } else { | |
180 xml.setAttribute(input.getAttribute('attrib-name'),input.value); | |
181 } | |
182 } else if (children[i].getAttribute('name') == 'element') | |
183 { | |
184 var input = children[i].children[1]; | |
185 xml.textContent = input.value; | |
186 } | |
187 } | |
188 return xml; | |
189 } else if (node.getAttribute('node-name') != undefined) | |
190 { | |
191 var xmlDom = document.createElement(node.getAttribute('node-name')); | |
192 xml.appendChild(xmlDom); | |
193 var children = node.children; | |
194 for (var i=0; i<children.length; i++) | |
195 { | |
196 if (children[i].nodeName == "DIV") | |
197 { | |
198 xmlDom = extractXML(xmlDom,children[i]); | |
199 } | |
200 } | |
201 } else { | |
202 var children = node.children; | |
203 for (var i=0; i<children.length; i++) | |
204 { | |
205 if (children[i].nodeName == "DIV") | |
206 { | |
207 xml = extractXML(xml,children[i]); | |
208 } | |
209 } | |
210 } | |
211 return xml; | |
212 } | |
213 | |
214 function goodNode(node) | |
215 {node.style.backgroundColor="#FFFFFF";} | |
216 | |
217 function warningNode(node) | |
218 {node.style.backgroundColor="#FFFF88";} | |
219 | |
220 function errorNode(node) | |
221 { | |
222 var errLog = document.getElementById('errorMessage'); | |
223 var div = document.createElement('div'); | |
224 var span = document.createElement('span'); | |
225 span.textContent = 'Invalid Data: '; | |
226 var list = [node.getAttribute('attrib-name')]; | |
227 var pNode = node; | |
228 while (pNode.id != 'topLevelBody') | |
229 { | |
230 if (pNode.getAttribute('node-name') != undefined) | |
231 {list.push(pNode.getAttribute('node-name'));} | |
232 pNode = pNode.parentElement; | |
233 } | |
234 for (var i=list.length-1; i>=0; i--) | |
235 { | |
236 span.textContent = span.textContent +' ->'+ list[i]; | |
237 } | |
238 div.appendChild(span); | |
239 errLog.appendChild(div); | |
240 errLog.style.visibility = 'visible'; | |
241 node.style.backgroundColor="#FF0000"; | |
242 } | |
243 | |
244 function importXML(xml) | |
245 { | |
246 xml = xml.children[0]; | |
247 var setup = xml.getElementsByTagName('setup')[0]; | |
248 var DOM = document.getElementById('setup'); | |
249 // Insert any setup node attributes | |
250 setAttributes(DOM,setup); | |
251 | |
252 for (var i=0; i<setup.childElementCount; i++) | |
253 { | |
254 var node = DOM.getElementsByClassName(setup.children[i].nodeName); | |
255 if (node.length != 0) | |
256 { | |
257 node = node[0]; | |
258 setAttributes(node,setup.children[i]); | |
259 buildNode(node,setup.children[i]); | |
260 } | |
261 } | |
262 | |
263 var holders = xml.getElementsByTagName('audioHolder'); | |
264 for (var i=0; i<holders.length; i++) | |
265 { | |
266 var node = addAudioHolder(); | |
267 document.getElementById('topLevelBody').appendChild(node); | |
268 setAttributes(node,holders[i]); | |
269 buildNode(node,holders[i]); | |
270 } | |
271 } | |
272 | |
273 function setAttributes(node,xml) | |
274 { | |
275 var attribs = node.getElementsByClassName('attrib'); | |
276 if (attribs.length != 0){ | |
277 attribs = attribs[0]; | |
278 for (var i=0; i < attribs.children.length; i++) | |
279 { | |
280 if(attribs.children[i].getAttribute('name')=='attribute'){ | |
281 var input = attribs.children[i].children[1]; | |
282 var value = xml.attributes.getNamedItem(input.getAttribute('attrib-name')); | |
283 if (value != undefined) {value = value.value;} | |
284 if (input.type == 'checkbox') | |
285 {input.checked = value;} | |
286 else | |
287 {input.value = value;} | |
288 } else if(attribs.children[i].getAttribute('name')=='element'){ | |
289 var input = attribs.children[i].children[1]; | |
290 input.value = xml.textContent; | |
291 } | |
292 } | |
293 } | |
294 } | |
295 | |
296 function buildNode(parent,xml) | |
297 { | |
298 for (var i=0; i<xml.childElementCount; i++) | |
299 { | |
300 var child = xml.children[i]; | |
301 var name = child.nodeName; | |
302 var node = null; | |
303 if (name == 'statement'){node = addPPStatement();} | |
304 else if (name == 'question' || name == 'number'){node = addPPQuestion();} | |
305 else if (name == 'checkbox'){node = addPPCheckbox();} | |
306 else if (name == 'radio'){node = addPPRadio();} | |
307 else if (name == 'metricEnable'){node = addMetricEnable();} | |
308 else if (name == 'check'){node = addInterfaceCheck();} | |
309 else if (name == 'option'){node = addInterfaceOption();} | |
310 else if (name == 'scale'){node = addScaleMarker();} | |
311 else if (name == 'audioHolder'){node = addAudioHolder();} | |
312 else if (name == 'audioElements'){node = addAudioElement();} | |
313 else if (name == 'commentQuestion'){node = addExtraComment();} | |
314 else if (name == 'interface'){node = parent.getElementsByClassName('interface')[0];} | |
315 else if (name == 'preTest' || name == 'PreTest') | |
316 { | |
317 node = parent.getElementsByClassName('preTest')[0]; | |
318 } | |
319 else if (name == 'postTest' || name == 'PostTest') | |
320 { | |
321 node = parent.getElementsByClassName('postTest')[0]; | |
322 } | |
323 else if (name == 'title' || name == 'commentBoxPrefix') | |
324 { | |
325 node = parent.getElementsByClassName(name)[0]; | |
326 } | |
327 if (node != null) { | |
328 if (name == 'radio' || name == 'checkbox') | |
329 { | |
330 buildRadio(node,xml.children[i]); | |
331 parent.appendChild(node); | |
332 } else | |
333 { | |
334 setAttributes(node,child); | |
335 parent.appendChild(node); | |
336 buildNode(node,child); | |
337 } | |
338 } else { | |
339 var node = createHead(name,name,'h3'); | |
340 | |
341 var attrib = document.createElement('div'); | |
342 attrib.className = 'attrib'; | |
343 for (var j=0; j<child.attributes.length; j++) | |
344 { | |
345 attrib.appendChild(attributePair('text',child.attributes[j].name,child.attributes[j].name,false)); | |
346 } | |
347 | |
348 node.appendChild(attrib); | |
349 parent.appendChild(node); | |
350 setAttributes(node,child); | |
351 /* | |
352 buildNode(node,child); | |
353 */ | |
354 } | |
355 } | |
356 } | |
357 | |
358 function buildRadio(node,xml) | |
359 { | |
360 setAttributes(node,xml); | |
361 setAttributes(node.getElementsByClassName('statement')[0],xml.getElementsByTagName('statement')[0]); | |
362 var options = xml.getElementsByTagName('option'); | |
363 var addOptionButton = node.getElementsByTagName('button')[2]; | |
364 for (var i=0; i<options.length; i++) | |
365 { | |
366 addOptionButton.click(); | |
367 setAttributes(node.getElementsByClassName('option')[i],options[i]); | |
368 } | |
369 } | |
370 | |
371 function createHead(name,title,size) | |
372 { | |
373 var node = document.createElement('div'); | |
374 node.setAttribute('class','head '+name); | |
375 node.setAttribute('node-name',name); | |
376 if (size == undefined) | |
377 {var node_T = document.createElement('h3');} | |
378 else{var node_T = document.createElement(size);} | |
379 node_T.textContent = title; | |
380 node.appendChild(node_T); | |
381 node.appendChild(removeNodeButton()); | |
382 return node; | |
383 } | |
384 | |
385 function addPretestNode() | |
386 { | |
387 var node = createHead('preTest', 'Pre Test','h3'); | |
388 var addStatement = document.createElement('button'); | |
389 addStatement.textContent = 'Add Statement'; | |
390 addStatement.onclick = function(){event.srcElement.parentElement.appendChild(addPPStatement());}; | |
391 node.appendChild(addStatement); | |
392 var addQuestion = document.createElement('button'); | |
393 addQuestion.textContent = 'Add Question'; | |
394 addQuestion.onclick = function(){event.srcElement.parentElement.appendChild(addPPQuestion());}; | |
395 node.appendChild(addQuestion); | |
396 var addCheckbox = document.createElement('button'); | |
397 addCheckbox.textContent = 'Add Checkbox'; | |
398 addCheckbox.onclick = function(){event.srcElement.parentElement.appendChild(addPPCheckbox());}; | |
399 node.appendChild(addCheckbox); | |
400 var addRadio = document.createElement('button'); | |
401 addRadio.textContent = 'Add Checkbox'; | |
402 addRadio.onclick = function(){event.srcElement.parentElement.appendChild(addPPRadio());}; | |
403 node.appendChild(addRadio); | |
404 return node; | |
405 }; | |
406 | |
407 function addPosttestNode() | |
408 { | |
409 var node = createHead('postTest', 'Post Test','h3'); | |
410 var addStatement = document.createElement('button'); | |
411 addStatement.textContent = 'Add Statement'; | |
412 addStatement.onclick = function(){event.srcElement.parentElement.appendChild(addPPStatement());}; | |
413 node.appendChild(addStatement); | |
414 var addQuestion = document.createElement('button'); | |
415 addQuestion.textContent = 'Add Question'; | |
416 addQuestion.onclick = function(){event.srcElement.parentElement.appendChild(addPPQuestion());}; | |
417 node.appendChild(addQuestion); | |
418 var addCheckbox = document.createElement('button'); | |
419 addCheckbox.textContent = 'Add Checkbox'; | |
420 addCheckbox.onclick = function(){event.srcElement.parentElement.appendChild(addPPCheckbox());}; | |
421 node.appendChild(addCheckbox); | |
422 var addRadio = document.createElement('button'); | |
423 addRadio.textContent = 'Add Checkbox'; | |
424 addRadio.onclick = function(){event.srcElement.parentElement.appendChild(addPPRadio());}; | |
425 node.appendChild(addRadio); | |
426 return node; | |
427 }; | |
428 | |
429 function addPPStatement() | |
430 { | |
431 var node = createHead('statement', 'Statement','h4'); | |
432 var attrib = document.createElement('div'); | |
433 attrib.className = "attrib"; | |
434 var element = document.createElement('div'); | |
435 element.setAttribute('name','element'); | |
436 var span = document.createElement('span'); | |
437 span.textContent = "Enter statement: "; | |
438 element.appendChild(span); | |
439 var input = document.createElement('input'); | |
440 input.type = "text"; | |
441 input.style.width = "500px"; | |
442 element.appendChild(input); | |
443 attrib.appendChild(element); | |
444 node.appendChild(attrib); | |
445 return node; | |
446 }; | |
447 function addPPQuestion() | |
448 { | |
449 var node = createHead('question', 'Question','h4'); | |
450 var attrib = document.createElement('div'); | |
451 attrib.className = "attrib"; | |
452 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
453 attrib.appendChild(attributePair('checkbox','Mandatory: ','mandatory',false)); | |
454 attrib.appendChild(attributePair('text','Box size: ','boxsize',false)); | |
455 var element = document.createElement('div'); | |
456 element.setAttribute('name','element'); | |
457 var span = document.createElement('span'); | |
458 span.textContent = "Enter Question: "; | |
459 element.appendChild(span); | |
460 var input = document.createElement('input'); | |
461 input.type = "text"; | |
462 input.style.width = "500px"; | |
463 element.appendChild(input); | |
464 attrib.appendChild(element); | |
465 node.appendChild(attrib); | |
466 return node; | |
467 }; | |
468 function addPPCheckbox() | |
469 { | |
470 var node = createHead('checkbox', 'Checkbox','h4'); | |
471 var attrib = document.createElement('div'); | |
472 attrib.className = "attrib"; | |
473 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
474 attrib.appendChild(attributePair('checkbox','Mandatory: ','mandatory',false)); | |
475 node.appendChild(attrib); | |
476 node.appendChild(addPPStatement()); | |
477 var addOption = document.createElement('button'); | |
478 addOption.textContent = 'Add Checkbox'; | |
479 addOption.onclick = function() { | |
480 var node = createHead('option', 'Option','h4'); | |
481 var attrib = document.createElement('div'); | |
482 attrib.className = "attrib"; | |
483 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
484 var element = document.createElement('div'); | |
485 element.setAttribute('name','element'); | |
486 var span = document.createElement('span'); | |
487 span.textContent = "Enter Text: "; | |
488 var input = document.createElement('input'); | |
489 input.type = 'text'; | |
490 element.appendChild(span); | |
491 element.appendChild(input); | |
492 attrib.appendChild(element); | |
493 node.appendChild(attrib); | |
494 event.srcElement.parentElement.appendChild(node); | |
495 }; | |
496 node.appendChild(addOption); | |
497 return node; | |
498 }; | |
499 | |
500 function addPPRadio() | |
501 { | |
502 var node = createHead('radio', 'Radio','h4'); | |
503 var attrib = document.createElement('div'); | |
504 attrib.className = "attrib"; | |
505 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
506 attrib.appendChild(attributePair('checkbox','Mandatory: ','mandatory',false)); | |
507 node.appendChild(attrib); | |
508 node.appendChild(addPPStatement()); | |
509 var addOption = document.createElement('button'); | |
510 addOption.textContent = 'Add Radio'; | |
511 addOption.onclick = function() { | |
512 var node = createHead('option', 'Option','h4'); | |
513 var attrib = document.createElement('div'); | |
514 attrib.className = "attrib"; | |
515 attrib.appendChild(attributePair('text','Name: ','name',true)); | |
516 var element = document.createElement('div'); | |
517 element.setAttribute('name','element'); | |
518 var span = document.createElement('span'); | |
519 span.textContent = "Enter Text: "; | |
520 var input = document.createElement('input'); | |
521 input.type = 'text'; | |
522 element.appendChild(span); | |
523 element.appendChild(input); | |
524 attrib.appendChild(element); | |
525 node.appendChild(attrib); | |
526 event.srcElement.parentElement.appendChild(node); | |
527 }; | |
528 node.appendChild(addOption); | |
529 return node; | |
530 }; | |
531 | |
532 function addMetricEnable() | |
533 { | |
534 var node = createHead('metricEnable', '','h4'); | |
535 var attrib = document.createElement('div'); | |
536 attrib.className = "attrib"; | |
537 var element = document.createElement('div'); | |
538 element.setAttribute('name','element'); | |
539 var span = document.createElement('span'); | |
540 span.textContent = "Enter Metric Name: "; | |
541 element.appendChild(span); | |
542 var input = document.createElement('input'); | |
543 input.type = "text"; | |
544 input.style.width = "500px"; | |
545 element.appendChild(input); | |
546 attrib.appendChild(element); | |
547 node.appendChild(attrib); | |
548 return node; | |
549 }; | |
550 | |
551 function addInterfaceCheck() | |
552 { | |
553 var node = createHead('check', 'Check','h4'); | |
554 var attrib = document.createElement('div'); | |
555 attrib.className = "attrib"; | |
556 attrib.appendChild(attributePair('text','Name','name',true)); | |
557 node.appendChild(attrib); | |
558 return node; | |
559 } | |
560 function addInterfaceOption() | |
561 { | |
562 var node = createHead('option', 'Option','h4'); | |
563 var attrib = document.createElement('div'); | |
564 attrib.className = "attrib"; | |
565 attrib.appendChild(attributePair('text','Name','name',true)); | |
566 node.appendChild(attrib); | |
567 return node; | |
568 } | |
569 | |
570 | |
571 function addAudioHolder() | |
572 { | |
573 var node = createHead('audioHolder','Audio Holder / Test Page','h2'); | |
574 var attrib = document.createElement('div'); | |
575 attrib.className = "attrib"; | |
576 node.appendChild(attrib); | |
577 | |
578 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
579 attrib.appendChild(attributePair('url','Host URL: ','hostURL',false)); | |
580 attrib.appendChild(attributePair('number','Sample Rate: ','sampleRate',false)); | |
581 attrib.appendChild(attributePair('checkbox','Randomise Fragment Order: ','randomiseOrder',false)); | |
582 attrib.appendChild(attributePair('number','Repeat Count: ','repeatCount',false)); | |
583 attrib.appendChild(attributePair('checkbox','Loop Fragments: ','loop',false)); | |
584 attrib.appendChild(attributePair('checkbox','Fragment Comment Boxes: ','enableComments',false)); | |
585 | |
586 node.appendChild(addPretestNode()); | |
587 | |
588 node.appendChild(addPosttestNode()); | |
589 | |
590 var interfaceNode = createHead('interface','Interface','h3'); | |
591 var addOption = document.createElement('button'); | |
592 addOption.textContent = 'Add Option'; | |
593 addOption.onclick = function(){event.srcElement.parentElement.appendChild(addInterfaceOption());}; | |
594 interfaceNode.appendChild(addOption); | |
595 var scale = document.createElement('button'); | |
596 scale.textContent = 'Add scale'; | |
597 scale.onclick = function(){event.srcElement.parentElement.appendChild(addScaleMarker());}; | |
598 interfaceNode.appendChild(scale); | |
599 | |
600 var PageTitle = createHead('title','Page Title','h4'); | |
601 var attrib = document.createElement('div'); | |
602 attrib.className='attrib'; | |
603 var element = document.createElement('div'); | |
604 element.setAttribute('name','element'); | |
605 var span = document.createElement('span'); | |
606 span.textContent = 'Page Title: '; | |
607 element.appendChild(span); | |
608 var input = document.createElement('input'); | |
609 input.type = 'text'; | |
610 input.style.width = "500px"; | |
611 element.appendChild(input); | |
612 attrib.appendChild(element); | |
613 PageTitle.appendChild(attrib); | |
614 interfaceNode.appendChild(PageTitle); | |
615 | |
616 var commentBoxPrefix = createHead('commentBoxPrefix','Comment Box Prefix','h4'); | |
617 var attrib = document.createElement('div'); | |
618 attrib.className='attrib'; | |
619 var element = document.createElement('div'); | |
620 element.setAttribute('name','element'); | |
621 var span = document.createElement('span'); | |
622 span.textContent = 'Prefix: '; | |
623 element.appendChild(span); | |
624 var input = document.createElement('input'); | |
625 input.type = 'text'; | |
626 input.style.width = "500px"; | |
627 element.appendChild(input); | |
628 attrib.appendChild(element); | |
629 commentBoxPrefix.appendChild(attrib); | |
630 interfaceNode.appendChild(commentBoxPrefix); | |
631 | |
632 node.appendChild(interfaceNode); | |
633 | |
634 var addElement = document.createElement('button'); | |
635 addElement.textContent = 'Add Audio Element'; | |
636 addElement.onclick = function(){event.srcElement.parentElement.appendChild(addAudioElement());}; | |
637 node.appendChild(addElement); | |
638 | |
639 var addCQ = document.createElement('button'); | |
640 addCQ.textContent = 'Add Comment Box'; | |
641 addCQ.onclick = function(){event.srcElement.parentElement.appendChild(addExtraComment());}; | |
642 node.appendChild(addCQ); | |
643 | |
644 return node; | |
645 }; | |
646 | |
647 function addScaleMarker(){ | |
648 var node = createHead('scale','Scale','h4'); | |
649 var attrib = document.createElement('div'); | |
650 attrib.className = "attrib"; | |
651 node.appendChild(attrib); | |
652 attrib.appendChild(attributePair('number','Position','position',true)); | |
653 var element = document.createElement('div'); | |
654 element.setAttribute('name','element'); | |
655 var span = document.createElement('span'); | |
656 span.textContent = 'Marker Text (Optional): '; | |
657 element.appendChild(span); | |
658 var input = document.createElement('input'); | |
659 input.type = 'text'; | |
660 element.appendChild(input); | |
661 attrib.appendChild(element); | |
662 return node; | |
663 }; | |
664 | |
665 function addAudioElement() | |
666 { | |
667 var node = createHead('audioElements','Audio Element'); | |
668 var attrib = document.createElement('div'); | |
669 attrib.className = "attrib"; | |
670 node.appendChild(attrib); | |
671 | |
672 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
673 attrib.appendChild(attributePair('text','URL: ','url',true)); | |
674 attrib.appendChild(attributePair('text','Type: ','type',false)); | |
675 | |
676 return node; | |
677 }; | |
678 | |
679 function addExtraComment() | |
680 { | |
681 var node = createHead('CommentQuestion','Comment'); | |
682 var attrib = document.createElement('div'); | |
683 attrib.className = "attrib"; | |
684 node.appendChild(attrib); | |
685 attrib.appendChild(attributePair('text','ID: ','id',true)); | |
686 | |
687 var element = document.createElement('div'); | |
688 element.setAttribute('name','element'); | |
689 var span = document.createElement('span'); | |
690 span.textContent = 'Question: '; | |
691 element.appendChild(span); | |
692 var input = document.createElement('input'); | |
693 input.type = 'text'; | |
694 input.style.width = "500px"; | |
695 element.appendChild(input); | |
696 attrib.appendChild(element); | |
697 return node; | |
698 } | |
699 </script> | |
700 | |
701 <style> | |
702 h4 {margin: 0px;} | |
703 div { | |
704 padding: 2px; | |
705 margin-top: 2px; | |
706 margin-bottom: 2px; | |
707 } | |
708 div.head{ | |
709 margin-left: 10px; | |
710 border: black; | |
711 border-width: 2px; | |
712 border-style: solid; | |
713 } | |
714 div.attrib{ | |
715 margin-left:25px; | |
716 border: black; | |
717 border-width: 2px; | |
718 border-style: dashed; | |
719 margin-bottom: 10px; | |
720 display: table; | |
721 background-color: rgb(200,255,255); | |
722 } | |
723 div.attrib div { | |
724 width: auto; | |
725 position: relative; | |
726 display: table-cell; | |
727 } | |
728 div#dragFile{ | |
729 height:100px; | |
730 border-width: 2px; | |
731 border-style: dashed; | |
732 margin-bottom: 10px; | |
733 } | |
734 </style> | |
735 </head> | |
736 | |
737 <body> | |
738 <h1>Create Test Setup XML</h1> | |
739 <div id="dragFile"> | |
740 <span>Drag and Drop an XML specification file here to auto-load.</span> | |
741 </div> | |
742 <button id="validateXML" onclick="buttonClickedValidate();">Validate</button> | |
743 <button id="createXML" onclick="buttonClickedSubmit();" disabled>Submit</button> | |
744 <div id="errorMessage" visibility="hidden"></div> | |
745 <div id="topLevelBody" align="left"> | |
746 <div id='setup' class="head setup" node-name='setup'> | |
747 <h2>Setup Node</h2> | |
748 <div class="attrib"> | |
749 <div name="attribute"> | |
750 <span>Interface: </span> | |
751 <input type="text" attrib-name='interface' mandatory='true'/> | |
752 </div> | |
753 <div name="attribute"> | |
754 <span>Project Return: </span> | |
755 <input type="url" attrib-name='projectReturn'/> | |
756 </div> | |
757 <div name="attribute"> | |
758 <span>Randomise Page Order: </span> | |
759 <input type="checkbox" attrib-name='randomiseOrder'/> | |
760 </div> | |
761 <div name="attribute"> | |
762 <span>Collect Metrics: </span> | |
763 <input type="checkbox" attrib-name='collectMetrics'/> | |
764 </div> | |
765 </div> | |
766 <div class="head PreTest" node-name="preTest"> | |
767 <h3>Pre Test</h3> | |
768 <button onclick="event.srcElement.parentElement.appendChild(addPPStatement());">Add Statement</button> | |
769 <button onclick="event.srcElement.parentElement.appendChild(addPPQuestion());">Add Question</button> | |
770 <button onclick="event.srcElement.parentElement.appendChild(addPPCheckbox());">Add Checkbox</button> | |
771 <button onclick="event.srcElement.parentElement.appendChild(addPPRadio());">Add Radio</button> | |
772 </div> | |
773 <div class="head PostTest" node-name="postTest"> | |
774 <h3>Post Test</h3> | |
775 <button onclick="event.srcElement.parentElement.appendChild(addPPStatement());">Add Statement</button> | |
776 <button onclick="event.srcElement.parentElement.appendChild(addPPQuestion());">Add Question</button> | |
777 <button onclick="event.srcElement.parentElement.appendChild(addPPCheckbox());">Add Checkbox</button> | |
778 <button onclick="event.srcElement.parentElement.appendChild(addPPRadio());">Add Radio</button> | |
779 </div> | |
780 <div class="head Metric" node-name="metrics"> | |
781 <h3>Metrics</h3> | |
782 <button onclick="event.srcElement.parentElement.appendChild(addMetricEnable());">Add Metric Enable</button> | |
783 </div> | |
784 <div class="head interface" node-name="interface"> | |
785 <h3>Interface</h3> | |
786 <button onclick="event.srcElement.parentElement.appendChild(addInterfaceCheck());">Add Check</button> | |
787 <button onclick="event.srcElement.parentElement.appendChild(addInterfaceOption());">Add Option</button> | |
788 </div> | |
789 </div> | |
790 <button onclick="event.srcElement.parentElement.appendChild(addAudioHolder());">Add Audio Holder</button> | |
791 </div> | |
792 </body> | |
793 </html> |