annotate ape.js @ 936:5ad6a3102921

Console logs for moving slider, playback, stop audio and (when submitting) comments.
author Brecht De Man <BrechtDeMan@users.noreply.github.com>
date Tue, 26 May 2015 12:16:57 +0100
parents
children 17353d015d33
rev   line source
BrechtDeMan@936 1 /**
BrechtDeMan@936 2 * ape.js
BrechtDeMan@936 3 * Create the APE interface
BrechtDeMan@936 4 */
BrechtDeMan@936 5
BrechtDeMan@936 6 var currentState; // Keep track of the current state (pre/post test, which test, final test? first test?)
BrechtDeMan@936 7 // preTest - In preTest state
BrechtDeMan@936 8 // testRun-ID - In test running, test Id number at the end 'testRun-2'
BrechtDeMan@936 9 // testRunPost-ID - Post test of test ID
BrechtDeMan@936 10 // testRunPre-ID - Pre-test of test ID
BrechtDeMan@936 11 // postTest - End of test, final submission!
BrechtDeMan@936 12
BrechtDeMan@936 13
BrechtDeMan@936 14 // Once this is loaded and parsed, begin execution
BrechtDeMan@936 15 loadInterface(projectXML);
BrechtDeMan@936 16
BrechtDeMan@936 17 function loadInterface(xmlDoc) {
BrechtDeMan@936 18
BrechtDeMan@936 19 // Get the dimensions of the screen available to the page
BrechtDeMan@936 20 var width = window.innerWidth;
BrechtDeMan@936 21 var height = window.innerHeight;
BrechtDeMan@936 22
BrechtDeMan@936 23 // The injection point into the HTML page
BrechtDeMan@936 24 var insertPoint = document.getElementById("topLevelBody");
BrechtDeMan@936 25 var testContent = document.createElement('div');
BrechtDeMan@936 26 testContent.id = 'testContent';
BrechtDeMan@936 27
BrechtDeMan@936 28
BrechtDeMan@936 29 // Decode parts of the xmlDoc that are needed
BrechtDeMan@936 30 // xmlDoc MUST already be parsed by jQuery!
BrechtDeMan@936 31 var xmlSetup = xmlDoc.find('setup');
BrechtDeMan@936 32 // Should put in an error function here incase of malprocessed or malformed XML
BrechtDeMan@936 33
BrechtDeMan@936 34 // Extract the different test XML DOM trees
BrechtDeMan@936 35 var audioHolders = xmlDoc.find('audioHolder');
BrechtDeMan@936 36 audioHolders.each(function(index,element) {
BrechtDeMan@936 37 var repeatN = element.attributes['repeatCount'].value;
BrechtDeMan@936 38 for (var r=0; r<=repeatN; r++) {
BrechtDeMan@936 39 testXMLSetups[testXMLSetups.length] = element;
BrechtDeMan@936 40 }
BrechtDeMan@936 41 });
BrechtDeMan@936 42
BrechtDeMan@936 43 // New check if we need to randomise the test order
BrechtDeMan@936 44 var randomise = xmlSetup[0].attributes['randomiseOrder'];
BrechtDeMan@936 45 if (randomise != undefined) {
BrechtDeMan@936 46 if (randomise.value === 'true'){
BrechtDeMan@936 47 randomise = true;
BrechtDeMan@936 48 } else {
BrechtDeMan@936 49 randomise = false;
BrechtDeMan@936 50 }
BrechtDeMan@936 51 } else {
BrechtDeMan@936 52 randomise = false;
BrechtDeMan@936 53 }
BrechtDeMan@936 54
BrechtDeMan@936 55 if (randomise)
BrechtDeMan@936 56 {
BrechtDeMan@936 57 testXMLSetups = randomiseOrder(testXMLSetups);
BrechtDeMan@936 58 }
BrechtDeMan@936 59
BrechtDeMan@936 60 // Obtain the metrics enabled
BrechtDeMan@936 61 var metricNode = xmlSetup.find('Metric');
BrechtDeMan@936 62 var metricNode = metricNode.find('metricEnable');
BrechtDeMan@936 63 metricNode.each(function(index,node){
BrechtDeMan@936 64 var enabled = node.textContent;
BrechtDeMan@936 65 switch(enabled)
BrechtDeMan@936 66 {
BrechtDeMan@936 67 case 'testTimer':
BrechtDeMan@936 68 sessionMetrics.prototype.enableTestTimer = true;
BrechtDeMan@936 69 break;
BrechtDeMan@936 70 case 'elementTimer':
BrechtDeMan@936 71 sessionMetrics.prototype.enableElementTimer = true;
BrechtDeMan@936 72 break;
BrechtDeMan@936 73 case 'elementTracker':
BrechtDeMan@936 74 sessionMetrics.prototype.enableElementTracker = true;
BrechtDeMan@936 75 break;
BrechtDeMan@936 76 case 'elementInitalPosition':
BrechtDeMan@936 77 sessionMetrics.prototype.enableElementInitialPosition = true;
BrechtDeMan@936 78 break;
BrechtDeMan@936 79 case 'elementFlagListenedTo':
BrechtDeMan@936 80 sessionMetrics.prototype.enableFlagListenedTo = true;
BrechtDeMan@936 81 break;
BrechtDeMan@936 82 case 'elementFlagMoved':
BrechtDeMan@936 83 sessionMetrics.prototype.enableFlagMoved = true;
BrechtDeMan@936 84 break;
BrechtDeMan@936 85 case 'elementFlagComments':
BrechtDeMan@936 86 sessionMetrics.prototype.enableFlagComments = true;
BrechtDeMan@936 87 break;
BrechtDeMan@936 88 }
BrechtDeMan@936 89 });
BrechtDeMan@936 90
BrechtDeMan@936 91 // Create APE specific metric functions
BrechtDeMan@936 92 audioEngineContext.metric.initialiseTest = function()
BrechtDeMan@936 93 {
BrechtDeMan@936 94 var sliders = document.getElementsByClassName('track-slider');
BrechtDeMan@936 95 for (var i=0; i<sliders.length; i++)
BrechtDeMan@936 96 {
BrechtDeMan@936 97 audioEngineContext.audioObjects[i].metric.initialised(convSliderPosToRate(i));
BrechtDeMan@936 98 }
BrechtDeMan@936 99 };
BrechtDeMan@936 100
BrechtDeMan@936 101 audioEngineContext.metric.sliderMoveStart = function(id)
BrechtDeMan@936 102 {
BrechtDeMan@936 103 if (this.data == -1)
BrechtDeMan@936 104 {
BrechtDeMan@936 105 this.data = id;
BrechtDeMan@936 106 } else {
BrechtDeMan@936 107 console.log('ERROR: Metric tracker detecting two moves!');
BrechtDeMan@936 108 this.data = -1;
BrechtDeMan@936 109 }
BrechtDeMan@936 110 };
BrechtDeMan@936 111 audioEngineContext.metric.sliderMoved = function()
BrechtDeMan@936 112 {
BrechtDeMan@936 113 var time = audioEngineContext.timer.getTestTime();
BrechtDeMan@936 114 var id = this.data;
BrechtDeMan@936 115 this.data = -1;
BrechtDeMan@936 116 var position = convSliderPosToRate(id);
BrechtDeMan@936 117 console.log('slider ' + id + ': '+ position + ' (' + time + ')'); // DEBUG/SAFETY: show position and slider id
BrechtDeMan@936 118 if (audioEngineContext.timer.testStarted)
BrechtDeMan@936 119 {
BrechtDeMan@936 120 audioEngineContext.audioObjects[id].metric.moved(time,position);
BrechtDeMan@936 121 }
BrechtDeMan@936 122 };
BrechtDeMan@936 123
BrechtDeMan@936 124 audioEngineContext.metric.sliderPlayed = function(id)
BrechtDeMan@936 125 {
BrechtDeMan@936 126 var time = audioEngineContext.timer.getTestTime();
BrechtDeMan@936 127 if (audioEngineContext.timer.testStarted)
BrechtDeMan@936 128 {
BrechtDeMan@936 129 if (this.lastClicked >= 0)
BrechtDeMan@936 130 {
BrechtDeMan@936 131 audioEngineContext.audioObjects[this.lastClicked].metric.listening(time);
BrechtDeMan@936 132 }
BrechtDeMan@936 133 this.lastClicked = id;
BrechtDeMan@936 134 audioEngineContext.audioObjects[id].metric.listening(time);
BrechtDeMan@936 135 }
BrechtDeMan@936 136 console.log('slider ' + id + ' played (' + time + ')'); // DEBUG/SAFETY: show played slider id
BrechtDeMan@936 137 };
BrechtDeMan@936 138
BrechtDeMan@936 139 // Create the top div for the Title element
BrechtDeMan@936 140 var titleAttr = xmlSetup[0].attributes['title'];
BrechtDeMan@936 141 var title = document.createElement('div');
BrechtDeMan@936 142 title.className = "title";
BrechtDeMan@936 143 title.align = "center";
BrechtDeMan@936 144 var titleSpan = document.createElement('span');
BrechtDeMan@936 145
BrechtDeMan@936 146 // Set title to that defined in XML, else set to default
BrechtDeMan@936 147 if (titleAttr != undefined) {
BrechtDeMan@936 148 titleSpan.innerHTML = titleAttr.value;
BrechtDeMan@936 149 } else {
BrechtDeMan@936 150 titleSpan.innerHTML = 'Listening test';
BrechtDeMan@936 151 }
BrechtDeMan@936 152 // Insert the titleSpan element into the title div element.
BrechtDeMan@936 153 title.appendChild(titleSpan);
BrechtDeMan@936 154
BrechtDeMan@936 155 var pagetitle = document.createElement('div');
BrechtDeMan@936 156 pagetitle.className = "pageTitle";
BrechtDeMan@936 157 pagetitle.align = "center";
BrechtDeMan@936 158 var titleSpan = document.createElement('span');
BrechtDeMan@936 159 titleSpan.id = "pageTitle";
BrechtDeMan@936 160 pagetitle.appendChild(titleSpan);
BrechtDeMan@936 161
BrechtDeMan@936 162 // Store the return URL path in global projectReturn
BrechtDeMan@936 163 projectReturn = xmlSetup[0].attributes['projectReturn'].value;
BrechtDeMan@936 164
BrechtDeMan@936 165 // Create Interface buttons!
BrechtDeMan@936 166 var interfaceButtons = document.createElement('div');
BrechtDeMan@936 167 interfaceButtons.id = 'interface-buttons';
BrechtDeMan@936 168
BrechtDeMan@936 169 // MANUAL DOWNLOAD POINT
BrechtDeMan@936 170 // If project return is null, this MUST be specified as the location to create the download link
BrechtDeMan@936 171 var downloadPoint = document.createElement('div');
BrechtDeMan@936 172 downloadPoint.id = 'download-point';
BrechtDeMan@936 173
BrechtDeMan@936 174 // Create playback start/stop points
BrechtDeMan@936 175 var playback = document.createElement("button");
BrechtDeMan@936 176 playback.innerHTML = 'Stop';
BrechtDeMan@936 177 playback.id = 'playback-button';
BrechtDeMan@936 178 // onclick function. Check if it is playing or not, call the correct function in the
BrechtDeMan@936 179 // audioEngine, change the button text to reflect the next state.
BrechtDeMan@936 180 playback.onclick = function() {
BrechtDeMan@936 181 if (audioEngineContext.status == 1) {
BrechtDeMan@936 182 audioEngineContext.stop();
BrechtDeMan@936 183 this.innerHTML = 'Stop';
BrechtDeMan@936 184 var time = audioEngineContext.timer.getTestTime();
BrechtDeMan@936 185 console.log('Stopped at ' + time); // DEBUG/SAFETY
BrechtDeMan@936 186 }
BrechtDeMan@936 187 };
BrechtDeMan@936 188 // Create Submit (save) button
BrechtDeMan@936 189 var submit = document.createElement("button");
BrechtDeMan@936 190 submit.innerHTML = 'Submit';
BrechtDeMan@936 191 submit.onclick = buttonSubmitClick;
BrechtDeMan@936 192 submit.id = 'submit-button';
BrechtDeMan@936 193 // Append the interface buttons into the interfaceButtons object.
BrechtDeMan@936 194 interfaceButtons.appendChild(playback);
BrechtDeMan@936 195 interfaceButtons.appendChild(submit);
BrechtDeMan@936 196 interfaceButtons.appendChild(downloadPoint);
BrechtDeMan@936 197
BrechtDeMan@936 198 // Now create the slider and HTML5 canvas boxes
BrechtDeMan@936 199
BrechtDeMan@936 200 // Create the div box to center align
BrechtDeMan@936 201 var sliderBox = document.createElement('div');
BrechtDeMan@936 202 sliderBox.className = 'sliderCanvasDiv';
BrechtDeMan@936 203 sliderBox.id = 'sliderCanvasHolder';
BrechtDeMan@936 204 sliderBox.align = 'center';
BrechtDeMan@936 205
BrechtDeMan@936 206 // Create the slider box to hold the slider elements
BrechtDeMan@936 207 var canvas = document.createElement('div');
BrechtDeMan@936 208 canvas.id = 'slider';
BrechtDeMan@936 209 // Must have a known EXACT width, as this is used later to determine the ratings
BrechtDeMan@936 210 canvas.style.width = width - 100 +"px";
BrechtDeMan@936 211 canvas.align = "left";
BrechtDeMan@936 212 sliderBox.appendChild(canvas);
BrechtDeMan@936 213
BrechtDeMan@936 214 // Create the div to hold any scale objects
BrechtDeMan@936 215 var scale = document.createElement('div');
BrechtDeMan@936 216 scale.className = 'sliderScale';
BrechtDeMan@936 217 scale.id = 'sliderScaleHolder';
BrechtDeMan@936 218 scale.align = 'left';
BrechtDeMan@936 219 sliderBox.appendChild(scale);
BrechtDeMan@936 220
BrechtDeMan@936 221 // Global parent for the comment boxes on the page
BrechtDeMan@936 222 var feedbackHolder = document.createElement('div');
BrechtDeMan@936 223 feedbackHolder.id = 'feedbackHolder';
BrechtDeMan@936 224
BrechtDeMan@936 225 testContent.style.zIndex = 1;
BrechtDeMan@936 226 insertPoint.innerHTML = null; // Clear the current schema
BrechtDeMan@936 227
BrechtDeMan@936 228 // Create pre and post test questions
BrechtDeMan@936 229
BrechtDeMan@936 230 var preTest = xmlSetup.find('PreTest');
BrechtDeMan@936 231 var postTest = xmlSetup.find('PostTest');
BrechtDeMan@936 232 preTest = preTest[0];
BrechtDeMan@936 233 postTest = postTest[0];
BrechtDeMan@936 234
BrechtDeMan@936 235 currentState = 'preTest';
BrechtDeMan@936 236
BrechtDeMan@936 237 // Create Pre-Test Box
BrechtDeMan@936 238 if (preTest != undefined && preTest.childElementCount >= 1)
BrechtDeMan@936 239 {
BrechtDeMan@936 240 showPopup();
BrechtDeMan@936 241 preTestPopupStart(preTest);
BrechtDeMan@936 242 }
BrechtDeMan@936 243
BrechtDeMan@936 244 // Inject into HTML
BrechtDeMan@936 245 testContent.appendChild(title); // Insert the title
BrechtDeMan@936 246 testContent.appendChild(pagetitle);
BrechtDeMan@936 247 testContent.appendChild(interfaceButtons);
BrechtDeMan@936 248 testContent.appendChild(sliderBox);
BrechtDeMan@936 249 testContent.appendChild(feedbackHolder);
BrechtDeMan@936 250 insertPoint.appendChild(testContent);
BrechtDeMan@936 251
BrechtDeMan@936 252 // Load the full interface
BrechtDeMan@936 253
BrechtDeMan@936 254 }
BrechtDeMan@936 255
BrechtDeMan@936 256 function loadTest(id)
BrechtDeMan@936 257 {
BrechtDeMan@936 258
BrechtDeMan@936 259 // Reset audioEngineContext.Metric globals for new test
BrechtDeMan@936 260 audioEngineContext.newTestPage();
BrechtDeMan@936 261
BrechtDeMan@936 262 // Used to load a specific test page
BrechtDeMan@936 263 var textXML = testXMLSetups[id];
BrechtDeMan@936 264
BrechtDeMan@936 265 var feedbackHolder = document.getElementById('feedbackHolder');
BrechtDeMan@936 266 var canvas = document.getElementById('slider');
BrechtDeMan@936 267 feedbackHolder.innerHTML = null;
BrechtDeMan@936 268 canvas.innerHTML = null;
BrechtDeMan@936 269
BrechtDeMan@936 270 // Setup question title
BrechtDeMan@936 271 var interfaceObj = $(textXML).find('interface');
BrechtDeMan@936 272 var titleNode = interfaceObj.find('title');
BrechtDeMan@936 273 if (titleNode[0] != undefined)
BrechtDeMan@936 274 {
BrechtDeMan@936 275 document.getElementById('pageTitle').textContent = titleNode[0].textContent;
BrechtDeMan@936 276 }
BrechtDeMan@936 277 var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
BrechtDeMan@936 278 var offset = 50-8; // Half the offset of the slider (window width -100) minus the body padding of 8
BrechtDeMan@936 279 // TODO: AUTOMATE ABOVE!!
BrechtDeMan@936 280 var scale = document.getElementById('sliderScaleHolder');
BrechtDeMan@936 281 scale.innerHTML = null;
BrechtDeMan@936 282 interfaceObj.find('scale').each(function(index,scaleObj){
BrechtDeMan@936 283 var position = Number(scaleObj.attributes['position'].value)*0.01;
BrechtDeMan@936 284 var pixelPosition = (position*positionScale)+offset;
BrechtDeMan@936 285 var scaleDOM = document.createElement('span');
BrechtDeMan@936 286 scaleDOM.textContent = scaleObj.textContent;
BrechtDeMan@936 287 scale.appendChild(scaleDOM);
BrechtDeMan@936 288 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
BrechtDeMan@936 289 });
BrechtDeMan@936 290
BrechtDeMan@936 291 // Extract the hostURL attribute. If not set, create an empty string.
BrechtDeMan@936 292 var hostURL = textXML.attributes['hostURL'];
BrechtDeMan@936 293 if (hostURL == undefined) {
BrechtDeMan@936 294 hostURL = "";
BrechtDeMan@936 295 } else {
BrechtDeMan@936 296 hostURL = hostURL.value;
BrechtDeMan@936 297 }
BrechtDeMan@936 298 // Extract the sampleRate. If set, convert the string to a Number.
BrechtDeMan@936 299 var hostFs = textXML.attributes['sampleRate'];
BrechtDeMan@936 300 if (hostFs != undefined) {
BrechtDeMan@936 301 hostFs = Number(hostFs.value);
BrechtDeMan@936 302 }
BrechtDeMan@936 303
BrechtDeMan@936 304 /// CHECK FOR SAMPLE RATE COMPATIBILITY
BrechtDeMan@936 305 if (hostFs != undefined) {
BrechtDeMan@936 306 if (Number(hostFs) != audioContext.sampleRate) {
BrechtDeMan@936 307 var errStr = 'Sample rates do not match! Requested '+Number(hostFs)+', got '+audioContext.sampleRate+'. Please set the sample rate to match before completing this test.';
BrechtDeMan@936 308 alert(errStr);
BrechtDeMan@936 309 return;
BrechtDeMan@936 310 }
BrechtDeMan@936 311 }
BrechtDeMan@936 312
BrechtDeMan@936 313 var commentShow = textXML.attributes['elementComments'];
BrechtDeMan@936 314 if (commentShow != undefined) {
BrechtDeMan@936 315 if (commentShow.value == 'false') {commentShow = false;}
BrechtDeMan@936 316 else {commentShow = true;}
BrechtDeMan@936 317 } else {commentShow = true;}
BrechtDeMan@936 318
BrechtDeMan@936 319 var loopPlayback = textXML.attributes['loop'];
BrechtDeMan@936 320 if (loopPlayback != undefined)
BrechtDeMan@936 321 {
BrechtDeMan@936 322 loopPlayback = loopPlayback.value;
BrechtDeMan@936 323 if (loopPlayback == 'true') {
BrechtDeMan@936 324 loopPlayback = true;
BrechtDeMan@936 325 } else {
BrechtDeMan@936 326 loopPlayback = false;
BrechtDeMan@936 327 }
BrechtDeMan@936 328 } else {
BrechtDeMan@936 329 loopPlayback = false;
BrechtDeMan@936 330 }
BrechtDeMan@936 331 audioEngineContext.loopPlayback = loopPlayback;
BrechtDeMan@936 332 loopPlayback = false;
BrechtDeMan@936 333 // Create AudioEngine bindings for playback
BrechtDeMan@936 334 if (loopPlayback) {
BrechtDeMan@936 335 audioEngineContext.selectedTrack = function(id) {
BrechtDeMan@936 336 for (var i=0; i<this.audioObjects.length; i++)
BrechtDeMan@936 337 {
BrechtDeMan@936 338 if (id == i) {
BrechtDeMan@936 339 this.audioObjects[i].outputGain.gain.value = 1.0;
BrechtDeMan@936 340 } else {
BrechtDeMan@936 341 this.audioObjects[i].outputGain.gain.value = 0.0;
BrechtDeMan@936 342 }
BrechtDeMan@936 343 }
BrechtDeMan@936 344 };
BrechtDeMan@936 345 } else {
BrechtDeMan@936 346 audioEngineContext.selectedTrack = function(id) {
BrechtDeMan@936 347 for (var i=0; i<this.audioObjects.length; i++)
BrechtDeMan@936 348 {
BrechtDeMan@936 349 this.audioObjects[i].outputGain.gain.value = 0.0;
BrechtDeMan@936 350 this.audioObjects[i].stop();
BrechtDeMan@936 351 }
BrechtDeMan@936 352 if (this.status == 1) {
BrechtDeMan@936 353 this.audioObjects[id].outputGain.gain.value = 1.0;
BrechtDeMan@936 354 this.audioObjects[id].play(audioContext.currentTime+0.01);
BrechtDeMan@936 355 }
BrechtDeMan@936 356 };
BrechtDeMan@936 357 }
BrechtDeMan@936 358
BrechtDeMan@936 359 currentTestHolder = document.createElement('audioHolder');
BrechtDeMan@936 360 currentTestHolder.id = textXML.id;
BrechtDeMan@936 361 currentTestHolder.repeatCount = textXML.attributes['repeatCount'].value;
BrechtDeMan@936 362 var currentPreTestHolder = document.createElement('preTest');
BrechtDeMan@936 363 var currentPostTestHolder = document.createElement('postTest');
BrechtDeMan@936 364 currentTestHolder.appendChild(currentPreTestHolder);
BrechtDeMan@936 365 currentTestHolder.appendChild(currentPostTestHolder);
BrechtDeMan@936 366
BrechtDeMan@936 367 var randomise = textXML.attributes['randomiseOrder'];
BrechtDeMan@936 368 if (randomise != undefined) {randomise = randomise.value;}
BrechtDeMan@936 369 else {randomise = false;}
BrechtDeMan@936 370
BrechtDeMan@936 371 var audioElements = $(textXML).find('audioElements');
BrechtDeMan@936 372 currentTrackOrder = [];
BrechtDeMan@936 373 audioElements.each(function(index,element){
BrechtDeMan@936 374 // Find any blind-repeats
BrechtDeMan@936 375 // Not implemented yet, but just in case
BrechtDeMan@936 376 currentTrackOrder[index] = element;
BrechtDeMan@936 377 });
BrechtDeMan@936 378 if (randomise) {
BrechtDeMan@936 379 currentTrackOrder = randomiseOrder(currentTrackOrder);
BrechtDeMan@936 380 }
BrechtDeMan@936 381
BrechtDeMan@936 382 // Delete any previous audioObjects associated with the audioEngine
BrechtDeMan@936 383 audioEngineContext.audioObjects = [];
BrechtDeMan@936 384
BrechtDeMan@936 385 // Find all the audioElements from the audioHolder
BrechtDeMan@936 386 $(currentTrackOrder).each(function(index,element){
BrechtDeMan@936 387 // Find URL of track
BrechtDeMan@936 388 // In this jQuery loop, variable 'this' holds the current audioElement.
BrechtDeMan@936 389
BrechtDeMan@936 390 // Now load each audio sample. First create the new track by passing the full URL
BrechtDeMan@936 391 var trackURL = hostURL + this.attributes['url'].value;
BrechtDeMan@936 392 audioEngineContext.newTrack(trackURL);
BrechtDeMan@936 393
BrechtDeMan@936 394 if (commentShow) {
BrechtDeMan@936 395 // Create document objects to hold the comment boxes
BrechtDeMan@936 396 var trackComment = document.createElement('div');
BrechtDeMan@936 397 trackComment.className = 'comment-div';
BrechtDeMan@936 398 // Create a string next to each comment asking for a comment
BrechtDeMan@936 399 var trackString = document.createElement('span');
BrechtDeMan@936 400 trackString.innerHTML = 'Comment on track '+index;
BrechtDeMan@936 401 // Create the HTML5 comment box 'textarea'
BrechtDeMan@936 402 var trackCommentBox = document.createElement('textarea');
BrechtDeMan@936 403 trackCommentBox.rows = '4';
BrechtDeMan@936 404 trackCommentBox.cols = '100';
BrechtDeMan@936 405 trackCommentBox.name = 'trackComment'+index;
BrechtDeMan@936 406 trackCommentBox.className = 'trackComment';
BrechtDeMan@936 407 var br = document.createElement('br');
BrechtDeMan@936 408 // Add to the holder.
BrechtDeMan@936 409 trackComment.appendChild(trackString);
BrechtDeMan@936 410 trackComment.appendChild(br);
BrechtDeMan@936 411 trackComment.appendChild(trackCommentBox);
BrechtDeMan@936 412 feedbackHolder.appendChild(trackComment);
BrechtDeMan@936 413 }
BrechtDeMan@936 414
BrechtDeMan@936 415 // Create a slider per track
BrechtDeMan@936 416
BrechtDeMan@936 417 var trackSliderObj = document.createElement('div');
BrechtDeMan@936 418 trackSliderObj.className = 'track-slider';
BrechtDeMan@936 419 trackSliderObj.id = 'track-slider-'+index;
BrechtDeMan@936 420 // Distribute it randomnly
BrechtDeMan@936 421 var w = window.innerWidth - 100;
BrechtDeMan@936 422 w = Math.random()*w;
BrechtDeMan@936 423 trackSliderObj.style.left = Math.floor(w)+50+'px';
BrechtDeMan@936 424 trackSliderObj.innerHTML = '<span>'+index+'</span>';
BrechtDeMan@936 425 trackSliderObj.draggable = true;
BrechtDeMan@936 426 trackSliderObj.ondragend = dragEnd;
BrechtDeMan@936 427 trackSliderObj.ondragstart = function()
BrechtDeMan@936 428 {
BrechtDeMan@936 429 var id = Number(this.id.substr(13,2)); // Maximum theoretical tracks is 99!
BrechtDeMan@936 430 audioEngineContext.metric.sliderMoveStart(id);
BrechtDeMan@936 431 };
BrechtDeMan@936 432
BrechtDeMan@936 433 // Onclick, switch playback to that track
BrechtDeMan@936 434 trackSliderObj.onclick = function() {
BrechtDeMan@936 435 // Start the test on first click, that way timings are more accurate.
BrechtDeMan@936 436 audioEngineContext.play();
BrechtDeMan@936 437 // Get the track ID from the object ID
BrechtDeMan@936 438 var id = Number(this.id.substr(13,2)); // Maximum theoretical tracks is 99!
BrechtDeMan@936 439 //audioEngineContext.metric.sliderPlayed(id);
BrechtDeMan@936 440 audioEngineContext.selectedTrack(id);
BrechtDeMan@936 441 // Currently playing track red, rest green
BrechtDeMan@936 442 document.getElementById('track-slider-'+index).style.backgroundColor = "#FF0000";
BrechtDeMan@936 443 for (var i = 0; i<$(currentTrackOrder).length; i++)
BrechtDeMan@936 444 {
BrechtDeMan@936 445 if (i!=index) // Make all other sliders green
BrechtDeMan@936 446 {
BrechtDeMan@936 447 document.getElementById('track-slider-'+i).style.backgroundColor = "rgb(100,200,100)";
BrechtDeMan@936 448 }
BrechtDeMan@936 449
BrechtDeMan@936 450 }
BrechtDeMan@936 451 };
BrechtDeMan@936 452
BrechtDeMan@936 453 canvas.appendChild(trackSliderObj);
BrechtDeMan@936 454
BrechtDeMan@936 455 });
BrechtDeMan@936 456
BrechtDeMan@936 457 // Append any commentQuestion boxes
BrechtDeMan@936 458 var commentQuestions = $(textXML).find('CommentQuestion');
BrechtDeMan@936 459 $(commentQuestions).each(function(index,element) {
BrechtDeMan@936 460 // Create document objects to hold the comment boxes
BrechtDeMan@936 461 var trackComment = document.createElement('div');
BrechtDeMan@936 462 trackComment.className = 'comment-div commentQuestion';
BrechtDeMan@936 463 trackComment.id = element.attributes['id'].value;
BrechtDeMan@936 464 // Create a string next to each comment asking for a comment
BrechtDeMan@936 465 var trackString = document.createElement('span');
BrechtDeMan@936 466 trackString.innerHTML = element.textContent;
BrechtDeMan@936 467 // Create the HTML5 comment box 'textarea'
BrechtDeMan@936 468 var trackCommentBox = document.createElement('textarea');
BrechtDeMan@936 469 trackCommentBox.rows = '4';
BrechtDeMan@936 470 trackCommentBox.cols = '100';
BrechtDeMan@936 471 trackCommentBox.name = 'commentQuestion'+index;
BrechtDeMan@936 472 trackCommentBox.className = 'trackComment';
BrechtDeMan@936 473 var br = document.createElement('br');
BrechtDeMan@936 474 // Add to the holder.
BrechtDeMan@936 475 trackComment.appendChild(trackString);
BrechtDeMan@936 476 trackComment.appendChild(br);
BrechtDeMan@936 477 trackComment.appendChild(trackCommentBox);
BrechtDeMan@936 478 feedbackHolder.appendChild(trackComment);
BrechtDeMan@936 479 });
BrechtDeMan@936 480
BrechtDeMan@936 481 // Now process any pre-test commands
BrechtDeMan@936 482
BrechtDeMan@936 483 var preTest = $(testXMLSetups[id]).find('PreTest')[0];
BrechtDeMan@936 484 if (preTest.childElementCount > 0)
BrechtDeMan@936 485 {
BrechtDeMan@936 486 currentState = 'testRunPre-'+id;
BrechtDeMan@936 487 preTestPopupStart(preTest);
BrechtDeMan@936 488 showPopup();
BrechtDeMan@936 489 } else {
BrechtDeMan@936 490 currentState = 'testRun-'+id;
BrechtDeMan@936 491 }
BrechtDeMan@936 492 }
BrechtDeMan@936 493
BrechtDeMan@936 494 function preTestPopupStart(preTest)
BrechtDeMan@936 495 {
BrechtDeMan@936 496 var popupHolder = document.getElementById('popupHolder');
BrechtDeMan@936 497 popupHolder.innerHTML = null;
BrechtDeMan@936 498 // Parse the first box
BrechtDeMan@936 499 var preTestOption = document.createElement('div');
BrechtDeMan@936 500 preTestOption.id = 'preTest';
BrechtDeMan@936 501 preTestOption.style.marginTop = '25px';
BrechtDeMan@936 502 preTestOption.align = "center";
BrechtDeMan@936 503 var child = $(preTest).children()[0];
BrechtDeMan@936 504 if (child.nodeName == 'statement')
BrechtDeMan@936 505 {
BrechtDeMan@936 506 preTestOption.innerHTML = '<span>'+child.textContent+'</span>';
BrechtDeMan@936 507 } else if (child.nodeName == 'question')
BrechtDeMan@936 508 {
BrechtDeMan@936 509 var textHold = document.createElement('span');
BrechtDeMan@936 510 textHold.innerHTML = child.textContent;
BrechtDeMan@936 511 var textEnter = document.createElement('textarea');
BrechtDeMan@936 512 textEnter.id = child.attributes['id'].value + 'response';
BrechtDeMan@936 513 var br = document.createElement('br');
BrechtDeMan@936 514 preTestOption.innerHTML = null;
BrechtDeMan@936 515 preTestOption.appendChild(textHold);
BrechtDeMan@936 516 preTestOption.appendChild(br);
BrechtDeMan@936 517 preTestOption.appendChild(textEnter);
BrechtDeMan@936 518 }
BrechtDeMan@936 519 var nextButton = document.createElement('button');
BrechtDeMan@936 520 nextButton.className = 'popupButton';
BrechtDeMan@936 521 nextButton.value = '0';
BrechtDeMan@936 522 nextButton.innerHTML = 'Next';
BrechtDeMan@936 523 nextButton.onclick = popupButtonClick;
BrechtDeMan@936 524
BrechtDeMan@936 525 popupHolder.appendChild(preTestOption);
BrechtDeMan@936 526 popupHolder.appendChild(nextButton);
BrechtDeMan@936 527 }
BrechtDeMan@936 528
BrechtDeMan@936 529 function popupButtonClick()
BrechtDeMan@936 530 {
BrechtDeMan@936 531 // Global call from the 'Next' button click
BrechtDeMan@936 532 if (currentState == 'preTest')
BrechtDeMan@936 533 {
BrechtDeMan@936 534 // At the start of the preTest routine!
BrechtDeMan@936 535 var xmlTree = projectXML.find('setup');
BrechtDeMan@936 536 var preTest = xmlTree.find('PreTest')[0];
BrechtDeMan@936 537 this.value = preTestButtonClick(preTest,this.value);
BrechtDeMan@936 538 } else if (currentState.substr(0,10) == 'testRunPre')
BrechtDeMan@936 539 {
BrechtDeMan@936 540 //Specific test pre-test
BrechtDeMan@936 541 var testId = currentState.substr(11,currentState.length-10);
BrechtDeMan@936 542 var preTest = $(testXMLSetups[testId]).find('PreTest')[0];
BrechtDeMan@936 543 this.value = preTestButtonClick(preTest,this.value);
BrechtDeMan@936 544 } else if (currentState.substr(0,11) == 'testRunPost')
BrechtDeMan@936 545 {
BrechtDeMan@936 546 // Specific test post-test
BrechtDeMan@936 547 var testId = currentState.substr(12,currentState.length-11);
BrechtDeMan@936 548 var preTest = $(testXMLSetups[testId]).find('PostTest')[0];
BrechtDeMan@936 549 this.value = preTestButtonClick(preTest,this.value);
BrechtDeMan@936 550 } else if (currentState == 'postTest')
BrechtDeMan@936 551 {
BrechtDeMan@936 552 // At the end of the test, running global post test
BrechtDeMan@936 553 var xmlTree = projectXML.find('setup');
BrechtDeMan@936 554 var PostTest = xmlTree.find('PostTest')[0];
BrechtDeMan@936 555 this.value = preTestButtonClick(PostTest,this.value);
BrechtDeMan@936 556 }
BrechtDeMan@936 557 }
BrechtDeMan@936 558
BrechtDeMan@936 559 function preTestButtonClick(preTest,index)
BrechtDeMan@936 560 {
BrechtDeMan@936 561 // Called on click of pre-test button
BrechtDeMan@936 562 // Need to find and parse preTest again!
BrechtDeMan@936 563 var preTestOption = document.getElementById('preTest');
BrechtDeMan@936 564 // Check if current state is a question!
BrechtDeMan@936 565 if ($(preTest).children()[index].nodeName == 'question') {
BrechtDeMan@936 566 var questionId = $(preTest).children()[index].attributes['id'].value;
BrechtDeMan@936 567 var questionHold = document.createElement('comment');
BrechtDeMan@936 568 var questionResponse = document.getElementById(questionId + 'response');
BrechtDeMan@936 569 var mandatory = $(preTest).children()[index].attributes['mandatory'];
BrechtDeMan@936 570 if (mandatory != undefined){
BrechtDeMan@936 571 if (mandatory.value == 'true') {mandatory = true;}
BrechtDeMan@936 572 else {mandatory = false;}
BrechtDeMan@936 573 } else {mandatory = false;}
BrechtDeMan@936 574 if (mandatory == true && questionResponse.value.length == 0) {
BrechtDeMan@936 575 return index;
BrechtDeMan@936 576 }
BrechtDeMan@936 577 questionHold.id = questionId;
BrechtDeMan@936 578 questionHold.innerHTML = questionResponse.value;
BrechtDeMan@936 579 postPopupResponse(questionHold);
BrechtDeMan@936 580 }
BrechtDeMan@936 581 index++;
BrechtDeMan@936 582 if (index < preTest.childElementCount)
BrechtDeMan@936 583 {
BrechtDeMan@936 584 // More to process
BrechtDeMan@936 585 var child = $(preTest).children()[index];
BrechtDeMan@936 586 if (child.nodeName == 'statement')
BrechtDeMan@936 587 {
BrechtDeMan@936 588 preTestOption.innerHTML = '<span>'+child.textContent+'</span>';
BrechtDeMan@936 589 } else if (child.nodeName == 'question')
BrechtDeMan@936 590 {
BrechtDeMan@936 591 var textHold = document.createElement('span');
BrechtDeMan@936 592 textHold.innerHTML = child.textContent;
BrechtDeMan@936 593 var textEnter = document.createElement('textarea');
BrechtDeMan@936 594 textEnter.id = child.attributes['id'].value + 'response';
BrechtDeMan@936 595 var br = document.createElement('br');
BrechtDeMan@936 596 preTestOption.innerHTML = null;
BrechtDeMan@936 597 preTestOption.appendChild(textHold);
BrechtDeMan@936 598 preTestOption.appendChild(br);
BrechtDeMan@936 599 preTestOption.appendChild(textEnter);
BrechtDeMan@936 600 }
BrechtDeMan@936 601 } else {
BrechtDeMan@936 602 // Time to clear
BrechtDeMan@936 603 preTestOption.innerHTML = null;
BrechtDeMan@936 604 if (currentState != 'postTest') {
BrechtDeMan@936 605 hidePopup();
BrechtDeMan@936 606 // Progress the state!
BrechtDeMan@936 607 advanceState();
BrechtDeMan@936 608 } else {
BrechtDeMan@936 609 a = createProjectSave(projectReturn);
BrechtDeMan@936 610 preTestOption.appendChild(a);
BrechtDeMan@936 611 }
BrechtDeMan@936 612 }
BrechtDeMan@936 613 return index;
BrechtDeMan@936 614 }
BrechtDeMan@936 615
BrechtDeMan@936 616 function postPopupResponse(response)
BrechtDeMan@936 617 {
BrechtDeMan@936 618 if (currentState == 'preTest') {
BrechtDeMan@936 619 preTestQuestions.appendChild(response);
BrechtDeMan@936 620 } else if (currentState == 'postTest') {
BrechtDeMan@936 621 postTestQuestions.appendChild(response);
BrechtDeMan@936 622 } else {
BrechtDeMan@936 623 // Inside a specific test
BrechtDeMan@936 624 if (currentState.substr(0,10) == 'testRunPre') {
BrechtDeMan@936 625 // Pre Test
BrechtDeMan@936 626 var store = $(currentTestHolder).find('preTest');
BrechtDeMan@936 627 } else {
BrechtDeMan@936 628 // Post Test
BrechtDeMan@936 629 var store = $(currentTestHolder).find('postTest');
BrechtDeMan@936 630 }
BrechtDeMan@936 631 store[0].appendChild(response);
BrechtDeMan@936 632 }
BrechtDeMan@936 633 }
BrechtDeMan@936 634
BrechtDeMan@936 635 function dragEnd(ev) {
BrechtDeMan@936 636 // Function call when a div has been dropped
BrechtDeMan@936 637 var slider = document.getElementById('slider');
BrechtDeMan@936 638 var w = slider.style.width;
BrechtDeMan@936 639 w = Number(w.substr(0,w.length-2));
BrechtDeMan@936 640 var x = ev.x;
BrechtDeMan@936 641 if (x >= 42 && x < w+42) {
BrechtDeMan@936 642 this.style.left = (x)+'px';
BrechtDeMan@936 643 } else {
BrechtDeMan@936 644 if (x<42) {
BrechtDeMan@936 645 this.style.left = '42px';
BrechtDeMan@936 646 } else {
BrechtDeMan@936 647 this.style.left = (w+42) + 'px';
BrechtDeMan@936 648 }
BrechtDeMan@936 649 }
BrechtDeMan@936 650 audioEngineContext.metric.sliderMoved();
BrechtDeMan@936 651 }
BrechtDeMan@936 652
BrechtDeMan@936 653 function advanceState()
BrechtDeMan@936 654 {
BrechtDeMan@936 655 console.log(currentState);
BrechtDeMan@936 656 if (currentState == 'preTest')
BrechtDeMan@936 657 {
BrechtDeMan@936 658 // End of pre-test, begin the test
BrechtDeMan@936 659 loadTest(0);
BrechtDeMan@936 660 } else if (currentState.substr(0,10) == 'testRunPre')
BrechtDeMan@936 661 {
BrechtDeMan@936 662 // Start the test
BrechtDeMan@936 663 var testId = currentState.substr(11,currentState.length-10);
BrechtDeMan@936 664 currentState = 'testRun-'+testId;
BrechtDeMan@936 665 //audioEngineContext.timer.startTest();
BrechtDeMan@936 666 //audioEngineContext.play();
BrechtDeMan@936 667 } else if (currentState.substr(0,11) == 'testRunPost')
BrechtDeMan@936 668 {
BrechtDeMan@936 669 var testId = currentState.substr(12,currentState.length-11);
BrechtDeMan@936 670 testEnded(testId);
BrechtDeMan@936 671 } else if (currentState.substr(0,7) == 'testRun')
BrechtDeMan@936 672 {
BrechtDeMan@936 673 var testId = currentState.substr(8,currentState.length-7);
BrechtDeMan@936 674 // Check if we have any post tests to perform
BrechtDeMan@936 675 var postXML = $(testXMLSetups[testId]).find('PostTest')[0];
BrechtDeMan@936 676 if (postXML == undefined || postXML.childElementCount == 0) {
BrechtDeMan@936 677 testEnded(testId);
BrechtDeMan@936 678 }
BrechtDeMan@936 679 else if (postXML.childElementCount > 0)
BrechtDeMan@936 680 {
BrechtDeMan@936 681 currentState = 'testRunPost-'+testId;
BrechtDeMan@936 682 showPopup();
BrechtDeMan@936 683 preTestPopupStart(postXML);
BrechtDeMan@936 684 }
BrechtDeMan@936 685 else {
BrechtDeMan@936 686
BrechtDeMan@936 687
BrechtDeMan@936 688 // No post tests, check if we have another test to perform instead
BrechtDeMan@936 689
BrechtDeMan@936 690 }
BrechtDeMan@936 691 }
BrechtDeMan@936 692 console.log(currentState);
BrechtDeMan@936 693 }
BrechtDeMan@936 694
BrechtDeMan@936 695 function testEnded(testId)
BrechtDeMan@936 696 {
BrechtDeMan@936 697 pageXMLSave(testId);
BrechtDeMan@936 698 if (testXMLSetups.length-1 > testId)
BrechtDeMan@936 699 {
BrechtDeMan@936 700 // Yes we have another test to perform
BrechtDeMan@936 701 testId = (Number(testId)+1);
BrechtDeMan@936 702 currentState = 'testRun-'+testId;
BrechtDeMan@936 703 loadTest(testId);
BrechtDeMan@936 704 } else {
BrechtDeMan@936 705 console.log('Testing Completed!');
BrechtDeMan@936 706 currentState = 'postTest';
BrechtDeMan@936 707 // Check for any post tests
BrechtDeMan@936 708 var xmlSetup = projectXML.find('setup');
BrechtDeMan@936 709 var postTest = xmlSetup.find('PostTest')[0];
BrechtDeMan@936 710 showPopup();
BrechtDeMan@936 711 preTestPopupStart(postTest);
BrechtDeMan@936 712 }
BrechtDeMan@936 713 }
BrechtDeMan@936 714
BrechtDeMan@936 715 function buttonSubmitClick() // TODO: Only when all songs have been played!
BrechtDeMan@936 716 {
BrechtDeMan@936 717 hasBeenPlayed = audioEngineContext.checkAllPlayed();
BrechtDeMan@936 718 if (hasBeenPlayed.length == 0) {
BrechtDeMan@936 719 if (audioEngineContext.status == 1) {
BrechtDeMan@936 720 var playback = document.getElementById('playback-button');
BrechtDeMan@936 721 playback.click();
BrechtDeMan@936 722 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options
BrechtDeMan@936 723 } else
BrechtDeMan@936 724 {
BrechtDeMan@936 725 if (audioEngineContext.timer.testStarted == false)
BrechtDeMan@936 726 {
BrechtDeMan@936 727 alert('You have not started the test! Please press start to begin the test!');
BrechtDeMan@936 728 return;
BrechtDeMan@936 729 }
BrechtDeMan@936 730 }
BrechtDeMan@936 731 if (currentState.substr(0,7) == 'testRun')
BrechtDeMan@936 732 {
BrechtDeMan@936 733 hasBeenPlayed = []; // clear array to prepare for next test
BrechtDeMan@936 734 audioEngineContext.timer.stopTest();
BrechtDeMan@936 735 advanceState();
BrechtDeMan@936 736 }
BrechtDeMan@936 737 } else // if a fragment has not been played yet
BrechtDeMan@936 738 {
BrechtDeMan@936 739 str = "";
BrechtDeMan@936 740 if (hasBeenPlayed.length > 1) {
BrechtDeMan@936 741 for (var i=0; i<hasBeenPlayed.length; i++) {
BrechtDeMan@936 742 str = str + hasBeenPlayed[i];
BrechtDeMan@936 743 if (i < hasBeenPlayed.length-2){
BrechtDeMan@936 744 str += ", ";
BrechtDeMan@936 745 } else if (i == hasBeenPlayed.length-2) {
BrechtDeMan@936 746 str += " or ";
BrechtDeMan@936 747 }
BrechtDeMan@936 748 }
BrechtDeMan@936 749 alert('You have not played fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
BrechtDeMan@936 750 } else {
BrechtDeMan@936 751 alert('You have not played fragment ' + hasBeenPlayed[0] + ' yet. Please listen, rate and comment all samples before submitting.');
BrechtDeMan@936 752 }
BrechtDeMan@936 753 return;
BrechtDeMan@936 754 }
BrechtDeMan@936 755 }
BrechtDeMan@936 756
BrechtDeMan@936 757 function convSliderPosToRate(id)
BrechtDeMan@936 758 {
BrechtDeMan@936 759 var w = document.getElementById('slider').style.width;
BrechtDeMan@936 760 var maxPix = w.substr(0,w.length-2);
BrechtDeMan@936 761 var slider = document.getElementsByClassName('track-slider')[id];
BrechtDeMan@936 762 var pix = slider.style.left;
BrechtDeMan@936 763 pix = pix.substr(0,pix.length-2);
BrechtDeMan@936 764 var rate = (pix-42)/maxPix;
BrechtDeMan@936 765 return rate;
BrechtDeMan@936 766 }
BrechtDeMan@936 767
BrechtDeMan@936 768 function pageXMLSave(testId)
BrechtDeMan@936 769 {
BrechtDeMan@936 770 // Saves a specific test page
BrechtDeMan@936 771 var xmlDoc = currentTestHolder;
BrechtDeMan@936 772 // Check if any session wide metrics are enabled
BrechtDeMan@936 773
BrechtDeMan@936 774 var commentShow = testXMLSetups[testId].attributes['elementComments'];
BrechtDeMan@936 775 if (commentShow != undefined) {
BrechtDeMan@936 776 if (commentShow.value == 'false') {commentShow = false;}
BrechtDeMan@936 777 else {commentShow = true;}
BrechtDeMan@936 778 } else {commentShow = true;}
BrechtDeMan@936 779
BrechtDeMan@936 780 var metric = document.createElement('metric');
BrechtDeMan@936 781 if (audioEngineContext.metric.enableTestTimer)
BrechtDeMan@936 782 {
BrechtDeMan@936 783 var testTime = document.createElement('metricResult');
BrechtDeMan@936 784 testTime.id = 'testTime';
BrechtDeMan@936 785 testTime.textContent = audioEngineContext.timer.testDuration;
BrechtDeMan@936 786 metric.appendChild(testTime);
BrechtDeMan@936 787 }
BrechtDeMan@936 788 xmlDoc.appendChild(metric);
BrechtDeMan@936 789 var trackSliderObjects = document.getElementsByClassName('track-slider');
BrechtDeMan@936 790 var commentObjects = document.getElementsByClassName('comment-div');
BrechtDeMan@936 791 for (var i=0; i<trackSliderObjects.length; i++)
BrechtDeMan@936 792 {
BrechtDeMan@936 793 var audioElement = document.createElement('audioElement');
BrechtDeMan@936 794 audioElement.id = currentTrackOrder[i].attributes['id'].value;
BrechtDeMan@936 795 audioElement.url = currentTrackOrder[i].attributes['url'].value;
BrechtDeMan@936 796 var value = document.createElement('value');
BrechtDeMan@936 797 value.innerHTML = convSliderPosToRate(i);
BrechtDeMan@936 798 if (commentShow) {
BrechtDeMan@936 799 var comment = document.createElement("comment");
BrechtDeMan@936 800 var question = document.createElement("question");
BrechtDeMan@936 801 var response = document.createElement("response");
BrechtDeMan@936 802 question.textContent = commentObjects[i].children[0].textContent;
BrechtDeMan@936 803 response.textContent = commentObjects[i].children[2].value;
BrechtDeMan@936 804 console.log('Comment ' + i + ': ' + commentObjects[i].children[2].value); // DEBUG/SAFETY
BrechtDeMan@936 805 comment.appendChild(question);
BrechtDeMan@936 806 comment.appendChild(response);
BrechtDeMan@936 807 audioElement.appendChild(comment);
BrechtDeMan@936 808 }
BrechtDeMan@936 809 audioElement.appendChild(value);
BrechtDeMan@936 810 // Check for any per element metrics
BrechtDeMan@936 811 var metric = document.createElement('metric');
BrechtDeMan@936 812 var elementMetric = audioEngineContext.audioObjects[i].metric;
BrechtDeMan@936 813 if (audioEngineContext.metric.enableElementTimer) {
BrechtDeMan@936 814 var elementTimer = document.createElement('metricResult');
BrechtDeMan@936 815 elementTimer.id = 'elementTimer';
BrechtDeMan@936 816 elementTimer.textContent = elementMetric.listenedTimer;
BrechtDeMan@936 817 metric.appendChild(elementTimer);
BrechtDeMan@936 818 }
BrechtDeMan@936 819 if (audioEngineContext.metric.enableElementTracker) {
BrechtDeMan@936 820 var elementTrackerFull = document.createElement('metricResult');
BrechtDeMan@936 821 elementTrackerFull.id = 'elementTrackerFull';
BrechtDeMan@936 822 var data = elementMetric.movementTracker;
BrechtDeMan@936 823 for (var k=0; k<data.length; k++)
BrechtDeMan@936 824 {
BrechtDeMan@936 825 var timePos = document.createElement('timePos');
BrechtDeMan@936 826 timePos.id = k;
BrechtDeMan@936 827 var time = document.createElement('time');
BrechtDeMan@936 828 time.textContent = data[k][0];
BrechtDeMan@936 829 var position = document.createElement('position');
BrechtDeMan@936 830 position.textContent = data[k][1];
BrechtDeMan@936 831 timePos.appendChild(time);
BrechtDeMan@936 832 timePos.appendChild(position);
BrechtDeMan@936 833 elementTrackerFull.appendChild(timePos);
BrechtDeMan@936 834 }
BrechtDeMan@936 835 metric.appendChild(elementTrackerFull);
BrechtDeMan@936 836 }
BrechtDeMan@936 837 if (audioEngineContext.metric.enableElementInitialPosition) {
BrechtDeMan@936 838 var elementInitial = document.createElement('metricResult');
BrechtDeMan@936 839 elementInitial.id = 'elementInitialPosition';
BrechtDeMan@936 840 elementInitial.textContent = elementMetric.initialPosition;
BrechtDeMan@936 841 metric.appendChild(elementInitial);
BrechtDeMan@936 842 }
BrechtDeMan@936 843 if (audioEngineContext.metric.enableFlagListenedTo) {
BrechtDeMan@936 844 var flagListenedTo = document.createElement('metricResult');
BrechtDeMan@936 845 flagListenedTo.id = 'elementFlagListenedTo';
BrechtDeMan@936 846 flagListenedTo.textContent = elementMetric.wasListenedTo;
BrechtDeMan@936 847 metric.appendChild(flagListenedTo);
BrechtDeMan@936 848 }
BrechtDeMan@936 849 if (audioEngineContext.metric.enableFlagMoved) {
BrechtDeMan@936 850 var flagMoved = document.createElement('metricResult');
BrechtDeMan@936 851 flagMoved.id = 'elementFlagMoved';
BrechtDeMan@936 852 flagMoved.textContent = elementMetric.wasMoved;
BrechtDeMan@936 853 metric.appendChild(flagMoved);
BrechtDeMan@936 854 }
BrechtDeMan@936 855 if (audioEngineContext.metric.enableFlagComments) {
BrechtDeMan@936 856 var flagComments = document.createElement('metricResult');
BrechtDeMan@936 857 flagComments.id = 'elementFlagComments';
BrechtDeMan@936 858 if (response.textContent.length == 0) {flag.textContent = 'false';}
BrechtDeMan@936 859 else {flag.textContet = 'true';}
BrechtDeMan@936 860 metric.appendChild(flagComments);
BrechtDeMan@936 861 }
BrechtDeMan@936 862 audioElement.appendChild(metric);
BrechtDeMan@936 863 xmlDoc.appendChild(audioElement);
BrechtDeMan@936 864 }
BrechtDeMan@936 865 var commentQuestion = document.getElementsByClassName('commentQuestion');
BrechtDeMan@936 866 for (var i=0; i<commentQuestion.length; i++)
BrechtDeMan@936 867 {
BrechtDeMan@936 868 var cqHolder = document.createElement('CommentQuestion');
BrechtDeMan@936 869 var comment = document.createElement('comment');
BrechtDeMan@936 870 var question = document.createElement('question');
BrechtDeMan@936 871 cqHolder.id = commentQuestion[i].id;
BrechtDeMan@936 872 comment.textContent = commentQuestion[i].children[2].value;
BrechtDeMan@936 873 question.textContent = commentQuestion[i].children[0].textContent;
BrechtDeMan@936 874 console.log('Question ' + i + ': ' + commentObjects[i].children[2].value); // DEBUG/SAFETY
BrechtDeMan@936 875 cqHolder.appendChild(question);
BrechtDeMan@936 876 cqHolder.appendChild(comment);
BrechtDeMan@936 877 xmlDoc.appendChild(cqHolder);
BrechtDeMan@936 878 }
BrechtDeMan@936 879 testResultsHolders[testId] = xmlDoc;
BrechtDeMan@936 880 }
BrechtDeMan@936 881
BrechtDeMan@936 882 // Only other global function which must be defined in the interface class. Determines how to create the XML document.
BrechtDeMan@936 883 function interfaceXMLSave(){
BrechtDeMan@936 884 // Create the XML string to be exported with results
BrechtDeMan@936 885 var xmlDoc = document.createElement("BrowserEvaluationResult");
BrechtDeMan@936 886 for (var i=0; i<testResultsHolders.length; i++)
BrechtDeMan@936 887 {
BrechtDeMan@936 888 xmlDoc.appendChild(testResultsHolders[i]);
BrechtDeMan@936 889 }
BrechtDeMan@936 890 // Append Pre/Post Questions
BrechtDeMan@936 891 xmlDoc.appendChild(preTestQuestions);
BrechtDeMan@936 892 xmlDoc.appendChild(postTestQuestions);
BrechtDeMan@936 893
BrechtDeMan@936 894 return xmlDoc;
BrechtDeMan@936 895 }