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();