annotate test_create/test_core.js @ 616:6b7ac72ccec8 Dev_main

Test Create fixes for #1597 #1598 #1656 #1657
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Mon, 14 Mar 2016 12:34:36 +0000
parents cce99fc682d8
children 6edb164f15b8
rev   line source
n@501 1 var interfaceSpecs;
n@501 2 var xmlHttp;
n@501 3 var popupObject;
n@501 4 var popupStateNodes;
n@501 5 var specification;
n@501 6 var convert;
n@501 7 var attributeText;
n@501 8
n@501 9 // Firefox does not have an XMLDocument.prototype.getElementsByName
n@501 10 // and there is no searchAll style command, this custom function will
n@501 11 // search all children recusrively for the name. Used for XSD where all
n@501 12 // element nodes must have a name and therefore can pull the schema node
n@501 13 XMLDocument.prototype.getAllElementsByName = function(name)
n@501 14 {
n@501 15 name = String(name);
n@501 16 var selected = this.documentElement.getAllElementsByName(name);
n@501 17 return selected;
n@501 18 }
n@501 19
n@501 20 Element.prototype.getAllElementsByName = function(name)
n@501 21 {
n@501 22 name = String(name);
n@501 23 var selected = [];
n@501 24 var node = this.firstElementChild;
n@501 25 while(node != null)
n@501 26 {
n@501 27 if (node.getAttribute('name') == name)
n@501 28 {
n@501 29 selected.push(node);
n@501 30 }
n@501 31 if (node.childElementCount > 0)
n@501 32 {
n@501 33 selected = selected.concat(node.getAllElementsByName(name));
n@501 34 }
n@501 35 node = node.nextElementSibling;
n@501 36 }
n@501 37 return selected;
n@501 38 }
n@501 39
n@501 40 XMLDocument.prototype.getAllElementsByTagName = function(name)
n@501 41 {
n@501 42 name = String(name);
n@501 43 var selected = this.documentElement.getAllElementsByTagName(name);
n@501 44 return selected;
n@501 45 }
n@501 46
n@501 47 Element.prototype.getAllElementsByTagName = function(name)
n@501 48 {
n@501 49 name = String(name);
n@501 50 var selected = [];
n@501 51 var node = this.firstElementChild;
n@501 52 while(node != null)
n@501 53 {
n@501 54 if (node.nodeName == name)
n@501 55 {
n@501 56 selected.push(node);
n@501 57 }
n@501 58 if (node.childElementCount > 0)
n@501 59 {
n@501 60 selected = selected.concat(node.getAllElementsByTagName(name));
n@501 61 }
n@501 62 node = node.nextElementSibling;
n@501 63 }
n@501 64 return selected;
n@501 65 }
n@501 66
n@501 67 // Firefox does not have an XMLDocument.prototype.getElementsByName
n@501 68 if (typeof XMLDocument.prototype.getElementsByName != "function") {
n@501 69 XMLDocument.prototype.getElementsByName = function(name)
n@501 70 {
n@501 71 name = String(name);
n@501 72 var node = this.documentElement.firstElementChild;
n@501 73 var selected = [];
n@501 74 while(node != null)
n@501 75 {
n@501 76 if (node.getAttribute('name') == name)
n@501 77 {
n@501 78 selected.push(node);
n@501 79 }
n@501 80 node = node.nextElementSibling;
n@501 81 }
n@501 82 return selected;
n@501 83 }
n@501 84 }
n@501 85
n@501 86 window.onload = function()
n@501 87 {
n@501 88 specification = new Specification();
n@501 89 convert = new SpecificationToHTML();
n@501 90 xmlHttp = new XMLHttpRequest();
n@501 91 xmlHttp.open("GET","./interface-specs.xml",true);
n@501 92 xmlHttp.onload = function()
n@501 93 {
n@501 94 var parse = new DOMParser();
n@501 95 interfaceSpecs = parse.parseFromString(xmlHttp.response,'text/xml');
n@501 96 buildPage();
n@501 97 popupObject.postNode(popupStateNodes.state[0])
n@501 98 }
n@501 99 xmlHttp.send();
n@501 100
n@501 101 var xsdGet = new XMLHttpRequest();
n@501 102 xsdGet.open("GET","../test-schema.xsd",true);
n@501 103 xsdGet.onload = function()
n@501 104 {
n@501 105 var parse = new DOMParser();
n@501 106 specification.schema = parse.parseFromString(xsdGet.response,'text/xml');;
n@501 107 }
n@501 108 xsdGet.send();
n@501 109
n@501 110 var jsonAttribute = new XMLHttpRequest();
n@501 111 jsonAttribute.open("GET","./attributes.json",true);
n@501 112 jsonAttribute.onload = function()
n@501 113 {
n@501 114 attributeText = JSON.parse(jsonAttribute.response)
n@501 115 }
n@501 116 jsonAttribute.send();
n@501 117 }
n@501 118
n@501 119 function buildPage()
n@501 120 {
n@501 121 popupObject = new function() {
n@501 122 this.object = document.getElementById("popupHolder");
n@501 123 this.blanket = document.getElementById("blanket");
n@501 124
n@501 125 this.popupTitle = document.createElement("div");
n@501 126 this.popupTitle.id = "popup-title-holder";
n@501 127 this.popupTitle.align = "center";
n@501 128 this.titleDOM = document.createElement("span");
n@501 129 this.titleDOM.id = "popup-title";
n@501 130 this.popupTitle.appendChild(this.titleDOM);
n@501 131 this.object.appendChild(this.popupTitle);
n@501 132
n@501 133 this.popupContent = document.createElement("div");
n@501 134 this.popupContent.id = "popup-content";
n@501 135 this.object.appendChild(this.popupContent);
n@501 136
n@501 137 this.proceedButton = document.createElement("button");
n@501 138 this.proceedButton.id = "popup-proceed";
n@541 139 this.proceedButton.className = "popup-button";
n@501 140 this.proceedButton.textContent = "Next";
n@501 141 this.proceedButton.onclick = function()
n@501 142 {
n@501 143 popupObject.popupContent.innerHTML = null;
n@543 144 if(typeof popupObject.shownObject.continue == "function") {
n@543 145 popupObject.shownObject.continue();
n@543 146 } else {
n@543 147 popupObject.hide();
n@543 148 }
n@501 149 };
n@501 150 this.object.appendChild(this.proceedButton);
n@501 151
n@541 152 this.backButton = document.createElement("button");
n@541 153 this.backButton.id = "popup-back";
n@541 154 this.backButton.className = "popup-button";
n@541 155 this.backButton.textContent = "Back";
n@541 156 this.backButton.onclick = function()
n@541 157 {
n@541 158 popupObject.popupContent.innerHTML = null;
n@541 159 popupObject.shownObject.back();
n@541 160 };
n@541 161 this.object.appendChild(this.backButton);
n@541 162
n@501 163 this.shownObject;
n@501 164
n@501 165 this.resize = function()
n@501 166 {
n@501 167 var w = window.innerWidth;
n@501 168 var h = window.innerHeight;
n@501 169 this.object.style.left = Math.floor((w-750)/2) + 'px';
n@501 170 this.object.style.top = Math.floor((h-500)/2) + 'px';
n@501 171 }
n@501 172
n@501 173 this.show = function()
n@501 174 {
n@501 175 this.object.style.visibility = "visible";
n@501 176 this.blanket.style.visibility = "visible";
n@541 177 if (typeof this.shownObject.back == "function") {
n@541 178 this.backButton.style.visibility = "visible";
n@541 179 } else {
n@541 180 this.backButton.style.visibility = "hidden";
n@541 181 }
n@501 182 }
n@501 183
n@501 184 this.hide = function()
n@501 185 {
n@501 186 this.object.style.visibility = "hidden";
n@501 187 this.blanket.style.visibility = "hidden";
n@541 188 this.backButton.style.visibility = "hidden";
n@501 189 }
n@501 190
n@501 191 this.postNode = function(postObject)
n@501 192 {
n@501 193 //Passed object must have the following:
n@501 194 // Title: text to show in the title
n@501 195 // Content: HTML DOM to show on the page
n@501 196 // On complete this HTML DOM is destroyed so make sure it is referenced elsewhere for processing
n@501 197 this.titleDOM.textContent = postObject.title;
n@501 198 this.popupContent.appendChild(postObject.content);
n@501 199 this.shownObject = postObject;
n@541 200 if (typeof this.shownObject.back == "function") {
n@541 201 this.backButton.style.visibility = "visible";
n@541 202 } else {
n@541 203 this.backButton.style.visibility = "hidden";
n@541 204 }
n@543 205 if (typeof this.shownObject.continue == "function") {
n@543 206 this.proceedButton.textContent = "Next";
n@543 207 } else {
n@543 208 this.proceedButton.textContent = "Finish";
n@543 209 }
n@541 210 this.show();
n@501 211 }
n@501 212
n@501 213 this.resize();
n@501 214 this.hide();
n@501 215 };
n@501 216
n@501 217 popupStateNodes = new function()
n@501 218 {
n@501 219 // This defines the several popup states wanted
n@501 220 this.state = [];
n@501 221 this.state[0] = new function()
n@501 222 {
n@501 223 this.title = "Welcome";
n@501 224 this.content = document.createElement("div");
n@501 225 this.content.id = "state-0";
n@501 226 var span = document.createElement("span");
n@501 227 span.textContent = "Welcome to the WAET test creator tool. This will allow you to create a new test from scratch to suit your testing needs. If you wish to update a test file, please drag and drop the XML document into the area below for processing, otherwise press 'Next' to start a new test. This tool generates files for the WAET 1.2.0 version."
n@501 228 this.content.appendChild(span);
n@501 229 this.dragArea = document.createElement("div");
n@504 230 this.dragArea.className = "drag-area";
n@504 231 this.dragArea.id = "project-drop";
n@501 232 this.content.appendChild(this.dragArea);
n@504 233
n@505 234 this.dragArea.addEventListener('dragover',function(e){
n@504 235 e.stopPropagation();
n@504 236 e.preventDefault();
n@504 237 e.dataTransfer.dropEffect = 'copy';
n@504 238 e.currentTarget.className = "drag-area drag-over";
n@504 239 });
n@504 240
n@504 241 this.dragArea.addEventListener('dragexit',function(e){
n@504 242 e.stopPropagation();
n@504 243 e.preventDefault();
n@504 244 e.dataTransfer.dropEffect = 'copy';
n@504 245 e.currentTarget.className = "drag-area";
n@504 246 });
n@504 247
n@504 248 this.dragArea.addEventListener('drop',function(e){
n@504 249 e.stopPropagation();
n@504 250 e.preventDefault();
n@504 251 e.currentTarget.className = "drag-area drag-dropped";
n@504 252 var files = e.dataTransfer.files[0];
n@505 253 var reader = new FileReader();
n@505 254 reader.onload = function(decoded) {
n@505 255 var parse = new DOMParser();
n@505 256 specification.decode(parse.parseFromString(decoded.target.result,'text/xml'));
n@505 257 popupObject.hide();
n@506 258 popupObject.popupContent.innerHTML = null;
n@505 259 convert.convert(document.getElementById('content'));
n@505 260 }
n@505 261 reader.readAsText(files);
n@504 262 });
n@504 263
n@501 264
n@501 265 this.continue = function()
n@501 266 {
n@501 267 popupObject.postNode(popupStateNodes.state[1]);
n@501 268 }
n@501 269 }
n@501 270 this.state[1] = new function()
n@501 271 {
n@501 272 this.title = "Select your interface";
n@501 273 this.content = document.createElement("div");
n@501 274 this.content.id = "state-1";
n@501 275 var spnH = document.createElement('div');
n@501 276 var span = document.createElement("span");
n@501 277 span.textContent = "Please select your interface from the list shown below. This will define the various options which are available. This can later be changed.";
n@501 278 spnH.appendChild(span);
n@501 279 this.content.appendChild(spnH);
n@501 280 this.select = document.createElement("select");
n@501 281 this.testsXML = interfaceSpecs.getElementsByTagName('tests')[0].children;
n@501 282 for (var i=0; i<this.testsXML.length; i++)
n@501 283 {
n@501 284 var option = document.createElement('option');
n@501 285 option.value = this.testsXML[i].getAttribute('name');
n@501 286 option.textContent = this.testsXML[i].getAttribute('name');
n@501 287 this.select.appendChild(option);
n@501 288 }
n@501 289 this.content.appendChild(this.select);
n@501 290 this.continue = function()
n@501 291 {
n@501 292 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(this.select.value)[0];
n@501 293 specification.interface = testXML.getAttribute("interface");
n@541 294 if (specification.interfaces == null)
n@541 295 {
n@541 296 specification.interfaces = new specification.interfaceNode();
n@541 297 }
n@541 298 if (specification.metrics == null) {
n@541 299 specification.metrics = new specification.metricNode();
n@541 300 }
n@501 301 popupStateNodes.state[2].generate();
n@501 302 popupObject.postNode(popupStateNodes.state[2]);
n@501 303 }
n@541 304 this.back = function() {
n@541 305 popupObject.postNode(popupStateNodes.state[0]);
n@541 306 }
n@501 307 }
n@501 308 this.state[2] = new function()
n@501 309 {
n@501 310 this.title = "Test Checks & Restrictions";
n@501 311 this.content = document.createElement("div");
n@501 312 this.content.id = "state-1";
n@501 313 var spnH = document.createElement('div');
n@501 314 var span = document.createElement("span");
n@501 315 span.textContent = "Select your test checks and restrictions. Greyed out items are fixed by the test/interface and cannot be changed";
n@501 316 spnH.appendChild(span);
n@501 317 this.content.appendChild(spnH);
n@501 318 var holder = document.createElement("div");
n@501 319 this.options = [];
n@501 320 this.testXML = null;
n@501 321 this.interfaceXML = null;
n@541 322 this.dynamicContent = document.createElement("div");
n@541 323 this.content.appendChild(this.dynamicContent);
n@501 324 this.generate = function()
n@501 325 {
n@541 326 this.options = [];
n@541 327 this.dynamicContent.innerHTML = null;
n@501 328 var interfaceName = popupStateNodes.state[1].select.value;
n@501 329 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
n@501 330 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 331 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
n@501 332 this.testXML = this.testXML.getAllElementsByTagName("checks");
n@501 333 for (var i=0; i<this.interfaceXML.children.length; i++)
n@501 334 {
n@501 335 var interfaceNode = this.interfaceXML.children[i];
n@501 336 var checkName = interfaceNode.getAttribute('name');
n@501 337 var testNode
n@501 338 if (this.testXML.length > 0)
n@501 339 {
n@501 340 testNode = this.testXML[0].getAllElementsByName(checkName);
n@501 341 if(testNode.length != 0) {testNode = testNode[0];}
n@501 342 else {testNode = undefined;}
n@501 343 } else {
n@501 344 testNode = undefined;
n@501 345 }
n@541 346 var obj = {
n@541 347 root: document.createElement("div"),
n@542 348 text: document.createElement("label"),
n@541 349 input: document.createElement("input"),
n@541 350 parent: this,
n@541 351 name: checkName,
n@541 352 handleEvent: function(event) {
n@541 353 if (this.input.checked) {
n@541 354 // Add to specification.interfaces.option
n@541 355 var included = specification.interfaces.options.find(function(element,index,array){
n@541 356 if (element.name == this.name) {return true;} else {return false;}
n@541 357 },this);
n@541 358 if (included == null) {
n@541 359 specification.interfaces.options.push({type:"check",name:this.name});
n@541 360 }
n@541 361 } else {
n@541 362 // Remove from specification.interfaces.option
n@541 363 var position = specification.interfaces.options.findIndex(function(element,index,array){
n@541 364 if (element.name == this.name) {return true;} else {return false;}
n@541 365 },this);
n@541 366 if (position >= 0) {
n@541 367 specification.interfaces.options.splice(position,1);
n@541 368 }
n@541 369 }
n@541 370 }
n@501 371 }
n@541 372
n@541 373 obj.input.addEventListener("click",obj);
n@541 374 obj.root.className = "popup-checkbox";
n@541 375 obj.input.type = "checkbox";
n@542 376 obj.input.setAttribute('id',checkName);
n@542 377 obj.text.setAttribute("for",checkName);
n@541 378 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
n@541 379 obj.root.appendChild(obj.input);
n@541 380 obj.root.appendChild(obj.text);
n@501 381 if(testNode != undefined)
n@501 382 {
n@541 383 if (testNode.getAttribute('default') == 'on')
n@501 384 {
n@541 385 obj.input.checked = true;
n@501 386 }
n@501 387 if (testNode.getAttribute('support') == "none")
n@501 388 {
n@541 389 obj.input.disabled = true;
n@541 390 obj.input.checked = false;
n@541 391 obj.root.className = "popup-checkbox disabled";
n@501 392 }else if (interfaceNode.getAttribute('support') == "mandatory")
n@501 393 {
n@541 394 obj.input.disabled = true;
n@541 395 obj.input.checked = true;
n@541 396 obj.root.className = "popup-checkbox disabled";
n@541 397 }
n@541 398 } else {
n@541 399 if (interfaceNode.getAttribute('default') == 'on')
n@541 400 {
n@541 401 obj.input.checked = true;
n@541 402 }
n@541 403 if (interfaceNode.getAttribute('support') == "none")
n@541 404 {
n@541 405 obj.input.disabled = true;
n@541 406 obj.input.checked = false;
n@541 407 obj.root.className = "popup-checkbox disabled";
n@541 408 } else if (interfaceNode.getAttribute('support') == "mandatory")
n@541 409 {
n@541 410 obj.input.disabled = true;
n@541 411 obj.input.checked = true;
n@541 412 obj.root.className = "popup-checkbox disabled";
n@501 413 }
n@501 414 }
n@541 415 var included = specification.interfaces.options.find(function(element,index,array){
n@541 416 if (element.name == this.name) {return true;} else {return false;}
n@541 417 },obj);
n@541 418 if (included != undefined) {
n@541 419 obj.input.checked = true;
n@541 420 }
n@541 421 obj.handleEvent();
n@541 422 this.options.push(obj);
n@541 423 this.dynamicContent.appendChild(obj.root);
n@501 424 }
n@501 425 }
n@501 426 this.continue = function()
n@501 427 {
n@501 428 popupStateNodes.state[3].generate();
n@501 429 popupObject.postNode(popupStateNodes.state[3]);
n@501 430 }
n@541 431 this.back = function() {
n@541 432 popupObject.postNode(popupStateNodes.state[1]);
n@541 433 }
n@501 434 }
n@501 435 this.state[3] = new function()
n@501 436 {
n@501 437 this.title = "Test Metrics";
n@501 438 this.content = document.createElement("div");
n@501 439 this.content.id = "state-1";
n@501 440 var spnH = document.createElement('div');
n@501 441 var span = document.createElement("span");
n@501 442 span.textContent = "Select which data points to include in the exported results XML. Some of this is required for certain post script analysis. See the documentation for further details";
n@501 443 spnH.appendChild(span);
n@501 444 this.content.appendChild(spnH);
n@501 445 this.options = [];
n@501 446 this.checkText;
n@501 447 this.testXML;
n@501 448 this.interfaceXML;
n@541 449 this.dynamicContent = document.createElement("div");
n@541 450 this.content.appendChild(this.dynamicContent);
n@501 451 this.generate = function()
n@501 452 {
n@541 453 this.options = [];
n@541 454 this.dynamicContent.innerHTML = null;
n@501 455 var interfaceName = popupStateNodes.state[1].select.value;
n@501 456 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
n@501 457 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 458 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
n@501 459 this.testXML = this.testXML.getAllElementsByTagName("metrics");
n@501 460 for (var i=0; i<this.interfaceXML.children.length; i++)
n@501 461 {
n@501 462 var interfaceNode = this.interfaceXML.children[i];
n@501 463 var checkName = interfaceNode.getAttribute('name');
n@501 464 var testNode
n@501 465 if (this.testXML.length > 0)
n@501 466 {
n@501 467 testNode = this.testXML[0].getAllElementsByName(checkName);
n@501 468 if(testNode.length != 0) {testNode = testNode[0];}
n@501 469 else {testNode = undefined;}
n@501 470 } else {
n@501 471 testNode = undefined;
n@501 472 }
n@541 473 var obj = {
n@541 474 root: document.createElement("div"),
n@542 475 text: document.createElement("label"),
n@541 476 input: document.createElement("input"),
n@541 477 parent: this,
n@541 478 name: checkName,
n@541 479 handleEvent: function(event) {
n@541 480 if (this.input.checked) {
n@541 481 // Add to specification.interfaces.option
n@541 482 var included = specification.metrics.enabled.find(function(element,index,array){
n@541 483 if (element == this.name) {return true;} else {return false;}
n@541 484 },this);
n@541 485 if (included == null) {
n@541 486 specification.metrics.enabled.push(this.name);
n@541 487 }
n@541 488 } else {
n@541 489 // Remove from specification.interfaces.option
n@541 490 var position = specification.metrics.enabled.findIndex(function(element,index,array){
n@541 491 if (element == this.name) {return true;} else {return false;}
n@541 492 },this);
n@541 493 if (position >= 0) {
n@541 494 specification.metrics.enabled.splice(position,1);
n@541 495 }
n@541 496 }
n@541 497 }
n@501 498 }
n@541 499
n@541 500 obj.input.addEventListener("click",obj);
n@541 501 obj.root.className = "popup-checkbox";
n@541 502 obj.input.type = "checkbox";
n@542 503 obj.input.setAttribute('id',checkName);
n@542 504 obj.text.setAttribute("for",checkName);
n@541 505 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
n@541 506 obj.root.appendChild(obj.input);
n@541 507 obj.root.appendChild(obj.text);
n@501 508 if(testNode != undefined)
n@501 509 {
n@541 510 if (testNode.getAttribute('default') == 'on')
n@501 511 {
n@541 512 obj.input.checked = true;
n@501 513 }
n@501 514 if (testNode.getAttribute('support') == "none")
n@501 515 {
n@541 516 obj.input.disabled = true;
n@541 517 obj.input.checked = false;
n@541 518 obj.root.className = "popup-checkbox disabled";
n@501 519 }else if (interfaceNode.getAttribute('support') == "mandatory")
n@501 520 {
n@541 521 obj.input.disabled = true;
n@541 522 obj.input.checked = true;
n@541 523 obj.root.className = "popup-checkbox disabled";
n@541 524 }
n@541 525 } else {
n@541 526 if (interfaceNode.getAttribute('default') == 'on')
n@541 527 {
n@541 528 obj.input.checked = true;
n@541 529 }
n@541 530 if (interfaceNode.getAttribute('support') == "none")
n@541 531 {
n@541 532 obj.input.disabled = true;
n@541 533 obj.input.checked = false;
n@541 534 obj.root.className = "popup-checkbox disabled";
n@541 535 } else if (interfaceNode.getAttribute('support') == "mandatory")
n@541 536 {
n@541 537 obj.input.disabled = true;
n@541 538 obj.input.checked = true;
n@541 539 obj.root.className = "popup-checkbox disabled";
n@501 540 }
n@501 541 }
n@541 542 var included = specification.metrics.enabled.find(function(element,index,array){
n@541 543 if (element == this.name) {return true;} else {return false;}
n@541 544 },obj);
n@541 545 obj.handleEvent();
n@541 546 if (included != undefined) {
n@541 547 obj.input.checked = true;
n@541 548 }
n@541 549 this.options.push(obj);
n@541 550 this.dynamicContent.appendChild(obj.root);
n@501 551 }
n@501 552 }
n@501 553 this.continue = function()
n@501 554 {
n@501 555 popupStateNodes.state[4].generate();
n@501 556 popupObject.postNode(popupStateNodes.state[4]);
n@501 557 }
n@541 558 this.back = function() {
n@541 559 popupObject.postNode(popupStateNodes.state[2]);
n@541 560 }
n@501 561 }
n@501 562 this.state[4] = new function()
n@501 563 {
n@501 564 this.title = "Test Visuals";
n@501 565 this.content = document.createElement("div");
n@501 566 this.content.id = "state-1";
n@501 567 var spnH = document.createElement('div');
n@501 568 var span = document.createElement("span");
n@501 569 span.textContent = "You can display extra visual content with your interface for the test user to interact with. Select from the available options below. Greyed out options are unavailable for your selected interface";
n@501 570 spnH.appendChild(span);
n@501 571 this.content.appendChild(spnH);
n@501 572 this.options = [];
n@501 573 this.checkText;
n@501 574 this.testXML;
n@501 575 this.interfaceXML;
n@541 576 this.dynamicContent = document.createElement("div");
n@541 577 this.content.appendChild(this.dynamicContent);
n@501 578 this.generate = function()
n@501 579 {
n@541 580 this.options = [];
n@541 581 this.dynamicContent.innerHTML = null;
n@501 582 var interfaceName = popupStateNodes.state[1].select.value;
n@501 583 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
n@501 584 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 585 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
n@541 586 this.testXML = this.testXML.getAllElementsByTagName("show");
n@501 587 for (var i=0; i<this.interfaceXML.children.length; i++)
n@501 588 {
n@501 589 var interfaceNode = this.interfaceXML.children[i];
n@501 590 var checkName = interfaceNode.getAttribute('name');
n@501 591 var testNode
n@501 592 if (this.testXML.length > 0)
n@501 593 {
n@501 594 testNode = this.testXML[0].getAllElementsByName(checkName);
n@501 595 if(testNode.length != 0) {testNode = testNode[0];}
n@501 596 else {testNode = undefined;}
n@501 597 } else {
n@501 598 testNode = undefined;
n@501 599 }
n@541 600 var obj = {
n@541 601 root: document.createElement("div"),
n@542 602 text: document.createElement("label"),
n@541 603 input: document.createElement("input"),
n@541 604 parent: this,
n@541 605 name: checkName,
n@541 606 handleEvent: function(event) {
n@541 607 if (this.input.checked) {
n@541 608 // Add to specification.interfaces.option
n@541 609 var included = specification.interfaces.options.find(function(element,index,array){
n@541 610 if (element.name == this.name) {return true;} else {return false;}
n@541 611 },this);
n@541 612 if (included == null) {
n@541 613 specification.interfaces.options.push({type:"show",name:this.name});
n@541 614 }
n@541 615 } else {
n@541 616 // Remove from specification.interfaces.option
n@541 617 var position = specification.interfaces.options.findIndex(function(element,index,array){
n@541 618 if (element.name == this.name) {return true;} else {return false;}
n@541 619 },this);
n@541 620 if (position >= 0) {
n@541 621 specification.interfaces.options.splice(position,1);
n@541 622 }
n@541 623 }
n@541 624 }
n@501 625 }
n@541 626
n@541 627 obj.input.addEventListener("click",obj);
n@541 628 obj.root.className = "popup-checkbox";
n@541 629 obj.input.type = "checkbox";
n@542 630 obj.input.setAttribute('id',checkName);
n@542 631 obj.text.setAttribute("for",checkName);
n@541 632 obj.text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
n@541 633 obj.root.appendChild(obj.input);
n@541 634 obj.root.appendChild(obj.text);
n@501 635 if(testNode != undefined)
n@501 636 {
n@541 637 if (testNode.getAttribute('default') == 'on')
n@501 638 {
n@541 639 obj.input.checked = true;
n@501 640 }
n@501 641 if (testNode.getAttribute('support') == "none")
n@501 642 {
n@541 643 obj.input.disabled = true;
n@541 644 obj.input.checked = false;
n@541 645 obj.root.className = "popup-checkbox disabled";
n@501 646 }else if (interfaceNode.getAttribute('support') == "mandatory")
n@501 647 {
n@541 648 obj.input.disabled = true;
n@541 649 obj.input.checked = true;
n@541 650 obj.root.className = "popup-checkbox disabled";
n@541 651 }
n@541 652 } else {
n@541 653 if (interfaceNode.getAttribute('default') == 'on')
n@541 654 {
n@541 655 obj.input.checked = true;
n@541 656 }
n@541 657 if (interfaceNode.getAttribute('support') == "none")
n@541 658 {
n@541 659 obj.input.disabled = true;
n@541 660 obj.input.checked = false;
n@541 661 obj.root.className = "popup-checkbox disabled";
n@541 662 } else if (interfaceNode.getAttribute('support') == "mandatory")
n@541 663 {
n@541 664 obj.input.disabled = true;
n@541 665 obj.input.checked = true;
n@541 666 obj.root.className = "popup-checkbox disabled";
n@501 667 }
n@501 668 }
n@541 669 var included = specification.interfaces.options.find(function(element,index,array){
n@541 670 if (element.name == this.name) {return true;} else {return false;}
n@541 671 },obj);
n@541 672 if (included != undefined) {
n@541 673 obj.input.checked = true;
n@541 674 }
n@541 675 obj.handleEvent();
n@541 676 this.options.push(obj);
n@541 677 this.dynamicContent.appendChild(obj.root);
n@501 678 }
n@501 679 }
n@501 680 this.continue = function()
n@501 681 {
n@501 682 popupObject.hide();
n@501 683 convert.convert(document.getElementById('content'));
n@501 684 }
n@541 685 this.back = function() {
n@541 686 popupObject.postNode(popupStateNodes.state[3]);
n@541 687 }
n@501 688 }
n@501 689 this.state[5] = new function() {
n@501 690 this.title = "Add/Edit Survey Element";
n@501 691 this.content = document.createElement("div");
n@501 692 this.content.id = "state-1";
n@501 693 var spnH = document.createElement('div');
n@501 694 var span = document.createElement("span");
n@501 695 span.textContent = "You can configure your survey element here. Press 'Continue' to complete your changes.";
n@501 696 spnH.appendChild(span);
n@501 697 this.content.appendChild(spnH);
n@501 698 this.dynamic = document.createElement("div");
n@501 699 this.option = null;
n@501 700 this.parent = null;
n@506 701 this.optionLists = [];
n@616 702 this.select = document.createElement("select");
n@616 703 this.select.setAttribute("name","type");
n@616 704 this.select.addEventListener("change",this,false);
n@616 705 this.content.appendChild(this.select);
n@501 706 this.content.appendChild(this.dynamic);
n@501 707 this.generate = function(option, parent)
n@501 708 {
n@501 709 this.option = option;
n@501 710 this.parent = parent;
n@616 711 if (this.select.childElementCount == 0) {
n@616 712 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("type")[0].getAllElementsByTagName("xs:enumeration");
n@616 713 for (var i=0; i<optionList.length; i++)
n@616 714 {
n@616 715 var selectOption = document.createElement("option");
n@616 716 selectOption.value = optionList[i].getAttribute("value");
n@616 717 selectOption.textContent = selectOption.value;
n@616 718 this.select.appendChild(selectOption);
n@616 719 }
n@501 720 }
n@501 721 if (this.option.type != undefined){
n@616 722 this.select.value = this.option.type
n@501 723 } else {
n@616 724 this.select.value = "statement";
n@501 725 this.option.type = "statement";
n@501 726 }
n@501 727
n@501 728 this.dynamic.innerHTML = null;
n@501 729 var statement = document.createElement("div");
n@501 730 var statementText = document.createElement("span");
n@501 731 var statementEntry = document.createElement("textarea");
n@501 732 statement.appendChild(statementText);
n@501 733 statement.appendChild(statementEntry);
n@501 734 statementText.textContent = "Statement/Question";
n@501 735 statementEntry.addEventListener("change",this,false);
n@501 736 statementEntry.setAttribute("name","statement");
n@501 737 statementEntry.value = this.option.statement;
n@501 738 this.dynamic.appendChild(statement);
n@506 739
n@506 740 var id = document.createElement("div");
n@506 741 var idText = document.createElement("span");
n@506 742 var idEntry = document.createElement("input");
n@506 743 id.appendChild(idText);
n@506 744 id.appendChild(idEntry);
n@506 745 idText.textContent = "ID: ";
n@506 746 idEntry.addEventListener("change",this,false);
n@506 747 idEntry.setAttribute("name","id");
n@506 748 idEntry.value = this.option.id;
n@506 749
n@616 750 this.dynamic.appendChild(id);
n@616 751
n@501 752 switch(this.option.type)
n@501 753 {
n@501 754 case "statement":
n@501 755 break;
n@501 756 case "question":
n@501 757 var boxsizeSelect = document.createElement("select");
n@501 758 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("boxsize")[0].getAllElementsByTagName("xs:enumeration");
n@501 759 for (var i=0; i<optionList.length; i++)
n@501 760 {
n@501 761 var selectOption = document.createElement("option");
n@501 762 selectOption.value = optionList[i].getAttribute("value");
n@501 763 selectOption.textContent = selectOption.value;
n@501 764 boxsizeSelect.appendChild(selectOption);
n@501 765 }
n@501 766 if(this.option.boxsize != undefined) {
n@501 767 boxsizeSelect.value = this.option.boxsize;
n@501 768 } else {
n@501 769 boxsizeSelect.value = "normal";
n@501 770 this.option.boxsize = "normal";
n@501 771 }
n@501 772 boxsizeSelect.setAttribute("name","boxsize");
n@501 773 boxsizeSelect.addEventListener("change",this,false);
n@501 774 var boxsize = document.createElement("div");
n@501 775 var boxsizeText = document.createElement("span");
n@501 776 boxsizeText.textContent = "Entry Size: ";
n@501 777 boxsize.appendChild(boxsizeText);
n@501 778 boxsize.appendChild(boxsizeSelect);
n@501 779 this.dynamic.appendChild(boxsize);
n@501 780
n@501 781 var mandatory = document.createElement("div");
n@501 782 var mandatoryInput = document.createElement("input");
n@501 783 var mandatoryText = document.createElement("span");
n@501 784 mandatoryText.textContent = "Mandatory: ";
n@501 785 mandatory.appendChild(mandatoryText);
n@501 786 mandatory.appendChild(mandatoryInput);
n@501 787 mandatoryInput.type = "checkbox";
n@501 788 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
n@501 789 mandatoryInput.setAttribute("name","mandatory");
n@501 790 mandatoryInput.addEventListener("change",this,false);
n@506 791 this.dynamic.appendChild(mandatory);
n@506 792 break;
n@506 793 case "number":
n@506 794 this.dynamic.appendChild(id);
n@506 795
n@506 796 var mandatory = document.createElement("div");
n@506 797 var mandatoryInput = document.createElement("input");
n@506 798 var mandatoryText = document.createElement("span");
n@506 799 mandatoryText.textContent = "Mandatory: ";
n@501 800 mandatory.appendChild(mandatoryText);
n@501 801 mandatory.appendChild(mandatoryInput);
n@506 802 mandatoryInput.type = "checkbox";
n@506 803 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
n@506 804 mandatoryInput.setAttribute("name","mandatory");
n@506 805 mandatoryInput.addEventListener("change",this,false);
n@501 806 this.dynamic.appendChild(mandatory);
n@506 807
n@506 808 var minimum = document.createElement("div");
n@506 809 var minimumEntry = document.createElement("input");
n@506 810 var minimumText = document.createElement("span");
n@506 811 minimumText.textContent = "Minimum: ";
n@506 812 minimum.appendChild(minimumText);
n@506 813 minimum.appendChild(minimumEntry);
n@506 814 minimumEntry.type = "number";
n@506 815 minimumEntry.setAttribute("name","min");
n@506 816 minimumEntry.addEventListener("change",this,false);
n@506 817 minimumEntry.value = this.option.min;
n@506 818 this.dynamic.appendChild(minimum);
n@506 819
n@506 820 var maximum = document.createElement("div");
n@506 821 var maximumEntry = document.createElement("input");
n@506 822 var maximumText = document.createElement("span");
n@506 823 maximumText.textContent = "Maximum: ";
n@506 824 maximum.appendChild(maximumText);
n@506 825 maximum.appendChild(maximumEntry);
n@506 826 maximumEntry.type = "number";
n@506 827 maximumEntry.setAttribute("name","max");
n@506 828 maximumEntry.addEventListener("change",this,false);
n@506 829 maximumEntry.value = this.option.max;
n@506 830 this.dynamic.appendChild(maximum);
n@501 831 break;
n@506 832 case "checkbox":
n@506 833 case "radio":
n@506 834 this.dynamic.appendChild(id);
n@506 835 var optionHolder = document.createElement("div");
n@506 836 optionHolder.className = 'node';
n@506 837 optionHolder.id = 'popup-option-holder';
n@506 838 var optionObject = function(parent,option) {
n@506 839 this.rootDOM = document.createElement("div");
n@506 840 this.rootDOM.className = "popup-option-entry";
n@506 841 this.inputName = document.createElement("input");
n@506 842 this.inputName.setAttribute("name","name");
n@506 843 this.inputLabel = document.createElement("input");
n@506 844 this.inputLabel.setAttribute("name","text");
n@506 845 this.specification = option;
n@506 846 this.parent = parent;
n@506 847 this.handleEvent = function()
n@506 848 {
n@506 849 var target = event.currentTarget.getAttribute("name");
n@506 850 eval("this.specification."+target+" = event.currentTarget.value");
n@506 851 };
n@506 852
n@506 853 var nameText = document.createElement("span");
n@506 854 nameText.textContent = "Name: ";
n@506 855 var labelText = document.createElement("span");
n@506 856 labelText.textContent = "Label: ";
n@506 857 this.rootDOM.appendChild(nameText);
n@506 858 this.rootDOM.appendChild(this.inputName);
n@506 859 this.rootDOM.appendChild(labelText);
n@506 860 this.rootDOM.appendChild(this.inputLabel);
n@506 861 this.inputName.addEventListener("change",this,false);
n@506 862 this.inputLabel.addEventListener("change",this,false);
n@506 863 this.inputName.value = this.specification.name;
n@506 864 this.inputLabel.value = this.specification.text;
n@506 865
n@506 866 this.deleteEntry = {
n@506 867 root: document.createElement("button"),
n@506 868 parent: this,
n@506 869 handleEvent: function() {
n@506 870 document.getElementById("popup-option-holder").removeChild(this.parent.rootDOM);
n@506 871 var index = this.parent.parent.option.options.findIndex(function(element,index,array){
n@506 872 if (element == this.parent.specification)
n@506 873 return true;
n@506 874 else
n@506 875 return false;
n@506 876 },this);
n@506 877 var optionList = this.parent.parent.option.options;
n@506 878 if (index == optionList.length-1) {
n@506 879 optionList = optionList.slice(0,index);
n@506 880 } else {
n@506 881 optionList = optionList.slice(0,index).concat(optionList.slice(index+1));
n@506 882 }
n@506 883 this.parent.parent.option.options = optionList;
n@506 884 }
n@506 885 };
n@506 886 this.deleteEntry.root.textContent = "Delete Option";
n@506 887 this.deleteEntry.root.addEventListener("click",this.deleteEntry,false);
n@506 888 this.rootDOM.appendChild(this.deleteEntry.root);
n@506 889 }
n@616 890 this.addEntry = {
n@616 891 parent: this,
n@616 892 root: document.createElement("button"),
n@616 893 handleEvent: function() {
n@616 894 var node = {name: "name", text: "text"};
n@616 895 var optionsList = this.parent.option.options;
n@616 896 optionsList.push(node);
n@616 897 var obj = new optionObject(this.parent,optionsList[optionsList.length-1]);
n@616 898 this.parent.optionLists.push(obj);
n@616 899 document.getElementById("popup-option-holder").appendChild(obj.rootDOM);
n@616 900 }
n@616 901 }
n@616 902 this.addEntry.root.textContent = "Add Option";
n@616 903 this.addEntry.root.addEventListener("click",this.addEntry);
n@616 904 this.dynamic.appendChild(this.addEntry.root);
n@506 905 for (var i=0; i<this.option.options.length; i++)
n@506 906 {
n@506 907 var obj = new optionObject(this,this.option.options[i]);
n@506 908 this.optionLists.push(obj);
n@506 909 optionHolder.appendChild(obj.rootDOM);
n@506 910 }
n@506 911 this.dynamic.appendChild(optionHolder);
n@501 912 }
n@501 913 }
n@501 914 this.handleEvent = function()
n@501 915 {
n@501 916 var name = event.currentTarget.getAttribute("name");
n@501 917 switch(name) {
n@501 918 case "type":
n@501 919 // If type has changed, we may need to rebuild the entire state node
n@501 920 if (event.currentTarget.value != this.option.name)
n@501 921 {
n@501 922 this.option.type = event.currentTarget.value;
n@501 923 this.generate(this.option,this.parent);
n@501 924 }
n@501 925 break;
n@501 926 case "mandatory":
n@501 927 this.option.mandatory = event.currentTarget.checked;
n@501 928 break;
n@501 929 case "boxsize":
n@501 930 this.option.boxsize = event.currentTarget.value;
n@501 931 break;
n@501 932 case "statement":
n@501 933 this.option.statement = event.currentTarget.value;
n@501 934 break;
n@501 935 }
n@501 936 }
n@501 937 this.continue = function()
n@501 938 {
n@506 939 if (this.parent.type == "surveyNode")
n@506 940 {
n@506 941 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
n@506 942 this.parent.children.push(newNode);
n@506 943 this.parent.childrenDOM.appendChild(newNode.rootDOM);
n@506 944 } else if (this.parent.type == "surveyEntryNode") {
n@506 945 this.parent.build();
n@506 946 }
n@501 947 popupObject.hide();
n@501 948 }
n@501 949 }
n@516 950 this.state[6] = new function() {
n@516 951 this.title = "Edit Scale Markers";
n@516 952 this.content = document.createElement("div");
n@516 953 this.content.id = "state-6";
n@516 954 var spnH = document.createElement('div');
n@516 955 var span = document.createElement("span");
n@516 956 span.textContent = "You can edit your scale markers here for the selected interface.";
n@516 957 spnH.appendChild(span);
n@516 958 this.scaleRoot;
n@516 959 this.parent;
n@516 960 this.markerNodes =[];
n@516 961 this.preset = {
n@516 962 input: document.createElement("select"),
n@516 963 parent: this,
n@516 964 handleEvent: function(event) {
n@516 965 this.parent.scaleRoot.scales = [];
n@516 966 var protoScale = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getAllElementsByName(event.currentTarget.value)[0];
n@516 967 var protoMarkers = protoScale.children;
n@516 968 for (var i=0; i<protoMarkers.length; i++)
n@516 969 {
n@516 970 var marker = {
n@516 971 position: protoMarkers[i].getAttribute("position"),
n@516 972 text: protoMarkers[i].textContent
n@516 973 }
n@516 974 this.parent.scaleRoot.scales.push(marker);
n@516 975 }
n@516 976 this.parent.buildMarkerList();
n@516 977 }
n@516 978 }
n@516 979 this.preset.input.addEventListener("change",this.preset);
n@516 980 this.content.appendChild(this.preset.input);
n@516 981 var optionHolder = document.createElement("div");
n@516 982 optionHolder.className = 'node';
n@516 983 optionHolder.id = 'popup-option-holder';
n@516 984 this.content.appendChild(optionHolder);
n@516 985 this.generate = function(scaleRoot,parent)
n@516 986 {
n@516 987 this.scaleRoot = scaleRoot;
n@516 988 this.parent = parent;
n@516 989
n@516 990 // Generate Pre-Set dropdown
n@516 991 var protoScales = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].children;
n@516 992 this.preset.input.innerHTML = "";
n@516 993
n@516 994 for (var i=0; i<protoScales.length; i++)
n@516 995 {
n@516 996 var selectOption = document.createElement("option");
n@516 997 var scaleName = protoScales[i].getAttribute("name");
n@516 998 selectOption.setAttribute("name",scaleName);
n@516 999 selectOption.textContent = scaleName;
n@516 1000 this.preset.input.appendChild(selectOption);
n@516 1001 }
n@516 1002
n@548 1003 this.addMarker = {
n@548 1004 root: document.createElement("button"),
n@548 1005 parent: this,
n@548 1006 handleEvent: function() {
n@548 1007 var marker = {
n@548 1008 position: 0,
n@548 1009 text: "text"
n@548 1010 };
n@548 1011 this.parent.scaleRoot.scales.push(marker);
n@548 1012 var markerNode = new this.parent.buildMarkerNode(this.parent,marker);
n@548 1013 document.getElementById("popup-option-holder").appendChild(markerNode.root);
n@548 1014 this.parent.markerNodes.push(markerNode);
n@548 1015 }
n@548 1016 };
n@548 1017 this.addMarker.root.textContent = "Add Marker";
n@548 1018 this.addMarker.root.addEventListener("click",this.addMarker);
n@548 1019 this.content.appendChild(this.addMarker.root);
n@548 1020
n@516 1021 // Create Marker List
n@516 1022 this.buildMarkerList();
n@516 1023 }
n@516 1024 this.buildMarkerList = function() {
n@516 1025 var markerInject = document.getElementById("popup-option-holder");
n@516 1026 markerInject.innerHTML = "";
n@516 1027 this.markerNodes = [];
n@516 1028 for (var i=0; i<this.scaleRoot.scales.length; i++)
n@516 1029 {
n@548 1030 var markerNode = new this.buildMarkerNode(this,this.scaleRoot.scales[i]);
n@516 1031 markerInject.appendChild(markerNode.root);
n@516 1032 this.markerNodes.push(markerNode);
n@516 1033
n@516 1034 }
n@516 1035 }
n@548 1036
n@548 1037 this.buildMarkerNode = function(parent,specification) {
n@548 1038 this.root = document.createElement("div");
n@548 1039 this.root.className = "popup-option-entry";
n@548 1040 this.positionInput = document.createElement("input");
n@548 1041 this.positionInput.min = 0;
n@548 1042 this.positionInput.max = 100;
n@548 1043 this.positionInput.value = specification.position;
n@548 1044 this.positionInput.setAttribute("name","position");
n@548 1045 this.textInput = document.createElement("input");
n@548 1046 this.textInput.setAttribute("name","text");
n@548 1047 this.textInput.value = specification.text;
n@548 1048 this.specification = specification;
n@548 1049 this.parent = parent;
n@548 1050 this.handleEvent = function(event) {
n@548 1051 switch(event.currentTarget.getAttribute("name"))
n@548 1052 {
n@548 1053 case "position":
n@548 1054 this.specification.position = Number(event.currentTarget.value);
n@548 1055 break;
n@548 1056 case "text":
n@548 1057 this.specification.text = event.currentTarget.value;
n@548 1058 break;
n@548 1059 }
n@548 1060 }
n@548 1061 this.positionInput.addEventListener("change",this,false);
n@548 1062 this.textInput.addEventListener("change",this,false);
n@548 1063
n@548 1064 var posText = document.createElement("span");
n@548 1065 posText.textContent = "Position: ";
n@548 1066 var textText = document.createElement("span");
n@548 1067 textText.textContent = "Text: ";
n@548 1068 this.root.appendChild(posText);
n@548 1069 this.root.appendChild(this.positionInput);
n@548 1070 this.root.appendChild(textText);
n@548 1071 this.root.appendChild(this.textInput);
n@548 1072
n@548 1073 this.deleteMarker = {
n@548 1074 root: document.createElement("button"),
n@548 1075 parent: this,
n@548 1076 handleEvent: function() {
n@548 1077 var index = this.parent.parent.scaleRoot.scales.findIndex(function(element,index,array){
n@548 1078 if (element == this) {return true;} else {return false;}
n@548 1079 },this.parent.specification)
n@548 1080 if (index >= 0) {
n@548 1081 this.parent.parent.scaleRoot.scales.splice(index,1);
n@548 1082 }
n@548 1083 document.getElementById("popup-option-holder").removeChild(this.parent.root);
n@548 1084 }
n@548 1085 }
n@548 1086 this.deleteMarker.root.addEventListener("click",this.deleteMarker);
n@548 1087 this.deleteMarker.root.textContent = "Delete Marker"
n@548 1088 this.root.appendChild(this.deleteMarker.root);
n@548 1089 }
n@516 1090 }
n@501 1091 }
n@501 1092 }
n@501 1093
n@501 1094 function SpecificationToHTML()
n@501 1095 {
n@501 1096 // This takes the specification node and converts it to an on-page HTML object
n@501 1097 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
n@501 1098 // Once generated, it directly binds into the specification object to update with changes
n@501 1099 // Fixed DOM entries
n@501 1100 this.injectDOM;
n@501 1101 this.setupDOM;
n@501 1102 this.pages = [];
n@501 1103
n@501 1104 // Self-contained generators
n@501 1105 this.createGeneralNodeDOM = function(name,id,parent)
n@501 1106 {
n@506 1107 this.type = name;
n@501 1108 var root = document.createElement('div');
n@501 1109 root.id = id;
n@501 1110 root.className = "node";
n@501 1111
n@501 1112 var titleDiv = document.createElement('div');
n@501 1113 titleDiv.className = "node-title";
n@501 1114 var title = document.createElement('span');
n@501 1115 title.className = "node-title";
n@501 1116 title.textContent = name;
n@501 1117 titleDiv.appendChild(title);
n@501 1118
n@501 1119 var attributeDiv = document.createElement('div');
n@501 1120 attributeDiv.className = "node-attributes";
n@501 1121
n@501 1122 var childrenDiv = document.createElement('div');
n@501 1123 childrenDiv.className = "node-children";
n@501 1124
n@501 1125 var buttonsDiv = document.createElement('div');
n@501 1126 buttonsDiv.className = "node-buttons";
n@501 1127
n@501 1128 root.appendChild(titleDiv);
n@501 1129 root.appendChild(attributeDiv);
n@501 1130 root.appendChild(childrenDiv);
n@501 1131 root.appendChild(buttonsDiv);
n@501 1132
n@501 1133 var obj = {
n@501 1134 rootDOM: root,
n@501 1135 titleDOM: title,
n@501 1136 attributeDOM: attributeDiv,
n@501 1137 attributes: [],
n@501 1138 childrenDOM: childrenDiv,
n@501 1139 children: [],
n@501 1140 buttonDOM: buttonsDiv,
n@501 1141 parent: parent
n@501 1142 }
n@501 1143 return obj;
n@501 1144 }
n@501 1145
n@501 1146 this.convertAttributeToDOM = function(node,schema)
n@501 1147 {
n@501 1148 // This takes an attribute schema node and returns an object with the input node and any bindings
n@501 1149 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
n@501 1150 {
n@501 1151 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
n@501 1152 }
n@501 1153 var obj = new function()
n@501 1154 {
n@501 1155 this.input;
n@501 1156 this.name;
n@501 1157 this.owner;
n@501 1158 this.holder;
n@501 1159
n@501 1160 this.name = schema.getAttribute('name');
n@501 1161 this.default = schema.getAttribute('default');
n@501 1162 this.dataType = schema.getAttribute('type');
n@616 1163 if (this.dataType == undefined) {
n@616 1164 if (schema.childElementCount > 0) {
n@616 1165 if (schema.children[0].nodeName == "xs:simpleType") {
n@616 1166 this.dataType = schema.getAllElementsByTagName("xs:restriction")[0].getAttribute("base");
n@616 1167 }
n@616 1168 }
n@616 1169 }
n@501 1170 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
n@501 1171 else {this.dataType = "string";}
n@501 1172 var minVar = undefined;
n@501 1173 var maxVar = undefined;
n@501 1174 switch(this.dataType)
n@501 1175 {
n@501 1176 case "negativeInteger":
n@501 1177 maxVar = -1;
n@501 1178 break;
n@501 1179 case "positiveInteger":
n@501 1180 minVar = 1;
n@501 1181 break;
n@501 1182 case "nonNegativeInteger":
n@501 1183 minVar = 0;
n@501 1184 break;
n@501 1185 case "nonPositiveInteger":
n@501 1186 maxVar = 0;
n@501 1187 break;
n@501 1188 case "byte":
n@501 1189 minVar = 0;
n@501 1190 maxVar = 256;
n@501 1191 break;
n@501 1192 case "short":
n@501 1193 minVar = 0;
n@501 1194 maxVar = 65536;
n@501 1195 break;
n@501 1196 default:
n@501 1197 break;
n@501 1198 }
n@501 1199
n@501 1200 this.input = document.createElement('input');
n@501 1201 switch(this.dataType)
n@501 1202 {
n@501 1203 case "boolean":
n@501 1204 this.input.type = "checkbox";
n@501 1205 break;
n@501 1206 case "negativeInteger":
n@501 1207 case "positiveInteger":
n@501 1208 case "nonNegativeInteger":
n@501 1209 case "nonPositiveInteger":
n@501 1210 case "integer":
n@501 1211 case "short":
n@501 1212 case "byte":
n@501 1213 this.input.step = 1;
n@501 1214 case "decimal":
n@501 1215 this.input.type = "number";
n@501 1216 this.input.min = minVar;
n@501 1217 this.input.max = maxVar;
n@501 1218 break;
n@501 1219 default:
n@501 1220 break;
n@501 1221 }
n@501 1222 var value;
n@504 1223 eval("value = node."+this.name)
n@501 1224 if (value != undefined)
n@501 1225 {
n@501 1226 this.input.value = value;
n@501 1227 } else if (this.default != undefined)
n@501 1228 {
n@501 1229 this.input.value = this.default;
n@501 1230 }
n@501 1231 this.handleEvent = function(event)
n@501 1232 {
n@501 1233 var value;
n@501 1234 switch(this.input.type)
n@501 1235 {
n@501 1236 case "checkbox":
n@501 1237 value = event.currentTarget.checked;
n@501 1238 break;
n@501 1239 case "number":
n@501 1240 value = Number(event.currentTarget.value);
n@501 1241 break;
n@501 1242 default:
n@501 1243 value = event.currentTarget.value;
n@501 1244 break;
n@501 1245 }
n@501 1246 eval("this.owner."+this.name+" = value");
n@501 1247 }
n@501 1248 this.holder = document.createElement('div');
n@501 1249 this.holder.className = "attribute";
n@501 1250 this.holder.setAttribute('name',this.name);
n@501 1251 var text = document.createElement('span');
n@501 1252 eval("text.textContent = attributeText."+this.name+"+': '");
n@501 1253 this.holder.appendChild(text);
n@501 1254 this.holder.appendChild(this.input);
n@501 1255 this.owner = node;
n@501 1256 this.input.addEventListener("change",this,false);
n@501 1257 }
n@501 1258 if (obj.attribute != null)
n@501 1259 {
n@501 1260 obj.input.value = obj.attribute;
n@501 1261 }
n@501 1262 return obj;
n@501 1263 }
n@501 1264
n@501 1265 this.convert = function(root)
n@501 1266 {
n@501 1267 //Performs the actual conversion using the given root DOM as the root
n@501 1268 this.injectDOM = root;
n@501 1269
n@504 1270 // Build the export button
n@504 1271 var exportButton = document.createElement("button");
n@504 1272 exportButton.textContent = "Export to XML";
n@504 1273 exportButton.onclick = function()
n@504 1274 {
n@504 1275 var doc = specification.encode();
n@504 1276 var obj = {};
n@504 1277 obj.title = "Export";
n@504 1278 obj.content = document.createElement("div");
n@504 1279 obj.content.id = "finish";
n@504 1280 var span = document.createElement("span");
n@504 1281 span.textContent = "Your XML document is linked below. On most browsers, simply right click on the link and select 'Save As'. Or clicking on the link may download the file directly."
n@504 1282 obj.content.appendChild(span);
n@504 1283 var link = document.createElement("div");
n@504 1284 link.appendChild(doc.children[0]);
n@504 1285 var file = [link.innerHTML];
n@504 1286 var bb = new Blob(file,{type : 'application/xml'});
n@504 1287 var dnlk = window.URL.createObjectURL(bb);
n@504 1288 var a = document.createElement("a");
n@504 1289 a.hidden = '';
n@504 1290 a.href = dnlk;
n@504 1291 a.download = "project-specification.xml";
n@504 1292 a.textContent = "Save File";
n@504 1293 obj.content.appendChild(a);
n@504 1294 popupObject.show();
n@504 1295 popupObject.postNode(obj);
n@504 1296 }
n@504 1297 this.injectDOM.appendChild(exportButton);
n@504 1298
n@501 1299 // First perform the setupNode;
n@501 1300 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
n@547 1301 this.setupDOM = new this.createGeneralNodeDOM('Global Configuration','setup',null);
n@501 1302 this.injectDOM.appendChild(this.setupDOM.rootDOM);
n@501 1303 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
n@501 1304 for (var i=0; i<setupAttributes.length; i++)
n@501 1305 {
n@501 1306 var attributeName = setupAttributes[i].getAttribute('name');
n@501 1307 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
n@501 1308 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
n@501 1309 this.setupDOM.attributes.push(attrObject);
n@501 1310 }
n@501 1311
n@501 1312 // Now we must build the interface Node
n@501 1313 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
n@501 1314 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
n@501 1315
n@501 1316 // Now build the Metrics selection node
n@547 1317 var metric = this.createGeneralNodeDOM("Session Metrics","setup-metric",this.setupDOM);
n@501 1318 metric.rootDOM.removeChild(metric.attributeDOM);
n@501 1319 this.setupDOM.children.push(metric);
n@501 1320 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
n@501 1321 var interfaceName = popupStateNodes.state[1].select.value;
n@501 1322 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
n@501 1323 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1324 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
n@501 1325 testXML = testXML.getAllElementsByTagName("metrics");
n@501 1326 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1327 {
n@501 1328 var obj = {
n@501 1329 input: document.createElement('input'),
n@501 1330 root: document.createElement('div'),
n@501 1331 text: document.createElement('span'),
n@501 1332 specification: specification.metrics.enabled,
n@501 1333 name: interfaceXML.children[i].getAttribute("name"),
n@501 1334 handleEvent: function()
n@501 1335 {
n@501 1336 for (var i=0; i<this.specification.length; i++)
n@501 1337 {
n@501 1338 if (this.specification[i] == this.name)
n@501 1339 {
n@501 1340 var options = this.specification;
n@501 1341 if (this.input.checked == false) {
n@501 1342 if (i == options.length)
n@501 1343 {options = options.slice(0,i);}
n@501 1344 else {
n@501 1345 options = options.slice(0,i).concat(options.slice(i+1));
n@501 1346 }
n@501 1347 } else {
n@501 1348 return;
n@501 1349 }
n@501 1350 this.specification = options;
n@501 1351 break;
n@501 1352 }
n@501 1353 }
n@501 1354 if (this.input.checked) {
n@501 1355 this.specification.push(this.name);
n@501 1356 }
n@501 1357 }
n@501 1358 };
n@501 1359 obj.root.className = "attribute";
n@501 1360 obj.input.type = "checkbox";
n@501 1361 obj.root.appendChild(obj.text);
n@501 1362 obj.root.appendChild(obj.input);
n@501 1363 obj.text.textContent = checkText.children[i].textContent;
n@501 1364 metric.children.push(obj);
n@501 1365 metric.childrenDOM.appendChild(obj.root);
n@537 1366 for (var j=0; j<specification.metrics.enabled.length; j++)
n@501 1367 {
n@537 1368 if (specification.metrics.enabled[j] == obj.name)
n@501 1369 {
n@501 1370 obj.input.checked = true;
n@501 1371 break;
n@501 1372 }
n@501 1373 }
n@501 1374 }
n@501 1375
n@501 1376 // Now both before and after surveys
n@501 1377 if (specification.preTest == undefined){
n@501 1378 specification.preTest = new specification.surveyNode();
n@501 1379 specification.preTest.location = "pre";
n@501 1380 }
n@501 1381 if (specification.postTest == undefined){
n@501 1382 specification.postTest = new specification.surveyNode();
n@501 1383 specification.postTest.location = "post";
n@501 1384 }
n@501 1385 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
n@501 1386 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
n@501 1387 this.setupDOM.children.push(surveyBefore);
n@501 1388 this.setupDOM.children.push(surveyAfter);
n@501 1389 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
n@501 1390 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
n@501 1391
n@501 1392 // Add in the page creator button
n@501 1393 this.addPage = {
n@501 1394 root: document.createElement("button"),
n@501 1395 parent: this,
n@501 1396 handleEvent: function()
n@501 1397 {
n@501 1398 var pageObj = new specification.page();
n@501 1399 specification.pages.push(pageObj);
n@501 1400 var newPage = new this.parent.pageNode(this.parent,pageObj);
n@501 1401 this.parent.injectDOM.appendChild(newPage.rootDOM);
n@501 1402 this.parent.pages.push(newPage);
n@501 1403 }
n@501 1404 }
n@501 1405 this.addPage.root.textContent = "Add Page";
n@501 1406 this.addPage.root.addEventListener("click",this.addPage,false);
n@501 1407 this.injectDOM.appendChild(this.addPage.root);
n@505 1408
n@505 1409 // Build each page
n@505 1410 for (var page of specification.pages)
n@505 1411 {
n@505 1412 var newPage = new this.pageNode(this,page);
n@505 1413 this.injectDOM.appendChild(newPage.rootDOM);
n@505 1414 this.pages.push(newPage);
n@505 1415 }
n@501 1416 }
n@501 1417
n@501 1418 this.interfaceNode = function(parent,rootObject)
n@501 1419 {
n@506 1420 this.type = "interfaceNode";
n@501 1421 this.rootDOM;
n@501 1422 this.titleDOM;
n@501 1423 this.attributeDOM;
n@501 1424 this.attributes = [];
n@501 1425 this.childrenDOM;
n@501 1426 this.children = [];
n@501 1427 this.buttonDOM;
n@501 1428 this.parent = parent;
n@501 1429 this.HTMLPoint;
n@501 1430 this.specification = rootObject;
n@501 1431 this.schema = specification.schema.getAllElementsByName("interface")[1];
n@501 1432
n@501 1433 this.createIOasAttr = function(name,specification,parent,type) {
n@501 1434 this.root = document.createElement('div');
n@501 1435 this.input = document.createElement("input");
n@501 1436 this.name = name;
n@501 1437 this.type = type;
n@501 1438 this.parent = parent;
n@501 1439 this.specification = specification;
n@501 1440 this.handleEvent = function(event) {
n@501 1441 for (var i=0; i<this.specification.options.length; i++)
n@501 1442 {
n@501 1443 if (this.specification.options[i].name == this.name)
n@501 1444 {
n@501 1445 var options = this.specification.options;
n@501 1446 if (this.input.checked == false) {
n@501 1447 if (i == options.length)
n@501 1448 {options = options.slice(0,i);}
n@501 1449 else {
n@501 1450 options = options.slice(0,i).concat(options.slice(i+1));
n@501 1451 }
n@501 1452 } else {
n@501 1453 return;
n@501 1454 }
n@501 1455 this.specification.options = options;
n@501 1456 break;
n@501 1457 }
n@501 1458 }
n@501 1459 if (this.input.checked) {
n@501 1460 var obj = {
n@501 1461 name: this.name,
n@501 1462 type: this.type
n@501 1463 };
n@501 1464 this.specification.options.push(obj);
n@501 1465 }
n@501 1466 if (this.parent.HTMLPoint.id == "setup")
n@501 1467 {
n@501 1468 // We've changed a global setting, must update all child 'interfaces' and disable them
n@501 1469 for (pages of convert.pages)
n@501 1470 {
n@501 1471 for (interface of pages.interfaces)
n@501 1472 {
n@501 1473 if (this.type == "check")
n@501 1474 {
n@501 1475 for (node of interface.children[0].attributes)
n@501 1476 {
n@501 1477 if (node.name == this.name) {
n@501 1478 if (this.input.checked) {
n@501 1479 node.input.disabled = true;
n@501 1480 node.input.checked = false;
n@501 1481 } else {
n@501 1482 node.input.disabled = false;
n@501 1483 }
n@501 1484 break;
n@501 1485 }
n@501 1486 }
n@501 1487 } else if (this.type == "show")
n@501 1488 {
n@501 1489 for (node of interface.children[1].attributes)
n@501 1490 {
n@501 1491 if (node.name == this.name) {
n@501 1492 if (this.input.checked) {
n@501 1493 node.input.disabled = true;
n@501 1494 } else {
n@501 1495 node.input.disabled = false;
n@501 1496 }
n@501 1497 break;
n@501 1498 }
n@501 1499 }
n@501 1500 }
n@501 1501 }
n@501 1502 }
n@501 1503 }
n@501 1504 };
n@501 1505 this.findIndex = function(element,index,array){
n@501 1506 if (element.name == this.name)
n@501 1507 return true;
n@501 1508 else
n@501 1509 return false;
n@501 1510 };
n@501 1511 this.findNode = function(element,index,array){
n@501 1512 if (element.name == this.name)
n@501 1513 return true;
n@501 1514 else
n@501 1515 return false;
n@501 1516 };
n@501 1517 this.input.type = "checkbox";
n@501 1518 this.input.setAttribute("name",name);
n@501 1519 this.input.addEventListener("change",this,false);
n@501 1520 this.root.appendChild(this.input);
n@501 1521 this.root.className = "attribute";
n@501 1522 return this;
n@501 1523 }
n@501 1524
n@501 1525 this.build = function(name,id,parent)
n@501 1526 {
n@501 1527 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
n@501 1528
n@501 1529 this.rootDOM = obj.rootDOM;
n@501 1530 this.titleDOM = obj.titleDOM;
n@501 1531 this.attributeDOM = obj.attributeDOM;
n@501 1532 this.childrenDOM = obj.childrenDOM;
n@501 1533 this.buttonDOM = obj.buttonsDOM;
n@501 1534 this.HTMLPoint = parent;
n@501 1535 this.rootDOM.removeChild(this.attributeDOM);
n@501 1536 // Put in the check / show options as individual children
n@501 1537 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
n@501 1538
n@501 1539 var interfaceName = popupStateNodes.state[1].select.value;
n@501 1540 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
n@501 1541 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1542 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
n@501 1543 testXML = testXML.getAllElementsByTagName("checks");
n@501 1544 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1545 {
n@501 1546 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"check");
n@501 1547 for (var option of this.specification.options)
n@501 1548 {
n@501 1549 if (option.name == obj.name)
n@501 1550 {
n@501 1551 obj.input.checked = true;
n@501 1552 break;
n@501 1553 }
n@501 1554 }
n@501 1555 if (parent.id != "setup") {
n@501 1556 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
n@512 1557 if (node != undefined) {
n@512 1558 if (node.input.checked) {
n@512 1559 obj.input.checked = false;
n@512 1560 obj.input.disabled = true;
n@512 1561 }
n@501 1562 }
n@501 1563 }
n@501 1564 var text = document.createElement('span');
n@501 1565 text.textContent = checkText.children[i].textContent;
n@501 1566 obj.root.appendChild(text);
n@501 1567 checks.attributeDOM.appendChild(obj.root);
n@501 1568 checks.attributes.push(obj);
n@501 1569 }
n@501 1570 this.children.push(checks);
n@501 1571 this.childrenDOM.appendChild(checks.rootDOM);
n@501 1572
n@501 1573 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
n@501 1574 interfaceName = popupStateNodes.state[1].select.value;
n@501 1575 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
n@501 1576 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1577 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
n@501 1578 testXML = testXML.getAllElementsByTagName("show");
n@501 1579 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1580 {
n@501 1581 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"show");
n@501 1582 for (var option of this.specification.options)
n@501 1583 {
n@501 1584 if (option.name == obj.name)
n@501 1585 {
n@501 1586 obj.input.checked = true;
n@501 1587 break;
n@501 1588 }
n@501 1589 }
n@501 1590 if (parent.id != "setup") {
n@501 1591 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
n@512 1592 if (node != undefined) {
n@512 1593 if (node.input.checked) {
n@512 1594 obj.input.checked = false;
n@512 1595 obj.input.disabled = true;
n@512 1596 }
n@501 1597 }
n@501 1598 }
n@501 1599 var text = document.createElement('span');
n@501 1600 text.textContent = checkText.children[i].textContent;
n@501 1601 obj.root.appendChild(text);
n@501 1602 show.attributeDOM.appendChild(obj.root);
n@501 1603 show.attributes.push(obj);
n@501 1604 }
n@501 1605 this.children.push(show);
n@501 1606 this.childrenDOM.appendChild(show.rootDOM);
n@501 1607
n@501 1608 if (parent.id == "setup")
n@501 1609 {
n@501 1610 } else {
n@501 1611 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
n@501 1612 this.attributeDOM.appendChild(nameAttr.holder);
n@501 1613 this.attributes.push(nameAttr);
n@516 1614 var scales = new this.scalesNode(this,this.specification);
n@516 1615 this.children.push(scales);
n@516 1616 this.childrenDOM.appendChild(scales.rootDOM);
n@501 1617 }
n@501 1618 if (parent != undefined)
n@501 1619 {
n@501 1620 parent.appendChild(this.rootDOM);
n@501 1621 }
n@501 1622 }
n@516 1623
n@516 1624 this.scalesNode = function(parent,rootObject)
n@516 1625 {
n@516 1626 this.type = "scalesNode";
n@516 1627 this.rootDOM = document.createElement("div");
n@516 1628 this.titleDOM = document.createElement("span");
n@516 1629 this.attributeDOM = document.createElement("div");
n@516 1630 this.attributes = [];
n@516 1631 this.childrenDOM = document.createElement("div");
n@516 1632 this.children = [];
n@516 1633 this.buttonDOM = document.createElement("div");
n@516 1634 this.parent = parent;
n@516 1635 this.specification = rootObject;
n@516 1636 this.schema = specification.schema.getAllElementsByName("page")[0];
n@516 1637 this.rootDOM.className = "node";
n@516 1638
n@516 1639 var titleDiv = document.createElement('div');
n@516 1640 titleDiv.className = "node-title";
n@516 1641 this.titleDOM.className = "node-title";
n@516 1642 this.titleDOM.textContent = "Interface Scales";
n@516 1643 titleDiv.appendChild(this.titleDOM);
n@516 1644
n@516 1645 this.attributeDOM.className = "node-attributes";
n@516 1646 this.childrenDOM.className = "node-children";
n@516 1647 this.buttonDOM.className = "node-buttons";
n@516 1648
n@516 1649 this.rootDOM.appendChild(titleDiv);
n@516 1650 this.rootDOM.appendChild(this.attributeDOM);
n@516 1651 this.rootDOM.appendChild(this.childrenDOM);
n@516 1652 this.rootDOM.appendChild(this.buttonDOM);
n@516 1653
n@516 1654 this.editButton = {
n@516 1655 button: document.createElement("button"),
n@516 1656 parent: this,
n@516 1657 handleEvent: function(event) {
n@516 1658 popupObject.show();
n@516 1659 popupObject.postNode(popupStateNodes.state[6]);
n@516 1660 popupStateNodes.state[6].generate(this.parent.specification,this.parent);
n@516 1661 }
n@516 1662 };
n@516 1663 this.editButton.button.textContent = "Edit Scales/Markers";
n@516 1664 this.editButton.button.addEventListener("click",this.editButton,false);
n@516 1665 this.buttonDOM.appendChild(this.editButton.button);
n@516 1666 }
n@501 1667 }
n@501 1668
n@501 1669 this.surveyNode = function(parent,rootObject,location)
n@501 1670 {
n@506 1671 this.type = "surveyNode";
n@501 1672 this.rootDOM = document.createElement("div");
n@501 1673 this.titleDOM = document.createElement("span");
n@501 1674 this.attributeDOM = document.createElement("div");
n@501 1675 this.attributes = [];
n@501 1676 this.childrenDOM = document.createElement("div");
n@501 1677 this.children = [];
n@501 1678 this.buttonDOM = document.createElement("div");
n@501 1679 this.parent = parent;
n@501 1680 this.specification = rootObject;
n@501 1681 this.schema = specification.schema.getAllElementsByName("survey")[1];
n@501 1682 this.rootDOM.className = "node";
n@501 1683
n@501 1684 var titleDiv = document.createElement('div');
n@501 1685 titleDiv.className = "node-title";
n@501 1686 this.titleDOM.className = "node-title";
n@501 1687 this.titleDOM.textContent = "Survey";
n@501 1688 titleDiv.appendChild(this.titleDOM);
n@501 1689
n@501 1690 this.attributeDOM.className = "node-attributes";
n@501 1691 var locationAttr = document.createElement("span");
n@501 1692 this.attributeDOM.appendChild(locationAttr);
n@501 1693 if (location == "Pre" || location == "pre") {
n@501 1694 locationAttr.textContent = "Location: Before";
n@501 1695 } else {
n@501 1696 locationAttr.textContent = "Location: After";
n@501 1697 }
n@501 1698 this.childrenDOM.className = "node-children";
n@501 1699 this.buttonDOM.className = "node-buttons";
n@501 1700
n@501 1701 this.rootDOM.appendChild(titleDiv);
n@501 1702 this.rootDOM.appendChild(this.attributeDOM);
n@501 1703 this.rootDOM.appendChild(this.childrenDOM);
n@501 1704 this.rootDOM.appendChild(this.buttonDOM);
n@501 1705
n@501 1706 this.surveyEntryNode = function(parent,rootObject)
n@501 1707 {
n@506 1708 this.type = "surveyEntryNode";
n@501 1709 this.rootDOM = document.createElement("div");
n@501 1710 this.titleDOM = document.createElement("span");
n@501 1711 this.attributeDOM = document.createElement("div");
n@501 1712 this.attributes = [];
n@501 1713 this.childrenDOM = document.createElement("div");
n@501 1714 this.children = [];
n@501 1715 this.buttonDOM = document.createElement("div");
n@501 1716 this.parent = parent;
n@501 1717 this.specification = rootObject;
n@501 1718 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
n@501 1719
n@501 1720 this.rootDOM.className = "node";
n@501 1721 this.rootDOM.style.minWidth = "50%";
n@501 1722
n@501 1723 var titleDiv = document.createElement('div');
n@501 1724 titleDiv.className = "node-title";
n@501 1725 this.titleDOM.className = "node-title";
n@501 1726 titleDiv.appendChild(this.titleDOM);
n@501 1727
n@501 1728 this.attributeDOM.className = "node-attributes";
n@501 1729 this.childrenDOM.className = "node-children";
n@501 1730 this.buttonDOM.className = "node-buttons";
n@501 1731
n@501 1732 this.rootDOM.appendChild(titleDiv);
n@501 1733 this.rootDOM.appendChild(this.attributeDOM);
n@501 1734 this.rootDOM.appendChild(this.childrenDOM);
n@501 1735 this.rootDOM.appendChild(this.buttonDOM);
n@501 1736
n@506 1737 this.build = function()
n@506 1738 {
n@506 1739 this.attributeDOM.innerHTML = null;
n@506 1740 this.childrenDOM.innerHTML = null;
n@506 1741 var statementRoot = document.createElement("div");
n@506 1742 var statement = document.createElement("span");
n@506 1743 statement.textContent = "Statement / Question: "+this.specification.statement;
n@506 1744 statementRoot.appendChild(statement);
n@506 1745 this.children.push(statementRoot);
n@506 1746 this.childrenDOM.appendChild(statementRoot);
n@506 1747 switch(this.specification.type)
n@506 1748 {
n@506 1749 case "statement":
n@506 1750 this.titleDOM.textContent = "Statement";
n@506 1751 break;
n@506 1752 case "question":
n@506 1753 this.titleDOM.textContent = "Question";
n@506 1754 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1755 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
n@506 1756 var boxsize = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("boxsize")[0]);
n@506 1757 this.attributeDOM.appendChild(id.holder);
n@506 1758 this.attributes.push(id);
n@506 1759 this.attributeDOM.appendChild(mandatory.holder);
n@506 1760 this.attributes.push(mandatory);
n@506 1761 this.attributeDOM.appendChild(boxsize.holder);
n@506 1762 this.attributes.push(boxsize);
n@506 1763 break;
n@506 1764 case "number":
n@506 1765 this.titleDOM.textContent = "Number";
n@506 1766 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1767 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
n@506 1768 var min = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("min")[0]);
n@506 1769 var max = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("max")[0]);
n@506 1770 this.attributeDOM.appendChild(id.holder);
n@506 1771 this.attributes.push(id);
n@506 1772 this.attributeDOM.appendChild(min.holder);
n@506 1773 this.attributes.push(min);
n@506 1774 this.attributeDOM.appendChild(max.holder);
n@506 1775 this.attributes.push(max);
n@506 1776 break;
n@506 1777 case "checkbox":
n@506 1778 this.titleDOM.textContent = "Checkbox";
n@506 1779 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1780 this.attributeDOM.appendChild(id.holder);
n@506 1781 this.attributes.push(id);
n@506 1782 break;
n@506 1783 case "radio":
n@506 1784 this.titleDOM.textContent = "Radio";
n@506 1785 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1786 this.attributeDOM.appendChild(id.holder);
n@506 1787 this.attributes.push(id);
n@506 1788 break;
n@506 1789 }
n@501 1790 }
n@506 1791 this.build();
n@501 1792
n@501 1793 this.editNode = {
n@501 1794 root: document.createElement("button"),
n@501 1795 parent: this,
n@501 1796 handleEvent: function()
n@501 1797 {
n@501 1798 popupObject.show();
n@506 1799 popupStateNodes.state[5].generate(this.parent.specification,this.parent);
n@501 1800 popupObject.postNode(popupStateNodes.state[5]);
n@501 1801 }
n@501 1802 }
n@501 1803 this.editNode.root.textContent = "Edit Entry";
n@501 1804 this.editNode.root.addEventListener("click",this.editNode,false);
n@501 1805 this.buttonDOM.appendChild(this.editNode.root);
n@501 1806
n@501 1807 this.deleteNode = {
n@501 1808 root: document.createElement("button"),
n@501 1809 parent: this,
n@501 1810 handleEvent: function()
n@501 1811 {
n@501 1812 var optionList = this.parent.parent.specification.options;
n@501 1813 var childList = this.parent.parent.children;
n@501 1814 for (var i=0; i <this.parent.parent.specification.options.length; i++)
n@501 1815 {
n@501 1816 var option = this.parent.parent.specification.options[i];
n@501 1817 if (option == this.parent.specification)
n@501 1818 {
n@501 1819 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
n@501 1820 if (i == this.parent.parent.specification.options.length-1)
n@501 1821 {
n@501 1822 optionList = optionList.slice(0,i);
n@501 1823 childList = childList.slice(0,i);
n@501 1824 }
n@501 1825 else {
n@501 1826 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
n@501 1827 childList = childList.slice(0,i).concat(childList.slice(i+1));
n@501 1828 }
n@501 1829 this.parent.parent.specification.options = optionList;
n@501 1830 this.parent.parent.children = childList;
n@501 1831 }
n@501 1832 }
n@501 1833 }
n@501 1834 }
n@501 1835 this.deleteNode.root.textContent = "Delete Entry";
n@501 1836 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
n@501 1837 this.buttonDOM.appendChild(this.deleteNode.root);
n@501 1838 }
n@501 1839 this.addNode = {
n@501 1840 root: document.createElement("button"),
n@501 1841 parent: this,
n@501 1842 handleEvent: function()
n@501 1843 {
n@501 1844 var newNode = new this.parent.specification.OptionNode();
n@501 1845 this.parent.specification.options.push(newNode);
n@501 1846 popupObject.show();
n@501 1847 popupStateNodes.state[5].generate(newNode,this.parent);
n@501 1848 popupObject.postNode(popupStateNodes.state[5]);
n@501 1849 }
n@501 1850 }
n@501 1851 this.addNode.root.textContent = "Add Survey Entry";
n@501 1852 this.addNode.root.addEventListener("click",this.addNode,false);
n@501 1853 this.buttonDOM.appendChild(this.addNode.root);
n@501 1854
n@501 1855 for (var option of this.specification.options)
n@501 1856 {
n@501 1857 var newNode = new this.surveyEntryNode(this,option);
n@501 1858 this.children.push(newNode);
n@501 1859 this.childrenDOM.appendChild(newNode.rootDOM);
n@501 1860 }
n@501 1861 }
n@501 1862
n@501 1863 this.pageNode = function(parent,rootObject)
n@501 1864 {
n@506 1865 this.type = "pageNode";
n@501 1866 this.rootDOM = document.createElement("div");
n@501 1867 this.titleDOM = document.createElement("span");
n@501 1868 this.attributeDOM = document.createElement("div");
n@501 1869 this.attributes = [];
n@501 1870 this.childrenDOM = document.createElement("div");
n@501 1871 this.children = [];
n@501 1872 this.buttonDOM = document.createElement("div");
n@501 1873 this.parent = parent;
n@501 1874 this.specification = rootObject;
n@501 1875 this.schema = specification.schema.getAllElementsByName("page")[0];
n@501 1876 this.rootDOM.className = "node";
n@501 1877
n@501 1878 var titleDiv = document.createElement('div');
n@501 1879 titleDiv.className = "node-title";
n@501 1880 this.titleDOM.className = "node-title";
n@501 1881 this.titleDOM.textContent = "Test Page";
n@501 1882 titleDiv.appendChild(this.titleDOM);
n@501 1883
n@501 1884 this.attributeDOM.className = "node-attributes";
n@501 1885 this.childrenDOM.className = "node-children";
n@501 1886 this.buttonDOM.className = "node-buttons";
n@501 1887
n@501 1888 this.rootDOM.appendChild(titleDiv);
n@501 1889 this.rootDOM.appendChild(this.attributeDOM);
n@501 1890 this.rootDOM.appendChild(this.childrenDOM);
n@501 1891 this.rootDOM.appendChild(this.buttonDOM);
n@501 1892
n@501 1893 // Do the comment prefix node
n@501 1894 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
n@501 1895 cpn.rootDOM.removeChild(cpn.attributeDOM);
n@501 1896 var obj = {
n@501 1897 root: document.createElement("div"),
n@501 1898 input: document.createElement("input"),
n@501 1899 parent: this,
n@501 1900 handleEvent: function()
n@501 1901 {
n@501 1902 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
n@501 1903 }
n@501 1904 }
n@501 1905 cpn.children.push(obj);
n@501 1906 cpn.childrenDOM.appendChild(obj.root);
n@501 1907 obj.root.appendChild(obj.input);
n@501 1908 obj.input.addEventListener("change",obj,false);
n@501 1909 obj.input.value = this.specification.commentBoxPrefix;
n@501 1910 this.childrenDOM.appendChild(cpn.rootDOM);
n@501 1911 this.children.push(cpn);
n@501 1912
n@501 1913 // Now both before and after surveys
n@501 1914 if (this.specification.preTest == undefined){
n@501 1915 this.specification.preTest = new specification.surveyNode();
n@501 1916 this.specification.preTest.location = "pre";
n@501 1917 }
n@501 1918 if (this.specification.postTest == undefined){
n@501 1919 this.specification.postTest = new specification.surveyNode();
n@501 1920 this.specification.postTest.location = "post";
n@501 1921 }
n@501 1922 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
n@501 1923 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
n@501 1924 this.children.push(surveyBefore);
n@501 1925 this.children.push(surveyAfter);
n@501 1926 this.childrenDOM.appendChild(surveyBefore.rootDOM);
n@501 1927 this.childrenDOM.appendChild(surveyAfter.rootDOM);
n@501 1928
n@501 1929 // Build the attributes
n@501 1930 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
n@501 1931 for (var i=0; i<attributeList.length; i++)
n@501 1932 {
n@501 1933 var attributeName = attributeList[i].getAttribute('name');
n@501 1934 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
n@501 1935 this.attributeDOM.appendChild(attrObject.holder);
n@501 1936 this.attributes.push(attrObject);
n@501 1937 }
n@501 1938
n@501 1939 this.interfaces = [];
n@501 1940
n@501 1941 this.audioElementNode = function(parent,rootObject)
n@501 1942 {
n@506 1943 this.type = "audioElementNode";
n@501 1944 this.rootDOM = document.createElement("div");
n@501 1945 this.titleDOM = document.createElement("span");
n@501 1946 this.attributeDOM = document.createElement("div");
n@501 1947 this.attributes = [];
n@501 1948 this.childrenDOM = document.createElement("div");
n@501 1949 this.children = [];
n@501 1950 this.buttonDOM = document.createElement("div");
n@501 1951 this.parent = parent;
n@501 1952 this.specification = rootObject;
n@501 1953 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
n@501 1954 this.rootDOM.className = "node";
n@501 1955
n@501 1956 var titleDiv = document.createElement('div');
n@501 1957 titleDiv.className = "node-title";
n@501 1958 this.titleDOM.className = "node-title";
n@501 1959 this.titleDOM.textContent = "Audio Element";
n@501 1960 titleDiv.appendChild(this.titleDOM);
n@501 1961
n@501 1962 this.attributeDOM.className = "node-attributes";
n@501 1963 this.childrenDOM.className = "node-children";
n@501 1964 this.buttonDOM.className = "node-buttons";
n@501 1965
n@501 1966 this.rootDOM.appendChild(titleDiv);
n@501 1967 this.rootDOM.appendChild(this.attributeDOM);
n@501 1968 this.rootDOM.appendChild(this.childrenDOM);
n@501 1969 this.rootDOM.appendChild(this.buttonDOM);
n@501 1970
n@501 1971 // Build the attributes
n@501 1972 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
n@501 1973 for (var i=0; i<attributeList.length; i++)
n@501 1974 {
n@501 1975 var attributeName = attributeList[i].getAttribute('name');
n@501 1976 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
n@501 1977 this.attributeDOM.appendChild(attrObject.holder);
n@501 1978 this.attributes.push(attrObject);
n@501 1979 }
n@501 1980
n@501 1981 this.deleteNode = {
n@501 1982 root: document.createElement("button"),
n@501 1983 parent: this,
n@501 1984 handleEvent: function()
n@501 1985 {
n@501 1986 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
n@501 1987 if (i >= 0) {
n@501 1988 var aeList = this.parent.parent.specification.audioElements;
n@501 1989 if (i < aeList.length-1) {
n@501 1990 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
n@501 1991 } else {
n@501 1992 aeList = aeList.slice(0,i);
n@501 1993 }
n@501 1994 }
n@501 1995 i = this.parent.parent.children.findIndex(function(element,index,array){
n@501 1996 if (element == this.parent)
n@501 1997 return true;
n@501 1998 else
n@501 1999 return false;
n@501 2000 },this);
n@501 2001 if (i >= 0) {
n@501 2002 var childList = this.parent.children;
n@501 2003 if (i < aeList.length-1) {
n@501 2004 childList = childList.slice(0,i).concat(childList.slice(i+1));
n@501 2005 } else {
n@501 2006 childList = childList.slice(0,i);
n@501 2007 }
n@501 2008 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
n@501 2009 }
n@501 2010 },
n@501 2011 findNode: function(element,index,array){
n@501 2012 if (element == this.parent.specification)
n@501 2013 return true;
n@501 2014 else
n@501 2015 return false;
n@501 2016 }
n@501 2017 }
n@501 2018 this.deleteNode.root.textContent = "Delete Entry";
n@501 2019 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
n@501 2020 this.buttonDOM.appendChild(this.deleteNode.root);
n@501 2021 }
n@501 2022
n@501 2023 this.commentQuestionNode = function(parent,rootObject)
n@501 2024 {
n@506 2025 this.type = "commentQuestionNode";
n@501 2026 this.rootDOM = document.createElement("div");
n@501 2027 this.titleDOM = document.createElement("span");
n@501 2028 this.attributeDOM = document.createElement("div");
n@501 2029 this.attributes = [];
n@501 2030 this.childrenDOM = document.createElement("div");
n@501 2031 this.children = [];
n@501 2032 this.buttonDOM = document.createElement("div");
n@501 2033 this.parent = parent;
n@501 2034 this.specification = rootObject;
n@501 2035 this.schema = specification.schema.getAllElementsByName("page")[0];
n@501 2036 this.rootDOM.className = "node";
n@501 2037
n@501 2038 var titleDiv = document.createElement('div');
n@501 2039 titleDiv.className = "node-title";
n@501 2040 this.titleDOM.className = "node-title";
n@501 2041 this.titleDOM.textContent = "Test Page";
n@501 2042 titleDiv.appendChild(this.titleDOM);
n@501 2043
n@501 2044 this.attributeDOM.className = "node-attributes";
n@501 2045 this.childrenDOM.className = "node-children";
n@501 2046 this.buttonDOM.className = "node-buttons";
n@501 2047
n@501 2048 this.rootDOM.appendChild(titleDiv);
n@501 2049 this.rootDOM.appendChild(this.attributeDOM);
n@501 2050 this.rootDOM.appendChild(this.childrenDOM);
n@501 2051 this.rootDOM.appendChild(this.buttonDOM);
n@501 2052
n@501 2053 }
n@501 2054
n@505 2055 // Build the components
n@525 2056 if (this.specification.interfaces.length == 0) {
n@525 2057 this.specification.interfaces.push(new specification.interfaceNode());
n@525 2058 }
n@512 2059 for (var interfaceObj of this.specification.interfaces)
n@512 2060 {
n@512 2061 var newInterface = new this.parent.interfaceNode(this.parent,interfaceObj);
n@512 2062 newInterface.build("Interface",""+this.specification.id+"-interface",this.childrenDOM);
n@512 2063 this.children.push(newInterface);
n@512 2064 this.interfaces.push(newInterface);
n@512 2065 }
n@512 2066
n@505 2067 for (var elements of this.specification.audioElements)
n@505 2068 {
n@505 2069 var audioElementDOM = new this.audioElementNode(this,elements);
n@505 2070 this.children.push(audioElementDOM);
n@505 2071 this.childrenDOM.appendChild(audioElementDOM.rootDOM);
n@505 2072 }
n@505 2073
n@501 2074 this.addInterface = {
n@501 2075 root: document.createElement("button"),
n@501 2076 parent: this,
n@501 2077 handleEvent: function() {
n@501 2078 var InterfaceObj = new specification.interfaceNode();
n@501 2079 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
n@501 2080 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
n@501 2081 this.parent.children.push(newInterface);
n@501 2082 this.parent.specification.interfaces.push(InterfaceObj);
n@501 2083 this.parent.interfaces.push(newInterface);
n@501 2084 }
n@501 2085 }
n@501 2086 this.addInterface.root.textContent = "Add Interface";
n@501 2087 this.addInterface.root.addEventListener("click",this.addInterface,false);
n@501 2088 this.buttonDOM.appendChild(this.addInterface.root);
n@501 2089
n@501 2090 this.addAudioElement = {
n@501 2091 root: document.createElement("button"),
n@501 2092 parent: this,
n@501 2093 handleEvent: function() {
n@501 2094 var audioElementObject = new this.parent.specification.audioElementNode();
n@501 2095 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
n@501 2096 this.parent.specification.audioElements.push(audioElementObject);
n@501 2097 this.parent.children.push(audioElementDOM);
n@501 2098 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
n@501 2099 }
n@501 2100 }
n@501 2101 this.addAudioElement.root.textContent = "Add Audio Element";
n@501 2102 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
n@501 2103 this.buttonDOM.appendChild(this.addAudioElement.root);
n@501 2104 }
n@501 2105 }