Mercurial > hg > webaudioevaluationtool
comparison interfaces/mushra.js @ 2701:d29471d114cf
#180. JSHinted Mushra
author | Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk> |
---|---|
date | Mon, 13 Mar 2017 11:46:24 +0000 |
parents | 41b7fcd245da |
children | c74c698795a9 |
comparison
equal
deleted
inserted
replaced
2700:87d9f785f1ec | 2701:d29471d114cf |
---|---|
1 /** | 1 /** |
2 * mushra.js | 2 * mushra.js |
3 * Create the MUSHRA interface | 3 * Create the MUSHRA interface |
4 */ | 4 */ |
5 | 5 /*globals window, interfaceContext, document, $, specification, audioEngineContext, console, testState, storage */ |
6 // Once this is loaded and parsed, begin execution | 6 // Once this is loaded and parsed, begin execution |
7 loadInterface(); | 7 loadInterface(); |
8 | 8 |
9 function loadInterface() { | 9 function loadInterface() { |
10 // Get the dimensions of the screen available to the page | 10 // Get the dimensions of the screen available to the page |
23 title.align = "center"; | 23 title.align = "center"; |
24 var titleSpan = document.createElement('span'); | 24 var titleSpan = document.createElement('span'); |
25 titleSpan.id = "test-title"; | 25 titleSpan.id = "test-title"; |
26 | 26 |
27 // Set title to that defined in XML, else set to default | 27 // Set title to that defined in XML, else set to default |
28 if (titleAttr != undefined) { | 28 if (titleAttr !== undefined) { |
29 titleSpan.textContent = titleAttr; | 29 titleSpan.textContent = titleAttr; |
30 } else { | 30 } else { |
31 titleSpan.textContent = 'Listening test'; | 31 titleSpan.textContent = 'Listening test'; |
32 } | 32 } |
33 // Insert the titleSpan element into the title div element. | 33 // Insert the titleSpan element into the title div element. |
34 title.appendChild(titleSpan); | 34 title.appendChild(titleSpan); |
35 | 35 |
36 var pagetitle = document.createElement('div'); | 36 var pagetitle = document.createElement('div'); |
37 pagetitle.className = "pageTitle"; | 37 pagetitle.className = "pageTitle"; |
38 pagetitle.align = "center"; | 38 pagetitle.align = "center"; |
39 var titleSpan = document.createElement('span'); | 39 |
40 titleSpan = document.createElement('span'); | |
40 titleSpan.id = "pageTitle"; | 41 titleSpan.id = "pageTitle"; |
41 pagetitle.appendChild(titleSpan); | 42 pagetitle.appendChild(titleSpan); |
42 | 43 |
43 // Create Interface buttons! | 44 // Create Interface buttons! |
44 var interfaceButtons = document.createElement('div'); | 45 var interfaceButtons = document.createElement('div'); |
127 } | 128 } |
128 interfaceObj = interfaceObj[0]; | 129 interfaceObj = interfaceObj[0]; |
129 | 130 |
130 // Set the page title | 131 // Set the page title |
131 if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { | 132 if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { |
132 document.getElementById("test-title").textContent = audioHolderObject.title | 133 document.getElementById("test-title").textContent = audioHolderObject.title; |
133 } | 134 } |
134 | 135 |
135 if (interfaceObj.title != null) { | 136 if (interfaceObj.title !== null) { |
136 document.getElementById("pageTitle").textContent = interfaceObj.title; | 137 document.getElementById("pageTitle").textContent = interfaceObj.title; |
137 } | 138 } |
138 | 139 |
139 // Delete outside reference | 140 // Delete outside reference |
140 var outsideReferenceHolder = document.getElementById("outside-reference-holder"); | 141 var outsideReferenceHolder = document.getElementById("outside-reference-holder"); |
142 | 143 |
143 var sliderBox = document.getElementById('slider-holder'); | 144 var sliderBox = document.getElementById('slider-holder'); |
144 sliderBox.innerHTML = ""; | 145 sliderBox.innerHTML = ""; |
145 | 146 |
146 var commentBoxPrefix = "Comment on track"; | 147 var commentBoxPrefix = "Comment on track"; |
147 if (interfaceObj.commentBoxPrefix != undefined) { | 148 if (interfaceObj.commentBoxPrefix !== undefined) { |
148 commentBoxPrefix = interfaceObj.commentBoxPrefix; | 149 commentBoxPrefix = interfaceObj.commentBoxPrefix; |
149 } | 150 } |
150 var loopPlayback = audioHolderObject.loop; | 151 var loopPlayback = audioHolderObject.loop; |
151 | 152 |
152 currentTestHolder = document.createElement('audioHolder'); | 153 var currentTestHolder = document.createElement('audioHolder'); |
153 currentTestHolder.id = audioHolderObject.id; | 154 currentTestHolder.id = audioHolderObject.id; |
154 currentTestHolder.repeatCount = audioHolderObject.repeatCount; | 155 currentTestHolder.repeatCount = audioHolderObject.repeatCount; |
155 | 156 |
156 // Find all the audioElements from the audioHolder | 157 // Find all the audioElements from the audioHolder |
157 var index = 0; | 158 var index = 0; |
190 }); | 191 }); |
191 | 192 |
192 if (testState.currentStateMap.restrictMovement) { | 193 if (testState.currentStateMap.restrictMovement) { |
193 $(".track-slider-range").addClass("track-slider-range-disabled"); | 194 $(".track-slider-range").addClass("track-slider-range-disabled"); |
194 $(".track-slider-range").each(function (i, e) { | 195 $(".track-slider-range").each(function (i, e) { |
195 e.disabled = true | 196 e.disabled = true; |
196 }); | 197 }); |
197 } | 198 } |
198 | 199 |
199 | 200 |
200 var interfaceOptions = interfaceObj.options; | 201 var interfaceOptions = interfaceObj.options; |
201 for (var option of interfaceOptions) { | 202 interfaceOptions.forEach(function (option) { |
202 if (option.type == "show") { | 203 if (option.type == "show") { |
203 switch (option.name) { | 204 switch (option.name) { |
204 case "playhead": | 205 case "playhead": |
205 var playbackHolder = document.getElementById('playback-holder'); | 206 var playbackHolder = document.getElementById('playback-holder'); |
206 if (playbackHolder == null) { | 207 if (playbackHolder === null) { |
207 playbackHolder = document.createElement('div'); | 208 playbackHolder = document.createElement('div'); |
208 playbackHolder.style.width = "100%"; | 209 playbackHolder.style.width = "100%"; |
209 playbackHolder.align = 'center'; | 210 playbackHolder.align = 'center'; |
210 playbackHolder.appendChild(interfaceContext.playhead.object); | 211 playbackHolder.appendChild(interfaceContext.playhead.object); |
211 feedbackHolder.insertBefore(playbackHolder, feedbackHolder.firstElementChild); | 212 feedbackHolder.insertBefore(playbackHolder, feedbackHolder.firstElementChild); |
212 } | 213 } |
213 break; | 214 break; |
214 case "page-count": | 215 case "page-count": |
215 var pagecountHolder = document.getElementById('page-count'); | 216 var pagecountHolder = document.getElementById('page-count'); |
216 if (pagecountHolder == null) { | 217 if (pagecountHolder === null) { |
217 pagecountHolder = document.createElement('div'); | 218 pagecountHolder = document.createElement('div'); |
218 pagecountHolder.id = 'page-count'; | 219 pagecountHolder.id = 'page-count'; |
219 } | 220 } |
220 pagecountHolder.innerHTML = '<span>Page ' + (testState.stateIndex + 1) + ' of ' + testState.stateMap.length + '</span>'; | 221 pagecountHolder.innerHTML = '<span>Page ' + (testState.stateIndex + 1) + ' of ' + testState.stateMap.length + '</span>'; |
221 var inject = document.getElementById('interface-buttons'); | 222 var inject = document.getElementById('interface-buttons'); |
222 inject.appendChild(pagecountHolder); | 223 inject.appendChild(pagecountHolder); |
223 break; | 224 break; |
224 case "volume": | 225 case "volume": |
225 if (document.getElementById('master-volume-holder') == null) { | 226 if (document.getElementById('master-volume-holder') === null) { |
226 feedbackHolder.appendChild(interfaceContext.volume.object); | 227 feedbackHolder.appendChild(interfaceContext.volume.object); |
227 } | 228 } |
228 break; | 229 break; |
229 case "comments": | 230 case "comments": |
230 interfaceContext.commentBoxes.showCommentBoxes(feedbackHolder, true); | 231 interfaceContext.commentBoxes.showCommentBoxes(feedbackHolder, true); |
231 break; | 232 break; |
232 } | 233 } |
233 } | 234 } |
234 } | 235 }); |
235 | 236 |
236 $(audioHolderObject.commentQuestions).each(function (index, element) { | 237 $(audioHolderObject.commentQuestions).each(function (index, element) { |
237 var node = interfaceContext.createCommentQuestion(element); | 238 var node = interfaceContext.createCommentQuestion(element); |
238 feedbackHolder.appendChild(node.holder); | 239 feedbackHolder.appendChild(node.holder); |
239 }); | 240 }); |
255 this.holder.style.height = window.innerHeight - 200 + 'px'; | 256 this.holder.style.height = window.innerHeight - 200 + 'px'; |
256 this.holder.appendChild(this.title); | 257 this.holder.appendChild(this.title); |
257 this.holder.appendChild(this.slider); | 258 this.holder.appendChild(this.slider); |
258 this.holder.appendChild(this.play); | 259 this.holder.appendChild(this.play); |
259 this.holder.align = "center"; | 260 this.holder.align = "center"; |
260 if (label == 0) { | 261 if (label === 0) { |
261 this.holder.style.marginLeft = '0px'; | 262 this.holder.style.marginLeft = '0px'; |
262 } | 263 } |
263 this.holder.setAttribute('trackIndex', audioObject.id); | 264 this.holder.setAttribute('trackIndex', audioObject.id); |
264 | 265 |
265 this.title.textContent = label; | 266 this.title.textContent = label; |
314 // Called when playback has begun | 315 // Called when playback has begun |
315 this.play.setAttribute("playstate", "playing"); | 316 this.play.setAttribute("playstate", "playing"); |
316 $(".track-slider").removeClass('track-slider-playing'); | 317 $(".track-slider").removeClass('track-slider-playing'); |
317 $(this.holder).addClass('track-slider-playing'); | 318 $(this.holder).addClass('track-slider-playing'); |
318 var outsideReference = document.getElementById('outside-reference'); | 319 var outsideReference = document.getElementById('outside-reference'); |
319 if (outsideReference != null) { | 320 if (outsideReference !== null) { |
320 $(outsideReference).removeClass('track-slider-playing'); | 321 $(outsideReference).removeClass('track-slider-playing'); |
321 } | 322 } |
322 this.play.textContent = "Stop"; | 323 this.play.textContent = "Stop"; |
323 if (page.restrictMovement) { | 324 if (page.restrictMovement) { |
324 if (page.loop) { | 325 if (page.loop) { |
372 }; | 373 }; |
373 this.error = function () { | 374 this.error = function () { |
374 // audioObject has an error!! | 375 // audioObject has an error!! |
375 this.playback.textContent = "Error"; | 376 this.playback.textContent = "Error"; |
376 $(this.playback).addClass("error-colour"); | 377 $(this.playback).addClass("error-colour"); |
377 } | 378 }; |
378 } | 379 } |
379 | 380 |
380 function resizeWindow(event) { | 381 function resizeWindow(event) { |
381 // Function called when the window has been resized. | 382 // Function called when the window has been resized. |
382 // MANDATORY FUNCTION | 383 // MANDATORY FUNCTION |
383 | 384 |
384 var outsideRef = document.getElementById('outside-reference'); | 385 var outsideRef = document.getElementById('outside-reference'); |
385 if (outsideRef != null) { | 386 if (outsideRef !== null) { |
386 outsideRef.style.left = (window.innerWidth - 120) / 2 + 'px'; | 387 outsideRef.style.left = (window.innerWidth - 120) / 2 + 'px'; |
387 } | 388 } |
388 | 389 |
389 // Auto-align | 390 // Auto-align |
390 var numObj = document.getElementsByClassName('track-slider').length; | 391 var numObj = document.getElementsByClassName('track-slider').length; |
426 ctx.clearRect(0, 0, canvas.width, canvas.height); | 427 ctx.clearRect(0, 0, canvas.width, canvas.height); |
427 var draw_heights = [24, height - 34]; | 428 var draw_heights = [24, height - 34]; |
428 var textHolder = document.getElementById('scale-text-holder'); | 429 var textHolder = document.getElementById('scale-text-holder'); |
429 textHolder.innerHTML = ""; | 430 textHolder.innerHTML = ""; |
430 var lastHeight = 0; | 431 var lastHeight = 0; |
431 for (var scale of scales) { | 432 scales.forEach(function (scale) { |
432 var posPercent = scale.position / 100.0; | 433 var posPercent = scale.position / 100.0; |
433 var posPix = (1 - posPercent) * (draw_heights[1] - draw_heights[0]) + draw_heights[0]; | 434 var posPix = (1 - posPercent) * (draw_heights[1] - draw_heights[0]) + draw_heights[0]; |
434 ctx.fillStyle = "#000000"; | 435 ctx.fillStyle = "#000000"; |
435 ctx.setLineDash([1, 2]); | 436 ctx.setLineDash([1, 2]); |
436 ctx.moveTo(0, posPix); | 437 ctx.moveTo(0, posPix); |
444 text.className = "scale-text"; | 445 text.className = "scale-text"; |
445 textHolder.appendChild(text); | 446 textHolder.appendChild(text); |
446 text.style.top = (posPix - 9) + 'px'; | 447 text.style.top = (posPix - 9) + 'px'; |
447 text.style.left = 100 - ($(text).width() + 3) + 'px'; | 448 text.style.left = 100 - ($(text).width() + 3) + 'px'; |
448 lastHeight = posPix; | 449 lastHeight = posPix; |
449 } | 450 }); |
450 } | 451 } |
451 | 452 |
452 function buttonSubmitClick() // TODO: Only when all songs have been played! | 453 function buttonSubmitClick() // TODO: Only when all songs have been played! |
453 { | 454 { |
454 var checks = testState.currentStateMap.interfaces[0].options, | 455 var checks = testState.currentStateMap.interfaces[0].options, |
455 canContinue = true; | 456 canContinue = true; |
456 | 457 |
457 // Check that the anchor and reference objects are correctly placed | 458 // Check that the anchor and reference objects are correctly placed |
458 if (interfaceContext.checkHiddenAnchor() == false) { | 459 if (interfaceContext.checkHiddenAnchor() === false) { |
459 return; | 460 return; |
460 } | 461 } |
461 if (interfaceContext.checkHiddenReference() == false) { | 462 if (interfaceContext.checkHiddenReference() === false) { |
462 return; | 463 return; |
463 } | 464 } |
464 | 465 |
465 for (var i = 0; i < checks.length; i++) { | 466 for (var i = 0; i < checks.length; i++) { |
467 var checkState = true; | |
466 if (checks[i].type == 'check') { | 468 if (checks[i].type == 'check') { |
467 switch (checks[i].name) { | 469 switch (checks[i].name) { |
468 case 'fragmentPlayed': | 470 case 'fragmentPlayed': |
469 // Check if all fragments have been played | 471 // Check if all fragments have been played |
470 var checkState = interfaceContext.checkAllPlayed(); | 472 checkState = interfaceContext.checkAllPlayed(); |
471 if (checkState == false) { | |
472 canContinue = false; | |
473 } | |
474 break; | 473 break; |
475 case 'fragmentFullPlayback': | 474 case 'fragmentFullPlayback': |
476 // Check all fragments have been played to their full length | 475 // Check all fragments have been played to their full length |
477 var checkState = interfaceContext.checkAllPlayed(); | 476 checkState = interfaceContext.checkAllPlayed(); |
478 if (checkState == false) { | |
479 canContinue = false; | |
480 } | |
481 console.log('NOTE: fragmentFullPlayback not currently implemented, performing check fragmentPlayed instead'); | 477 console.log('NOTE: fragmentFullPlayback not currently implemented, performing check fragmentPlayed instead'); |
482 break; | 478 break; |
483 case 'fragmentMoved': | 479 case 'fragmentMoved': |
484 // Check all fragment sliders have been moved. | 480 // Check all fragment sliders have been moved. |
485 var checkState = interfaceContext.checkAllMoved(); | 481 checkState = interfaceContext.checkAllMoved(); |
486 if (checkState == false) { | |
487 canContinue = false; | |
488 } | |
489 break; | 482 break; |
490 case 'fragmentComments': | 483 case 'fragmentComments': |
491 // Check all fragment sliders have been moved. | 484 // Check all fragment sliders have been moved. |
492 var checkState = interfaceContext.checkAllCommented(); | 485 checkState = interfaceContext.checkAllCommented(); |
493 if (checkState == false) { | |
494 canContinue = false; | |
495 } | |
496 break; | 486 break; |
497 case 'scalerange': | 487 case 'scalerange': |
498 // Check the scale has been used effectively | 488 // Check the scale has been used effectively |
499 var checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max); | 489 checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max); |
500 if (checkState == false) { | |
501 canContinue = false; | |
502 } | |
503 break; | 490 break; |
504 default: | 491 default: |
505 console.log("WARNING - Check option " + checks[i].check + " is not supported on this interface"); | 492 console.log("WARNING - Check option " + checks[i].check + " is not supported on this interface"); |
506 break; | 493 break; |
507 } | 494 } |
508 | 495 |
509 } | 496 } |
510 if (!canContinue) { | 497 if (checkState === false) { |
498 canContinue = false; | |
511 break; | 499 break; |
512 } | 500 } |
513 } | 501 } |
514 | 502 |
515 if (canContinue) { | 503 if (canContinue) { |
516 if (audioEngineContext.status == 1) { | 504 if (audioEngineContext.status == 1) { |
517 var playback = document.getElementById('playback-button'); | 505 var playback = document.getElementById('playback-button'); |
518 playback.click(); | 506 playback.click(); |
519 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options | 507 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options |
520 } else { | 508 } else { |
521 if (audioEngineContext.timer.testStarted == false) { | 509 if (audioEngineContext.timer.testStarted === false) { |
522 interfaceContext.lightbox.post("Message", 'You have not started the test! Please press start to begin the test!'); | 510 interfaceContext.lightbox.post("Message", 'You have not started the test! Please press start to begin the test!'); |
523 return; | 511 return; |
524 } | 512 } |
525 } | 513 } |
526 testState.advanceState(); | 514 testState.advanceState(); |