# HG changeset patch # User www-data # Date 1470140449 -3600 # Node ID 582be5fd888407412e58dad9aa0961276b6810e0 # Parent 7875d043f8ba1dcc044bc193e0816e467ff87fbc# Parent 2a1f42b5614a126f720afdc9bea98abcb386ea54 Merge branch 'master' of https://github.com/BrechtDeMan/WebAudioEvaluationTool diff -r 7875d043f8ba -r 582be5fd8884 interfaces/AB.js --- a/interfaces/AB.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/AB.js Tue Aug 02 13:20:49 2016 +0100 @@ -45,6 +45,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id = "test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -136,6 +137,11 @@ // Delete outside reference var outsideReferenceHolder = document.getElementById("outside-reference-holder"); outsideReferenceHolder.innerHTML = ""; + + // Set the page title + if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { + document.getElementById("test-title").textContent = audioHolderObject.title + } if(interfaceObj.title != null) { @@ -207,7 +213,7 @@ $(audioHolderObject.commentQuestions).each(function(index,element) { var node = interfaceContext.createCommentQuestion(element); - commentHolder.appendChild(node.holder); + document.getElementById('testContent').appendChild(node.holder); }); resizeWindow(null); diff -r 7875d043f8ba -r 582be5fd8884 interfaces/ABX.js --- a/interfaces/ABX.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/ABX.js Tue Aug 02 13:20:49 2016 +0100 @@ -50,6 +50,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id = "test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -134,12 +135,19 @@ console.log("WARNING - This interface only supports one node per page. Using first interface node"); } interfaceObj = interfaceObj[0]; + + // Set the page title + if (typeof page.title == "string" && page.title.length > 0) { + document.getElementById("test-title").textContent = page.title + } if(interfaceObj.title != null) { document.getElementById("pageTitle").textContent = interfaceObj.title; } + interfaceContext.comparator = new comparator(page); + var interfaceOptions = specification.interfaces.options.concat(interfaceObj.options); for (var option of interfaceOptions) { @@ -175,11 +183,26 @@ feedbackHolder.appendChild(interfaceContext.volume.object); } break; + case "comments": + var commentHolder = document.createElement('div'); + commentHolder.id = 'commentHolder'; + document.getElementById('testContent').appendChild(commentHolder); + // Generate one comment box per presented page + for (var element of audioEngineContext.audioObjects) + { + interfaceContext.commentBoxes.createCommentBox(element); + } + interfaceContext.commentBoxes.showCommentBoxes(commentHolder,true); + break; } } } - interfaceContext.comparator = new comparator(page); + $(page.commentQuestions).each(function(index,element) { + var node = interfaceContext.createCommentQuestion(element); + document.getElementById('testContent').appendChild(node.holder); + }); + resizeWindow(null); } diff -r 7875d043f8ba -r 582be5fd8884 interfaces/ape.js --- a/interfaces/ape.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/ape.js Tue Aug 02 13:20:49 2016 +0100 @@ -220,6 +220,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id = "test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -297,6 +298,12 @@ var sliderHolder = document.getElementById('slider-holder'); feedbackHolder.innerHTML = ""; sliderHolder.innerHTML = ""; + + // Set the page title + if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { + document.getElementById("test-title").textContent = audioHolderObject.title + } + // Delete outside reference document.getElementById("outside-reference-holder").innerHTML = ""; @@ -395,7 +402,11 @@ event.preventDefault(); var obj = interfaceContext.getSelectedObject(); if (obj == null) {return;} - $(obj).css("left",event.clientX-6 + "px"); + var move = event.clientX-6; + var w = $(event.currentTarget).width(); + move = Math.max(50,move); + move = Math.min(w+50,move); + $(obj).css("left",move + "px"); interfaceContext.moveObject(); }); @@ -404,6 +415,9 @@ var obj = interfaceContext.getSelectedObject(); if (obj == null) {return;} var move = event.originalEvent.targetTouches[0].clientX - 6; + var w = $(event.currentTarget).width(); + move = Math.max(50,move); + move = Math.min(w+50,move); $(obj).css("left",move + "px"); interfaceContext.moveObject(); }); diff -r 7875d043f8ba -r 582be5fd8884 interfaces/discrete.js --- a/interfaces/discrete.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/discrete.js Tue Aug 02 13:20:49 2016 +0100 @@ -16,6 +16,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id = "test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -126,6 +127,12 @@ console.log("WARNING - This interface only supports one node per page. Using first interface node"); } interfaceObj = interfaceObj[0]; + + // Set the page title + if (typeof page.title == "string" && page.title.length > 0) { + document.getElementById("test-title").textContent = page.title + } + if(interfaceObj.title != null) { document.getElementById("pageTitle").textContent = interfaceObj.title; @@ -143,11 +150,6 @@ } var loopPlayback = page.loop; - $(page.commentQuestions).each(function(index,element) { - var node = interfaceContext.createCommentQuestion(element); - feedbackHolder.appendChild(node.holder); - }); - // Find all the audioElements from the audioHolder var index = 0; var interfaceScales = testState.currentStateMap.interfaces[0].scales; @@ -229,7 +231,7 @@ $(page.commentQuestions).each(function(index,element) { var node = interfaceContext.createCommentQuestion(element); - commentHolder.appendChild(node.holder); + feedbackHolder.appendChild(node.holder); }); // Auto-align diff -r 7875d043f8ba -r 582be5fd8884 interfaces/horizontal-sliders.js --- a/interfaces/horizontal-sliders.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/horizontal-sliders.js Tue Aug 02 13:20:49 2016 +0100 @@ -16,6 +16,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id="test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -126,6 +127,12 @@ console.log("WARNING - This interface only supports one node per page. Using first interface node"); } interfaceObj = interfaceObj[0]; + + // Set the page title + if (typeof page.title == "string" && page.title.length > 0) { + document.getElementById("test-title").textContent = page.title + } + if(interfaceObj.title != null) { document.getElementById("pageTitle").textContent = interfaceObj.title; diff -r 7875d043f8ba -r 582be5fd8884 interfaces/mushra.js --- a/interfaces/mushra.js Tue Aug 02 12:20:52 2016 +0100 +++ b/interfaces/mushra.js Tue Aug 02 13:20:49 2016 +0100 @@ -22,6 +22,7 @@ title.className = "title"; title.align = "center"; var titleSpan = document.createElement('span'); + titleSpan.id = "test-title"; // Set title to that defined in XML, else set to default if (titleAttr != undefined) { @@ -127,6 +128,12 @@ console.log("WARNING - This interface only supports one node per page. Using first interface node"); } interfaceObj = interfaceObj[0]; + + // Set the page title + if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { + document.getElementById("test-title").textContent = audioHolderObject.title + } + if(interfaceObj.title != null) { document.getElementById("pageTitle").textContent = interfaceObj.title; diff -r 7875d043f8ba -r 582be5fd8884 js/core.js --- a/js/core.js Tue Aug 02 12:20:52 2016 +0100 +++ b/js/core.js Tue Aug 02 13:20:49 2016 +0100 @@ -859,6 +859,39 @@ console.log("Question Response: "+ textArea.value); node.response = textArea.value; } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "equals": + if (textArea.value == condition.value) { + pass = true; + } + break; + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'question' cannot interpret greaterThan/lessThan conditions. IGNORING"); + break; + case "contains": + if (textArea.value.includes(condition.value)) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == 'checkbox') { // Must extract checkbox data console.log("Checkbox: "+ node.specification.statement); @@ -872,6 +905,38 @@ }); console.log(node.specification.options[i].name+": "+ inputs[i].checked); } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "equals": + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'checkbox' cannot interpret equals/greaterThan/lessThan conditions. IGNORING"); + break; + case "contains": + for (var response of node.response) { + if (response.name == condition.value && response.checked) { + pass = true; + break; + } + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == "radio") { var optHold = this.popupResponse; console.log("Radio: "+ node.specification.statement); @@ -894,6 +959,35 @@ } i++; } + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "contains": + case "greaterThan": + case "lessThan": + console.log("Survey Element of type 'radio' cannot interpret contains/greaterThan/lessThan conditions. IGNORING"); + break; + case "equals": + if (node.response == condition.value) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } else if (node.specification.type == "number") { var input = this.popupContent.getElementsByTagName('input')[0]; if (node.mandatory == true && input.value.length == 0) { @@ -914,6 +1008,43 @@ return; } node.response = input.value; + // Perform the conditional + for (var condition of node.specification.conditions) { + var pass = false; + switch(condition.check) { + case "contains": + console.log("Survey Element of type 'number' cannot interpret contains conditions. IGNORING"); + break; + case "greaterThan": + if (node.response > Number(condition.value)) { + pass = true; + } + break; + case "lessThan": + if (node.response < Number(condition.value)) { + pass = true; + } + break; + case "equals": + if (node.response == condition.value) { + pass = true; + } + break; + } + var jumpID; + if (pass) { + jumpID = condition.jumpToOnPass; + } else { + jumpID = condition.jumpToOnFail; + } + if (jumpID != undefined) { + var index = this.popupOptions.findIndex(function(item,index,element){ + if (item.specification.id == jumpID) {return true;} else {return false;} + },this); + this.currentIndex = index-1; + break; + } + } } this.currentIndex++; if (this.currentIndex < this.popupOptions.length) { @@ -1355,29 +1486,48 @@ // Copies the entire bufferObj. if (preSilenceTime == undefined) {preSilenceTime = 0;} if (postSilenceTime == undefined) {postSilenceTime = 0;} - var copy = new this.constructor(); - copy.url = this.url; var preSilenceSamples = secondsToSamples(preSilenceTime,this.buffer.sampleRate); var postSilenceSamples = secondsToSamples(postSilenceTime,this.buffer.sampleRate); var newLength = this.buffer.length+preSilenceSamples+postSilenceSamples; - copy.buffer = audioContext.createBuffer(this.buffer.numberOfChannels, newLength, this.buffer.sampleRate); + var copybuffer = audioContext.createBuffer(this.buffer.numberOfChannels, newLength, this.buffer.sampleRate); // Now we can use some efficient background copy schemes if we are just padding the end - if (preSilenceSamples == 0 && typeof copy.buffer.copyToChannel == "function") { + if (preSilenceSamples == 0 && typeof copybuffer.copyToChannel == "function") { for (var c=0; c Please enter your name. + Please select with which activities you have any experience (example checkbox question) @@ -13,6 +14,9 @@ + + What instrument did you play + This is an example of an 'APE'-style test, with two pages, using the test stimuli in 'example_eval/'. diff -r 7875d043f8ba -r 582be5fd8884 xml/test-schema.xsd --- a/xml/test-schema.xsd Tue Aug 02 12:20:52 2016 +0100 +++ b/xml/test-schema.xsd Tue Aug 02 13:20:49 2016 +0100 @@ -249,6 +249,23 @@ + + + + + + + + + + + + + + + + +