giuliomoro@1088: // Once this is loaded and parsed, begin execution giuliomoro@1088: loadInterface(); giuliomoro@1088: giuliomoro@1088: function loadInterface() { giuliomoro@1088: // Get the dimensions of the screen available to the page giuliomoro@1088: var width = window.innerWidth; giuliomoro@1088: var height = window.innerHeight; giuliomoro@1088: interfaceContext.insertPoint.innerHTML = null; // Clear the current schema giuliomoro@1088: giuliomoro@1088: // Custom Comparitor Object giuliomoro@1088: Interface.prototype.comparitor = null; giuliomoro@1088: giuliomoro@1088: // The injection point into the HTML page giuliomoro@1088: interfaceContext.insertPoint = document.getElementById("topLevelBody"); giuliomoro@1088: var testContent = document.createElement('div'); giuliomoro@1088: testContent.id = 'testContent'; giuliomoro@1088: giuliomoro@1088: // Create the top div for the Title element giuliomoro@1088: var titleAttr = specification.title; giuliomoro@1088: var title = document.createElement('div'); giuliomoro@1088: title.className = "title"; giuliomoro@1088: title.align = "center"; giuliomoro@1088: var titleSpan = document.createElement('span'); giuliomoro@1088: giuliomoro@1088: // Set title to that defined in XML, else set to default giuliomoro@1088: if (titleAttr != undefined) { giuliomoro@1088: titleSpan.textContent = titleAttr; giuliomoro@1088: } else { giuliomoro@1088: titleSpan.textContent = 'Listening test'; giuliomoro@1088: } giuliomoro@1088: // Insert the titleSpan element into the title div element. giuliomoro@1088: title.appendChild(titleSpan); giuliomoro@1088: giuliomoro@1088: var pagetitle = document.createElement('div'); giuliomoro@1088: pagetitle.className = "pageTitle"; giuliomoro@1088: pagetitle.align = "center"; giuliomoro@1088: var titleSpan = document.createElement('span'); giuliomoro@1088: titleSpan.id = "pageTitle"; giuliomoro@1088: pagetitle.appendChild(titleSpan); giuliomoro@1088: giuliomoro@1088: // Create Interface buttons! giuliomoro@1088: var interfaceButtons = document.createElement('div'); giuliomoro@1088: interfaceButtons.id = 'interface-buttons'; giuliomoro@1088: interfaceButtons.style.height = '25px'; giuliomoro@1088: giuliomoro@1088: // Create playback start/stop points giuliomoro@1088: var playback = document.createElement("button"); giuliomoro@1088: playback.innerHTML = 'Stop'; giuliomoro@1088: playback.id = 'playback-button'; giuliomoro@1088: playback.style.float = 'left'; giuliomoro@1088: // onclick function. Check if it is playing or not, call the correct function in the giuliomoro@1088: // audioEngine, change the button text to reflect the next state. giuliomoro@1088: playback.onclick = function() { giuliomoro@1088: if (audioEngineContext.status == 1) { giuliomoro@1088: audioEngineContext.stop(); giuliomoro@1088: this.innerHTML = 'Stop'; giuliomoro@1088: var time = audioEngineContext.timer.getTestTime(); giuliomoro@1088: console.log('Stopped at ' + time); // DEBUG/SAFETY giuliomoro@1088: } giuliomoro@1088: }; giuliomoro@1088: // Append the interface buttons into the interfaceButtons object. giuliomoro@1088: interfaceButtons.appendChild(playback); giuliomoro@1088: giuliomoro@1088: // Global parent for the comment boxes on the page giuliomoro@1088: var feedbackHolder = document.createElement('div'); giuliomoro@1088: feedbackHolder.id = 'feedbackHolder'; giuliomoro@1088: giuliomoro@1088: // Construct the AB Boxes giuliomoro@1088: var boxes = document.createElement('div'); giuliomoro@1088: boxes.align = "center"; giuliomoro@1088: boxes.id = "box-holders"; giuliomoro@1088: boxes.style.float = "left"; giuliomoro@1088: giuliomoro@1088: var submit = document.createElement('button'); giuliomoro@1088: submit.id = "submit"; giuliomoro@1088: submit.onclick = buttonSubmitClick; giuliomoro@1088: submit.className = "big-button"; giuliomoro@1088: submit.textContent = "submit"; giuliomoro@1088: submit.style.position = "relative"; giuliomoro@1088: submit.style.left = (window.innerWidth-250)/2 + 'px'; giuliomoro@1088: giuliomoro@1088: feedbackHolder.appendChild(boxes); giuliomoro@1088: giuliomoro@1088: // Inject into HTML giuliomoro@1088: testContent.appendChild(title); // Insert the title giuliomoro@1088: testContent.appendChild(pagetitle); giuliomoro@1088: testContent.appendChild(interfaceButtons); giuliomoro@1088: testContent.appendChild(feedbackHolder); giuliomoro@1088: testContent.appendChild(submit); giuliomoro@1088: interfaceContext.insertPoint.appendChild(testContent); giuliomoro@1088: giuliomoro@1088: // Load the full interface giuliomoro@1088: testState.initialise(); giuliomoro@1088: testState.advanceState(); giuliomoro@1088: } giuliomoro@1088: giuliomoro@1088: function loadTest(audioHolderObject) giuliomoro@1088: { giuliomoro@1088: var feedbackHolder = document.getElementById('feedbackHolder'); giuliomoro@1088: var interfaceObj = audioHolderObject.interfaces; giuliomoro@1088: if (interfaceObj.length > 1) giuliomoro@1088: { giuliomoro@1088: console.log("WARNING - This interface only supports one node per page. Using first interface node"); giuliomoro@1088: } giuliomoro@1088: interfaceObj = interfaceObj[0]; giuliomoro@1088: giuliomoro@1088: if(interfaceObj.title != null) giuliomoro@1088: { giuliomoro@1088: document.getElementById("pageTitle").textContent = interfaceObj.title; giuliomoro@1088: } giuliomoro@1088: giuliomoro@1088: var interfaceOptions = specification.interfaces.options.concat(interfaceObj.options); giuliomoro@1088: for (var option of interfaceOptions) giuliomoro@1088: { giuliomoro@1088: if (option.type == "show") giuliomoro@1088: { giuliomoro@1088: switch(option.name) { giuliomoro@1088: case "playhead": giuliomoro@1088: var playbackHolder = document.getElementById('playback-holder'); giuliomoro@1088: if (playbackHolder == null) giuliomoro@1088: { giuliomoro@1088: playbackHolder = document.createElement('div'); giuliomoro@1088: playbackHolder.style.width = "100%"; giuliomoro@1088: playbackHolder.style.float = "left"; giuliomoro@1088: playbackHolder.align = 'center'; giuliomoro@1088: playbackHolder.appendChild(interfaceContext.playhead.object); giuliomoro@1088: feedbackHolder.appendChild(playbackHolder); giuliomoro@1088: } giuliomoro@1088: break; giuliomoro@1088: case "page-count": giuliomoro@1088: var pagecountHolder = document.getElementById('page-count'); giuliomoro@1088: if (pagecountHolder == null) giuliomoro@1088: { giuliomoro@1088: pagecountHolder = document.createElement('div'); giuliomoro@1088: pagecountHolder.id = 'page-count'; giuliomoro@1088: } giuliomoro@1088: pagecountHolder.innerHTML = 'Page '+(audioHolderObject.presentedId+1)+' of '+specification.pages.length+''; giuliomoro@1088: var inject = document.getElementById('interface-buttons'); giuliomoro@1088: inject.appendChild(pagecountHolder); giuliomoro@1088: break; giuliomoro@1088: case "volume": giuliomoro@1088: if (document.getElementById('master-volume-holder') == null) giuliomoro@1088: { giuliomoro@1088: feedbackHolder.appendChild(interfaceContext.volume.object); giuliomoro@1088: } giuliomoro@1088: break; giuliomoro@1088: } giuliomoro@1088: } giuliomoro@1088: } giuliomoro@1088: giuliomoro@1088: // Populate the comparitor object giuliomoro@1088: interfaceContext.comparitor = new Comparitor(audioHolderObject); giuliomoro@1088: if (audioHolderObject.showElementComments) giuliomoro@1088: { giuliomoro@1088: var commentHolder = document.createElement('div'); giuliomoro@1088: commentHolder.id = 'commentHolder'; giuliomoro@1088: document.getElementById('testContent').appendChild(commentHolder); giuliomoro@1088: // Generate one comment box per presented page giuliomoro@1088: for (var element of audioEngineContext.audioObjects) giuliomoro@1088: { giuliomoro@1088: interfaceContext.createCommentBox(element); giuliomoro@1088: } giuliomoro@1088: interfaceContext.showCommentBoxes(commentHolder,true); giuliomoro@1088: } giuliomoro@1088: resizeWindow(null); giuliomoro@1088: } giuliomoro@1088: giuliomoro@1088: function Comparitor(audioHolderObject) giuliomoro@1088: { giuliomoro@1088: this.comparitorBox = function(audioElement,id,text) giuliomoro@1088: { giuliomoro@1088: this.parent = audioElement; giuliomoro@1088: this.id = id; giuliomoro@1088: this.value = 0; giuliomoro@1088: this.disabled = true; giuliomoro@1088: this.box = document.createElement('div'); giuliomoro@1088: this.box.className = 'comparitor-holder'; giuliomoro@1088: this.box.setAttribute('track-id',audioElement.id); giuliomoro@1088: this.box.id = 'comparitor-'+text; giuliomoro@1088: this.selector = document.createElement('div'); giuliomoro@1088: this.selector.className = 'comparitor-selector disabled'; giuliomoro@1088: var selectorText = document.createElement('span'); giuliomoro@1088: selectorText.textContent = text; giuliomoro@1088: this.selector.appendChild(selectorText); giuliomoro@1088: this.playback = document.createElement('button'); giuliomoro@1088: this.playback.className = 'comparitor-button'; giuliomoro@1088: this.playback.disabled = true; giuliomoro@1088: this.playback.textContent = "Listen"; giuliomoro@1088: this.box.appendChild(this.selector); giuliomoro@1088: this.box.appendChild(this.playback); giuliomoro@1088: this.selector.onclick = function(event) giuliomoro@1088: { giuliomoro@1088: var time = audioEngineContext.timer.getTestTime(); giuliomoro@1088: if ($(event.currentTarget).hasClass('disabled')) giuliomoro@1088: { giuliomoro@1088: console.log("Please wait until sample has loaded"); giuliomoro@1088: return; giuliomoro@1088: } giuliomoro@1088: if (audioEngineContext.status == 0) giuliomoro@1088: { giuliomoro@1088: alert("Please listen to the samples before making a selection"); giuliomoro@1088: console.log("Please listen to the samples before making a selection"); giuliomoro@1088: return; giuliomoro@1088: } giuliomoro@1088: $(".comparitor-selector").removeClass('selected'); giuliomoro@1088: var id = event.currentTarget.parentElement.getAttribute('track-id'); giuliomoro@1088: interfaceContext.comparitor.selected = id; giuliomoro@1088: $(event.currentTarget).addClass('selected'); giuliomoro@1088: for (var i=0; i saves giuliomoro@1088: // Get the current information in store (remember to appendChild your data to it) giuliomoro@1088: // pageSpecification is the current page node configuration giuliomoro@1088: // To create new XML nodes, use storage.document.createElement(); giuliomoro@1088: }