BrechtDeMan@936: /** BrechtDeMan@936: * ape.js BrechtDeMan@936: * Create the APE interface BrechtDeMan@936: */ BrechtDeMan@936: BrechtDeMan@936: var currentState; // Keep track of the current state (pre/post test, which test, final test? first test?) BrechtDeMan@936: // preTest - In preTest state BrechtDeMan@936: // testRun-ID - In test running, test Id number at the end 'testRun-2' BrechtDeMan@936: // testRunPost-ID - Post test of test ID BrechtDeMan@936: // testRunPre-ID - Pre-test of test ID BrechtDeMan@936: // postTest - End of test, final submission! BrechtDeMan@936: BrechtDeMan@936: BrechtDeMan@936: // Once this is loaded and parsed, begin execution BrechtDeMan@936: loadInterface(projectXML); BrechtDeMan@936: BrechtDeMan@936: function loadInterface(xmlDoc) { BrechtDeMan@936: BrechtDeMan@936: // Get the dimensions of the screen available to the page BrechtDeMan@936: var width = window.innerWidth; BrechtDeMan@936: var height = window.innerHeight; BrechtDeMan@936: BrechtDeMan@936: // The injection point into the HTML page BrechtDeMan@936: var insertPoint = document.getElementById("topLevelBody"); BrechtDeMan@936: var testContent = document.createElement('div'); BrechtDeMan@936: testContent.id = 'testContent'; BrechtDeMan@936: BrechtDeMan@936: BrechtDeMan@936: // Decode parts of the xmlDoc that are needed BrechtDeMan@936: // xmlDoc MUST already be parsed by jQuery! BrechtDeMan@936: var xmlSetup = xmlDoc.find('setup'); BrechtDeMan@936: // Should put in an error function here incase of malprocessed or malformed XML BrechtDeMan@936: BrechtDeMan@936: // Extract the different test XML DOM trees BrechtDeMan@936: var audioHolders = xmlDoc.find('audioHolder'); BrechtDeMan@936: audioHolders.each(function(index,element) { BrechtDeMan@936: var repeatN = element.attributes['repeatCount'].value; BrechtDeMan@936: for (var r=0; r<=repeatN; r++) { BrechtDeMan@936: testXMLSetups[testXMLSetups.length] = element; BrechtDeMan@936: } BrechtDeMan@936: }); BrechtDeMan@936: BrechtDeMan@936: // New check if we need to randomise the test order BrechtDeMan@936: var randomise = xmlSetup[0].attributes['randomiseOrder']; BrechtDeMan@936: if (randomise != undefined) { BrechtDeMan@936: if (randomise.value === 'true'){ BrechtDeMan@936: randomise = true; BrechtDeMan@936: } else { BrechtDeMan@936: randomise = false; BrechtDeMan@936: } BrechtDeMan@936: } else { BrechtDeMan@936: randomise = false; BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: if (randomise) BrechtDeMan@936: { BrechtDeMan@936: testXMLSetups = randomiseOrder(testXMLSetups); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: // Obtain the metrics enabled BrechtDeMan@936: var metricNode = xmlSetup.find('Metric'); BrechtDeMan@936: var metricNode = metricNode.find('metricEnable'); BrechtDeMan@936: metricNode.each(function(index,node){ BrechtDeMan@936: var enabled = node.textContent; BrechtDeMan@936: switch(enabled) BrechtDeMan@936: { BrechtDeMan@936: case 'testTimer': BrechtDeMan@936: sessionMetrics.prototype.enableTestTimer = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementTimer': BrechtDeMan@936: sessionMetrics.prototype.enableElementTimer = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementTracker': BrechtDeMan@936: sessionMetrics.prototype.enableElementTracker = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementInitalPosition': BrechtDeMan@936: sessionMetrics.prototype.enableElementInitialPosition = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementFlagListenedTo': BrechtDeMan@936: sessionMetrics.prototype.enableFlagListenedTo = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementFlagMoved': BrechtDeMan@936: sessionMetrics.prototype.enableFlagMoved = true; BrechtDeMan@936: break; BrechtDeMan@936: case 'elementFlagComments': BrechtDeMan@936: sessionMetrics.prototype.enableFlagComments = true; BrechtDeMan@936: break; BrechtDeMan@936: } BrechtDeMan@936: }); BrechtDeMan@936: BrechtDeMan@936: // Create APE specific metric functions BrechtDeMan@936: audioEngineContext.metric.initialiseTest = function() BrechtDeMan@936: { BrechtDeMan@936: var sliders = document.getElementsByClassName('track-slider'); BrechtDeMan@936: for (var i=0; i= 0) BrechtDeMan@936: { BrechtDeMan@936: audioEngineContext.audioObjects[this.lastClicked].metric.listening(time); BrechtDeMan@936: } BrechtDeMan@936: this.lastClicked = id; BrechtDeMan@936: audioEngineContext.audioObjects[id].metric.listening(time); BrechtDeMan@936: } BrechtDeMan@936: console.log('slider ' + id + ' played (' + time + ')'); // DEBUG/SAFETY: show played slider id BrechtDeMan@936: }; BrechtDeMan@936: BrechtDeMan@936: // Create the top div for the Title element BrechtDeMan@936: var titleAttr = xmlSetup[0].attributes['title']; BrechtDeMan@936: var title = document.createElement('div'); BrechtDeMan@936: title.className = "title"; BrechtDeMan@936: title.align = "center"; BrechtDeMan@936: var titleSpan = document.createElement('span'); BrechtDeMan@936: BrechtDeMan@936: // Set title to that defined in XML, else set to default BrechtDeMan@936: if (titleAttr != undefined) { BrechtDeMan@936: titleSpan.innerHTML = titleAttr.value; BrechtDeMan@936: } else { BrechtDeMan@936: titleSpan.innerHTML = 'Listening test'; BrechtDeMan@936: } BrechtDeMan@936: // Insert the titleSpan element into the title div element. BrechtDeMan@936: title.appendChild(titleSpan); BrechtDeMan@936: BrechtDeMan@936: var pagetitle = document.createElement('div'); BrechtDeMan@936: pagetitle.className = "pageTitle"; BrechtDeMan@936: pagetitle.align = "center"; BrechtDeMan@936: var titleSpan = document.createElement('span'); BrechtDeMan@936: titleSpan.id = "pageTitle"; BrechtDeMan@936: pagetitle.appendChild(titleSpan); BrechtDeMan@936: BrechtDeMan@936: // Store the return URL path in global projectReturn BrechtDeMan@936: projectReturn = xmlSetup[0].attributes['projectReturn'].value; BrechtDeMan@936: BrechtDeMan@936: // Create Interface buttons! BrechtDeMan@936: var interfaceButtons = document.createElement('div'); BrechtDeMan@936: interfaceButtons.id = 'interface-buttons'; BrechtDeMan@936: BrechtDeMan@936: // MANUAL DOWNLOAD POINT BrechtDeMan@936: // If project return is null, this MUST be specified as the location to create the download link BrechtDeMan@936: var downloadPoint = document.createElement('div'); BrechtDeMan@936: downloadPoint.id = 'download-point'; BrechtDeMan@936: BrechtDeMan@936: // Create playback start/stop points BrechtDeMan@936: var playback = document.createElement("button"); BrechtDeMan@936: playback.innerHTML = 'Stop'; BrechtDeMan@936: playback.id = 'playback-button'; BrechtDeMan@936: // onclick function. Check if it is playing or not, call the correct function in the BrechtDeMan@936: // audioEngine, change the button text to reflect the next state. BrechtDeMan@936: playback.onclick = function() { BrechtDeMan@936: if (audioEngineContext.status == 1) { BrechtDeMan@936: audioEngineContext.stop(); BrechtDeMan@936: this.innerHTML = 'Stop'; BrechtDeMan@936: var time = audioEngineContext.timer.getTestTime(); BrechtDeMan@936: console.log('Stopped at ' + time); // DEBUG/SAFETY BrechtDeMan@936: } BrechtDeMan@936: }; BrechtDeMan@936: // Create Submit (save) button BrechtDeMan@936: var submit = document.createElement("button"); BrechtDeMan@936: submit.innerHTML = 'Submit'; BrechtDeMan@936: submit.onclick = buttonSubmitClick; BrechtDeMan@936: submit.id = 'submit-button'; BrechtDeMan@936: // Append the interface buttons into the interfaceButtons object. BrechtDeMan@936: interfaceButtons.appendChild(playback); BrechtDeMan@936: interfaceButtons.appendChild(submit); BrechtDeMan@936: interfaceButtons.appendChild(downloadPoint); BrechtDeMan@936: BrechtDeMan@936: // Now create the slider and HTML5 canvas boxes BrechtDeMan@936: BrechtDeMan@936: // Create the div box to center align BrechtDeMan@936: var sliderBox = document.createElement('div'); BrechtDeMan@936: sliderBox.className = 'sliderCanvasDiv'; BrechtDeMan@936: sliderBox.id = 'sliderCanvasHolder'; BrechtDeMan@936: sliderBox.align = 'center'; BrechtDeMan@936: BrechtDeMan@936: // Create the slider box to hold the slider elements BrechtDeMan@936: var canvas = document.createElement('div'); BrechtDeMan@936: canvas.id = 'slider'; BrechtDeMan@936: // Must have a known EXACT width, as this is used later to determine the ratings BrechtDeMan@936: canvas.style.width = width - 100 +"px"; BrechtDeMan@936: canvas.align = "left"; BrechtDeMan@936: sliderBox.appendChild(canvas); BrechtDeMan@936: BrechtDeMan@936: // Create the div to hold any scale objects BrechtDeMan@936: var scale = document.createElement('div'); BrechtDeMan@936: scale.className = 'sliderScale'; BrechtDeMan@936: scale.id = 'sliderScaleHolder'; BrechtDeMan@936: scale.align = 'left'; BrechtDeMan@936: sliderBox.appendChild(scale); BrechtDeMan@936: BrechtDeMan@936: // Global parent for the comment boxes on the page BrechtDeMan@936: var feedbackHolder = document.createElement('div'); BrechtDeMan@936: feedbackHolder.id = 'feedbackHolder'; BrechtDeMan@936: BrechtDeMan@936: testContent.style.zIndex = 1; BrechtDeMan@936: insertPoint.innerHTML = null; // Clear the current schema BrechtDeMan@936: BrechtDeMan@936: // Create pre and post test questions BrechtDeMan@936: BrechtDeMan@936: var preTest = xmlSetup.find('PreTest'); BrechtDeMan@936: var postTest = xmlSetup.find('PostTest'); BrechtDeMan@936: preTest = preTest[0]; BrechtDeMan@936: postTest = postTest[0]; BrechtDeMan@936: BrechtDeMan@936: currentState = 'preTest'; BrechtDeMan@936: BrechtDeMan@936: // Create Pre-Test Box BrechtDeMan@936: if (preTest != undefined && preTest.childElementCount >= 1) BrechtDeMan@936: { BrechtDeMan@936: showPopup(); BrechtDeMan@936: preTestPopupStart(preTest); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: // Inject into HTML BrechtDeMan@936: testContent.appendChild(title); // Insert the title BrechtDeMan@936: testContent.appendChild(pagetitle); BrechtDeMan@936: testContent.appendChild(interfaceButtons); BrechtDeMan@936: testContent.appendChild(sliderBox); BrechtDeMan@936: testContent.appendChild(feedbackHolder); BrechtDeMan@936: insertPoint.appendChild(testContent); BrechtDeMan@936: BrechtDeMan@936: // Load the full interface BrechtDeMan@936: BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function loadTest(id) BrechtDeMan@936: { BrechtDeMan@936: BrechtDeMan@936: // Reset audioEngineContext.Metric globals for new test BrechtDeMan@936: audioEngineContext.newTestPage(); BrechtDeMan@936: BrechtDeMan@936: // Used to load a specific test page BrechtDeMan@936: var textXML = testXMLSetups[id]; BrechtDeMan@936: BrechtDeMan@936: var feedbackHolder = document.getElementById('feedbackHolder'); BrechtDeMan@936: var canvas = document.getElementById('slider'); BrechtDeMan@936: feedbackHolder.innerHTML = null; BrechtDeMan@936: canvas.innerHTML = null; BrechtDeMan@936: BrechtDeMan@936: // Setup question title BrechtDeMan@936: var interfaceObj = $(textXML).find('interface'); BrechtDeMan@936: var titleNode = interfaceObj.find('title'); BrechtDeMan@936: if (titleNode[0] != undefined) BrechtDeMan@936: { BrechtDeMan@936: document.getElementById('pageTitle').textContent = titleNode[0].textContent; BrechtDeMan@936: } BrechtDeMan@936: var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2); BrechtDeMan@936: var offset = 50-8; // Half the offset of the slider (window width -100) minus the body padding of 8 BrechtDeMan@936: // TODO: AUTOMATE ABOVE!! BrechtDeMan@936: var scale = document.getElementById('sliderScaleHolder'); BrechtDeMan@936: scale.innerHTML = null; BrechtDeMan@936: interfaceObj.find('scale').each(function(index,scaleObj){ BrechtDeMan@936: var position = Number(scaleObj.attributes['position'].value)*0.01; BrechtDeMan@936: var pixelPosition = (position*positionScale)+offset; BrechtDeMan@936: var scaleDOM = document.createElement('span'); BrechtDeMan@936: scaleDOM.textContent = scaleObj.textContent; BrechtDeMan@936: scale.appendChild(scaleDOM); BrechtDeMan@936: scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px'; BrechtDeMan@936: }); BrechtDeMan@936: BrechtDeMan@936: // Extract the hostURL attribute. If not set, create an empty string. BrechtDeMan@936: var hostURL = textXML.attributes['hostURL']; BrechtDeMan@936: if (hostURL == undefined) { BrechtDeMan@936: hostURL = ""; BrechtDeMan@936: } else { BrechtDeMan@936: hostURL = hostURL.value; BrechtDeMan@936: } BrechtDeMan@936: // Extract the sampleRate. If set, convert the string to a Number. BrechtDeMan@936: var hostFs = textXML.attributes['sampleRate']; BrechtDeMan@936: if (hostFs != undefined) { BrechtDeMan@936: hostFs = Number(hostFs.value); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: /// CHECK FOR SAMPLE RATE COMPATIBILITY BrechtDeMan@936: if (hostFs != undefined) { BrechtDeMan@936: if (Number(hostFs) != audioContext.sampleRate) { BrechtDeMan@936: 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: alert(errStr); BrechtDeMan@936: return; BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: var commentShow = textXML.attributes['elementComments']; BrechtDeMan@936: if (commentShow != undefined) { BrechtDeMan@936: if (commentShow.value == 'false') {commentShow = false;} BrechtDeMan@936: else {commentShow = true;} BrechtDeMan@936: } else {commentShow = true;} BrechtDeMan@936: BrechtDeMan@936: var loopPlayback = textXML.attributes['loop']; BrechtDeMan@936: if (loopPlayback != undefined) BrechtDeMan@936: { BrechtDeMan@936: loopPlayback = loopPlayback.value; BrechtDeMan@936: if (loopPlayback == 'true') { BrechtDeMan@936: loopPlayback = true; BrechtDeMan@936: } else { BrechtDeMan@936: loopPlayback = false; BrechtDeMan@936: } BrechtDeMan@936: } else { BrechtDeMan@936: loopPlayback = false; BrechtDeMan@936: } BrechtDeMan@936: audioEngineContext.loopPlayback = loopPlayback; BrechtDeMan@936: loopPlayback = false; BrechtDeMan@936: // Create AudioEngine bindings for playback BrechtDeMan@936: if (loopPlayback) { BrechtDeMan@936: audioEngineContext.selectedTrack = function(id) { BrechtDeMan@936: for (var i=0; i'; BrechtDeMan@936: trackSliderObj.draggable = true; BrechtDeMan@936: trackSliderObj.ondragend = dragEnd; BrechtDeMan@936: trackSliderObj.ondragstart = function() BrechtDeMan@936: { BrechtDeMan@936: var id = Number(this.id.substr(13,2)); // Maximum theoretical tracks is 99! BrechtDeMan@936: audioEngineContext.metric.sliderMoveStart(id); BrechtDeMan@936: }; BrechtDeMan@936: BrechtDeMan@936: // Onclick, switch playback to that track BrechtDeMan@936: trackSliderObj.onclick = function() { BrechtDeMan@936: // Start the test on first click, that way timings are more accurate. BrechtDeMan@936: audioEngineContext.play(); BrechtDeMan@936: // Get the track ID from the object ID BrechtDeMan@936: var id = Number(this.id.substr(13,2)); // Maximum theoretical tracks is 99! BrechtDeMan@936: //audioEngineContext.metric.sliderPlayed(id); BrechtDeMan@936: audioEngineContext.selectedTrack(id); BrechtDeMan@936: // Currently playing track red, rest green BrechtDeMan@936: document.getElementById('track-slider-'+index).style.backgroundColor = "#FF0000"; BrechtDeMan@936: for (var i = 0; i<$(currentTrackOrder).length; i++) BrechtDeMan@936: { BrechtDeMan@936: if (i!=index) // Make all other sliders green BrechtDeMan@936: { BrechtDeMan@936: document.getElementById('track-slider-'+i).style.backgroundColor = "rgb(100,200,100)"; BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: } BrechtDeMan@936: }; BrechtDeMan@936: BrechtDeMan@936: canvas.appendChild(trackSliderObj); BrechtDeMan@936: BrechtDeMan@936: }); BrechtDeMan@936: BrechtDeMan@936: // Append any commentQuestion boxes BrechtDeMan@936: var commentQuestions = $(textXML).find('CommentQuestion'); BrechtDeMan@936: $(commentQuestions).each(function(index,element) { BrechtDeMan@936: // Create document objects to hold the comment boxes BrechtDeMan@936: var trackComment = document.createElement('div'); BrechtDeMan@936: trackComment.className = 'comment-div commentQuestion'; BrechtDeMan@936: trackComment.id = element.attributes['id'].value; BrechtDeMan@936: // Create a string next to each comment asking for a comment BrechtDeMan@936: var trackString = document.createElement('span'); BrechtDeMan@936: trackString.innerHTML = element.textContent; BrechtDeMan@936: // Create the HTML5 comment box 'textarea' BrechtDeMan@936: var trackCommentBox = document.createElement('textarea'); BrechtDeMan@936: trackCommentBox.rows = '4'; BrechtDeMan@936: trackCommentBox.cols = '100'; BrechtDeMan@936: trackCommentBox.name = 'commentQuestion'+index; BrechtDeMan@936: trackCommentBox.className = 'trackComment'; BrechtDeMan@936: var br = document.createElement('br'); BrechtDeMan@936: // Add to the holder. BrechtDeMan@936: trackComment.appendChild(trackString); BrechtDeMan@936: trackComment.appendChild(br); BrechtDeMan@936: trackComment.appendChild(trackCommentBox); BrechtDeMan@936: feedbackHolder.appendChild(trackComment); BrechtDeMan@936: }); BrechtDeMan@936: BrechtDeMan@936: // Now process any pre-test commands BrechtDeMan@936: BrechtDeMan@936: var preTest = $(testXMLSetups[id]).find('PreTest')[0]; BrechtDeMan@936: if (preTest.childElementCount > 0) BrechtDeMan@936: { BrechtDeMan@936: currentState = 'testRunPre-'+id; BrechtDeMan@936: preTestPopupStart(preTest); BrechtDeMan@936: showPopup(); BrechtDeMan@936: } else { BrechtDeMan@936: currentState = 'testRun-'+id; BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function preTestPopupStart(preTest) BrechtDeMan@936: { BrechtDeMan@936: var popupHolder = document.getElementById('popupHolder'); BrechtDeMan@936: popupHolder.innerHTML = null; BrechtDeMan@936: // Parse the first box BrechtDeMan@936: var preTestOption = document.createElement('div'); BrechtDeMan@936: preTestOption.id = 'preTest'; BrechtDeMan@936: preTestOption.style.marginTop = '25px'; BrechtDeMan@936: preTestOption.align = "center"; BrechtDeMan@936: var child = $(preTest).children()[0]; BrechtDeMan@936: if (child.nodeName == 'statement') BrechtDeMan@936: { BrechtDeMan@936: preTestOption.innerHTML = ''+child.textContent+''; BrechtDeMan@936: } else if (child.nodeName == 'question') BrechtDeMan@936: { BrechtDeMan@936: var textHold = document.createElement('span'); BrechtDeMan@936: textHold.innerHTML = child.textContent; BrechtDeMan@936: var textEnter = document.createElement('textarea'); BrechtDeMan@936: textEnter.id = child.attributes['id'].value + 'response'; BrechtDeMan@936: var br = document.createElement('br'); BrechtDeMan@936: preTestOption.innerHTML = null; BrechtDeMan@936: preTestOption.appendChild(textHold); BrechtDeMan@936: preTestOption.appendChild(br); BrechtDeMan@936: preTestOption.appendChild(textEnter); BrechtDeMan@936: } BrechtDeMan@936: var nextButton = document.createElement('button'); BrechtDeMan@936: nextButton.className = 'popupButton'; BrechtDeMan@936: nextButton.value = '0'; BrechtDeMan@936: nextButton.innerHTML = 'Next'; BrechtDeMan@936: nextButton.onclick = popupButtonClick; BrechtDeMan@936: BrechtDeMan@936: popupHolder.appendChild(preTestOption); BrechtDeMan@936: popupHolder.appendChild(nextButton); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function popupButtonClick() BrechtDeMan@936: { BrechtDeMan@936: // Global call from the 'Next' button click BrechtDeMan@936: if (currentState == 'preTest') BrechtDeMan@936: { BrechtDeMan@936: // At the start of the preTest routine! BrechtDeMan@936: var xmlTree = projectXML.find('setup'); BrechtDeMan@936: var preTest = xmlTree.find('PreTest')[0]; BrechtDeMan@936: this.value = preTestButtonClick(preTest,this.value); BrechtDeMan@936: } else if (currentState.substr(0,10) == 'testRunPre') BrechtDeMan@936: { BrechtDeMan@936: //Specific test pre-test BrechtDeMan@936: var testId = currentState.substr(11,currentState.length-10); BrechtDeMan@936: var preTest = $(testXMLSetups[testId]).find('PreTest')[0]; BrechtDeMan@936: this.value = preTestButtonClick(preTest,this.value); BrechtDeMan@936: } else if (currentState.substr(0,11) == 'testRunPost') BrechtDeMan@936: { BrechtDeMan@936: // Specific test post-test BrechtDeMan@936: var testId = currentState.substr(12,currentState.length-11); BrechtDeMan@936: var preTest = $(testXMLSetups[testId]).find('PostTest')[0]; BrechtDeMan@936: this.value = preTestButtonClick(preTest,this.value); BrechtDeMan@936: } else if (currentState == 'postTest') BrechtDeMan@936: { BrechtDeMan@936: // At the end of the test, running global post test BrechtDeMan@936: var xmlTree = projectXML.find('setup'); BrechtDeMan@936: var PostTest = xmlTree.find('PostTest')[0]; BrechtDeMan@936: this.value = preTestButtonClick(PostTest,this.value); BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function preTestButtonClick(preTest,index) BrechtDeMan@936: { BrechtDeMan@936: // Called on click of pre-test button BrechtDeMan@936: // Need to find and parse preTest again! BrechtDeMan@936: var preTestOption = document.getElementById('preTest'); BrechtDeMan@936: // Check if current state is a question! BrechtDeMan@936: if ($(preTest).children()[index].nodeName == 'question') { BrechtDeMan@936: var questionId = $(preTest).children()[index].attributes['id'].value; BrechtDeMan@936: var questionHold = document.createElement('comment'); BrechtDeMan@936: var questionResponse = document.getElementById(questionId + 'response'); BrechtDeMan@936: var mandatory = $(preTest).children()[index].attributes['mandatory']; BrechtDeMan@936: if (mandatory != undefined){ BrechtDeMan@936: if (mandatory.value == 'true') {mandatory = true;} BrechtDeMan@936: else {mandatory = false;} BrechtDeMan@936: } else {mandatory = false;} BrechtDeMan@936: if (mandatory == true && questionResponse.value.length == 0) { BrechtDeMan@936: return index; BrechtDeMan@936: } BrechtDeMan@936: questionHold.id = questionId; BrechtDeMan@936: questionHold.innerHTML = questionResponse.value; BrechtDeMan@936: postPopupResponse(questionHold); BrechtDeMan@936: } BrechtDeMan@936: index++; BrechtDeMan@936: if (index < preTest.childElementCount) BrechtDeMan@936: { BrechtDeMan@936: // More to process BrechtDeMan@936: var child = $(preTest).children()[index]; BrechtDeMan@936: if (child.nodeName == 'statement') BrechtDeMan@936: { BrechtDeMan@936: preTestOption.innerHTML = ''+child.textContent+''; BrechtDeMan@936: } else if (child.nodeName == 'question') BrechtDeMan@936: { BrechtDeMan@936: var textHold = document.createElement('span'); BrechtDeMan@936: textHold.innerHTML = child.textContent; BrechtDeMan@936: var textEnter = document.createElement('textarea'); BrechtDeMan@936: textEnter.id = child.attributes['id'].value + 'response'; BrechtDeMan@936: var br = document.createElement('br'); BrechtDeMan@936: preTestOption.innerHTML = null; BrechtDeMan@936: preTestOption.appendChild(textHold); BrechtDeMan@936: preTestOption.appendChild(br); BrechtDeMan@936: preTestOption.appendChild(textEnter); BrechtDeMan@936: } BrechtDeMan@936: } else { BrechtDeMan@936: // Time to clear BrechtDeMan@936: preTestOption.innerHTML = null; BrechtDeMan@936: if (currentState != 'postTest') { BrechtDeMan@936: hidePopup(); BrechtDeMan@936: // Progress the state! BrechtDeMan@936: advanceState(); BrechtDeMan@936: } else { BrechtDeMan@936: a = createProjectSave(projectReturn); BrechtDeMan@936: preTestOption.appendChild(a); BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: return index; BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function postPopupResponse(response) BrechtDeMan@936: { BrechtDeMan@936: if (currentState == 'preTest') { BrechtDeMan@936: preTestQuestions.appendChild(response); BrechtDeMan@936: } else if (currentState == 'postTest') { BrechtDeMan@936: postTestQuestions.appendChild(response); BrechtDeMan@936: } else { BrechtDeMan@936: // Inside a specific test BrechtDeMan@936: if (currentState.substr(0,10) == 'testRunPre') { BrechtDeMan@936: // Pre Test BrechtDeMan@936: var store = $(currentTestHolder).find('preTest'); BrechtDeMan@936: } else { BrechtDeMan@936: // Post Test BrechtDeMan@936: var store = $(currentTestHolder).find('postTest'); BrechtDeMan@936: } BrechtDeMan@936: store[0].appendChild(response); BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function dragEnd(ev) { BrechtDeMan@936: // Function call when a div has been dropped BrechtDeMan@936: var slider = document.getElementById('slider'); BrechtDeMan@936: var w = slider.style.width; BrechtDeMan@936: w = Number(w.substr(0,w.length-2)); BrechtDeMan@936: var x = ev.x; BrechtDeMan@936: if (x >= 42 && x < w+42) { BrechtDeMan@936: this.style.left = (x)+'px'; BrechtDeMan@936: } else { BrechtDeMan@936: if (x<42) { BrechtDeMan@936: this.style.left = '42px'; BrechtDeMan@936: } else { BrechtDeMan@936: this.style.left = (w+42) + 'px'; BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: audioEngineContext.metric.sliderMoved(); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function advanceState() BrechtDeMan@936: { BrechtDeMan@936: console.log(currentState); BrechtDeMan@936: if (currentState == 'preTest') BrechtDeMan@936: { BrechtDeMan@936: // End of pre-test, begin the test BrechtDeMan@936: loadTest(0); BrechtDeMan@936: } else if (currentState.substr(0,10) == 'testRunPre') BrechtDeMan@936: { BrechtDeMan@936: // Start the test BrechtDeMan@936: var testId = currentState.substr(11,currentState.length-10); BrechtDeMan@936: currentState = 'testRun-'+testId; BrechtDeMan@936: //audioEngineContext.timer.startTest(); BrechtDeMan@936: //audioEngineContext.play(); BrechtDeMan@936: } else if (currentState.substr(0,11) == 'testRunPost') BrechtDeMan@936: { BrechtDeMan@936: var testId = currentState.substr(12,currentState.length-11); BrechtDeMan@936: testEnded(testId); BrechtDeMan@936: } else if (currentState.substr(0,7) == 'testRun') BrechtDeMan@936: { BrechtDeMan@936: var testId = currentState.substr(8,currentState.length-7); BrechtDeMan@936: // Check if we have any post tests to perform BrechtDeMan@936: var postXML = $(testXMLSetups[testId]).find('PostTest')[0]; BrechtDeMan@936: if (postXML == undefined || postXML.childElementCount == 0) { BrechtDeMan@936: testEnded(testId); BrechtDeMan@936: } BrechtDeMan@936: else if (postXML.childElementCount > 0) BrechtDeMan@936: { BrechtDeMan@936: currentState = 'testRunPost-'+testId; BrechtDeMan@936: showPopup(); BrechtDeMan@936: preTestPopupStart(postXML); BrechtDeMan@936: } BrechtDeMan@936: else { BrechtDeMan@936: BrechtDeMan@936: BrechtDeMan@936: // No post tests, check if we have another test to perform instead BrechtDeMan@936: BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: console.log(currentState); BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function testEnded(testId) BrechtDeMan@936: { BrechtDeMan@936: pageXMLSave(testId); BrechtDeMan@936: if (testXMLSetups.length-1 > testId) BrechtDeMan@936: { BrechtDeMan@936: // Yes we have another test to perform BrechtDeMan@936: testId = (Number(testId)+1); BrechtDeMan@936: currentState = 'testRun-'+testId; BrechtDeMan@936: loadTest(testId); BrechtDeMan@936: } else { BrechtDeMan@936: console.log('Testing Completed!'); BrechtDeMan@936: currentState = 'postTest'; BrechtDeMan@936: // Check for any post tests BrechtDeMan@936: var xmlSetup = projectXML.find('setup'); BrechtDeMan@936: var postTest = xmlSetup.find('PostTest')[0]; BrechtDeMan@936: showPopup(); BrechtDeMan@936: preTestPopupStart(postTest); BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: BrechtDeMan@936: function buttonSubmitClick() // TODO: Only when all songs have been played! BrechtDeMan@936: { BrechtDeMan@936: hasBeenPlayed = audioEngineContext.checkAllPlayed(); BrechtDeMan@936: if (hasBeenPlayed.length == 0) { BrechtDeMan@936: if (audioEngineContext.status == 1) { BrechtDeMan@936: var playback = document.getElementById('playback-button'); BrechtDeMan@936: playback.click(); BrechtDeMan@936: // 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: } else BrechtDeMan@936: { BrechtDeMan@936: if (audioEngineContext.timer.testStarted == false) BrechtDeMan@936: { BrechtDeMan@936: alert('You have not started the test! Please press start to begin the test!'); BrechtDeMan@936: return; BrechtDeMan@936: } BrechtDeMan@936: } BrechtDeMan@936: if (currentState.substr(0,7) == 'testRun') BrechtDeMan@936: { BrechtDeMan@936: hasBeenPlayed = []; // clear array to prepare for next test BrechtDeMan@936: audioEngineContext.timer.stopTest(); BrechtDeMan@936: advanceState(); BrechtDeMan@936: } BrechtDeMan@936: } else // if a fragment has not been played yet BrechtDeMan@936: { BrechtDeMan@936: str = ""; BrechtDeMan@936: if (hasBeenPlayed.length > 1) { BrechtDeMan@936: for (var i=0; i