annotate ape.js @ 777:3123565e0c49

Merge
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Tue, 08 Dec 2015 12:22:18 +0000
parents e66434e0f573 0795031754d7
children 01a882ec2b72
rev   line source
n@767 1 /**
n@767 2 * ape.js
n@767 3 * Create the APE interface
n@767 4 */
n@767 5
n@767 6
n@767 7 // Once this is loaded and parsed, begin execution
n@767 8 loadInterface();
n@767 9
n@767 10 var clicking = -1;
n@767 11
n@767 12 function loadInterface() {
n@767 13
n@767 14 // Get the dimensions of the screen available to the page
n@767 15 var width = window.innerWidth;
n@767 16 var height = window.innerHeight;
n@767 17
n@767 18 // The injection point into the HTML page
n@767 19 interfaceContext.insertPoint = document.getElementById("topLevelBody");
n@767 20 var testContent = document.createElement('div');
n@767 21
n@767 22 testContent.id = 'testContent';
n@767 23
n@767 24
n@767 25 // Create APE specific metric functions
n@767 26 audioEngineContext.metric.initialiseTest = function()
n@767 27 {
n@767 28 };
n@767 29
n@767 30 audioEngineContext.metric.sliderMoved = function()
n@767 31 {
n@767 32 var id = this.data;
n@767 33 this.data = -1;
n@767 34 var position = convSliderPosToRate(id);
n@767 35 console.log('slider ' + id + ': '+ position + ' (' + time + ')'); // DEBUG/SAFETY: show position and slider id
n@767 36 if (audioEngineContext.timer.testStarted)
n@767 37 {
n@767 38 audioEngineContext.audioObjects[id].metric.moved(time,position);
n@767 39 }
n@767 40 };
n@767 41
n@767 42 audioEngineContext.metric.sliderPlayed = function(id)
n@767 43 {
n@767 44 var time = audioEngineContext.timer.getTestTime();
n@767 45 if (audioEngineContext.timer.testStarted)
n@767 46 {
n@767 47 if (this.lastClicked >= 0)
n@767 48 {
n@767 49 audioEngineContext.audioObjects[this.lastClicked].metric.listening(time);
n@767 50 }
n@767 51 this.lastClicked = id;
n@767 52 audioEngineContext.audioObjects[id].metric.listening(time);
n@767 53 }
n@767 54 console.log('slider ' + id + ' played (' + time + ')'); // DEBUG/SAFETY: show played slider id
n@767 55 };
n@767 56
n@767 57 // Bindings for interfaceContext
n@767 58 Interface.prototype.checkAllPlayed = function()
n@767 59 {
n@767 60 hasBeenPlayed = audioEngineContext.checkAllPlayed();
n@767 61 if (hasBeenPlayed.length > 0) // if a fragment has not been played yet
n@767 62 {
n@767 63 str = "";
n@767 64 if (hasBeenPlayed.length > 1) {
n@767 65 for (var i=0; i<hasBeenPlayed.length; i++) {
n@767 66 str = str + hasBeenPlayed[i];
n@767 67 if (i < hasBeenPlayed.length-2){
n@767 68 str += ", ";
n@767 69 } else if (i == hasBeenPlayed.length-2) {
n@767 70 str += " or ";
n@767 71 }
n@767 72 }
n@767 73 alert('You have not played fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 74 } else {
n@767 75 alert('You have not played fragment ' + hasBeenPlayed[0] + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 76 }
n@767 77 return false;
n@767 78 }
n@767 79 return true;
n@767 80 };
n@767 81
n@767 82 Interface.prototype.checkAllMoved = function() {
n@767 83 var audioObjs = audioEngineContext.audioObjects;
n@767 84 var state = true;
n@767 85 var strNums = [];
n@767 86 for (var i=0; i<audioObjs.length; i++)
n@767 87 {
n@767 88 if (audioObjs[i].metric.wasMoved == false && audioObjs[i].specification.type != 'outsidereference') {
n@767 89 state = false;
n@767 90 strNums.push(i);
n@767 91 }
n@767 92 }
n@767 93 if (state == false) {
n@767 94 if (strNums.length > 1) {
n@767 95 var str = "";
n@767 96 for (var i=0; i<strNums.length; i++) {
n@767 97 str = str + strNums[i];
n@767 98 if (i < strNums.length-2){
n@767 99 str += ", ";
n@767 100 } else if (i == strNums.length-2) {
n@767 101 str += " or ";
n@767 102 }
n@767 103 }
n@767 104 alert('You have not moved fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 105 } else {
n@767 106 alert('You have not moved fragment ' + strNums[0] + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 107 }
n@767 108 }
n@767 109 return state;
n@767 110 };
n@767 111
n@767 112 Interface.prototype.checkAllCommented = function() {
n@767 113 var audioObjs = audioEngineContext.audioObjects;
n@767 114 var audioHolder = testState.stateMap[testState.stateIndex];
n@767 115 var state = true;
n@767 116 if (audioHolder.elementComments) {
n@767 117 var strNums = [];
n@767 118 for (var i=0; i<audioObjs.length; i++)
n@767 119 {
n@767 120 if (audioObjs[i].commentDOM.trackCommentBox.value.length == 0) {
n@767 121 state = false;
n@767 122 strNums.push(i);
n@767 123 }
n@767 124 }
n@767 125 if (state == false) {
n@767 126 if (strNums.length > 1) {
n@767 127 var str = "";
n@767 128 for (var i=0; i<strNums.length; i++) {
n@767 129 str = str + strNums[i];
n@767 130 if (i < strNums.length-2){
n@767 131 str += ", ";
n@767 132 } else if (i == strNums.length-2) {
n@767 133 str += " or ";
n@767 134 }
n@767 135 }
n@767 136 alert('You have not commented on fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 137 } else {
n@767 138 alert('You have not commented on fragment ' + strNums[0] + ' yet. Please listen, rate and comment all samples before submitting.');
n@767 139 }
n@767 140 }
n@767 141 }
n@767 142 return state;
n@767 143 };
n@767 144
n@767 145 Interface.prototype.checkScaleRange = function()
n@767 146 {
n@767 147 var audioObjs = audioEngineContext.audioObjects;
n@767 148 var audioHolder = testState.stateMap[testState.stateIndex];
n@767 149 var interfaces = audioHolder.interfaces;
n@776 150 for (var i=0; i<interfaces.length; i++)
n@767 151 {
n@776 152 var minRanking = convSliderPosToRate(audioObjs[0].interfaceDOM.trackSliderObjects[i]);
n@776 153 var maxRanking = minRanking;
n@776 154
n@776 155 var minScale;
n@776 156 var maxScale;
n@776 157 for (var j=0; j<interfaces[i].options.length; j++)
n@776 158 {
n@776 159 if (interfaces[i].options[j].check == "scalerange") {
n@776 160 minScale = interfaces[i].options[j].min;
n@776 161 maxScale = interfaces[i].options[j].max;
n@776 162 break;
n@776 163 }
n@776 164 }
n@776 165 for (var j=1; j<audioObjs.length; j++){
n@776 166 if (audioObjs[j].specification.type != 'outsidereference') {
n@776 167 var ranking = convSliderPosToRate(audioObjs[j].interfaceDOM.trackSliderObjects[i]);
n@776 168 if (ranking < minRanking) { minRanking = ranking;}
n@776 169 if (ranking > maxRanking) { maxRanking = ranking;}
n@776 170 }
n@776 171 }
n@776 172 if (minRanking > minScale || maxRanking < maxScale) {
n@776 173 alert('Please use the full width of the scale');
n@776 174 return false;
n@767 175 }
n@767 176 }
n@776 177 return true;
n@767 178 };
n@767 179
n@767 180 Interface.prototype.objectSelected = null;
n@767 181 Interface.prototype.objectMoved = false;
n@767 182 Interface.prototype.selectObject = function(object)
n@767 183 {
n@767 184 if (this.objectSelected == null)
n@767 185 {
n@767 186 this.objectSelected = object;
n@767 187 this.objectMoved = false;
n@767 188 }
n@767 189 };
n@767 190 Interface.prototype.moveObject = function()
n@767 191 {
n@767 192 if (this.objectMoved == false)
n@767 193 {
n@767 194 this.objectMoved = true;
n@767 195 }
n@767 196 };
n@767 197 Interface.prototype.releaseObject = function()
n@767 198 {
n@767 199 this.objectSelected = null;
n@767 200 this.objectMoved = false;
n@767 201 };
n@767 202 Interface.prototype.getSelectedObject = function()
n@767 203 {
n@767 204 return this.objectSelected;
n@767 205 };
n@767 206 Interface.prototype.hasSelectedObjectMoved = function()
n@767 207 {
n@767 208 return this.objectMoved;
n@767 209 };
n@767 210
n@767 211 // Bindings for audioObjects
n@767 212
n@767 213 // Create the top div for the Title element
n@767 214 var titleAttr = specification.title;
n@767 215 var title = document.createElement('div');
n@767 216 title.className = "title";
n@767 217 title.align = "center";
n@767 218 var titleSpan = document.createElement('span');
n@767 219
n@767 220 // Set title to that defined in XML, else set to default
n@767 221 if (titleAttr != undefined) {
n@767 222 titleSpan.textContent = titleAttr;
n@767 223 } else {
n@767 224 titleSpan.textContent = 'Listening test';
n@767 225 }
n@767 226 // Insert the titleSpan element into the title div element.
n@767 227 title.appendChild(titleSpan);
n@767 228
n@767 229 // Create Interface buttons!
n@767 230 var interfaceButtons = document.createElement('div');
n@767 231 interfaceButtons.id = 'interface-buttons';
n@767 232
n@767 233 // Create playback start/stop points
n@767 234 var playback = document.createElement("button");
n@767 235 playback.innerHTML = 'Stop';
n@767 236 playback.id = 'playback-button';
n@767 237 // onclick function. Check if it is playing or not, call the correct function in the
n@767 238 // audioEngine, change the button text to reflect the next state.
n@767 239 playback.onclick = function() {
n@767 240 if (audioEngineContext.status == 1) {
n@767 241 audioEngineContext.stop();
n@767 242 this.innerHTML = 'Stop';
n@767 243 var time = audioEngineContext.timer.getTestTime();
n@767 244 console.log('Stopped at ' + time); // DEBUG/SAFETY
n@767 245 }
n@767 246 };
n@767 247 // Create Submit (save) button
n@767 248 var submit = document.createElement("button");
n@767 249 submit.innerHTML = 'Submit';
n@767 250 submit.onclick = buttonSubmitClick;
n@767 251 submit.id = 'submit-button';
n@767 252 // Append the interface buttons into the interfaceButtons object.
n@767 253 interfaceButtons.appendChild(playback);
n@767 254 interfaceButtons.appendChild(submit);
n@767 255
n@776 256 var sliderHolder = document.createElement("div");
n@776 257 sliderHolder.id = "slider-holder";
n@767 258
n@767 259
n@767 260 // Global parent for the comment boxes on the page
n@767 261 var feedbackHolder = document.createElement('div');
n@767 262 feedbackHolder.id = 'feedbackHolder';
n@767 263
n@767 264 testContent.style.zIndex = 1;
n@767 265 interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
n@767 266
n@767 267 // Inject into HTML
n@767 268 testContent.appendChild(title); // Insert the title
n@767 269 testContent.appendChild(interfaceButtons);
n@776 270 testContent.appendChild(sliderHolder);
n@767 271 testContent.appendChild(feedbackHolder);
n@767 272 interfaceContext.insertPoint.appendChild(testContent);
n@767 273
n@767 274 // Load the full interface
n@767 275 testState.initialise();
n@767 276 testState.advanceState();
n@767 277
n@767 278 }
n@767 279
n@767 280 function loadTest(audioHolderObject)
n@767 281 {
n@776 282 var width = window.innerWidth;
n@776 283 var height = window.innerHeight;
n@767 284 var id = audioHolderObject.id;
n@767 285
n@767 286 var feedbackHolder = document.getElementById('feedbackHolder');
n@776 287 var sliderHolder = document.getElementById('slider-holder');
n@767 288 feedbackHolder.innerHTML = null;
n@776 289 sliderHolder.innerHTML = null;
n@767 290
n@767 291 var interfaceObj = audioHolderObject.interfaces;
n@767 292 for (var k=0; k<interfaceObj.length; k++) {
n@776 293 // Create the div box to center align
n@776 294 var sliderBox = document.createElement('div');
n@776 295 sliderBox.className = 'sliderCanvasDiv';
n@776 296 sliderBox.id = 'sliderCanvasHolder-'+k;
n@776 297
n@776 298 var pagetitle = document.createElement('div');
n@776 299 pagetitle.className = "pageTitle";
n@776 300 pagetitle.align = "center";
n@776 301 var titleSpan = document.createElement('span');
n@776 302 titleSpan.id = "pageTitle-"+k;
n@776 303 if (interfaceObj[k].title != undefined && typeof interfaceObj[k].title == "string")
n@776 304 {
n@776 305 titleSpan.textContent = interfaceObj[k].title;
n@776 306 }
n@776 307 pagetitle.appendChild(titleSpan);
n@776 308 sliderBox.appendChild(pagetitle);
n@776 309
n@776 310 // Create the slider box to hold the slider elements
n@776 311 var canvas = document.createElement('div');
n@776 312 if (interfaceObj[k].name != undefined)
n@776 313 canvas.id = 'slider-'+name;
n@776 314 else
n@776 315 canvas.id = 'slider-'+k;
n@776 316 canvas.className = 'slider';
n@776 317 canvas.align = "left";
n@776 318 canvas.addEventListener('dragover',function(event){
n@776 319 event.preventDefault();
n@776 320 event.dataTransfer.effectAllowed = 'none';
n@776 321 event.dataTransfer.dropEffect = 'copy';
n@776 322 return false;
n@776 323 },false);
n@776 324 var sliderMargin = document.createAttribute('marginsize');
n@776 325 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
n@776 326 // Must have a known EXACT width, as this is used later to determine the ratings
n@776 327 var w = (Number(sliderMargin.nodeValue)+8)*2;
n@776 328 canvas.style.width = width - w +"px";
n@776 329 canvas.style.marginLeft = sliderMargin.nodeValue +'px';
n@776 330 canvas.setAttributeNode(sliderMargin);
n@776 331 sliderBox.appendChild(canvas);
n@776 332
n@776 333 // Create the div to hold any scale objects
n@776 334 var scale = document.createElement('div');
n@776 335 scale.className = 'sliderScale';
n@776 336 scale.id = 'sliderScaleHolder';
n@776 337 scale.align = 'left';
n@776 338 sliderBox.appendChild(scale);
n@776 339 sliderHolder.appendChild(sliderBox);
n@776 340 var positionScale = canvas.style.width.substr(0,canvas.style.width.length-2);
n@776 341 var offset = Number(canvas.attributes['marginsize'].value);
n@776 342 $(interfaceObj[k].scale).each(function(index,scaleObj){
n@776 343 var value = document.createAttribute('value');
n@776 344 var position = Number(scaleObj[0])*0.01;
n@776 345 value.nodeValue = position;
n@776 346 var pixelPosition = (position*positionScale)+offset;
n@776 347 var scaleDOM = document.createElement('span');
n@776 348 scaleDOM.textContent = scaleObj[1];
n@776 349 scale.appendChild(scaleDOM);
n@776 350 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
n@776 351 scaleDOM.setAttributeNode(value);
n@776 352 });
n@776 353
n@767 354 for (var i=0; i<interfaceObj[k].options.length; i++)
n@767 355 {
n@767 356 if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'playhead')
n@767 357 {
n@767 358 var playbackHolder = document.getElementById('playback-holder');
n@767 359 if (playbackHolder == null)
n@767 360 {
n@767 361 playbackHolder = document.createElement('div');
n@767 362 playbackHolder.style.width = "100%";
n@767 363 playbackHolder.align = 'center';
n@767 364 playbackHolder.appendChild(interfaceContext.playhead.object);
n@767 365 feedbackHolder.appendChild(playbackHolder);
n@767 366 }
n@767 367 } else if (interfaceObj[k].options[i].type == 'option' && interfaceObj[k].options[i].name == 'page-count')
n@767 368 {
n@767 369 var pagecountHolder = document.getElementById('page-count');
n@767 370 if (pagecountHolder == null)
n@767 371 {
n@767 372 pagecountHolder = document.createElement('div');
n@767 373 pagecountHolder.id = 'page-count';
n@767 374 }
n@767 375 pagecountHolder.innerHTML = '<span>Test '+(audioHolderObject.presentedId+1)+' of '+specification.audioHolders.length+'</span>';
n@767 376 var inject = document.getElementById('interface-buttons');
n@767 377 inject.appendChild(pagecountHolder);
n@767 378 }
n@767 379 }
n@767 380 }
n@767 381
n@767 382 var commentBoxPrefix = "Comment on track";
n@767 383
n@767 384 var commentShow = audioHolderObject.elementComments;
n@767 385
n@767 386 var loopPlayback = audioHolderObject.loop;
n@767 387
n@767 388 currentTestHolder = document.createElement('audioHolder');
n@767 389 currentTestHolder.id = audioHolderObject.id;
n@767 390 currentTestHolder.repeatCount = audioHolderObject.repeatCount;
n@767 391
n@767 392 // Find all the audioElements from the audioHolder
n@767 393 $(audioHolderObject.audioElements).each(function(index,element){
n@767 394 // Find URL of track
n@767 395 // In this jQuery loop, variable 'this' holds the current audioElement.
n@767 396
n@767 397 // Now load each audio sample. First create the new track by passing the full URL
n@767 398 var trackURL = audioHolderObject.hostURL + element.url;
n@767 399 var audioObject = audioEngineContext.newTrack(element);
n@767 400
n@767 401 var node = interfaceContext.createCommentBox(audioObject);
n@767 402
n@767 403 // Create a slider per track
n@776 404 audioObject.interfaceDOM = new sliderObject(audioObject,interfaceObj);
n@773 405 if (audioObject.state == 1)
n@773 406 {
n@773 407 audioObject.interfaceDOM.enable();
n@773 408 }
n@767 409
n@767 410 });
n@767 411
n@767 412 $('.track-slider').mousedown(function(event) {
n@767 413 interfaceContext.selectObject($(this)[0]);
n@767 414 });
n@767 415
n@767 416 $('.track-slider').mousemove(function(event) {
n@767 417 event.preventDefault();
n@767 418 });
n@767 419
n@776 420 $('.slider').mousemove(function(event) {
n@767 421 event.preventDefault();
n@767 422 var obj = interfaceContext.getSelectedObject();
n@767 423 if (obj == null) {return;}
n@767 424 $(obj).css("left",event.clientX + "px");
n@767 425 interfaceContext.moveObject();
n@767 426 });
n@767 427
n@767 428 $(document).mouseup(function(event){
n@767 429 event.preventDefault();
n@767 430 var obj = interfaceContext.getSelectedObject();
n@767 431 if (obj == null) {return;}
n@767 432 if (interfaceContext.hasSelectedObjectMoved() == true)
n@767 433 {
n@767 434 var l = $(obj).css("left");
n@767 435 var id = obj.getAttribute('trackIndex');
n@767 436 var time = audioEngineContext.timer.getTestTime();
n@767 437 var rate = convSliderPosToRate(obj);
n@767 438 audioEngineContext.audioObjects[id].metric.moved(time,rate);
n@767 439 console.log("slider "+id+" moved to "+rate+' ('+time+')');
n@767 440 } else {
n@767 441 var id = Number(obj.attributes['trackIndex'].value);
n@767 442 //audioEngineContext.metric.sliderPlayed(id);
n@767 443 audioEngineContext.play(id);
n@767 444 // Currently playing track red, rest green
n@767 445
n@776 446
n@767 447 $('.track-slider').removeClass('track-slider-playing');
n@776 448 var name = ".track-slider-"+obj.getAttribute("trackindex");
n@776 449 $(name).addClass('track-slider-playing');
n@767 450 $('.comment-div').removeClass('comment-box-playing');
n@767 451 $('#comment-div-'+id).addClass('comment-box-playing');
n@767 452 var outsideReference = document.getElementById('outside-reference');
n@767 453 if (outsideReference != undefined)
n@767 454 $(outsideReference).removeClass('track-slider-playing');
n@767 455 }
n@767 456 interfaceContext.releaseObject();
n@767 457 });
n@767 458
n@767 459
n@767 460 if (commentShow) {
n@767 461 interfaceContext.showCommentBoxes(feedbackHolder,true);
n@767 462 }
n@767 463
n@767 464 $(audioHolderObject.commentQuestions).each(function(index,element) {
n@767 465 var node = interfaceContext.createCommentQuestion(element);
n@767 466 feedbackHolder.appendChild(node.holder);
n@767 467 });
n@767 468
n@767 469 // Construct outside reference;
n@767 470 if (audioHolderObject.outsideReference != null) {
n@767 471 var outsideReferenceHolder = document.createElement('div');
n@767 472 outsideReferenceHolder.id = 'outside-reference';
n@767 473 outsideReferenceHolderspan = document.createElement('span');
n@767 474 outsideReferenceHolderspan.textContent = 'Reference';
n@767 475 outsideReferenceHolder.appendChild(outsideReferenceHolderspan);
n@767 476
n@767 477 var audioObject = audioEngineContext.newTrack(audioHolderObject.outsideReference);
n@767 478
n@767 479 outsideReferenceHolder.onclick = function(event)
n@767 480 {
n@767 481 audioEngineContext.play(audioEngineContext.audioObjects.length-1);
n@767 482 $('.track-slider').removeClass('track-slider-playing');
n@767 483 $('.comment-div').removeClass('comment-box-playing');
n@767 484 if (event.currentTarget.nodeName == 'DIV') {
n@767 485 $(event.currentTarget).addClass('track-slider-playing');
n@767 486 } else {
n@767 487 $(event.currentTarget.parentElement).addClass('track-slider-playing');
n@767 488 }
n@767 489 };
n@767 490
n@767 491 document.getElementById('interface-buttons').appendChild(outsideReferenceHolder);
n@767 492 }
n@767 493
n@767 494
n@767 495 //testWaitIndicator();
n@767 496 }
n@767 497
n@776 498 function sliderObject(audioObject,interfaceObjects) {
n@767 499 // Create a new slider object;
n@767 500 this.parent = audioObject;
n@776 501 this.trackSliderObjects = [];
n@776 502 for (var i=0; i<interfaceObjects.length; i++)
n@776 503 {
n@776 504 var trackObj = document.createElement('div');
n@776 505 trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id;
n@776 506 trackObj.id = 'track-slider-'+i+'-'+audioObject.id;
n@776 507 trackObj.setAttribute('trackIndex',audioObject.id);
n@776 508 trackObj.innerHTML = '<span>'+audioObject.id+'</span>';
n@776 509 if (interfaceObjects[i].name != undefined) {
n@776 510 trackObj.setAttribute('interface-name',interfaceObjects[i].name);
n@776 511 } else {
n@776 512 trackObj.setAttribute('interface-name',i);
n@776 513 }
n@776 514 this.trackSliderObjects.push(trackObj);
n@776 515 var slider = document.getElementById("slider-"+trackObj.getAttribute("interface-name"));
n@776 516 var offset = Number(slider.attributes['marginsize'].value);
n@776 517 // Distribute it randomnly
n@776 518 var w = window.innerWidth - (offset+8)*2;
n@776 519 w = Math.random()*w;
n@776 520 w = Math.floor(w+(offset+8));
n@776 521 trackObj.style.left = w+'px';
n@776 522 slider.appendChild(trackObj);
n@776 523 }
n@767 524
n@767 525 // Onclick, switch playback to that track
n@767 526
n@767 527 this.enable = function() {
n@767 528 if (this.parent.state == 1)
n@767 529 {
n@776 530 $(this.trackSliderObjects).each(function(i,trackObj){
n@776 531 $(trackObj).removeClass('track-slider-disabled');
n@776 532 });
n@767 533 }
n@767 534 };
n@767 535
n@767 536 this.exportXMLDOM = function(audioObject) {
n@767 537 // Called by the audioObject holding this element. Must be present
n@776 538 var obj = [];
n@776 539 $(this.trackSliderObjects).each(function(i,trackObj){
n@776 540 var node = document.createElement('value');
n@776 541 node.setAttribute("name",trackObj.getAttribute("interface-name"));
n@776 542 node.textContent = convSliderPosToRate(trackObj);
n@776 543 obj.push(node);
n@776 544 });
n@776 545
n@776 546 return obj;
n@767 547 };
n@767 548 this.getValue = function() {
n@767 549 return convSliderPosToRate(this.trackSliderObj);
n@767 550 };
n@767 551 }
n@767 552
n@767 553 function buttonSubmitClick()
n@767 554 {
n@767 555 var checks = testState.currentStateMap[testState.currentIndex].interfaces[0].options;
n@767 556 var canContinue = true;
n@767 557
n@767 558 // Check that the anchor and reference objects are correctly placed
n@767 559 if (interfaceContext.checkHiddenAnchor() == false) {return;}
n@767 560 if (interfaceContext.checkHiddenReference() == false) {return;}
n@767 561
n@767 562 for (var i=0; i<checks.length; i++) {
n@767 563 if (checks[i].type == 'check')
n@767 564 {
n@767 565 switch(checks[i].check) {
n@767 566 case 'fragmentPlayed':
n@767 567 // Check if all fragments have been played
n@767 568 var checkState = interfaceContext.checkAllPlayed();
n@767 569 if (checkState == false) {canContinue = false;}
n@767 570 break;
n@767 571 case 'fragmentFullPlayback':
n@767 572 // Check all fragments have been played to their full length
n@767 573 var checkState = interfaceContext.checkFragmentsFullyPlayed();
n@767 574 if (checkState == false) {canContinue = false;}
n@767 575 break;
n@767 576 case 'fragmentMoved':
n@767 577 // Check all fragment sliders have been moved.
n@767 578 var checkState = interfaceContext.checkAllMoved();
n@767 579 if (checkState == false) {canContinue = false;}
n@767 580 break;
n@767 581 case 'fragmentComments':
n@767 582 // Check all fragment sliders have been moved.
n@767 583 var checkState = interfaceContext.checkAllCommented();
n@767 584 if (checkState == false) {canContinue = false;}
n@767 585 break;
n@767 586 case 'scalerange':
n@767 587 // Check the scale is used to its full width outlined by the node
n@767 588 var checkState = interfaceContext.checkScaleRange();
n@767 589 if (checkState == false) {canContinue = false;}
n@767 590 break;
n@767 591 }
n@767 592
n@767 593 }
n@767 594 if (!canContinue) {break;}
n@767 595 }
n@767 596
n@767 597 if (canContinue) {
n@767 598 if (audioEngineContext.status == 1) {
n@767 599 var playback = document.getElementById('playback-button');
n@767 600 playback.click();
n@767 601 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options
n@767 602 } else
n@767 603 {
n@767 604 if (audioEngineContext.timer.testStarted == false)
n@767 605 {
n@767 606 alert('You have not started the test! Please click a fragment to begin the test!');
n@767 607 return;
n@767 608 }
n@767 609 }
n@767 610 testState.advanceState();
n@767 611 }
n@767 612 }
n@767 613
n@776 614 function convSliderPosToRate(trackSlider)
n@767 615 {
n@776 616 var slider = trackSlider.parentElement;
n@776 617 var w = slider.style.width;
n@776 618 var marginsize = Number(slider.attributes['marginsize'].value);
n@767 619 var maxPix = w.substr(0,w.length-2);
n@776 620 var pix = trackSlider.style.left;
n@767 621 pix = pix.substr(0,pix.length-2);
n@767 622 var rate = (pix-marginsize)/maxPix;
n@767 623 return rate;
n@767 624 }
n@767 625
n@767 626 function resizeWindow(event){
n@767 627 // Function called when the window has been resized.
n@767 628 // MANDATORY FUNCTION
n@767 629
n@767 630 // Store the slider marker values
n@767 631 var holdValues = [];
n@767 632 $(".track-slider").each(function(index,sliderObj){
n@767 633 holdValues.push(convSliderPosToRate(sliderObj));
n@767 634 });
n@767 635
n@767 636 var width = event.target.innerWidth;
n@767 637 var canvas = document.getElementById('sliderCanvasHolder');
n@767 638 var sliderDiv = canvas.children[0];
n@767 639 var sliderScaleDiv = canvas.children[1];
n@767 640 var marginsize = Number(sliderDiv.attributes['marginsize'].value);
n@767 641 var w = (marginsize+8)*2;
n@767 642 sliderDiv.style.width = width - w + 'px';
n@767 643 var width = width - w;
n@767 644 // Move sliders into new position
n@767 645 $(".track-slider").each(function(index,sliderObj){
n@767 646 var pos = holdValues[index];
n@767 647 var pix = pos * width;
n@767 648 sliderObj.style.left = pix+marginsize+'px';
n@767 649 });
n@767 650
n@767 651 // Move scale labels
n@767 652 $(sliderScaleDiv.children).each(function(index,scaleObj){
n@767 653 var position = Number(scaleObj.attributes['value'].value);
n@767 654 var pixelPosition = (position*width)+marginsize;
n@767 655 scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
n@767 656 });
n@767 657 }
n@767 658
n@767 659 function pageXMLSave(store, testXML)
n@767 660 {
n@775 661 // MANDATORY
n@767 662 // Saves a specific test page
n@775 663 // You can use this space to add any extra nodes to your XML saves
n@767 664 }