annotate interfaces/ape.js @ 22:1f375b7d75fd tip

updated warning for breaks during test
author Giulio Moro <giuliomoro@yahoo.it>
date Fri, 13 May 2016 19:01:08 +0100
parents d2eb0e6ccaaf
children
rev   line source
giuliomoro@0 1 /**
giuliomoro@0 2 * ape.js
giuliomoro@0 3 * Create the APE interface
giuliomoro@0 4 */
giuliomoro@0 5
giuliomoro@0 6
giuliomoro@0 7 // Once this is loaded and parsed, begin execution
giuliomoro@0 8 loadInterface();
giuliomoro@0 9
giuliomoro@0 10 function loadInterface() {
giuliomoro@0 11
giuliomoro@0 12 // Get the dimensions of the screen available to the page
giuliomoro@0 13 var width = window.innerWidth;
giuliomoro@0 14 var height = window.innerHeight;
giuliomoro@0 15
giuliomoro@0 16 // The injection point into the HTML page
giuliomoro@0 17 interfaceContext.insertPoint = document.getElementById("topLevelBody");
giuliomoro@0 18 var testContent = document.createElement('div');
giuliomoro@0 19
giuliomoro@0 20 testContent.id = 'testContent';
giuliomoro@0 21
giuliomoro@0 22 // Bindings for interfaceContext
giuliomoro@0 23 interfaceContext.checkAllPlayed = function()
giuliomoro@0 24 {
giuliomoro@0 25 hasBeenPlayed = audioEngineContext.checkAllPlayed();
giuliomoro@0 26 if (hasBeenPlayed.length > 0) // if a fragment has not been played yet
giuliomoro@0 27 {
giuliomoro@0 28 str = "";
giuliomoro@0 29 if (hasBeenPlayed.length > 1) {
giuliomoro@0 30 for (var i=0; i<hasBeenPlayed.length; i++) {
giuliomoro@0 31 str = str + hasBeenPlayed[i];
giuliomoro@0 32 if (i < hasBeenPlayed.length-2){
giuliomoro@0 33 str += ", ";
giuliomoro@0 34 } else if (i == hasBeenPlayed.length-2) {
giuliomoro@0 35 str += " or ";
giuliomoro@0 36 }
giuliomoro@0 37 }
giuliomoro@0 38 alert('You have not played fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
giuliomoro@0 39 } else {
giuliomoro@0 40 alert('You have not played fragment ' + hasBeenPlayed[0] + ' yet. Please listen, rate and comment all samples before submitting.');
giuliomoro@0 41 }
giuliomoro@0 42 return false;
giuliomoro@0 43 }
giuliomoro@0 44 return true;
giuliomoro@0 45 };
giuliomoro@0 46
giuliomoro@0 47 interfaceContext.checkAllMoved = function() {
giuliomoro@0 48 var state = true;
giuliomoro@0 49 var str = 'You have not moved the following sliders. ';
giuliomoro@0 50 for (var i=0; i<this.interfaceSliders.length; i++)
giuliomoro@0 51 {
giuliomoro@0 52 var interfaceTID = [];
giuliomoro@0 53 for (var j=0; j<this.interfaceSliders[i].metrics.length; j++)
giuliomoro@0 54 {
giuliomoro@0 55 if (this.interfaceSliders[i].metrics[j].wasMoved == false)
giuliomoro@0 56 {
giuliomoro@0 57 state = false;
giuliomoro@0 58 interfaceTID.push(j);
giuliomoro@0 59 }
giuliomoro@0 60 }
giuliomoro@0 61 if (interfaceTID.length != 0)
giuliomoro@0 62 {
giuliomoro@0 63 var interfaceName = this.interfaceSliders[i].interfaceObject.title;
giuliomoro@0 64 if (interfaceName == undefined) {
giuliomoro@0 65 str += 'On axis '+String(i+1)+' you must move ';
giuliomoro@0 66 } else {
giuliomoro@0 67 str += 'On axis "'+interfaceName+'" you must move ';
giuliomoro@0 68 }
giuliomoro@0 69 if (interfaceTID.length == 1)
giuliomoro@0 70 {
giuliomoro@0 71 str += 'slider '+interfaceTID[0]+'. ';
giuliomoro@0 72 }
giuliomoro@0 73 else {
giuliomoro@0 74 str += 'sliders ';
giuliomoro@0 75 for (var k=0; k<interfaceTID.length-1; k++)
giuliomoro@0 76 {
giuliomoro@0 77 str += interfaceTID[k]+', ';
giuliomoro@0 78 }
giuliomoro@0 79 str += interfaceTID[interfaceTID.length-1] +'. ';
giuliomoro@0 80 }
giuliomoro@0 81 }
giuliomoro@0 82 }
giuliomoro@0 83 if (state != true)
giuliomoro@0 84 {
giuliomoro@0 85 alert(str);
giuliomoro@0 86 console.log(str);
giuliomoro@0 87 }
giuliomoro@0 88 return state;
giuliomoro@0 89 };
giuliomoro@0 90
giuliomoro@0 91 Interface.prototype.checkAllCommented = function() {
giuliomoro@0 92 var audioObjs = audioEngineContext.audioObjects;
giuliomoro@0 93 var audioHolder = testState.stateMap[testState.stateIndex];
giuliomoro@0 94 var state = true;
giuliomoro@0 95 if (audioHolder.elementComments) {
giuliomoro@0 96 var strNums = [];
giuliomoro@0 97 for (var i=0; i<audioObjs.length; i++)
giuliomoro@0 98 {
giuliomoro@0 99 if (audioObjs[i].commentDOM.trackCommentBox.value.length == 0) {
giuliomoro@0 100 state = false;
giuliomoro@0 101 strNums.push(i);
giuliomoro@0 102 }
giuliomoro@0 103 }
giuliomoro@0 104 if (state == false) {
giuliomoro@0 105 if (strNums.length > 1) {
giuliomoro@0 106 var str = "";
giuliomoro@0 107 for (var i=0; i<strNums.length; i++) {
giuliomoro@0 108 str = str + strNums[i];
giuliomoro@0 109 if (i < strNums.length-2){
giuliomoro@0 110 str += ", ";
giuliomoro@0 111 } else if (i == strNums.length-2) {
giuliomoro@0 112 str += " or ";
giuliomoro@0 113 }
giuliomoro@0 114 }
giuliomoro@0 115 alert('You have not commented on fragments ' + str + ' yet. Please listen, rate and comment all samples before submitting.');
giuliomoro@0 116 } else {
giuliomoro@0 117 alert('You have not commented on fragment ' + strNums[0] + ' yet. Please listen, rate and comment all samples before submitting.');
giuliomoro@0 118 }
giuliomoro@0 119 }
giuliomoro@0 120 }
giuliomoro@0 121 return state;
giuliomoro@0 122 };
giuliomoro@0 123
giuliomoro@0 124 Interface.prototype.checkScaleRange = function()
giuliomoro@0 125 {
giuliomoro@0 126 var audioObjs = audioEngineContext.audioObjects;
giuliomoro@0 127 var audioHolder = testState.stateMap[testState.stateIndex];
giuliomoro@0 128 var state = true;
giuliomoro@0 129 var str = '';
giuliomoro@0 130 for (var i=0; i<this.interfaceSliders.length; i++)
giuliomoro@0 131 {
giuliomoro@0 132 var minScale;
giuliomoro@0 133 var maxScale;
giuliomoro@0 134 var interfaceObject = interfaceContext.interfaceSliders[0].interfaceObject;
giuliomoro@0 135 for (var j=0; j<interfaceObject.options.length; j++)
giuliomoro@0 136 {
giuliomoro@0 137 if (interfaceObject.options[j].check == "scalerange") {
giuliomoro@0 138 minScale = interfaceObject.options[j].min;
giuliomoro@0 139 maxScale = interfaceObject.options[j].max;
giuliomoro@0 140 break;
giuliomoro@0 141 }
giuliomoro@0 142 }
giuliomoro@0 143 var minRanking = convSliderPosToRate(this.interfaceSliders[i].sliders[0]);
giuliomoro@0 144 var maxRanking = minRanking;
giuliomoro@0 145 for (var j=1; j<this.interfaceSliders[i].sliders.length; j++)
giuliomoro@0 146 {
giuliomoro@0 147 var ranking = convSliderPosToRate(this.interfaceSliders[i].sliders[j]);
giuliomoro@0 148 if (ranking < minRanking)
giuliomoro@0 149 {
giuliomoro@0 150 minRanking = ranking;
giuliomoro@0 151 } else if (ranking > maxRanking)
giuliomoro@0 152 {
giuliomoro@0 153 maxRanking = ranking;
giuliomoro@0 154 }
giuliomoro@0 155 }
giuliomoro@0 156 if (minRanking > minScale || maxRanking < maxScale)
giuliomoro@0 157 {
giuliomoro@0 158 state = false;
giuliomoro@0 159 str += 'On axis "'+this.interfaceSliders[i].interfaceObject.title+'" you have not used the full width of the scale. ';
giuliomoro@0 160 }
giuliomoro@0 161 }
giuliomoro@0 162 if (state != true)
giuliomoro@0 163 {
giuliomoro@0 164 alert(str);
giuliomoro@0 165 console.log(str);
giuliomoro@0 166 }
giuliomoro@0 167 return state;
giuliomoro@0 168 };
giuliomoro@0 169
giuliomoro@0 170 Interface.prototype.objectSelected = null;
giuliomoro@0 171 Interface.prototype.objectMoved = false;
giuliomoro@0 172 Interface.prototype.selectObject = function(object)
giuliomoro@0 173 {
giuliomoro@0 174 if (this.objectSelected == null)
giuliomoro@0 175 {
giuliomoro@0 176 this.objectSelected = object;
giuliomoro@0 177 this.objectMoved = false;
giuliomoro@0 178 }
giuliomoro@0 179 };
giuliomoro@0 180 Interface.prototype.moveObject = function()
giuliomoro@0 181 {
giuliomoro@0 182 if (this.objectMoved == false)
giuliomoro@0 183 {
giuliomoro@0 184 this.objectMoved = true;
giuliomoro@0 185 }
giuliomoro@0 186 };
giuliomoro@0 187 Interface.prototype.releaseObject = function()
giuliomoro@0 188 {
giuliomoro@0 189 this.objectSelected = null;
giuliomoro@0 190 this.objectMoved = false;
giuliomoro@0 191 };
giuliomoro@0 192 Interface.prototype.getSelectedObject = function()
giuliomoro@0 193 {
giuliomoro@0 194 return this.objectSelected;
giuliomoro@0 195 };
giuliomoro@0 196 Interface.prototype.hasSelectedObjectMoved = function()
giuliomoro@0 197 {
giuliomoro@0 198 return this.objectMoved;
giuliomoro@0 199 };
giuliomoro@0 200
giuliomoro@0 201 // Bindings for slider interfaces
giuliomoro@0 202 Interface.prototype.interfaceSliders = [];
giuliomoro@0 203
giuliomoro@0 204 // Bindings for audioObjects
giuliomoro@0 205
giuliomoro@0 206 // Create the top div for the Title element
giuliomoro@0 207 var titleAttr = specification.title;
giuliomoro@0 208 var title = document.createElement('div');
giuliomoro@0 209 title.className = "title";
giuliomoro@0 210 title.align = "center";
giuliomoro@0 211 var titleSpan = document.createElement('span');
giuliomoro@0 212
giuliomoro@0 213 // Set title to that defined in XML, else set to default
giuliomoro@0 214 if (titleAttr != undefined) {
giuliomoro@0 215 titleSpan.textContent = titleAttr;
giuliomoro@0 216 } else {
giuliomoro@0 217 titleSpan.textContent = 'Listening test';
giuliomoro@0 218 }
giuliomoro@0 219 // Insert the titleSpan element into the title div element.
giuliomoro@0 220 title.appendChild(titleSpan);
giuliomoro@0 221
giuliomoro@0 222 // Create Interface buttons!
giuliomoro@0 223 var interfaceButtons = document.createElement('div');
giuliomoro@0 224 interfaceButtons.id = 'interface-buttons';
giuliomoro@0 225
giuliomoro@0 226 // Create playback start/stop points
giuliomoro@0 227 var playback = document.createElement("button");
giuliomoro@0 228 playback.innerHTML = 'Stop';
giuliomoro@0 229 playback.id = 'playback-button';
giuliomoro@0 230 // onclick function. Check if it is playing or not, call the correct function in the
giuliomoro@0 231 // audioEngine, change the button text to reflect the next state.
giuliomoro@0 232 playback.onclick = function() {
giuliomoro@0 233 if (audioEngineContext.status == 1) {
giuliomoro@0 234 audioEngineContext.stop();
giuliomoro@0 235 this.innerHTML = 'Stop';
giuliomoro@0 236 var time = audioEngineContext.timer.getTestTime();
giuliomoro@0 237 console.log('Stopped at ' + time); // DEBUG/SAFETY
giuliomoro@0 238 }
giuliomoro@0 239 };
giuliomoro@0 240 // Create Submit (save) button
giuliomoro@0 241 var submit = document.createElement("button");
giuliomoro@0 242 submit.innerHTML = 'Next';
giuliomoro@0 243 submit.onclick = buttonSubmitClick;
giuliomoro@0 244 submit.id = 'submit-button';
giuliomoro@0 245 // Append the interface buttons into the interfaceButtons object.
giuliomoro@0 246 interfaceButtons.appendChild(playback);
giuliomoro@0 247 interfaceButtons.appendChild(submit);
giuliomoro@0 248
giuliomoro@0 249 var sliderHolder = document.createElement("div");
giuliomoro@0 250 sliderHolder.id = "slider-holder";
giuliomoro@0 251
giuliomoro@0 252
giuliomoro@0 253 // Global parent for the comment boxes on the page
giuliomoro@0 254 var feedbackHolder = document.createElement('div');
giuliomoro@0 255 feedbackHolder.id = 'feedbackHolder';
giuliomoro@0 256
giuliomoro@0 257 testContent.style.zIndex = 1;
giuliomoro@0 258 interfaceContext.insertPoint.innerHTML = null; // Clear the current schema
giuliomoro@0 259
giuliomoro@0 260 // Inject into HTML
giuliomoro@0 261 testContent.appendChild(title); // Insert the title
giuliomoro@0 262 testContent.appendChild(interfaceButtons);
giuliomoro@0 263 testContent.appendChild(sliderHolder);
giuliomoro@0 264 testContent.appendChild(feedbackHolder);
giuliomoro@0 265 interfaceContext.insertPoint.appendChild(testContent);
giuliomoro@0 266
giuliomoro@0 267 // Load the full interface
giuliomoro@0 268 testState.initialise();
giuliomoro@0 269 testState.advanceState();
giuliomoro@0 270
giuliomoro@0 271 }
giuliomoro@0 272
giuliomoro@0 273 function loadTest(audioHolderObject)
giuliomoro@0 274 {
giuliomoro@0 275 var width = window.innerWidth;
giuliomoro@0 276 var height = window.innerHeight;
giuliomoro@0 277 var id = audioHolderObject.id;
giuliomoro@0 278
giuliomoro@0 279 interfaceContext.interfaceSliders = [];
giuliomoro@0 280
giuliomoro@0 281 var feedbackHolder = document.getElementById('feedbackHolder');
giuliomoro@0 282 var sliderHolder = document.getElementById('slider-holder');
giuliomoro@0 283 feedbackHolder.innerHTML = null;
giuliomoro@0 284 sliderHolder.innerHTML = null;
giuliomoro@0 285
giuliomoro@0 286 // Delete outside reference
giuliomoro@0 287 var outsideReferenceHolder = document.getElementById('outside-reference');
giuliomoro@0 288 if (outsideReferenceHolder != null) {
giuliomoro@0 289 document.getElementById('interface-buttons').removeChild(outsideReferenceHolder);
giuliomoro@0 290 }
giuliomoro@0 291
giuliomoro@0 292 var interfaceObj = audioHolderObject.interfaces;
giuliomoro@0 293 for (var k=0; k<interfaceObj.length; k++) {
giuliomoro@0 294 // Create the div box to center align
giuliomoro@0 295 interfaceContext.interfaceSliders.push(new interfaceSliderHolder(interfaceObj[k]));
giuliomoro@0 296 }
giuliomoro@0 297
giuliomoro@0 298 var interfaceList = audioHolderObject.interfaces.concat(specification.interfaces);
giuliomoro@0 299 for (var k=0; k<interfaceList.length; k++)
giuliomoro@0 300 {
giuliomoro@0 301 for (var i=0; i<interfaceList[k].options.length; i++)
giuliomoro@0 302 {
giuliomoro@0 303 if (interfaceList[k].options[i].type == 'show' && interfaceList[k].options[i].name == 'playhead')
giuliomoro@0 304 {
giuliomoro@0 305 var playbackHolder = document.getElementById('playback-holder');
giuliomoro@0 306 if (playbackHolder == null)
giuliomoro@0 307 {
giuliomoro@0 308 playbackHolder = document.createElement('div');
giuliomoro@0 309 playbackHolder.style.width = "100%";
giuliomoro@0 310 playbackHolder.align = 'center';
giuliomoro@0 311 playbackHolder.appendChild(interfaceContext.playhead.object);
giuliomoro@0 312 feedbackHolder.appendChild(playbackHolder);
giuliomoro@0 313 }
giuliomoro@0 314 } else if (interfaceList[k].options[i].type == 'show' && interfaceList[k].options[i].name == 'page-count')
giuliomoro@0 315 {
giuliomoro@0 316 var pagecountHolder = document.getElementById('page-count');
giuliomoro@0 317 if (pagecountHolder == null)
giuliomoro@0 318 {
giuliomoro@0 319 pagecountHolder = document.createElement('div');
giuliomoro@0 320 pagecountHolder.id = 'page-count';
giuliomoro@0 321 }
giuliomoro@0 322 pagecountHolder.innerHTML = '<span>Page '+(testState.stateIndex+1)+' of '+testState.stateMap.length+'</span>';
giuliomoro@0 323 var inject = document.getElementById('interface-buttons');
giuliomoro@0 324 inject.appendChild(pagecountHolder);
giuliomoro@0 325 } else if (interfaceList[k].options[i].type == 'show' && interfaceList[k].options[i].name == 'volume') {
giuliomoro@0 326 if (document.getElementById('master-volume-holder') == null)
giuliomoro@0 327 {
giuliomoro@0 328 feedbackHolder.appendChild(interfaceContext.volume.object);
giuliomoro@0 329 }
giuliomoro@0 330 }
giuliomoro@0 331 }
giuliomoro@0 332 }
giuliomoro@0 333
giuliomoro@0 334 var commentBoxPrefix = "Comment on fragment";
giuliomoro@0 335
giuliomoro@0 336 var commentShow = audioHolderObject.elementComments;
giuliomoro@0 337
giuliomoro@0 338 var loopPlayback = audioHolderObject.loop;
giuliomoro@0 339
giuliomoro@0 340 currentTestHolder = document.createElement('audioHolder');
giuliomoro@0 341 currentTestHolder.id = audioHolderObject.id;
giuliomoro@0 342 currentTestHolder.repeatCount = audioHolderObject.repeatCount;
giuliomoro@0 343
giuliomoro@0 344 // Find all the audioElements from the audioHolder
giuliomoro@0 345 $(audioHolderObject.audioElements).each(function(index,element){
giuliomoro@0 346 // Find URL of track
giuliomoro@0 347 // In this jQuery loop, variable 'this' holds the current audioElement.
giuliomoro@0 348 var audioObject = audioEngineContext.newTrack(element);
giuliomoro@0 349 // Check if an outside reference
giuliomoro@0 350 if (element.type == 'outside-reference')
giuliomoro@0 351 {
giuliomoro@0 352 // Construct outside reference;
giuliomoro@0 353 var orNode = new outsideReferenceDOM(audioObject,index,document.getElementById('interface-buttons'));
giuliomoro@0 354 audioObject.bindInterface(orNode);
giuliomoro@0 355 } else {
giuliomoro@0 356 // Create a slider per track
giuliomoro@0 357 var sliderNode = new sliderObject(audioObject,interfaceObj);
giuliomoro@0 358 audioObject.bindInterface(sliderNode);
giuliomoro@0 359 interfaceContext.commentBoxes.createCommentBox(audioObject);
giuliomoro@0 360 }
giuliomoro@0 361 });
giuliomoro@0 362
giuliomoro@0 363 // Initialse the interfaceSlider object metrics
giuliomoro@0 364
giuliomoro@0 365 $('.track-slider').mousedown(function(event) {
giuliomoro@0 366 interfaceContext.selectObject($(this)[0]);
giuliomoro@0 367 });
giuliomoro@0 368 $('.track-slider').on('touchstart',null,function(event) {
giuliomoro@0 369 interfaceContext.selectObject($(this)[0]);
giuliomoro@0 370 });
giuliomoro@0 371
giuliomoro@0 372 $('.track-slider').mousemove(function(event) {
giuliomoro@0 373 event.preventDefault();
giuliomoro@0 374 });
giuliomoro@0 375
giuliomoro@0 376 $('.slider').mousemove(function(event) {
giuliomoro@0 377 event.preventDefault();
giuliomoro@0 378 var obj = interfaceContext.getSelectedObject();
giuliomoro@0 379 if (obj == null) {return;}
giuliomoro@0 380 $(obj).css("left",event.clientX-6 + "px");
giuliomoro@0 381 interfaceContext.moveObject();
giuliomoro@0 382 });
giuliomoro@0 383
giuliomoro@0 384 $('.slider').on('touchmove',null,function(event) {
giuliomoro@0 385 event.preventDefault();
giuliomoro@0 386 var obj = interfaceContext.getSelectedObject();
giuliomoro@0 387 if (obj == null) {return;}
giuliomoro@0 388 var move = event.originalEvent.targetTouches[0].clientX - 6;
giuliomoro@0 389 $(obj).css("left",move + "px");
giuliomoro@0 390 interfaceContext.moveObject();
giuliomoro@0 391 });
giuliomoro@0 392
giuliomoro@0 393 $(document).mouseup(function(event){
giuliomoro@0 394 event.preventDefault();
giuliomoro@0 395 var obj = interfaceContext.getSelectedObject();
giuliomoro@0 396 if (obj == null) {return;}
giuliomoro@0 397 var interfaceID = obj.parentElement.getAttribute("interfaceid");
giuliomoro@0 398 var trackID = obj.getAttribute("trackindex");
giuliomoro@0 399 if (interfaceContext.hasSelectedObjectMoved() == true)
giuliomoro@0 400 {
giuliomoro@0 401 var l = $(obj).css("left");
giuliomoro@0 402 var id = obj.getAttribute('trackIndex');
giuliomoro@0 403 var time = audioEngineContext.timer.getTestTime();
giuliomoro@0 404 var rate = convSliderPosToRate(obj);
giuliomoro@0 405 audioEngineContext.audioObjects[id].metric.moved(time,rate);
giuliomoro@0 406 interfaceContext.interfaceSliders[interfaceID].metrics[trackID].moved(time,rate);
giuliomoro@0 407 console.log("slider "+id+" moved to "+rate+' ('+time+')');
giuliomoro@0 408 } else {
giuliomoro@0 409 var id = Number(obj.attributes['trackIndex'].value);
giuliomoro@0 410 //audioEngineContext.metric.sliderPlayed(id);
giuliomoro@0 411 audioEngineContext.play(id);
giuliomoro@0 412 }
giuliomoro@0 413 interfaceContext.releaseObject();
giuliomoro@0 414 });
giuliomoro@0 415
giuliomoro@0 416 $('.slider').on('touchend',null,function(event){
giuliomoro@0 417 var obj = interfaceContext.getSelectedObject();
giuliomoro@0 418 if (obj == null) {return;}
giuliomoro@0 419 var interfaceID = obj.parentElement.getAttribute("interfaceid");
giuliomoro@0 420 var trackID = obj.getAttribute("trackindex");
giuliomoro@0 421 if (interfaceContext.hasSelectedObjectMoved() == true)
giuliomoro@0 422 {
giuliomoro@0 423 var l = $(obj).css("left");
giuliomoro@0 424 var id = obj.getAttribute('trackIndex');
giuliomoro@0 425 var time = audioEngineContext.timer.getTestTime();
giuliomoro@0 426 var rate = convSliderPosToRate(obj);
giuliomoro@0 427 audioEngineContext.audioObjects[id].metric.moved(time,rate);
giuliomoro@0 428 interfaceContext.interfaceSliders[interfaceID].metrics[trackID].moved(time,rate);
giuliomoro@0 429 console.log("slider "+id+" moved to "+rate+' ('+time+')');
giuliomoro@0 430 }
giuliomoro@0 431 interfaceContext.releaseObject();
giuliomoro@0 432 });
giuliomoro@0 433
giuliomoro@0 434
giuliomoro@0 435 if (audioHolderObject.showElementComments) {
giuliomoro@0 436 interfaceContext.commentBoxes.showCommentBoxes(feedbackHolder,true);
giuliomoro@0 437 }
giuliomoro@0 438
giuliomoro@0 439 $(audioHolderObject.commentQuestions).each(function(index,element) {
giuliomoro@0 440 var node = interfaceContext.createCommentQuestion(element);
giuliomoro@0 441 feedbackHolder.appendChild(node.holder);
giuliomoro@0 442 });
giuliomoro@0 443
giuliomoro@0 444
giuliomoro@0 445 //testWaitIndicator();
giuliomoro@0 446 }
giuliomoro@0 447
giuliomoro@0 448 function interfaceSliderHolder(interfaceObject)
giuliomoro@0 449 {
giuliomoro@0 450 this.sliders = [];
giuliomoro@0 451 this.metrics = [];
giuliomoro@0 452 this.id = document.getElementsByClassName("sliderCanvasDiv").length;
giuliomoro@0 453 this.name = interfaceObject.name;
giuliomoro@0 454 this.interfaceObject = interfaceObject;
giuliomoro@0 455 this.sliderDOM = document.createElement('div');
giuliomoro@0 456 this.sliderDOM.className = 'sliderCanvasDiv';
giuliomoro@0 457 this.sliderDOM.id = 'sliderCanvasHolder-'+this.id;
giuliomoro@0 458
giuliomoro@0 459 var pagetitle = document.createElement('div');
giuliomoro@0 460 pagetitle.className = "pageTitle";
giuliomoro@0 461 pagetitle.align = "center";
giuliomoro@0 462 var titleSpan = document.createElement('span');
giuliomoro@0 463 titleSpan.id = "pageTitle-"+this.id;
giuliomoro@0 464 if (interfaceObject.title != undefined && typeof interfaceObject.title == "string")
giuliomoro@0 465 {
giuliomoro@0 466 titleSpan.textContent = interfaceObject.title;
giuliomoro@0 467 } else {
giuliomoro@0 468 titleSpan.textContent = "Axis "+String(this.id+1);
giuliomoro@0 469 }
giuliomoro@0 470 pagetitle.appendChild(titleSpan);
giuliomoro@0 471 this.sliderDOM.appendChild(pagetitle);
giuliomoro@0 472
giuliomoro@0 473 // Create the slider box to hold the slider elements
giuliomoro@0 474 this.canvas = document.createElement('div');
giuliomoro@0 475 if (this.name != undefined)
giuliomoro@0 476 this.canvas.id = 'slider-'+this.name;
giuliomoro@0 477 else
giuliomoro@0 478 this.canvas.id = 'slider-'+this.id;
giuliomoro@0 479 this.canvas.setAttribute("interfaceid",this.id);
giuliomoro@0 480 this.canvas.className = 'slider';
giuliomoro@0 481 this.canvas.align = "left";
giuliomoro@0 482 this.canvas.addEventListener('dragover',function(event){
giuliomoro@0 483 event.preventDefault();
giuliomoro@0 484 event.dataTransfer.effectAllowed = 'none';
giuliomoro@0 485 event.dataTransfer.dropEffect = 'copy';
giuliomoro@0 486 return false;
giuliomoro@0 487 },false);
giuliomoro@0 488 var sliderMargin = document.createAttribute('marginsize');
giuliomoro@0 489 sliderMargin.nodeValue = 42; // Set default margins to 42px either side
giuliomoro@0 490 // Must have a known EXACT width, as this is used later to determine the ratings
giuliomoro@0 491 var w = (Number(sliderMargin.nodeValue)+8)*2;
giuliomoro@0 492 this.canvas.style.width = window.innerWidth - w +"px";
giuliomoro@0 493 this.canvas.style.marginLeft = sliderMargin.nodeValue +'px';
giuliomoro@0 494 this.canvas.setAttributeNode(sliderMargin);
giuliomoro@0 495 this.sliderDOM.appendChild(this.canvas);
giuliomoro@0 496
giuliomoro@0 497 // Create the div to hold any scale objects
giuliomoro@0 498 this.scale = document.createElement('div');
giuliomoro@0 499 this.scale.className = 'sliderScale';
giuliomoro@0 500 this.scale.id = 'sliderScaleHolder-'+this.id;
giuliomoro@0 501 this.scale.align = 'left';
giuliomoro@0 502 this.sliderDOM.appendChild(this.scale);
giuliomoro@0 503 var positionScale = this.canvas.style.width.substr(0,this.canvas.style.width.length-2);
giuliomoro@0 504 var offset = Number(this.canvas.attributes['marginsize'].value);
giuliomoro@0 505 var dest = document.getElementById("slider-holder").appendChild(this.sliderDOM);
giuliomoro@0 506 for (var scaleObj of interfaceObject.scales)
giuliomoro@0 507 {
giuliomoro@0 508 var position = Number(scaleObj.position)*0.01;
giuliomoro@0 509 var pixelPosition = (position*$(this.canvas).width())+offset;
giuliomoro@0 510 var scaleDOM = document.createElement('span');
giuliomoro@0 511 scaleDOM.textContent = scaleObj.text;
giuliomoro@0 512 scaleDOM.setAttribute('value',position)
giuliomoro@0 513 this.scale.appendChild(scaleDOM);
giuliomoro@0 514 scaleDOM.style.left = Math.floor((pixelPosition-($(scaleDOM).width()/2)))+'px';
giuliomoro@0 515 }
giuliomoro@0 516
giuliomoro@0 517 this.createSliderObject = function(audioObject)
giuliomoro@0 518 {
giuliomoro@0 519 var trackObj = document.createElement('div');
giuliomoro@0 520 trackObj.align = "center";
giuliomoro@0 521 trackObj.className = 'track-slider track-slider-disabled track-slider-'+audioObject.id;
giuliomoro@0 522 trackObj.id = 'track-slider-'+this.id+'-'+audioObject.id;
giuliomoro@0 523 trackObj.setAttribute('trackIndex',audioObject.id);
giuliomoro@0 524 if (this.name != undefined) {
giuliomoro@0 525 trackObj.setAttribute('interface-name',this.name);
giuliomoro@0 526 } else {
giuliomoro@0 527 trackObj.setAttribute('interface-name',this.id);
giuliomoro@0 528 }
giuliomoro@0 529 var offset = Number(this.canvas.attributes['marginsize'].value);
giuliomoro@0 530 // Distribute it randomnly
giuliomoro@0 531 var w = window.innerWidth - (offset+8)*2;
giuliomoro@0 532 w = Math.random()*w;
giuliomoro@0 533 w = Math.floor(w+(offset+8));
giuliomoro@0 534 trackObj.style.left = w+'px';
giuliomoro@0 535 this.canvas.appendChild(trackObj);
giuliomoro@0 536 this.sliders.push(trackObj);
giuliomoro@0 537 this.metrics.push(new metricTracker(this));
giuliomoro@0 538 var label = document.createElement("label");
giuliomoro@0 539 switch(audioObject.specification.parent.label) {
giuliomoro@0 540 case "letter":
giuliomoro@0 541 label.textContent = String.fromCharCode(97 + this.metrics.length-1);
giuliomoro@0 542 break;
giuliomoro@0 543 case "capital":
giuliomoro@0 544 label.textContent = String.fromCharCode(65 + this.metrics.length-1);
giuliomoro@0 545 break;
giuliomoro@0 546 case "none":
giuliomoro@0 547 label.textContent = "";
giuliomoro@0 548 break;
giuliomoro@0 549 default:
giuliomoro@0 550 label.textContent = ""+this.metrics.length;
giuliomoro@0 551 break;
giuliomoro@0 552 }
giuliomoro@0 553 trackObj.appendChild(label);
giuliomoro@0 554 this.metrics[this.metrics.length-1].initialise(convSliderPosToRate(trackObj));
giuliomoro@0 555 return trackObj;
giuliomoro@0 556 };
giuliomoro@0 557
giuliomoro@0 558 this.resize = function(event)
giuliomoro@0 559 {
giuliomoro@0 560 var holdValues = [];
giuliomoro@0 561 for (var index = 0; index < this.sliders.length; index++)
giuliomoro@0 562 {
giuliomoro@0 563 holdValues.push(convSliderPosToRate(this.sliders[index]));
giuliomoro@0 564 }
giuliomoro@0 565 var width = event.target.innerWidth;
giuliomoro@0 566 var sliderDiv = this.canvas;
giuliomoro@0 567 var sliderScaleDiv = this.scale;
giuliomoro@0 568 var marginsize = Number(sliderDiv.attributes['marginsize'].value);
giuliomoro@0 569 var w = (marginsize+8)*2;
giuliomoro@0 570 sliderDiv.style.width = width - w + 'px';
giuliomoro@0 571 var width = width - w;
giuliomoro@0 572 // Move sliders into new position
giuliomoro@0 573 for (var index = 0; index < this.sliders.length; index++)
giuliomoro@0 574 {
giuliomoro@0 575 var pos = holdValues[index];
giuliomoro@0 576 var pix = pos * width;
giuliomoro@0 577 this.sliders[index].style.left = pix+marginsize+'px';
giuliomoro@0 578 }
giuliomoro@0 579
giuliomoro@0 580 // Move scale labels
giuliomoro@0 581 for (var index = 0; index < this.scale.children.length; index++)
giuliomoro@0 582 {
giuliomoro@0 583 var scaleObj = this.scale.children[index];
giuliomoro@0 584 var position = Number(scaleObj.attributes['value'].value);
giuliomoro@0 585 var pixelPosition = (position*width)+marginsize;
giuliomoro@0 586 scaleObj.style.left = Math.floor((pixelPosition-($(scaleObj).width()/2)))+'px';
giuliomoro@0 587 }
giuliomoro@0 588 };
giuliomoro@0 589 }
giuliomoro@0 590
giuliomoro@0 591 function sliderObject(audioObject,interfaceObjects) {
giuliomoro@0 592 // Create a new slider object;
giuliomoro@0 593 this.parent = audioObject;
giuliomoro@0 594 this.trackSliderObjects = [];
giuliomoro@0 595 for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
giuliomoro@0 596 {
giuliomoro@0 597 var trackObj = interfaceContext.interfaceSliders[i].createSliderObject(audioObject);
giuliomoro@0 598 this.trackSliderObjects.push(trackObj);
giuliomoro@0 599 }
giuliomoro@0 600
giuliomoro@0 601 // Onclick, switch playback to that track
giuliomoro@0 602
giuliomoro@0 603 this.enable = function() {
giuliomoro@0 604 if (this.parent.state == 1)
giuliomoro@0 605 {
giuliomoro@0 606 $(this.trackSliderObjects).each(function(i,trackObj){
giuliomoro@0 607 $(trackObj).removeClass('track-slider-disabled');
giuliomoro@0 608 });
giuliomoro@0 609 }
giuliomoro@0 610 };
giuliomoro@0 611 this.updateLoading = function(progress)
giuliomoro@0 612 {
giuliomoro@0 613 if (progress != 100)
giuliomoro@0 614 {
giuliomoro@0 615 progress = String(progress);
giuliomoro@0 616 progress = progress.split('.')[0];
giuliomoro@0 617 this.trackSliderObjects[0].children[0].textContent = progress+'%';
giuliomoro@0 618 } else {
giuliomoro@0 619 this.trackSliderObjects[0].children[0].textContent = this.parent.id;
giuliomoro@0 620 }
giuliomoro@0 621 };
giuliomoro@0 622 this.startPlayback = function()
giuliomoro@0 623 {
giuliomoro@0 624 $('.track-slider').removeClass('track-slider-playing');
giuliomoro@0 625 var name = ".track-slider-"+this.parent.id;
giuliomoro@0 626 $(name).addClass('track-slider-playing');
giuliomoro@0 627 $('.comment-div').removeClass('comment-box-playing');
giuliomoro@0 628 $('#comment-div-'+this.parent.id).addClass('comment-box-playing');
giuliomoro@0 629 var outsideReference = document.getElementById('outside-reference');
giuliomoro@0 630 if (outsideReference != undefined)
giuliomoro@0 631 $(outsideReference).removeClass('track-slider-playing');
giuliomoro@0 632 };
giuliomoro@0 633 this.stopPlayback = function()
giuliomoro@0 634 {
giuliomoro@0 635 var name = ".track-slider-"+this.parent.id;
giuliomoro@0 636 $(name).removeClass('track-slider-playing');
giuliomoro@0 637 $('#comment-div-'+this.parent.id).removeClass('comment-box-playing');
giuliomoro@0 638 };
giuliomoro@0 639 this.exportXMLDOM = function(audioObject) {
giuliomoro@0 640 // Called by the audioObject holding this element. Must be present
giuliomoro@0 641 var obj = [];
giuliomoro@0 642 $(this.trackSliderObjects).each(function(i,trackObj){
giuliomoro@0 643 var node = storage.document.createElement('value');
giuliomoro@0 644 node.setAttribute("interface-name",trackObj.getAttribute("interface-name"));
giuliomoro@0 645 node.textContent = convSliderPosToRate(trackObj);
giuliomoro@0 646 obj.push(node);
giuliomoro@0 647 });
giuliomoro@0 648
giuliomoro@0 649 return obj;
giuliomoro@0 650 };
giuliomoro@0 651 this.getValue = function() {
giuliomoro@0 652 return convSliderPosToRate(this.trackSliderObjects[0]);
giuliomoro@0 653 };
giuliomoro@0 654 this.getPresentedId = function()
giuliomoro@0 655 {
giuliomoro@0 656 return this.trackSliderObjects[0].children[0].textContent;
giuliomoro@0 657 };
giuliomoro@0 658 this.canMove = function()
giuliomoro@0 659 {
giuliomoro@0 660 return true;
giuliomoro@0 661 };
giuliomoro@0 662 this.error = function() {
giuliomoro@0 663 // audioObject has an error!!
giuliomoro@0 664 this.playback.textContent = "Error";
giuliomoro@0 665 $(this.playback).addClass("error-colour");
giuliomoro@0 666 }
giuliomoro@0 667 }
giuliomoro@0 668
giuliomoro@0 669 function outsideReferenceDOM(audioObject,index,inject)
giuliomoro@0 670 {
giuliomoro@0 671 this.parent = audioObject;
giuliomoro@0 672 this.outsideReferenceHolder = document.createElement('div');
giuliomoro@0 673 this.outsideReferenceHolder.id = 'outside-reference';
giuliomoro@0 674 this.outsideReferenceHolder.className = 'outside-reference track-slider-disabled';
giuliomoro@0 675 var outsideReferenceHolderspan = document.createElement('span');
giuliomoro@0 676 outsideReferenceHolderspan.textContent = 'Reference';
giuliomoro@0 677 this.outsideReferenceHolder.appendChild(outsideReferenceHolderspan);
giuliomoro@0 678 this.outsideReferenceHolder.setAttribute('track-id',index);
giuliomoro@0 679
giuliomoro@0 680 this.outsideReferenceHolder.onclick = function(event)
giuliomoro@0 681 {
giuliomoro@0 682 audioEngineContext.play(event.currentTarget.getAttribute('track-id'));
giuliomoro@0 683 $('.track-slider').removeClass('track-slider-playing');
giuliomoro@0 684 $('.comment-div').removeClass('comment-box-playing');
giuliomoro@0 685 if (event.currentTarget.nodeName == 'DIV') {
giuliomoro@0 686 $(event.currentTarget).addClass('track-slider-playing');
giuliomoro@0 687 } else {
giuliomoro@0 688 $(event.currentTarget.parentElement).addClass('track-slider-playing');
giuliomoro@0 689 }
giuliomoro@0 690 };
giuliomoro@0 691 inject.appendChild(this.outsideReferenceHolder);
giuliomoro@0 692 this.enable = function()
giuliomoro@0 693 {
giuliomoro@0 694 if (this.parent.state == 1)
giuliomoro@0 695 {
giuliomoro@0 696 $(this.outsideReferenceHolder).removeClass('track-slider-disabled');
giuliomoro@0 697 }
giuliomoro@0 698 };
giuliomoro@0 699 this.updateLoading = function(progress)
giuliomoro@0 700 {
giuliomoro@0 701 if (progress != 100)
giuliomoro@0 702 {
giuliomoro@0 703 progress = String(progress);
giuliomoro@0 704 progress = progress.split('.')[0];
giuliomoro@0 705 this.outsideReferenceHolder[0].children[0].textContent = progress+'%';
giuliomoro@0 706 } else {
giuliomoro@0 707 this.outsideReferenceHolder[0].children[0].textContent = "Play Reference";
giuliomoro@0 708 }
giuliomoro@0 709 };
giuliomoro@0 710 this.startPlayback = function()
giuliomoro@0 711 {
giuliomoro@0 712 $('.track-slider').removeClass('track-slider-playing');
giuliomoro@0 713 $(this.outsideReferenceHolder).addClass('track-slider-playing');
giuliomoro@0 714 $('.comment-div').removeClass('comment-box-playing');
giuliomoro@0 715 };
giuliomoro@0 716 this.stopPlayback = function()
giuliomoro@0 717 {
giuliomoro@0 718 $(this.outsideReferenceHolder).removeClass('track-slider-playing');
giuliomoro@0 719 };
giuliomoro@0 720 this.exportXMLDOM = function(audioObject)
giuliomoro@0 721 {
giuliomoro@0 722 return null;
giuliomoro@0 723 };
giuliomoro@0 724 this.getValue = function()
giuliomoro@0 725 {
giuliomoro@0 726 return 0;
giuliomoro@0 727 };
giuliomoro@0 728 this.getPresentedId = function()
giuliomoro@0 729 {
giuliomoro@0 730 return 'reference';
giuliomoro@0 731 };
giuliomoro@0 732 this.canMove = function()
giuliomoro@0 733 {
giuliomoro@0 734 return false;
giuliomoro@0 735 };
giuliomoro@0 736 this.error = function() {
giuliomoro@0 737 // audioObject has an error!!
giuliomoro@0 738 this.outsideReferenceHolder.textContent = "Error";
giuliomoro@0 739 $(this.outsideReferenceHolder).addClass("error-colour");
giuliomoro@0 740 }
giuliomoro@0 741 }
giuliomoro@0 742
giuliomoro@0 743 function buttonSubmitClick()
giuliomoro@0 744 {
giuliomoro@0 745 var checks = [];
giuliomoro@0 746 checks = checks.concat(testState.currentStateMap.interfaces[0].options);
giuliomoro@0 747 checks = checks.concat(specification.interfaces.options);
giuliomoro@0 748 var canContinue = true;
giuliomoro@0 749
giuliomoro@0 750 // Check that the anchor and reference objects are correctly placed
giuliomoro@0 751 if (interfaceContext.checkHiddenAnchor() == false) {return;}
giuliomoro@0 752 if (interfaceContext.checkHiddenReference() == false) {return;}
giuliomoro@0 753
giuliomoro@0 754 for (var i=0; i<checks.length; i++) {
giuliomoro@0 755 if (checks[i].type == 'check')
giuliomoro@0 756 {
giuliomoro@0 757 switch(checks[i].name) {
giuliomoro@0 758 case 'fragmentPlayed':
giuliomoro@0 759 // Check if all fragments have been played
giuliomoro@0 760 var checkState = interfaceContext.checkAllPlayed();
giuliomoro@0 761 if (checkState == false) {canContinue = false;}
giuliomoro@0 762 break;
giuliomoro@0 763 case 'fragmentFullPlayback':
giuliomoro@0 764 // Check all fragments have been played to their full length
giuliomoro@0 765 var checkState = interfaceContext.checkFragmentsFullyPlayed();
giuliomoro@0 766 if (checkState == false) {canContinue = false;}
giuliomoro@0 767 break;
giuliomoro@0 768 case 'fragmentMoved':
giuliomoro@0 769 // Check all fragment sliders have been moved.
giuliomoro@0 770 var checkState = interfaceContext.checkAllMoved();
giuliomoro@0 771 if (checkState == false) {canContinue = false;}
giuliomoro@0 772 break;
giuliomoro@0 773 case 'fragmentComments':
giuliomoro@0 774 // Check all fragment sliders have been moved.
giuliomoro@0 775 var checkState = interfaceContext.checkAllCommented();
giuliomoro@0 776 if (checkState == false) {canContinue = false;}
giuliomoro@0 777 break;
giuliomoro@0 778 case 'scalerange':
giuliomoro@0 779 // Check the scale is used to its full width outlined by the node
giuliomoro@0 780 var checkState = interfaceContext.checkScaleRange();
giuliomoro@0 781 if (checkState == false) {canContinue = false;}
giuliomoro@0 782 break;
giuliomoro@0 783 default:
giuliomoro@0 784 console.log("WARNING - Check option "+checks[i].name+" is not supported on this interface");
giuliomoro@0 785 break;
giuliomoro@0 786 }
giuliomoro@0 787
giuliomoro@0 788 }
giuliomoro@0 789 if (!canContinue) {break;}
giuliomoro@0 790 }
giuliomoro@0 791
giuliomoro@0 792 if (canContinue) {
giuliomoro@0 793 if (audioEngineContext.status == 1) {
giuliomoro@0 794 var playback = document.getElementById('playback-button');
giuliomoro@0 795 playback.click();
giuliomoro@0 796 // This function is called when the submit button is clicked. Will check for any further tests to perform, or any post-test options
giuliomoro@0 797 } else
giuliomoro@0 798 {
giuliomoro@0 799 if (audioEngineContext.timer.testStarted == false)
giuliomoro@0 800 {
giuliomoro@0 801 alert('You have not started the test! Please click a fragment to begin the test!');
giuliomoro@0 802 return;
giuliomoro@0 803 }
giuliomoro@0 804 }
giuliomoro@0 805 testState.advanceState();
giuliomoro@0 806 }
giuliomoro@0 807 }
giuliomoro@0 808
giuliomoro@0 809 function convSliderPosToRate(trackSlider)
giuliomoro@0 810 {
giuliomoro@0 811 var slider = trackSlider.parentElement;
giuliomoro@0 812 var w = slider.style.width;
giuliomoro@0 813 var marginsize = Number(slider.attributes['marginsize'].value);
giuliomoro@0 814 var maxPix = w.substr(0,w.length-2);
giuliomoro@0 815 var pix = trackSlider.style.left;
giuliomoro@0 816 pix = pix.substr(0,pix.length-2);
giuliomoro@0 817 var rate = (pix-marginsize)/maxPix;
giuliomoro@0 818 return rate;
giuliomoro@0 819 }
giuliomoro@0 820
giuliomoro@0 821 function resizeWindow(event){
giuliomoro@0 822 // Function called when the window has been resized.
giuliomoro@0 823 // MANDATORY FUNCTION
giuliomoro@0 824
giuliomoro@0 825 // Resize the slider objects
giuliomoro@0 826 for (var i=0; i<interfaceContext.interfaceSliders.length; i++)
giuliomoro@0 827 {
giuliomoro@0 828 interfaceContext.interfaceSliders[i].resize(event);
giuliomoro@0 829 }
giuliomoro@0 830 }
giuliomoro@0 831
giuliomoro@0 832 function pageXMLSave(store, pageSpecification)
giuliomoro@0 833 {
giuliomoro@0 834 // MANDATORY
giuliomoro@0 835 // Saves a specific test page
giuliomoro@0 836 // You can use this space to add any extra nodes to your XML <audioHolder> saves
giuliomoro@0 837 // Get the current <page> information in store (remember to appendChild your data to it)
giuliomoro@0 838 // pageSpecification is the current page node configuration
giuliomoro@0 839 // To create new XML nodes, use storage.document.createElement();
giuliomoro@0 840
giuliomoro@0 841 if (interfaceContext.interfaceSliders.length == 1)
giuliomoro@0 842 {
giuliomoro@0 843 // If there is only one axis, there only needs to be one metric return
giuliomoro@0 844 return;
giuliomoro@0 845 }
giuliomoro@0 846 var audioelements = store.getElementsByTagName("audioelement");
giuliomoro@0 847 for (var i=0; i<audioelements.length; i++)
giuliomoro@0 848 {
giuliomoro@0 849 // Have to append the metric specific nodes
giuliomoro@0 850 if (pageSpecification.outsideReference == null || pageSpecification.outsideReference.id != audioelements[i].id)
giuliomoro@0 851 {
giuliomoro@0 852 var inject = audioelements[i].getElementsByTagName("metric");
giuliomoro@0 853 if (inject.length == 0)
giuliomoro@0 854 {
giuliomoro@0 855 inject = storage.document.createElement("metric");
giuliomoro@0 856 } else {
giuliomoro@0 857 inject = inject[0];
giuliomoro@0 858 }
giuliomoro@0 859 for (var k=0; k<interfaceContext.interfaceSliders.length; k++)
giuliomoro@0 860 {
giuliomoro@0 861 var mrnodes = interfaceContext.interfaceSliders[k].metrics[i].exportXMLDOM(inject);
giuliomoro@0 862 for (var j=0; j<mrnodes.length; j++)
giuliomoro@0 863 {
giuliomoro@0 864 var name = mrnodes[j].getAttribute("name");
giuliomoro@0 865 if (name == "elementTracker" || name == "elementTrackerFull" || name == "elementInitialPosition" || name == "elementFlagMoved")
giuliomoro@0 866 {
giuliomoro@0 867 mrnodes[j].setAttribute("interface-name",interfaceContext.interfaceSliders[k].name);
giuliomoro@0 868 mrnodes[j].setAttribute("interface-id",k);
giuliomoro@0 869 inject.appendChild(mrnodes[j]);
giuliomoro@0 870 }
giuliomoro@0 871 }
giuliomoro@0 872 }
giuliomoro@0 873 }
giuliomoro@0 874 }
giuliomoro@0 875 }