changeset 2699:6350ae016862

#180. JSHint Discrete.js
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Mon, 13 Mar 2017 11:18:55 +0000
parents 0562dcdfd5eb
children 87d9f785f1ec
files interfaces/discrete.js
diffstat 1 files changed, 59 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/interfaces/discrete.js	Mon Mar 13 11:08:51 2017 +0000
+++ b/interfaces/discrete.js	Mon Mar 13 11:18:55 2017 +0000
@@ -1,3 +1,4 @@
+/* globals interfaceContext, document, window, $, specification, audioEngineContext, console, window, testState, storage */
 // Once this is loaded and parsed, begin execution
 loadInterface();
 
@@ -19,7 +20,7 @@
     titleSpan.id = "test-title";
 
     // Set title to that defined in XML, else set to default
-    if (titleAttr != undefined) {
+    if (titleAttr !== undefined) {
         titleSpan.textContent = titleAttr;
     } else {
         titleSpan.textContent = 'Listening test';
@@ -30,7 +31,8 @@
     var pagetitle = document.createElement('div');
     pagetitle.className = "pageTitle";
     pagetitle.align = "center";
-    var titleSpan = document.createElement('span');
+
+    titleSpan = document.createElement('span');
     titleSpan.id = "pageTitle";
     pagetitle.appendChild(titleSpan);
 
@@ -112,7 +114,7 @@
     // Load the full interface
     testState.initialise();
     testState.advanceState();
-};
+}
 
 function loadTest(page) {
     // Called each time a new test page is to be build. The page specification node is the only item passed in
@@ -128,10 +130,10 @@
 
     // Set the page title
     if (typeof page.title == "string" && page.title.length > 0) {
-        document.getElementById("test-title").textContent = page.title
+        document.getElementById("test-title").textContent = page.title;
     }
 
-    if (interfaceObj.title != null) {
+    if (interfaceObj.title !== null) {
         document.getElementById("pageTitle").textContent = interfaceObj.title;
     }
 
@@ -142,17 +144,17 @@
     sliderBox.innerHTML = "";
 
     var commentBoxPrefix = "Comment on track";
-    if (interfaceObj.commentBoxPrefix != undefined) {
+    if (interfaceObj.commentBoxPrefix !== undefined) {
         commentBoxPrefix = interfaceObj.commentBoxPrefix;
     }
     var loopPlayback = page.loop;
 
-    for (var option of interfaceObj.options) {
+    interfaceObj.options.forEach(function (option) {
         if (option.type == "show") {
             switch (option.name) {
                 case "playhead":
                     var playbackHolder = document.getElementById('playback-holder');
-                    if (playbackHolder == null) {
+                    if (playbackHolder === null) {
                         playbackHolder = document.createElement('div');
                         playbackHolder.style.width = "100%";
                         playbackHolder.align = 'center';
@@ -162,7 +164,7 @@
                     break;
                 case "page-count":
                     var pagecountHolder = document.getElementById('page-count');
-                    if (pagecountHolder == null) {
+                    if (pagecountHolder === null) {
                         pagecountHolder = document.createElement('div');
                         pagecountHolder.id = 'page-count';
                     }
@@ -171,7 +173,7 @@
                     inject.appendChild(pagecountHolder);
                     break;
                 case "volume":
-                    if (document.getElementById('master-volume-holder') == null) {
+                    if (document.getElementById('master-volume-holder') === null) {
                         feedbackHolder.appendChild(interfaceContext.volume.object);
                     }
                     break;
@@ -180,7 +182,7 @@
                     break;
             }
         }
-    }
+    });
 
     // Find all the audioElements from the audioHolder
     var index = 0;
@@ -223,9 +225,9 @@
     // An example node, you can make this however you want for each audioElement.
     // However, every audioObject (audioEngineContext.audioObject) MUST have an interface object with the following
     // You attach them by calling audioObject.bindInterface( )
-    if (interfaceScales == null || interfaceScales.length == 0) {
+    if (interfaceScales === null || interfaceScales.length === 0) {
         console.log("WARNING: The discrete radio's are built depending on the number of scale points specified! Ensure you have some specified. Defaulting to 5 for now!");
-        numOptions = 5;
+        var numOptions = 5;
     }
     this.parent = audioObject;
 
@@ -246,6 +248,26 @@
 
     this.discreteHolder.className = "track-slider-range";
     this.discreteHolder.style.width = window.innerWidth - 500 + 'px';
+    this.radioClicked = function (event) {
+        var time = audioEngineContext.timer.getTestTime();
+        if (audioEngineContext.status === 0) {
+            event.currentTarget.checked = false;
+            return;
+        }
+        var id = this.parent.id;
+        var checkedelement = this.discretes.find(function (elem) {
+            return elem.checked;
+        });
+        var position = checkedelement.getAttribute("position") / 100.0;
+        this.parent.metric.moved(time, checkedelement);
+        console.log('slider ' + id + ' moved to ' + position + ' (' + time + ')');
+
+    };
+    this.handleEvent = function (event) {
+        if (event.currentTarget.getAttribute("name") === this.parent.specification.id) {
+            this.radioClicked(event);
+        }
+    };
     for (var i = 0; i < interfaceScales.length; i++) {
         var node = document.createElement('input');
         node.setAttribute('type', 'radio');
@@ -256,17 +278,7 @@
         node.setAttribute('id', audioObject.specification.id + '-' + String(i));
         this.discretes.push(node);
         this.discreteHolder.appendChild(node);
-        node.onclick = function (event) {
-            if (audioEngineContext.status == 0) {
-                event.currentTarget.checked = false;
-                return;
-            }
-            var time = audioEngineContext.timer.getTestTime();
-            var id = Number(event.currentTarget.parentNode.parentNode.getAttribute('trackIndex'));
-            var value = event.currentTarget.getAttribute('position') / 100.0;
-            audioEngineContext.audioObjects[id].metric.moved(time, value);
-            console.log('slider ' + id + ' moved to ' + value + ' (' + time + ')');
-        };
+        node.addEventListener("click", this);
     }
 
     this.play.className = 'track-slider-button';
@@ -300,9 +312,9 @@
         this.play.disabled = false;
         this.play.textContent = "Play";
         $(this.slider).removeClass('track-slider-disabled');
-        for (var radio of this.discretes) {
-            radio.disabled = false;
-        }
+        this.discretes.forEach(function (elem) {
+            elem.disabled = false;
+        });
     };
     this.updateLoading = function (progress) {
         // progress is a value from 0 to 100 indicating the current download state of media files
@@ -322,14 +334,14 @@
         $(this.holder).addClass('track-slider-playing');
         var outsideReference = document.getElementById('outside-reference');
         this.play.textContent = "Listening";
-        if (outsideReference != null) {
+        if (outsideReference !== null) {
             $(outsideReference).removeClass('track-slider-playing');
         }
         if (this.parent.specification.parent.playOne || specification.playOne) {
             $('.track-slider-button').text = "Wait";
             $('.track-slider-button').attr("disabled", "true");
         }
-    }
+    };
     this.stopPlayback = function () {
         // Called by audioObject when playback stops
         if (this.play.getAttribute("playstate") == "playing") {
@@ -339,13 +351,13 @@
             this.play.textContent = "Play";
             $('.track-slider-button').removeAttr("disabled");
         }
-    }
+    };
 
     this.getValue = function () {
         // Return the current value of the object. If there is no value, return -1
         var value = -1;
         for (var i = 0; i < this.discretes.length; i++) {
-            if (this.discretes[i].checked == true) {
+            if (this.discretes[i].checked === true) {
                 value = this.discretes[i].getAttribute('position') / 100.0;
                 break;
             }
@@ -374,8 +386,8 @@
         // audioObject has an error!!
         this.playback.textContent = "Error";
         $(this.playback).addClass("error-colour");
-    }
-};
+    };
+}
 
 function resizeWindow(event) {
     // Called on every window resize event, use this to scale your page properly
@@ -415,7 +427,7 @@
     textHolder.innerHTML = "";
     ctx.fillStyle = "#000000";
     ctx.setLineDash([1, 4]);
-    for (var scale of scales) {
+    scales.forEach(function (scale) {
         var posPercent = scale.position / 100.0;
         var posPix = Math.round(width * posPercent);
         if (posPix <= 0) {
@@ -437,7 +449,7 @@
         textHolder.appendChild(text);
         text.style.width = $(text.children[0]).width() + 'px';
         text.style.left = (posPix + 150 - ($(text).width() / 2)) + 'px';
-    }
+    });
 }
 
 function buttonSubmitClick() // TODO: Only when all songs have been played!
@@ -446,57 +458,45 @@
         canContinue = true;
 
     // Check that the anchor and reference objects are correctly placed
-    if (interfaceContext.checkHiddenAnchor() == false) {
+    if (interfaceContext.checkHiddenAnchor() === false) {
         return;
     }
-    if (interfaceContext.checkHiddenReference() == false) {
+    if (interfaceContext.checkHiddenReference() === false) {
         return;
     }
 
     for (var i = 0; i < checks.length; i++) {
+        var checkState;
         if (checks[i].type == 'check') {
             switch (checks[i].name) {
                 case 'fragmentPlayed':
                     // Check if all fragments have been played
-                    var checkState = interfaceContext.checkAllPlayed();
-                    if (checkState == false) {
-                        canContinue = false;
-                    }
+                    checkState = interfaceContext.checkAllPlayed();
                     break;
                 case 'fragmentFullPlayback':
                     // Check all fragments have been played to their full length
-                    var checkState = interfaceContext.checkAllPlayed();
-                    if (checkState == false) {
-                        canContinue = false;
-                    }
+                    checkState = interfaceContext.checkAllPlayed();
                     console.log('NOTE: fragmentFullPlayback not currently implemented, performing check fragmentPlayed instead');
                     break;
                 case 'fragmentMoved':
                     // Check all fragment sliders have been moved.
-                    var checkState = interfaceContext.checkAllMoved();
-                    if (checkState == false) {
-                        canContinue = false;
-                    }
+                    checkState = interfaceContext.checkAllMoved();
                     break;
                 case 'fragmentComments':
                     // Check all fragment sliders have been moved.
-                    var checkState = interfaceContext.checkAllCommented();
-                    if (checkState == false) {
-                        canContinue = false;
-                    }
+                    checkState = interfaceContext.checkAllCommented();
                     break;
                 case 'scalerange':
                     // Check the scale has been used effectively
-                    var checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max);
-                    if (checkState == false) {
-                        canContinue = false;
-                    }
+                    checkState = interfaceContext.checkScaleRange(checks[i].min, checks[i].max);
                     break;
                 default:
                     console.log("WARNING - Check option " + checks[i].check + " is not supported on this interface");
                     break;
             }
-
+            if (checkState === false) {
+                canContinue = false;
+            }
         }
         if (!canContinue) {
             break;
@@ -509,7 +509,7 @@
             playback.click();
             // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options
         } else {
-            if (audioEngineContext.timer.testStarted == false) {
+            if (audioEngineContext.timer.testStarted === false) {
                 interfaceContext.lightbox.post("Warning", 'You have not started the test! Please press start to begin the test!');
                 return;
             }