Mercurial > hg > webaudioevaluationtool
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(); |