comparison interfaces/AB.js @ 2691:388d77c8bfef

#180. AB JSHinted
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Sat, 11 Mar 2017 11:35:47 +0000
parents 0fafb872a1a3
children 31af72ea5e61
comparison
equal deleted inserted replaced
2690:9eb3ff794d63 2691:388d77c8bfef
1 // Once this is loaded and parsed, begin execution 1 // Once this is loaded and parsed, begin execution
2 loadInterface(); 2 loadInterface();
3 3 /*globals window, interfaceContext, testState, Interface, audioEngineContext, console, document, specification, $, storage*/
4 function loadInterface() { 4 function loadInterface() {
5 // Get the dimensions of the screen available to the page 5 // Get the dimensions of the screen available to the page
6 var width = window.innerWidth; 6 var width = window.innerWidth;
7 var height = window.innerHeight; 7 var height = window.innerHeight;
8 interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema 8 interfaceContext.insertPoint.innerHTML = ""; // Clear the current schema
25 if (rank > maxRanking) { 25 if (rank > maxRanking) {
26 maxRanking = rank; 26 maxRanking = rank;
27 } 27 }
28 } 28 }
29 if (maxRanking * 100 < max) { 29 if (maxRanking * 100 < max) {
30 str += "At least one fragment must be selected." 30 str += "At least one fragment must be selected.";
31 state = false; 31 state = false;
32 } 32 }
33 if (!state) { 33 if (!state) {
34 console.log(str); 34 console.log(str);
35 this.storeErrorNode(str); 35 this.storeErrorNode(str);
36 interfaceContext.lightbox.post("Message", str); 36 interfaceContext.lightbox.post("Message", str);
37 } 37 }
38 return state; 38 return state;
39 } 39 };
40 40
41 // The injection point into the HTML page 41 // The injection point into the HTML page
42 interfaceContext.insertPoint = document.getElementById("topLevelBody"); 42 interfaceContext.insertPoint = document.getElementById("topLevelBody");
43 var testContent = document.createElement('div'); 43 var testContent = document.createElement('div');
44 testContent.id = 'testContent'; 44 testContent.id = 'testContent';
50 title.align = "center"; 50 title.align = "center";
51 var titleSpan = document.createElement('span'); 51 var titleSpan = document.createElement('span');
52 titleSpan.id = "test-title"; 52 titleSpan.id = "test-title";
53 53
54 // Set title to that defined in XML, else set to default 54 // Set title to that defined in XML, else set to default
55 if (titleAttr != undefined) { 55 if (titleAttr !== undefined) {
56 titleSpan.textContent = titleAttr; 56 titleSpan.textContent = titleAttr;
57 } else { 57 } else {
58 titleSpan.textContent = 'Listening test'; 58 titleSpan.textContent = 'Listening test';
59 } 59 }
60 // Insert the titleSpan element into the title div element. 60 // Insert the titleSpan element into the title div element.
61 title.appendChild(titleSpan); 61 title.appendChild(titleSpan);
62 62
63 var pagetitle = document.createElement('div'); 63 var pagetitle = document.createElement('div');
64 pagetitle.className = "pageTitle"; 64 pagetitle.className = "pageTitle";
65 pagetitle.align = "center"; 65 pagetitle.align = "center";
66 var titleSpan = document.createElement('span'); 66
67 titleSpan = document.createElement('span');
67 titleSpan.id = "pageTitle"; 68 titleSpan.id = "pageTitle";
68 pagetitle.appendChild(titleSpan); 69 pagetitle.appendChild(titleSpan);
69 70
70 // Create Interface buttons! 71 // Create Interface buttons!
71 var interfaceButtons = document.createElement('div'); 72 var interfaceButtons = document.createElement('div');
148 var outsideReferenceHolder = document.getElementById("outside-reference-holder"); 149 var outsideReferenceHolder = document.getElementById("outside-reference-holder");
149 outsideReferenceHolder.innerHTML = ""; 150 outsideReferenceHolder.innerHTML = "";
150 151
151 // Set the page title 152 // Set the page title
152 if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) { 153 if (typeof audioHolderObject.title == "string" && audioHolderObject.title.length > 0) {
153 document.getElementById("test-title").textContent = audioHolderObject.title 154 document.getElementById("test-title").textContent = audioHolderObject.title;
154 } 155 }
155 156
156 if (interfaceObj.title != null) { 157 if (interfaceObj.title !== null) {
157 document.getElementById("pageTitle").textContent = interfaceObj.title; 158 document.getElementById("pageTitle").textContent = interfaceObj.title;
158 } 159 }
159 160
160 var interfaceOptions = interfaceObj.options; 161 var interfaceOptions = interfaceObj.options;
161 // Clear the interfaceElements 162 // Clear the interfaceElements
180 for (var option of interfaceOptions) { 181 for (var option of interfaceOptions) {
181 if (option.type == "show") { 182 if (option.type == "show") {
182 switch (option.name) { 183 switch (option.name) {
183 case "playhead": 184 case "playhead":
184 var playbackHolder = document.getElementById('playback-holder'); 185 var playbackHolder = document.getElementById('playback-holder');
185 if (playbackHolder == null) { 186 if (playbackHolder === null) {
186 playbackHolder = document.createElement('div'); 187 playbackHolder = document.createElement('div');
187 playbackHolder.id = 'playback-holder'; 188 playbackHolder.id = 'playback-holder';
188 playbackHolder.style.width = "100%"; 189 playbackHolder.style.width = "100%";
189 playbackHolder.style.float = "left"; 190 playbackHolder.style.float = "left";
190 playbackHolder.align = 'center'; 191 playbackHolder.align = 'center';
192 feedbackHolder.appendChild(playbackHolder); 193 feedbackHolder.appendChild(playbackHolder);
193 } 194 }
194 break; 195 break;
195 case "page-count": 196 case "page-count":
196 var pagecountHolder = document.getElementById('page-count'); 197 var pagecountHolder = document.getElementById('page-count');
197 if (pagecountHolder == null) { 198 if (pagecountHolder === null) {
198 pagecountHolder = document.createElement('div'); 199 pagecountHolder = document.createElement('div');
199 pagecountHolder.id = 'page-count'; 200 pagecountHolder.id = 'page-count';
200 document.getElementById('interface-buttons').appendChild(pagecountHolder); 201 document.getElementById('interface-buttons').appendChild(pagecountHolder);
201 } 202 }
202 pagecountHolder.innerHTML = '<span>Page ' + (testState.stateIndex + 1) + ' of ' + testState.stateMap.length + '</span>'; 203 pagecountHolder.innerHTML = '<span>Page ' + (testState.stateIndex + 1) + ' of ' + testState.stateMap.length + '</span>';
203 break; 204 break;
204 case "volume": 205 case "volume":
205 if (document.getElementById('master-volume-holder-float') == null) { 206 if (document.getElementById('master-volume-holder-float') === null) {
206 feedbackHolder.appendChild(interfaceContext.volume.object); 207 feedbackHolder.appendChild(interfaceContext.volume.object);
207 } 208 }
208 break; 209 break;
209 case "comments": 210 case "comments":
210 // Generate one comment box per presented page 211 // Generate one comment box per presented page
244 this.playback.className = 'comparator-button'; 245 this.playback.className = 'comparator-button';
245 this.playback.disabled = true; 246 this.playback.disabled = true;
246 this.playback.textContent = "Listen"; 247 this.playback.textContent = "Listen";
247 this.box.appendChild(this.selector); 248 this.box.appendChild(this.selector);
248 this.box.appendChild(this.playback); 249 this.box.appendChild(this.playback);
249 this.selector.onclick = function (event) { 250 this.selectorClicked = function () {
251 var i;
250 var time = audioEngineContext.timer.getTestTime(); 252 var time = audioEngineContext.timer.getTestTime();
251 if ($(event.currentTarget).hasClass('disabled')) { 253 if (this.parent.state !== 1) {
254 interfaceContext.lightbox.post("Message", "Please wait for the sample to load");
252 console.log("Please wait until sample has loaded"); 255 console.log("Please wait until sample has loaded");
253 return; 256 return;
254 } 257 }
255 if (audioEngineContext.status == 0) { 258 if (audioEngineContext.status === 0) {
256 interfaceContext.lightbox.post("Message", "Please listen to the samples before making a selection"); 259 interfaceContext.lightbox.post("Message", "Please listen to the samples before making a selection");
257 console.log("Please listen to the samples before making a selection"); 260 console.log("Please listen to the samples before making a selection");
258 return; 261 return;
259 } 262 }
260 var id = event.currentTarget.parentElement.getAttribute('track-id'); 263 interfaceContext.comparator.selected = this.id;
261 interfaceContext.comparator.selected = id; 264 $(".comparator-selector").removeClass('selected');
262 if ($(event.currentTarget).hasClass("selected")) { 265 $(this.selector).addClass('selected');
263 $(".comparator-selector").removeClass('selected'); 266 this.comparator.comparators.forEach(function (a) {
264 for (var i = 0; i < interfaceContext.comparator.comparators.length; i++) { 267 if (a !== this) {
265 var obj = interfaceContext.comparator.comparators[i]; 268 a.value = 0;
266 obj.parent.metric.moved(time, 0); 269 } else {
267 obj.value = 0; 270 a.value = 1;
268 } 271 }
269 } else { 272 a.parent.metric.moved(time, obj.value);
270 $(".comparator-selector").removeClass('selected'); 273 }, this);
271 $(event.currentTarget).addClass('selected'); 274 console.log("Selected " + this.id + ' (' + time + ')');
272 for (var i = 0; i < interfaceContext.comparator.comparators.length; i++) {
273 var obj = interfaceContext.comparator.comparators[i];
274 if (i == id) {
275 obj.value = 1;
276 } else {
277 obj.value = 0;
278 }
279 obj.parent.metric.moved(time, obj.value);
280 }
281 console.log("Selected " + id + ' (' + time + ')');
282 }
283 }; 275 };
284 this.playback.setAttribute("playstate", "ready"); 276 this.playback.setAttribute("playstate", "ready");
285 this.playback.onclick = function (event) { 277 this.playbackClicked = function () {
286 var id = event.currentTarget.parentElement.getAttribute('track-id');
287 if (event.currentTarget.getAttribute("playstate") == "ready") { 278 if (event.currentTarget.getAttribute("playstate") == "ready") {
288 audioEngineContext.play(id); 279 audioEngineContext.play(this.id);
289 } else if (event.currentTarget.getAttribute("playstate") == "playing") { 280 } else if (event.currentTarget.getAttribute("playstate") == "playing") {
290 audioEngineContext.stop(); 281 audioEngineContext.stop();
291 } 282 }
292 283
293 }; 284 };
285 this.handleEvent = function (event) {
286 if (event.currentTarget === this.selector) {
287 this.selectorClicked();
288 } else if (event.currentTarget === this.playback) {
289 this.playbackClicked();
290 }
291 }
292 this.playback.addEventListener("click", this);
293 this.selector.addEventListener("click", this);
294 294
295 this.enable = function () { 295 this.enable = function () {
296 if (this.parent.state == 1) { 296 if (this.parent.state == 1) {
297 $(this.selector).removeClass('disabled'); 297 $(this.selector).removeClass('disabled');
298 this.playback.disabled = false; 298 this.playback.disabled = false;
309 }; 309 };
310 this.error = function () { 310 this.error = function () {
311 // audioObject has an error!! 311 // audioObject has an error!!
312 this.playback.textContent = "Error"; 312 this.playback.textContent = "Error";
313 $(this.playback).addClass("error-colour"); 313 $(this.playback).addClass("error-colour");
314 } 314 };
315 this.startPlayback = function () { 315 this.startPlayback = function () {
316 if (this.parent.specification.parent.playOne || specification.playOne) { 316 if (this.parent.specification.parent.playOne || specification.playOne) {
317 $('.comparator-button').text('Wait'); 317 $('.comparator-button').text('Wait');
318 $('.comparator-button').attr("disabled", "true"); 318 $('.comparator-button').attr("disabled", "true");
319 $(this.playback).css("disabled", "false"); 319 $(this.playback).css("disabled", "false");
364 var orNode = new interfaceContext.outsideReferenceDOM(audioObject, index, document.getElementById("outside-reference-holder")); 364 var orNode = new interfaceContext.outsideReferenceDOM(audioObject, index, document.getElementById("outside-reference-holder"));
365 audioObject.bindInterface(orNode); 365 audioObject.bindInterface(orNode);
366 } else { 366 } else {
367 var label = interfaceContext.getLabel(labelType, index, audioHolderObject.labelStart); 367 var label = interfaceContext.getLabel(labelType, index, audioHolderObject.labelStart);
368 var node = new this.comparatorBox(audioObject, index, label); 368 var node = new this.comparatorBox(audioObject, index, label);
369 Object.defineProperties(node, {
370 'comparator': {
371 'value': this
372 }
373 });
369 audioObject.bindInterface(node); 374 audioObject.bindInterface(node);
370 this.comparators.push(node); 375 this.comparators.push(node);
371 this.boxHolders.appendChild(node.box); 376 this.boxHolders.appendChild(node.box);
372 } 377 }
373 } 378 }
387 document.getElementById('box-holders').style.marginLeft = diff / 2 + 'px'; 392 document.getElementById('box-holders').style.marginLeft = diff / 2 + 'px';
388 document.getElementById('box-holders').style.marginRight = diff / 2 + 'px'; 393 document.getElementById('box-holders').style.marginRight = diff / 2 + 'px';
389 document.getElementById('box-holders').style.width = boxW + 'px'; 394 document.getElementById('box-holders').style.width = boxW + 'px';
390 395
391 var outsideRef = document.getElementById('outside-reference'); 396 var outsideRef = document.getElementById('outside-reference');
392 if (outsideRef != null) { 397 if (outsideRef !== null) {
393 outsideRef.style.left = (window.innerWidth - 120) / 2 + 'px'; 398 outsideRef.style.left = (window.innerWidth - 120) / 2 + 'px';
394 } 399 }
395 } 400 }
396 401
397 function buttonSubmitClick() { 402 function buttonSubmitClick() {
398 var checks = testState.currentStateMap.interfaces[0].options, 403 var checks = testState.currentStateMap.interfaces[0].options,
399 canContinue = true; 404 canContinue = true;
400 405
401 for (var i = 0; i < checks.length; i++) { 406 for (var i = 0; i < checks.length; i++) {
402 if (checks[i].type == 'check') { 407 if (checks[i].type == 'check') {
408 var checkState;
403 switch (checks[i].name) { 409 switch (checks[i].name) {
404 case 'fragmentPlayed': 410 case 'fragmentPlayed':
405 // Check if all fragments have been played 411 // Check if all fragments have been played
406 var checkState = interfaceContext.checkAllPlayed(); 412 checkState = interfaceContext.checkAllPlayed();
407 if (checkState == false) { 413 if (checkState === false) {
408 canContinue = false; 414 canContinue = false;
409 } 415 }
410 break; 416 break;
411 case 'fragmentFullPlayback': 417 case 'fragmentFullPlayback':
412 // Check all fragments have been played to their full length 418 // Check all fragments have been played to their full length
413 var checkState = interfaceContext.checkFragmentsFullyPlayed(); 419 checkState = interfaceContext.checkFragmentsFullyPlayed();
414 if (checkState == false) { 420 if (checkState === false) {
415 canContinue = false; 421 canContinue = false;
416 } 422 }
417 break; 423 break;
418 case 'fragmentMoved': 424 case 'fragmentMoved':
419 // Check all fragment sliders have been moved. 425 // Check all fragment sliders have been moved.
420 var checkState = interfaceContext.checkAllMoved(); 426 checkState = interfaceContext.checkAllMoved();
421 if (checkState == false) { 427 if (checkState === false) {
422 canContinue = false; 428 canContinue = false;
423 } 429 }
424 break; 430 break;
425 case 'fragmentComments': 431 case 'fragmentComments':
426 // Check all fragment sliders have been moved. 432 // Check all fragment sliders have been moved.
427 var checkState = interfaceContext.checkAllCommented(); 433 checkState = interfaceContext.checkAllCommented();
428 if (checkState == false) { 434 if (checkState === false) {
429 canContinue = false; 435 canContinue = false;
430 } 436 }
431 break; 437 break;
432 case 'scalerange': 438 case 'scalerange':
433 // Check the scale has been used effectively 439 // Check the scale has been used effectively
434 var checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max); 440 checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max);
435 if (checkState == false) { 441 if (checkState === false) {
436 canContinue = false; 442 canContinue = false;
437 } 443 }
438 break; 444 break;
439 default: 445 default:
440 console.log("WARNING - Check option " + checks[i].check + " is not supported on this interface"); 446 console.log("WARNING - Check option " + checks[i].check + " is not supported on this interface");
450 if (audioEngineContext.status == 1) { 456 if (audioEngineContext.status == 1) {
451 var playback = document.getElementById('playback-button'); 457 var playback = document.getElementById('playback-button');
452 playback.click(); 458 playback.click();
453 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options 459 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options
454 } else { 460 } else {
455 if (audioEngineContext.timer.testStarted == false) { 461 if (audioEngineContext.timer.testStarted === false) {
456 interfaceContext.lightbox.post("Warning", 'You have not started the test! Please click play on a sample to begin the test!'); 462 interfaceContext.lightbox.post("Warning", 'You have not started the test! Please click play on a sample to begin the test!');
457 return; 463 return;
458 } 464 }
459 } 465 }
460 testState.advanceState(); 466 testState.advanceState();