nicholas@872: /** nicholas@872: * ape.js nicholas@872: * Create the APE interface nicholas@872: */ nicholas@872: nicholas@872: // preTest - In preTest state nicholas@872: // testRun-ID - In test running, test Id number at the end 'testRun-2' nicholas@872: // testRunPost-ID - Post test of test ID nicholas@872: // testRunPre-ID - Pre-test of test ID nicholas@872: // postTest - End of test, final submission! nicholas@872: nicholas@872: nicholas@872: // Once this is loaded and parsed, begin execution nicholas@872: loadInterface(); nicholas@872: nicholas@872: function loadInterface() { nicholas@872: nicholas@872: // Get the dimensions of the screen available to the page nicholas@872: var width = window.innerWidth; nicholas@872: var height = window.innerHeight; nicholas@872: nicholas@872: // The injection point into the HTML page nicholas@872: interfaceContext.insertPoint = document.getElementById("topLevelBody"); nicholas@872: var testContent = document.createElement('div'); nicholas@872: nicholas@872: testContent.id = 'testContent'; nicholas@872: nicholas@872: nicholas@872: // Create APE specific metric functions nicholas@872: audioEngineContext.metric.initialiseTest = function() nicholas@872: { nicholas@872: }; nicholas@872: nicholas@872: audioEngineContext.metric.sliderMoved = function() nicholas@872: { nicholas@872: nicholas@872: var id = this.data; nicholas@872: this.data = -1; nicholas@872: var position = convSliderPosToRate(id); nicholas@872: console.log('slider ' + id + ': '+ position + ' (' + time + ')'); // DEBUG/SAFETY: show position and slider id nicholas@872: if (audioEngineContext.timer.testStarted) nicholas@872: { nicholas@872: audioEngineContext.audioObjects[id].metric.moved(time,position); nicholas@872: } nicholas@872: }; nicholas@872: nicholas@872: audioEngineContext.metric.sliderPlayed = function(id) nicholas@872: { nicholas@872: var time = audioEngineContext.timer.getTestTime(); nicholas@872: if (audioEngineContext.timer.testStarted) nicholas@872: { nicholas@872: if (this.lastClicked >= 0) nicholas@872: { nicholas@872: audioEngineContext.audioObjects[this.lastClicked].metric.listening(time); nicholas@872: } nicholas@872: this.lastClicked = id; nicholas@872: audioEngineContext.audioObjects[id].metric.listening(time); nicholas@872: } nicholas@872: console.log('slider ' + id + ' played (' + time + ')'); // DEBUG/SAFETY: show played slider id nicholas@872: }; nicholas@872: nicholas@872: // Bindings for interfaceContext nicholas@872: Interface.prototype.checkAllPlayed = function() nicholas@872: { nicholas@872: hasBeenPlayed = audioEngineContext.checkAllPlayed(); nicholas@872: if (hasBeenPlayed.length > 0) // if a fragment has not been played yet nicholas@872: { nicholas@872: str = ""; nicholas@872: if (hasBeenPlayed.length > 1) { nicholas@872: for (var i=0; i 1) { nicholas@872: var str = ""; nicholas@872: for (var i=0; i 1) { nicholas@872: var str = ""; nicholas@872: for (var i=0; i'; nicholas@872: this.trackSliderObj.draggable = true; nicholas@872: this.trackSliderObj.ondragend = dragEnd; nicholas@872: nicholas@872: // Onclick, switch playback to that track nicholas@872: this.trackSliderObj.onclick = function() { nicholas@872: // Start the test on first click, that way timings are more accurate. nicholas@872: audioEngineContext.play(); nicholas@872: if (audioEngineContext.audioObjectsReady) { nicholas@872: // Cannot continue to issue play command until audioObjects reported as ready! nicholas@872: // Get the track ID from the object ID nicholas@872: var element; nicholas@872: if (event.srcElement.nodeName == "SPAN") { nicholas@872: element = event.srcElement.parentNode; nicholas@872: } else { nicholas@872: element = event.srcElement; nicholas@872: } nicholas@872: var id = Number(element.attributes['trackIndex'].value); nicholas@872: //audioEngineContext.metric.sliderPlayed(id); nicholas@872: audioEngineContext.play(id); nicholas@872: // Currently playing track red, rest green nicholas@872: nicholas@872: //document.getElementById('track-slider-'+index).style.backgroundColor = "#FF0000"; nicholas@872: $('.track-slider').removeClass('track-slider-playing'); nicholas@872: $(element).addClass('track-slider-playing'); nicholas@872: $('.comment-div').removeClass('comment-box-playing'); nicholas@872: $('#comment-div-'+id).addClass('comment-box-playing'); nicholas@872: } nicholas@872: }; nicholas@872: nicholas@872: this.exportXMLDOM = function(audioObject) { nicholas@872: // Called by the audioObject holding this element. Must be present nicholas@872: var node = document.createElement('value'); nicholas@872: node.textContent = convSliderPosToRate(this.trackSliderObj); nicholas@872: return node; nicholas@872: }; nicholas@872: this.getValue = function() { nicholas@872: return convSliderPosToRate(this.trackSliderObj); nicholas@872: }; nicholas@872: } nicholas@872: nicholas@872: function dragEnd(ev) { nicholas@872: // Function call when a div has been dropped nicholas@872: var slider = document.getElementById('slider'); nicholas@872: var marginSize = Number(slider.attributes['marginsize'].value); nicholas@872: var w = slider.style.width; nicholas@872: w = Number(w.substr(0,w.length-2)); nicholas@872: var x = ev.x; nicholas@872: if (x >= marginSize && x < w+marginSize) { nicholas@872: this.style.left = (x)+'px'; nicholas@872: } else { nicholas@872: if (x audioObjs[anchorId].specification.marker) nicholas@872: { nicholas@872: // Anchor is not set below nicholas@872: console.log('Anchor node not below marker value'); nicholas@872: alert('Please keep listening'); nicholas@872: return; nicholas@872: } nicholas@872: } else { nicholas@872: // No marker value given, ensure it is the minimum value nicholas@872: var anchorVal = audioObjs[anchorId].interfaceDOM.getValue(); nicholas@872: for (var i=0; i audioObjs[i].interfaceDOM.getValue()) { nicholas@872: // Anchor not the minimum nicholas@872: console.log('No marker set, anchor node not the minimum'); nicholas@872: alert('Please keep listening'); nicholas@872: return; nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: if (referenceId != null) { nicholas@872: if (audioObjs[referenceId].specification.marker != null) { nicholas@872: if (audioObjs[referenceId].interfaceDOM.getValue() < audioObjs[referenceId].specification.marker) nicholas@872: { nicholas@872: // Anchor is not set below nicholas@872: console.log('Reference node not above marker value'); nicholas@872: alert('Please keep listening'); nicholas@872: return; nicholas@872: } nicholas@872: } else { nicholas@872: // No marker value given, ensure it is the minimum value nicholas@872: var referenceVal = audioObjs[referenceId].interfaceDOM.getValue(); nicholas@872: for (var i=0; i audioObjs[i].interfaceDOM.getValue()) { nicholas@872: // Anchor not the minimum nicholas@872: console.log('No marker set, reference node not the maximum'); nicholas@872: alert('Please keep listening'); nicholas@872: return; nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: } nicholas@872: nicholas@872: for (var i=0; i