annotate test_create/test_create.html @ 902:4041e5abcde5

Feature #1208: Added checkbox. Bug-fix on console debug lines not showing question of survery.
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Mon, 08 Jun 2015 11:17:26 +0100
parents 573810a04b0f
children 907abe027ebc
rev   line source
n@901 1 <!DOCTYPE html>
n@901 2 <html lang="en">
n@901 3 <head>
n@901 4 <meta charset="utf-8">
n@901 5
n@901 6 <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
n@901 7 Remove this if you use the .htaccess -->
n@901 8 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
n@901 9
n@901 10 <title>WAET Create Test</title>
n@901 11 <meta name="description" content="">
n@901 12 <meta name="author" content="">
n@901 13
n@901 14 <meta name="viewport" content="width=device-width; initial-scale=1.0">
n@901 15
n@901 16 <script type="text/javascript">
n@901 17 // To aid 'one-page set-up' all scripts and CSS must be included directly in this file!
n@901 18 var topLevel;
n@901 19 window.onload = function() {
n@901 20 // Initialise page
n@901 21 topLevel = document.getElementById('topLevelBody');
n@901 22 var setup = document.createElement('div');
n@901 23 setup.id = 'setupTagDiv';
n@901 24
n@901 25 // Setup drag/drop handles
n@901 26 var dropBody = document.getElementById('dragFile');
n@901 27 dropBody.addEventListener('dragover', handleDragOver, false);
n@901 28 dropBody.addEventListener('dragenter',handleDragEnter,false);
n@901 29 dropBody.addEventListener('dragleave',handleDragLeave,false);
n@901 30 dropBody.addEventListener('drop', handleDrop,false);
n@901 31 };
n@901 32
n@901 33 function attributePair(string, type, mandatory){
n@901 34 var id = document.createElement("span");
n@901 35 id.textContent = string;
n@901 36 var input = document.createElement("input");
n@901 37 input.type = type;
n@901 38 if (type == 'text') {
n@901 39 if (mandatory == true) {
n@901 40 input.setAttribute('mandatory','true');
n@901 41 }
n@901 42 else {
n@901 43 input.setAttribute('mandatory','false');
n@901 44 }
n@901 45 }
n@901 46 return [id, input];
n@901 47 }
n@901 48
n@901 49 function removeNode(event) {
n@901 50 event.srcElement.parentElement.parentElement.removeChild(event.srcElement.parentElement);
n@901 51 }
n@901 52
n@901 53 function buttonClickedValidate() {
n@901 54 var ready = validate();
n@901 55 if (ready == false) {
n@901 56 var errMsg = document.getElementById('errorMessage');
n@901 57 errMsg.textContent = "There were some errors with your XML. Any input boxes highlighted in red are invalid because they are empty or because its ID matches another elements ID. Please fill these in correctly. Any boxes which are yellow are not-invalid but will use the default value.";
n@901 58 errMsg.style.visibility = 'visible';
n@901 59 document.getElementById('createXML').disabled = true;
n@901 60
n@901 61 } else {
n@901 62 var errMsg = document.getElementById('errorMessage');
n@901 63 errMsg.textContent = "";
n@901 64 errMsg.style.visiblity = 'hidden';
n@901 65 document.getElementById('createXML').disabled = false;
n@901 66 }
n@901 67 }
n@901 68
n@901 69 function buttonClickedSubmit() {
n@901 70 var ready = validate();
n@901 71 if (ready == true) {
n@901 72 var xmlDoc = buildXML();
n@901 73 var inject = document.getElementById('errorMessage');
n@901 74 createProjectSave(xmlDoc, inject);
n@901 75 }
n@901 76 }
n@901 77
n@901 78 function createProjectSave(xmlDoc, injectPoint) {
n@901 79 var parent = document.createElement("div");
n@901 80 parent.appendChild(xmlDoc);
n@901 81 var file = [parent.innerHTML];
n@901 82 var bb = new Blob(file,{type : 'application/xml'});
n@901 83 var dnlk = window.URL.createObjectURL(bb);
n@901 84 var a = document.createElement("a");
n@901 85 a.hidden = '';
n@901 86 a.href = dnlk;
n@901 87 a.download = "save.xml";
n@901 88 a.textContent = "Save File";
n@901 89 injectPoint.appendChild(a);
n@901 90 }
n@901 91
n@901 92 function buildXML() {
n@901 93 var xmlDoc = document.createElement('BrowserEvalProjectDocument');
n@901 94 var setup = document.createElement('setup');
n@901 95 setup.setAttribute('interface',document.getElementById('interface').value);
n@901 96 if (document.getElementById('projectReturn').value == "") {
n@901 97 setup.setAttribute('projectReturn',"null");
n@901 98 } else {
n@901 99 setup.setAttribute('projectReturn',document.getElementById('projectReturn').value);
n@901 100 }
n@901 101 setup.setAttribute('randomiseOrder',document.getElementById('randomisePageOrder').checked);
n@901 102 setup.setAttribute('collectMetrics',document.getElementById('collectMetrics').checked);
n@901 103
n@901 104 var globalPreTest = document.createElement('preTest');
n@901 105 var options = document.getElementById('globalPreTest').getElementsByClassName('head');
n@901 106 constructPrePost(globalPreTest, options);
n@901 107
n@901 108 var globalPostTest = document.createElement('postTest');
n@901 109 options = document.getElementById('globalPostTest').getElementsByClassName('head');
n@901 110 constructPrePost(globalPostTest, options);
n@901 111
n@901 112 var globalMetrics = document.createElement('metric');
n@901 113 options = document.getElementById('globalMetric').getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 114 for (var i=0; i<options.length; i++) {
n@901 115 if (options[i].checked) {
n@901 116 var metric = document.createElement('metricEnable');
n@901 117 metric.textContent = options[i].id;
n@901 118 globalMetrics.appendChild(metric);
n@901 119 }
n@901 120 }
n@901 121 setup.appendChild(globalPreTest);
n@901 122 setup.appendChild(globalPostTest);
n@901 123 setup.appendChild(globalMetrics);
n@901 124 xmlDoc.appendChild(setup);
n@901 125
n@901 126 var audioHolders = document.getElementsByName('audio-holder');
n@901 127 for (var i=0; i<audioHolders.length; i++) {
n@901 128 var audioHolder = document.createElement('audioHolder');
n@901 129 var audioHolderDOM = audioHolders[i];
n@901 130 var attribs = audioHolderDOM.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 131 audioHolder.id = attribs[0].value;
n@901 132 if (attribs[1].value != "") {audioHolder.setAttribute('sampleRate',attribs[1].value);}
n@901 133 if (attribs[2].value != "") {audioHolder.setAttribute('hostURL',attribs[2].value);}
n@901 134 audioHolder.setAttribute('randomiseOrder',attribs[3].checked);
n@901 135 audioHolder.setAttribute('repeatCount',attribs[4].checked);
n@901 136 audioHolder.setAttribute('loop',attribs[5].checked);
n@901 137 audioHolder.setAttribute('elementComments',attribs[6].checked);
n@901 138
n@901 139 // Audio-Holder PreTests
n@901 140 var audioHolderPreTest = document.createElement('preTest');
n@901 141 var audioHolderPostTest = document.createElement('postTest');
n@901 142 options = audioHolderDOM.childNodes[2].getElementsByClassName('head');
n@901 143 constructPrePost(audioHolderPreTest, options);
n@901 144 options = audioHolderDOM.childNodes[3].getElementsByClassName('head');
n@901 145 constructPrePost(audioHolderPostTest, options);
n@901 146
n@901 147 audioHolder.appendChild(audioHolderPreTest);
n@901 148 audioHolder.appendChild(audioHolderPostTest);
n@901 149
n@901 150 // Interface Nodes
n@901 151
n@901 152 // audio-Elements
n@901 153 var audioElementsDOM = [];
n@901 154 var commentQuestionDOM = [];
n@901 155 var interfacesDOM = [];
n@901 156 for (var j=0; j<audioHolderDOM.childElementCount; j++) {
n@901 157 var child = audioHolderDOM.childNodes[j];
n@901 158 var name = child.getAttribute('name');
n@901 159 if (name == 'audio-element') {audioElementsDOM.push(child);}
n@901 160 else if (name == 'comment-question') {commentQuestionDOM.push(child);}
n@901 161 else if (name == 'interface-options') {interfacesDOM.push(child);}
n@901 162 }
n@901 163
n@901 164 for (var j=0; j<interfacesDOM.length; j++) {
n@901 165 var interfaceNode = document.createElement('interface');
n@901 166 attribs = interfacesDOM[j].getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 167 var title = document.createElement('title');
n@901 168 title.textContent = attribs[0].value;
n@901 169 interfaceNode.appendChild(title);
n@901 170
n@901 171
n@901 172 var markers = interfacesDOM[j].getElementsByClassName('head');
n@901 173 for (var k=0; k<markers.length; k++) {
n@901 174 var markerNode = document.createElement('scale');
n@901 175 attribs = markers[k].getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 176 markerNode.textContent = attribs[0].value;
n@901 177 markerNode.setAttribute('position',attribs[1].value);
n@901 178 interfaceNode.appendChild(markerNode);
n@901 179 }
n@901 180 audioHolder.appendChild(interfaceNode);
n@901 181 }
n@901 182
n@901 183 for (var j=0; j<audioElementsDOM.length; j++) {
n@901 184 var audioElement = document.createElement('audioElement');
n@901 185 attribs = audioElementsDOM[j].getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 186 audioElement.id = attribs[0].value;
n@901 187 audioElement.setAttribute('url',attribs[1].value);
n@901 188 audioHolder.appendChild(audioElement);
n@901 189 }
n@901 190
n@901 191 for (var j=0; j<commentQuestionDOM.length; j++) {
n@901 192 var commentQuestion = document.createElement('commentQuestion');
n@901 193 attribs = commentQuestionDOM[j].getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 194 commentQuestion.id = attribs[0].value;
n@901 195 commentQuestion.textContent = attribs[1].value;
n@901 196 audioHolder.appendChild(commentQuestion);
n@901 197 }
n@901 198 xmlDoc.appendChild(audioHolder);
n@901 199 }
n@901 200 return xmlDoc;
n@901 201 }
n@901 202
n@901 203 function constructPrePost(parent, options) {
n@901 204 for (var i=0; i<options.length; i++) {
n@901 205 var elem = options[i];
n@901 206 var attributes = elem.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 207 if (elem.getAttribute('name') == 'question-node') {
n@901 208 var node = document.createElement('question');
n@901 209 node.setAttribute('id',attributes[0].value);
n@901 210 node.textContent = attributes[1].value;
n@901 211 node.setAttribute('mandatory',attributes[2].checked);
n@901 212 } else if (elem.getAttribute('name') == 'statement-node') {
n@901 213 var node = document.createElement('statement');
n@901 214 node.textContent = attributes[0].value;
n@901 215 }
n@901 216 parent.appendChild(node);
n@901 217 }
n@901 218 }
n@901 219
n@901 220 function validate() {
n@901 221 var canExport = true;
n@901 222 // Checks if the XML can be created from the given entries
n@901 223 var inputs = document.getElementsByTagName('input');
n@901 224 for (var i=0; i<inputs.length; i++) {
n@901 225 if (inputs[i].type == 'text') {
n@901 226 if (inputs[i].value == "") {
n@901 227 var mandatory = inputs[i].getAttribute('mandatory');
n@901 228 if (mandatory == "true") {
n@901 229 errorInput(inputs[i]);
n@901 230 canExport = false;
n@901 231 } else {
n@901 232 warningInput(inputs[i]);
n@901 233 }
n@901 234 } else {
n@901 235 goodInput(inputs[i]);
n@901 236 }
n@901 237 }
n@901 238 }
n@901 239
n@901 240 var audioHolders = document.getElementsByName('audio-holder');
n@901 241 for (var i=0; i<audioHolders.length; i++) {
n@901 242 var divs = audioHolders[i].getElementsByClassName('head');
n@901 243 var IDs = [];
n@901 244 for (var j=0; j<divs.length; j++) {
n@901 245 if (divs[j].getAttribute('name') == 'audio-element') {
n@901 246 var obj = divs[j].getElementsByClassName('attrib')[0].children[1];
n@901 247 var aeID = obj.value;
n@901 248 if (aeID != "") {
n@901 249 var unique = true;
n@901 250 for (var k=0; k<IDs.length; k++) {
n@901 251 if (aeID == IDs[k]) {
n@901 252 unique = false;
n@901 253 break;
n@901 254 }
n@901 255 }
n@901 256 if (unique == true) {
n@901 257 IDs.push(aeID);
n@901 258 } else {
n@901 259 errorInput(obj);
n@901 260 canExport = false;
n@901 261 }
n@901 262 }
n@901 263 }
n@901 264 }
n@901 265 }
n@901 266 return canExport;
n@901 267 };
n@901 268
n@901 269 function errorInput(node) {
n@901 270 node.style.backgroundColor = "#FF0000";
n@901 271 }
n@901 272
n@901 273 function warningInput(node) {
n@901 274 node.style.backgroundColor = "#FFFF00";
n@901 275 }
n@901 276
n@901 277 function goodInput(node) {
n@901 278 node.style.backgroundColor = "#FFFFFF";
n@901 279 }
n@901 280
n@901 281 function questionNode() {
n@901 282 var node = document.createElement("div");
n@901 283 node.setAttribute('class','head');
n@901 284 node.setAttribute('name','question-node');
n@901 285 var nodeTitle = document.createElement("span");
n@901 286 nodeTitle.textContent = "Question";
n@901 287 var attributes = document.createElement("div");
n@901 288 attributes.setAttribute('class','attrib');
n@901 289 var id = attributePair("ID:","text", true);
n@901 290 var question = attributePair("Question:","text", false);
n@901 291 question[1].style.width = "500px";
n@901 292 var mandatory = attributePair("Mandatory:","checkbox", false);
n@901 293 node.appendChild(nodeTitle);
n@901 294 id.forEach(function(item){attributes.appendChild(item);},false);
n@901 295 question.forEach(function(item){attributes.appendChild(item);},false);
n@901 296 mandatory.forEach(function(item){attributes.appendChild(item);},false);
n@901 297 node.appendChild(attributes);
n@901 298
n@901 299 var removeButton = document.createElement("button");
n@901 300 removeButton.textContent = "Remove";
n@901 301 removeButton.onclick = removeNode;
n@901 302 node.appendChild(removeButton);
n@901 303 return node;
n@901 304 }
n@901 305
n@901 306 function statementNode() {
n@901 307 var node = document.createElement("div");
n@901 308 node.setAttribute('class','head');
n@901 309 node.setAttribute('name','statement-node');
n@901 310 var nodeTitle = document.createElement("span");
n@901 311 nodeTitle.textContent = "Statement";
n@901 312 var attributes = document.createElement("div");
n@901 313 attributes.setAttribute('class','attrib');
n@901 314 var statement = attributePair("Statement:","text",false);
n@901 315 statement[1].style.width = "500px";
n@901 316 node.appendChild(nodeTitle);
n@901 317 statement.forEach(function(item){attributes.appendChild(item);},false);
n@901 318 node.appendChild(attributes);
n@901 319
n@901 320 var removeButton = document.createElement("button");
n@901 321 removeButton.textContent = "Remove";
n@901 322 removeButton.onclick = removeNode;
n@901 323 node.appendChild(removeButton);
n@901 324 return node;
n@901 325 }
n@901 326
n@901 327 function audioHolderNode() {
n@901 328 var audioHolderCounts = document.getElementsByName("audio-holder").length;
n@901 329 var node = document.createElement("div");
n@901 330 node.setAttribute("class","head");
n@901 331 node.setAttribute("name","audio-holder");
n@901 332 node.setAttribute("id","audio-holder-"+audioHolderCounts);
n@901 333 var nodeTitle = document.createElement("span");
n@901 334 nodeTitle.textContent = "Audio Holder "+(audioHolderCounts+1);
n@901 335
n@901 336 var attributes = document.createElement("div");
n@901 337 attributes.setAttribute('class','attrib');
n@901 338 var id = attributePair("ID:","text",true);
n@901 339 id[1].value=audioHolderCounts;
n@901 340 var hostURL = attributePair("Host URL:", "text",false);
n@901 341 var sampleRate = attributePair("Sample Rate:","text",false);
n@901 342 var randomiseOrder = attributePair("Randomise Element Order:","checkbox");
n@901 343 var repeatCount = attributePair("Repeat Page Count:","number");
n@901 344 repeatCount[1].value = 0;
n@901 345 var loop = attributePair("Loop Element Playback","checkbox");
n@901 346 var elementComments = attributePair("Enable Comment Boxes","checkbox");
n@901 347 id.forEach(function(item){attributes.appendChild(item);},false);
n@901 348 hostURL.forEach(function(item){attributes.appendChild(item);},false);
n@901 349 sampleRate.forEach(function(item){attributes.appendChild(item);},false);
n@901 350 hostURL.forEach(function(item){attributes.appendChild(item);},false);
n@901 351 randomiseOrder.forEach(function(item){attributes.appendChild(item);},false);
n@901 352 repeatCount.forEach(function(item){attributes.appendChild(item);},false);
n@901 353 loop.forEach(function(item){attributes.appendChild(item);},false);
n@901 354 elementComments.forEach(function(item){attributes.appendChild(item);},false);
n@901 355
n@901 356 node.appendChild(nodeTitle);
n@901 357 node.appendChild(attributes);
n@901 358
n@901 359 var pretest = document.createElement("div");
n@901 360 pretest.setAttribute('class','head');
n@901 361 pretest.setAttribute('name','pre-test');
n@901 362 var pretestTitle = document.createElement("h4");
n@901 363 pretestTitle.textContent = "Pre Test";
n@901 364 var buttonAddQ = document.createElement("button");
n@901 365 buttonAddQ.textContent = "Add Pre Test Question";
n@901 366 buttonAddQ.onclick = function(){event.srcElement.parentElement.appendChild(questionNode());};
n@901 367 var buttonAddS = document.createElement("button");
n@901 368 buttonAddS.textContent = "Add Pre Test Statement";
n@901 369 buttonAddS.onclick = function(){event.srcElement.parentElement.appendChild(statementNode());};
n@901 370 pretest.appendChild(pretestTitle);
n@901 371 pretest.appendChild(buttonAddQ);
n@901 372 pretest.appendChild(buttonAddS);
n@901 373
n@901 374 var posttest = document.createElement("div");
n@901 375 posttest.setAttribute('class','head');
n@901 376 posttest.setAttribute('name','post-test');
n@901 377 var posttestTitle = document.createElement("h4");
n@901 378 posttestTitle.textContent = "Post Test";
n@901 379 var buttonAddQ = document.createElement("button");
n@901 380 buttonAddQ.textContent = "Add Post Test Question";
n@901 381 buttonAddQ.onclick = function(){event.srcElement.parentElement.appendChild(questionNode());};
n@901 382 var buttonAddS = document.createElement("button");
n@901 383 buttonAddS.textContent = "Add Post Test Statement";
n@901 384 buttonAddS.onclick = function(){event.srcElement.parentElement.appendChild(statementNode());};
n@901 385 posttest.appendChild(posttestTitle);
n@901 386 posttest.appendChild(buttonAddQ);
n@901 387 posttest.appendChild(buttonAddS);
n@901 388
n@901 389 node.appendChild(pretest);
n@901 390 node.appendChild(posttest);
n@901 391
n@901 392 var newAudioElementButton = document.createElement("button");
n@901 393 newAudioElementButton.textContent = "Add audio element";
n@901 394 newAudioElementButton.onclick = function(){
n@901 395 event.srcElement.parentElement.appendChild(audioElementNode());
n@901 396 };
n@901 397 node.appendChild(newAudioElementButton);
n@901 398
n@901 399 var newCommentButton = document.createElement("button");
n@901 400 newCommentButton.textContent = "Add Comment Box";
n@901 401 newCommentButton.onclick = function() {
n@901 402 event.srcElement.parentElement.appendChild(commentBox());
n@901 403 };
n@901 404 node.appendChild(newCommentButton);
n@901 405
n@901 406 var newInterface = document.createElement("button");
n@901 407 newInterface.textContent = "Add Interface";
n@901 408 newInterface.onclick = function() {
n@901 409 event.srcElement.parentElement.appendChild(interfaceNode());
n@901 410 };
n@901 411 node.appendChild(newInterface);
n@901 412
n@901 413 var removeButton = document.createElement("button");
n@901 414 removeButton.textContent = "Remove Audio Holder";
n@901 415 removeButton.onclick = removeNode;
n@901 416 node.appendChild(removeButton);
n@901 417 return node;
n@901 418 }
n@901 419
n@901 420 function audioElementNode() {
n@901 421 var node = document.createElement('div');
n@901 422 node.setAttribute('class','head');
n@901 423 node.setAttribute('name','audio-element');
n@901 424 var nodeTitle = document.createElement('span');
n@901 425 nodeTitle.textContent = 'Audio Element';
n@901 426
n@901 427 var attributes = document.createElement("div");
n@901 428 attributes.setAttribute('class','attrib');
n@901 429 var id = attributePair("ID:","text",true);
n@901 430 var url = attributePair("URL:","text",true);
n@901 431 id.forEach(function(item){attributes.appendChild(item);},false);
n@901 432 url.forEach(function(item){attributes.appendChild(item);},false);
n@901 433
n@901 434 node.appendChild(nodeTitle);
n@901 435 node.appendChild(attributes);
n@901 436
n@901 437 var removeButton = document.createElement("button");
n@901 438 removeButton.textContent = "Remove Audio Element";
n@901 439 removeButton.onclick = removeNode;
n@901 440 node.appendChild(removeButton);
n@901 441 return node;
n@901 442 }
n@901 443
n@901 444 function commentBox() {
n@901 445 var node = document.createElement('div');
n@901 446 node.setAttribute('class','head');
n@901 447 node.setAttribute('name','comment-question');
n@901 448 var nodeTitle = document.createElement('h4');
n@901 449 nodeTitle.textContent = "Comment Box";
n@901 450
n@901 451 var attributes = document.createElement('div');
n@901 452 attributes.setAttribute('class','attrib');
n@901 453 var id = attributePair("ID:",'text',true);
n@901 454 var question = attributePair("Question:",'text',true);
n@901 455 question[1].style.width = "500px";
n@901 456 id.forEach(function(item){attributes.appendChild(item);},false);
n@901 457 question.forEach(function(item){attributes.appendChild(item);},false);
n@901 458
n@901 459 var removeButton = document.createElement("button");
n@901 460 removeButton.textContent = "Remove Comment Box";
n@901 461 removeButton.onclick = removeNode;
n@901 462
n@901 463 node.appendChild(nodeTitle);
n@901 464 node.appendChild(attributes);
n@901 465 node.appendChild(removeButton);
n@901 466 return node;
n@901 467 }
n@901 468
n@901 469 function interfaceNode() {
n@901 470 var selectedInterface = document.getElementById('interface').value;
n@901 471 var node = document.createElement('div');
n@901 472 node.setAttribute('class','head');
n@901 473 node.setAttribute('name','interface-options');
n@901 474 var nodeTitle = document.createElement('h4');
n@901 475 nodeTitle.textContent = "Interface";
n@901 476
n@901 477 var attributes = document.createElement('div');
n@901 478 attributes.setAttribute('class','attrib');
n@901 479 var title = attributePair('Title: ','text',false);
n@901 480 title[1].style.width = "500px";
n@901 481
n@901 482 var addMarker = document.createElement('button');
n@901 483 addMarker.textContent = "Add Scale Marker";
n@901 484 addMarker.onclick = function() {
n@901 485 event.srcElement.parentElement.appendChild(newScaleMarker());
n@901 486 };
n@901 487
n@901 488 title.forEach(function(item){attributes.appendChild(item);},false);
n@901 489
n@901 490 var removeButton = document.createElement("button");
n@901 491 removeButton.textContent = "Remove Interface";
n@901 492 removeButton.onclick = removeNode;
n@901 493
n@901 494 node.appendChild(nodeTitle);
n@901 495 node.appendChild(attributes);
n@901 496 node.appendChild(addMarker);
n@901 497 node.appendChild(removeButton);
n@901 498 return node;
n@901 499 }
n@901 500
n@901 501 function newScaleMarker() {
n@901 502 var node = document.createElement('div');
n@901 503 node.setAttribute('class','head');
n@901 504 node.setAttribute('name','interface-options');
n@901 505 var nodeTitle = document.createElement('span');
n@901 506 nodeTitle.textContent = "Marker";
n@901 507 var attributes = document.createElement('div');
n@901 508 attributes.setAttribute('class','attrib');
n@901 509 var text = attributePair('Text: ','text',true);
n@901 510 var position = attributePair('Positon','number',true);
n@901 511
n@901 512 text.forEach(function(item){attributes.appendChild(item);},false);
n@901 513 position.forEach(function(item){attributes.appendChild(item);},false);
n@901 514
n@901 515 var removeButton = document.createElement("button");
n@901 516 removeButton.textContent = "Remove Marker";
n@901 517 removeButton.onclick = removeNode;
n@901 518
n@901 519 node.appendChild(nodeTitle);
n@901 520 node.appendChild(attributes);
n@901 521 node.appendChild(removeButton);
n@901 522 return node;
n@901 523 }
n@901 524
n@901 525 function handleDragOver(e) {
n@901 526 e.stopPropagation();
n@901 527 e.preventDefault();
n@901 528 }
n@901 529 function handleDragEnter(e) {
n@901 530 e.stopPropagation();
n@901 531 e.preventDefault();
n@901 532 this.style.backgroundColor = '#AAFFAA';
n@901 533 }
n@901 534 function handleDragLeave(e) {
n@901 535 e.stopPropagation();
n@901 536 e.preventDefault();
n@901 537 this.style.backgroundColor = "#FFFFFF";
n@901 538 }
n@901 539 function handleDrop(e) {
n@901 540 e.stopPropagation();
n@901 541 e.preventDefault();
n@901 542
n@901 543 var file = e.dataTransfer.files[0];
n@901 544
n@901 545 // Uses HTML5 FileAPI - https://w3c.github.io/FileAPI/#filereader-interface
n@901 546 var reader = new FileReader();
n@901 547 reader.onload = function() {
n@901 548 var parse = new DOMParser();
n@901 549 var xml = parse.parseFromString(reader.result,'text/xml');
n@901 550 importXML(xml);
n@901 551 };
n@901 552 reader.readAsText(file);
n@901 553
n@901 554 }
n@901 555 var g_XML;
n@901 556
n@901 557 function importXML(xml) {
n@901 558 g_XML = xml;
n@901 559
n@901 560 var root = xml.getElementsByTagName('BrowserEvalProjectDocument')[0];
n@901 561 var setup = xml.getElementsByTagName('setup')[0];
n@901 562 document.getElementById('interface').value = setup.getAttribute('interface');
n@901 563 document.getElementById('projectReturn').value = setup.getAttribute('projectReturn');
n@901 564 document.getElementById('randomisePageOrder').checked = setup.getAttribute('randomiseOrder');
n@901 565 document.getElementById('collectMetrics').checked = setup.getAttribute('collectMetrics');
n@901 566
n@901 567 var globalPreTest = setup.getElementsByTagName('PreTest')[0];
n@901 568 var globalPostTest = setup.getElementsByTagName('PostTest')[0];
n@901 569 for (var i=0; i<globalPreTest.childElementCount; i++) {
n@901 570 var child = globalPreTest.children[i];
n@901 571 var node;
n@901 572 if (child.nodeName == "question") {
n@901 573 node = questionNode();
n@901 574 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 575 attribs[0].value = child.id;
n@901 576 attribs[1].value = child.textContent;
n@901 577 attribs[2].checked = child.getAttribute('mandatory');
n@901 578 } else if (child.nodeName == "statement") {
n@901 579 node = statementNode();
n@901 580 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 581 attribs[0].value = child.textContent;
n@901 582 }
n@901 583 document.getElementById('globalPreTest').appendChild(node);
n@901 584 }
n@901 585
n@901 586 for (var i=0; i<globalPostTest.childElementCount; i++) {
n@901 587 var child = globalPostTest.children[i];
n@901 588 var node;
n@901 589 if (child.nodeName == "question") {
n@901 590 node = questionNode();
n@901 591 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 592 attribs[0].value = child.id;
n@901 593 attribs[1].value = child.textContent;
n@901 594 attribs[2].checked = child.getAttribute('mandatory');
n@901 595 } else if (child.nodeName == "statement") {
n@901 596 node = statementNode();
n@901 597 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 598 attribs[0].value = child.textContent;
n@901 599 }
n@901 600 document.getElementById('globalPostTest').appendChild(node);
n@901 601 }
n@901 602
n@901 603 // Metric Enable Flags
n@901 604 var mEnable = setup.getElementsByTagName('Metric')[0].getElementsByTagName('metricEnable');
n@901 605 for (var i=0; i<mEnable.length; i++) {
n@901 606 var node = mEnable[i];
n@901 607 var enabled = node.textContent;
n@901 608 document.getElementById(enabled).checked = true;
n@901 609 }
n@901 610
n@901 611 var audioHolders = root.getElementsByTagName('audioHolder');
n@901 612 for (var i=0; i<audioHolders.length; i++) {
n@901 613 var audioHolderDOM = audioHolderNode();
n@901 614 var attribs = audioHolderDOM.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 615 attribs[0].value = audioHolders[i].id;
n@901 616 attribs[1].value = audioHolders[i].getAttribute('sampleRate');
n@901 617 attribs[2].value = audioHolders[i].getAttribute('hostURL');
n@901 618 attribs[3].checked = audioHolders[i].getAttribute('randomiseOrder');
n@901 619 attribs[4].value = audioHolders[i].getAttribute('repeatCount');
n@901 620 attribs[5].checked = audioHolders[i].getAttribute('loop');
n@901 621 attribs[6].checked = audioHolders[i].getAttribute('elementComments');
n@901 622
n@901 623 var PreTest = audioHolders[i].getElementsByTagName('PreTest');
n@901 624 var PostTest = audioHolders[i].getElementsByTagName('PostTest');
n@901 625 if (PreTest.length != 0) {
n@901 626 PreTest = PreTest[0];
n@901 627 for (var j=0; j<PreTest.childElementCount; j++) {
n@901 628 var child = PreTest.children[j];
n@901 629 var node;
n@901 630 if (child.nodeName == "question") {
n@901 631 node = questionNode();
n@901 632 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 633 attribs[0].value = child.id;
n@901 634 attribs[1].value = child.textContent;
n@901 635 attribs[2].checked = child.getAttribute('mandatory');
n@901 636 } else if (child.nodeName == "statement") {
n@901 637 node = statementNode();
n@901 638 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 639 attribs[0].value = child.textContent;
n@901 640 }
n@901 641 audioHolderDOM.children[2].appendChild(node);
n@901 642 }
n@901 643 }
n@901 644 if (PostTest.length != 0) {
n@901 645 PostTest = PostTest[0];
n@901 646 for (var j=0; j<PostTest.childElementCount; j++) {
n@901 647 var child = PostTest.children[j];
n@901 648 var node;
n@901 649 if (child.nodeName == "question") {
n@901 650 node = questionNode();
n@901 651 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 652 attribs[0].value = child.id;
n@901 653 attribs[1].value = child.textContent;
n@901 654 attribs[2].checked = child.getAttribute('mandatory');
n@901 655 } else if (child.nodeName == "statement") {
n@901 656 node = statementNode();
n@901 657 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 658 attribs[0].value = child.textContent;
n@901 659 }
n@901 660 audioHolderDOM.children[3].appendChild(node);
n@901 661 }
n@901 662 }
n@901 663 // Process interface
n@901 664 var interfaceNodes = audioHolders[i].getElementsByTagName('interface');
n@901 665 for (var j=0; j<interfaceNodes.length; j++) {
n@901 666 var node = interfaceNode();
n@901 667 var child = interfaceNodes[j];
n@901 668 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 669 attribs[0].value = child.getElementsByTagName('title')[0].textContent;
n@901 670
n@901 671 var markers = child.getElementsByTagName('scale');
n@901 672 for (var k=0; k<markers.length; k++) {
n@901 673 var markerNode = newScaleMarker();
n@901 674 attribs = markerNode.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 675 attribs[0].value = markers[k].textContent;
n@901 676 attribs[1].value = markers[k].getAttribute('position');
n@901 677 node.appendChild(markerNode);
n@901 678 }
n@901 679 audioHolderDOM.appendChild(node);
n@901 680 }
n@901 681
n@901 682
n@901 683 // Process audio-element
n@901 684 var audioElements = audioHolders[i].getElementsByTagName('audioElements');
n@901 685 for (var j=0; j<audioElements.length; j++) {
n@901 686 var node = audioElementNode();
n@901 687 var child = audioElements[j];
n@901 688 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 689 attribs[0].value = child.id;
n@901 690 attribs[1].value = child.getAttribute('url');
n@901 691 audioHolderDOM.appendChild(node);
n@901 692 }
n@901 693
n@901 694 // Process comment-question
n@901 695 var commentQuestion = audioHolders[0].getElementsByTagName('CommentQuestion');
n@901 696 for (var j=0; j<commentQuestion.length; j++) {
n@901 697 var node = commentBox();
n@901 698 var child = commentQuestion[j];
n@901 699 var attribs = node.getElementsByClassName('attrib')[0].getElementsByTagName('input');
n@901 700 attribs[0].value = child.id;
n@901 701 attribs[1].value = child.textContent;
n@901 702 audioHolderDOM.appendChild(node);
n@901 703 }
n@901 704
n@901 705 document.getElementById('setup').appendChild(audioHolderDOM);
n@901 706 }
n@901 707 }
n@901 708 </script>
n@901 709 <style>
n@901 710 div {
n@901 711 padding: 2px;
n@901 712 margin-top: 2px;
n@901 713 margin-bottom: 2px;
n@901 714 }
n@901 715 div.head{
n@901 716 margin-left: 10px;
n@901 717 border: black;
n@901 718 border-width: 2px;
n@901 719 border-style: solid;
n@901 720 }
n@901 721 div.attrib{
n@901 722 margin-left:25px;
n@901 723 border: black;
n@901 724 border-width: 2px;
n@901 725 border-style: dashed;
n@901 726 margin-bottom: 10px;
n@901 727 }
n@901 728 div#dragFile{
n@901 729 height:100px;
n@901 730 border-width: 2px;
n@901 731 border-style: dashed;
n@901 732 margin-bottom: 10px;
n@901 733 }
n@901 734 </style>
n@901 735
n@901 736 </head>
n@901 737
n@901 738 <body>
n@901 739 <h1>Create Test Setup XML</h1>
n@901 740 <div id="dragFile">
n@901 741 <span>Drag and Drop an XML specification file here to auto-load.</span>
n@901 742 </div>
n@901 743 <button id="validateXML" onclick="buttonClickedValidate();">Validate</button>
n@901 744 <button id="createXML" onclick="buttonClickedSubmit();" disabled>Submit</button>
n@901 745 <span id="errorMessage" visibility="hidden"></span>
n@901 746 <div id="topLevelBody" align="left">
n@901 747 <!-- Interface goes here -->
n@901 748 <div name='test-setup'>
n@901 749 <div id="setup" class="head">
n@901 750 <h2>Setup Tag</h2>
n@901 751 <div id="setup-attribs" class="attrib">
n@901 752 <span>Interface</span>
n@901 753 <select id="interface">
n@901 754 <option value='APE'>APE</option>
n@901 755 </select>
n@901 756 <span>Project Return</span>
n@901 757 <input type="text" id="projectReturn" mandatory="false">
n@901 758 <span>Randomise Test Page Order</span>
n@901 759 <input id="randomisePageOrder" type="checkbox" value="false">
n@901 760 <span>Collect Session Metrics</span>
n@901 761 <input id="collectMetrics" type="checkbox">
n@901 762 </div>
n@901 763 <div id="globalPreTest" class="head">
n@901 764 <h3>Pre Test</h3>
n@901 765 <button id="addPreTestQ" onclick="event.srcElement.parentElement.appendChild(questionNode());">Add Pre Test Question</button>
n@901 766 <button id="addPreTestS" onclick="event.srcElement.parentElement.appendChild(statementNode());">Add Pre Test Statement</button>
n@901 767 </div>
n@901 768 <div id="globalPostTest" class="head">
n@901 769 <h3>Post Test</h3>
n@901 770 <button id="addPreTestQ" onclick="event.srcElement.parentElement.appendChild(questionNode());">Add Post Test Question</button>
n@901 771 <button id="addPreTestS" onclick="event.srcElement.parentElement.appendChild(statementNode());">Add Post Test Statement</button>
n@901 772 </div>
n@901 773 <div id="globalMetric" class="head">
n@901 774 <h3>Global Metrics</h3>
n@901 775 <div id="globalMetric-attrib" class="attrib">
n@901 776 <span>Test Timer</span>
n@901 777 <input type="checkbox" id="testTimer" />
n@901 778 <span>Element Playback Timer</span>
n@901 779 <input type="checkbox" id="elementTimer" />
n@901 780 <span>Element Initial Position</span>
n@901 781 <input type="checkbox" id="elementInitialPosition" />
n@901 782 <span>Element Tracker</span>
n@901 783 <input type="checkbox" id="elementTracker" />
n@901 784 <span>Element Listen Tracker</span>
n@901 785 <input type="checkbox" id="elementListenTracker" />
n@901 786 <span>Element Flag Listened To</span>
n@901 787 <input type="checkbox" id="elementFlagListenedTo" />
n@901 788 <span>Element Flag Moved</span>
n@901 789 <input type="checkbox" id="elementFlagMoved" />
n@901 790 </div>
n@901 791 </div>
n@901 792 <button id="addAudioHolder" onclick="event.srcElement.parentElement.appendChild(audioHolderNode());">Add AudioHolder / Test Page</button>
n@901 793 </div>
n@901 794 </div>
n@901 795 </div>
n@901 796 </body>
n@901 797 </html>