annotate test_create/test_core.js @ 577:80e6cf42a17b Dev_main

WAC2016 review updated PDF
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Thu, 25 Feb 2016 11:57:24 +0000
parents cce99fc682d8
children 6b7ac72ccec8
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@501 702 var select = document.createElement("select");
n@501 703 select.setAttribute("name","type");
n@501 704 select.addEventListener("change",this,false);
n@501 705 this.content.appendChild(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@501 711 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("type")[0].getAllElementsByTagName("xs:enumeration");
n@501 712 for (var i=0; i<optionList.length; i++)
n@501 713 {
n@501 714 var selectOption = document.createElement("option");
n@501 715 selectOption.value = optionList[i].getAttribute("value");
n@501 716 selectOption.textContent = selectOption.value;
n@501 717 select.appendChild(selectOption);
n@501 718 }
n@501 719 if (this.option.type != undefined){
n@501 720 select.value = this.option.type
n@501 721 } else {
n@501 722 select.value = "statement";
n@501 723 this.option.type = "statement";
n@501 724 }
n@501 725
n@501 726 this.dynamic.innerHTML = null;
n@501 727 var statement = document.createElement("div");
n@501 728 var statementText = document.createElement("span");
n@501 729 var statementEntry = document.createElement("textarea");
n@501 730 statement.appendChild(statementText);
n@501 731 statement.appendChild(statementEntry);
n@501 732 statementText.textContent = "Statement/Question";
n@501 733 statementEntry.addEventListener("change",this,false);
n@501 734 statementEntry.setAttribute("name","statement");
n@501 735 statementEntry.value = this.option.statement;
n@501 736 this.dynamic.appendChild(statement);
n@506 737
n@506 738 var id = document.createElement("div");
n@506 739 var idText = document.createElement("span");
n@506 740 var idEntry = document.createElement("input");
n@506 741 id.appendChild(idText);
n@506 742 id.appendChild(idEntry);
n@506 743 idText.textContent = "ID: ";
n@506 744 idEntry.addEventListener("change",this,false);
n@506 745 idEntry.setAttribute("name","id");
n@506 746 idEntry.value = this.option.id;
n@506 747
n@501 748 switch(this.option.type)
n@501 749 {
n@501 750 case "statement":
n@501 751 break;
n@501 752 case "question":
n@506 753 this.dynamic.appendChild(id);
n@501 754 var boxsizeSelect = document.createElement("select");
n@501 755 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("boxsize")[0].getAllElementsByTagName("xs:enumeration");
n@501 756 for (var i=0; i<optionList.length; i++)
n@501 757 {
n@501 758 var selectOption = document.createElement("option");
n@501 759 selectOption.value = optionList[i].getAttribute("value");
n@501 760 selectOption.textContent = selectOption.value;
n@501 761 boxsizeSelect.appendChild(selectOption);
n@501 762 }
n@501 763 if(this.option.boxsize != undefined) {
n@501 764 boxsizeSelect.value = this.option.boxsize;
n@501 765 } else {
n@501 766 boxsizeSelect.value = "normal";
n@501 767 this.option.boxsize = "normal";
n@501 768 }
n@501 769 boxsizeSelect.setAttribute("name","boxsize");
n@501 770 boxsizeSelect.addEventListener("change",this,false);
n@501 771 var boxsize = document.createElement("div");
n@501 772 var boxsizeText = document.createElement("span");
n@501 773 boxsizeText.textContent = "Entry Size: ";
n@501 774 boxsize.appendChild(boxsizeText);
n@501 775 boxsize.appendChild(boxsizeSelect);
n@501 776 this.dynamic.appendChild(boxsize);
n@501 777
n@501 778 var mandatory = document.createElement("div");
n@501 779 var mandatoryInput = document.createElement("input");
n@501 780 var mandatoryText = document.createElement("span");
n@501 781 mandatoryText.textContent = "Mandatory: ";
n@501 782 mandatory.appendChild(mandatoryText);
n@501 783 mandatory.appendChild(mandatoryInput);
n@501 784 mandatoryInput.type = "checkbox";
n@501 785 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
n@501 786 mandatoryInput.setAttribute("name","mandatory");
n@501 787 mandatoryInput.addEventListener("change",this,false);
n@506 788 this.dynamic.appendChild(mandatory);
n@506 789 break;
n@506 790 case "number":
n@506 791 this.dynamic.appendChild(id);
n@506 792
n@506 793 var mandatory = document.createElement("div");
n@506 794 var mandatoryInput = document.createElement("input");
n@506 795 var mandatoryText = document.createElement("span");
n@506 796 mandatoryText.textContent = "Mandatory: ";
n@501 797 mandatory.appendChild(mandatoryText);
n@501 798 mandatory.appendChild(mandatoryInput);
n@506 799 mandatoryInput.type = "checkbox";
n@506 800 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
n@506 801 mandatoryInput.setAttribute("name","mandatory");
n@506 802 mandatoryInput.addEventListener("change",this,false);
n@501 803 this.dynamic.appendChild(mandatory);
n@506 804
n@506 805 var minimum = document.createElement("div");
n@506 806 var minimumEntry = document.createElement("input");
n@506 807 var minimumText = document.createElement("span");
n@506 808 minimumText.textContent = "Minimum: ";
n@506 809 minimum.appendChild(minimumText);
n@506 810 minimum.appendChild(minimumEntry);
n@506 811 minimumEntry.type = "number";
n@506 812 minimumEntry.setAttribute("name","min");
n@506 813 minimumEntry.addEventListener("change",this,false);
n@506 814 minimumEntry.value = this.option.min;
n@506 815 this.dynamic.appendChild(minimum);
n@506 816
n@506 817 var maximum = document.createElement("div");
n@506 818 var maximumEntry = document.createElement("input");
n@506 819 var maximumText = document.createElement("span");
n@506 820 maximumText.textContent = "Maximum: ";
n@506 821 maximum.appendChild(maximumText);
n@506 822 maximum.appendChild(maximumEntry);
n@506 823 maximumEntry.type = "number";
n@506 824 maximumEntry.setAttribute("name","max");
n@506 825 maximumEntry.addEventListener("change",this,false);
n@506 826 maximumEntry.value = this.option.max;
n@506 827 this.dynamic.appendChild(maximum);
n@501 828 break;
n@506 829 case "checkbox":
n@506 830 case "radio":
n@506 831 this.dynamic.appendChild(id);
n@506 832 var optionHolder = document.createElement("div");
n@506 833 optionHolder.className = 'node';
n@506 834 optionHolder.id = 'popup-option-holder';
n@506 835 var optionObject = function(parent,option) {
n@506 836 this.rootDOM = document.createElement("div");
n@506 837 this.rootDOM.className = "popup-option-entry";
n@506 838 this.inputName = document.createElement("input");
n@506 839 this.inputName.setAttribute("name","name");
n@506 840 this.inputLabel = document.createElement("input");
n@506 841 this.inputLabel.setAttribute("name","text");
n@506 842 this.specification = option;
n@506 843 this.parent = parent;
n@506 844 this.handleEvent = function()
n@506 845 {
n@506 846 var target = event.currentTarget.getAttribute("name");
n@506 847 eval("this.specification."+target+" = event.currentTarget.value");
n@506 848 };
n@506 849
n@506 850 var nameText = document.createElement("span");
n@506 851 nameText.textContent = "Name: ";
n@506 852 var labelText = document.createElement("span");
n@506 853 labelText.textContent = "Label: ";
n@506 854 this.rootDOM.appendChild(nameText);
n@506 855 this.rootDOM.appendChild(this.inputName);
n@506 856 this.rootDOM.appendChild(labelText);
n@506 857 this.rootDOM.appendChild(this.inputLabel);
n@506 858 this.inputName.addEventListener("change",this,false);
n@506 859 this.inputLabel.addEventListener("change",this,false);
n@506 860 this.inputName.value = this.specification.name;
n@506 861 this.inputLabel.value = this.specification.text;
n@506 862
n@506 863 this.deleteEntry = {
n@506 864 root: document.createElement("button"),
n@506 865 parent: this,
n@506 866 handleEvent: function() {
n@506 867 document.getElementById("popup-option-holder").removeChild(this.parent.rootDOM);
n@506 868 var index = this.parent.parent.option.options.findIndex(function(element,index,array){
n@506 869 if (element == this.parent.specification)
n@506 870 return true;
n@506 871 else
n@506 872 return false;
n@506 873 },this);
n@506 874 var optionList = this.parent.parent.option.options;
n@506 875 if (index == optionList.length-1) {
n@506 876 optionList = optionList.slice(0,index);
n@506 877 } else {
n@506 878 optionList = optionList.slice(0,index).concat(optionList.slice(index+1));
n@506 879 }
n@506 880 this.parent.parent.option.options = optionList;
n@506 881 }
n@506 882 };
n@506 883 this.deleteEntry.root.textContent = "Delete Option";
n@506 884 this.deleteEntry.root.addEventListener("click",this.deleteEntry,false);
n@506 885 this.rootDOM.appendChild(this.deleteEntry.root);
n@506 886 }
n@506 887 for (var i=0; i<this.option.options.length; i++)
n@506 888 {
n@506 889 var obj = new optionObject(this,this.option.options[i]);
n@506 890 this.optionLists.push(obj);
n@506 891 optionHolder.appendChild(obj.rootDOM);
n@506 892 }
n@506 893 this.dynamic.appendChild(optionHolder);
n@501 894 }
n@501 895 }
n@501 896 this.handleEvent = function()
n@501 897 {
n@501 898 var name = event.currentTarget.getAttribute("name");
n@501 899 switch(name) {
n@501 900 case "type":
n@501 901 // If type has changed, we may need to rebuild the entire state node
n@501 902 if (event.currentTarget.value != this.option.name)
n@501 903 {
n@501 904 this.option.type = event.currentTarget.value;
n@501 905 this.generate(this.option,this.parent);
n@501 906 }
n@501 907 break;
n@501 908 case "mandatory":
n@501 909 this.option.mandatory = event.currentTarget.checked;
n@501 910 break;
n@501 911 case "boxsize":
n@501 912 this.option.boxsize = event.currentTarget.value;
n@501 913 break;
n@501 914 case "statement":
n@501 915 this.option.statement = event.currentTarget.value;
n@501 916 break;
n@501 917 }
n@501 918 }
n@501 919 this.continue = function()
n@501 920 {
n@506 921 if (this.parent.type == "surveyNode")
n@506 922 {
n@506 923 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
n@506 924 this.parent.children.push(newNode);
n@506 925 this.parent.childrenDOM.appendChild(newNode.rootDOM);
n@506 926 } else if (this.parent.type == "surveyEntryNode") {
n@506 927 this.parent.build();
n@506 928 }
n@501 929 popupObject.hide();
n@501 930 }
n@501 931 }
n@516 932 this.state[6] = new function() {
n@516 933 this.title = "Edit Scale Markers";
n@516 934 this.content = document.createElement("div");
n@516 935 this.content.id = "state-6";
n@516 936 var spnH = document.createElement('div');
n@516 937 var span = document.createElement("span");
n@516 938 span.textContent = "You can edit your scale markers here for the selected interface.";
n@516 939 spnH.appendChild(span);
n@516 940 this.scaleRoot;
n@516 941 this.parent;
n@516 942 this.markerNodes =[];
n@516 943 this.preset = {
n@516 944 input: document.createElement("select"),
n@516 945 parent: this,
n@516 946 handleEvent: function(event) {
n@516 947 this.parent.scaleRoot.scales = [];
n@516 948 var protoScale = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getAllElementsByName(event.currentTarget.value)[0];
n@516 949 var protoMarkers = protoScale.children;
n@516 950 for (var i=0; i<protoMarkers.length; i++)
n@516 951 {
n@516 952 var marker = {
n@516 953 position: protoMarkers[i].getAttribute("position"),
n@516 954 text: protoMarkers[i].textContent
n@516 955 }
n@516 956 this.parent.scaleRoot.scales.push(marker);
n@516 957 }
n@516 958 this.parent.buildMarkerList();
n@516 959 }
n@516 960 }
n@516 961 this.preset.input.addEventListener("change",this.preset);
n@516 962 this.content.appendChild(this.preset.input);
n@516 963 var optionHolder = document.createElement("div");
n@516 964 optionHolder.className = 'node';
n@516 965 optionHolder.id = 'popup-option-holder';
n@516 966 this.content.appendChild(optionHolder);
n@516 967 this.generate = function(scaleRoot,parent)
n@516 968 {
n@516 969 this.scaleRoot = scaleRoot;
n@516 970 this.parent = parent;
n@516 971
n@516 972 // Generate Pre-Set dropdown
n@516 973 var protoScales = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].children;
n@516 974 this.preset.input.innerHTML = "";
n@516 975
n@516 976 for (var i=0; i<protoScales.length; i++)
n@516 977 {
n@516 978 var selectOption = document.createElement("option");
n@516 979 var scaleName = protoScales[i].getAttribute("name");
n@516 980 selectOption.setAttribute("name",scaleName);
n@516 981 selectOption.textContent = scaleName;
n@516 982 this.preset.input.appendChild(selectOption);
n@516 983 }
n@516 984
n@548 985 this.addMarker = {
n@548 986 root: document.createElement("button"),
n@548 987 parent: this,
n@548 988 handleEvent: function() {
n@548 989 var marker = {
n@548 990 position: 0,
n@548 991 text: "text"
n@548 992 };
n@548 993 this.parent.scaleRoot.scales.push(marker);
n@548 994 var markerNode = new this.parent.buildMarkerNode(this.parent,marker);
n@548 995 document.getElementById("popup-option-holder").appendChild(markerNode.root);
n@548 996 this.parent.markerNodes.push(markerNode);
n@548 997 }
n@548 998 };
n@548 999 this.addMarker.root.textContent = "Add Marker";
n@548 1000 this.addMarker.root.addEventListener("click",this.addMarker);
n@548 1001 this.content.appendChild(this.addMarker.root);
n@548 1002
n@516 1003 // Create Marker List
n@516 1004 this.buildMarkerList();
n@516 1005 }
n@516 1006 this.buildMarkerList = function() {
n@516 1007 var markerInject = document.getElementById("popup-option-holder");
n@516 1008 markerInject.innerHTML = "";
n@516 1009 this.markerNodes = [];
n@516 1010 for (var i=0; i<this.scaleRoot.scales.length; i++)
n@516 1011 {
n@548 1012 var markerNode = new this.buildMarkerNode(this,this.scaleRoot.scales[i]);
n@516 1013 markerInject.appendChild(markerNode.root);
n@516 1014 this.markerNodes.push(markerNode);
n@516 1015
n@516 1016 }
n@516 1017 }
n@548 1018
n@548 1019 this.buildMarkerNode = function(parent,specification) {
n@548 1020 this.root = document.createElement("div");
n@548 1021 this.root.className = "popup-option-entry";
n@548 1022 this.positionInput = document.createElement("input");
n@548 1023 this.positionInput.min = 0;
n@548 1024 this.positionInput.max = 100;
n@548 1025 this.positionInput.value = specification.position;
n@548 1026 this.positionInput.setAttribute("name","position");
n@548 1027 this.textInput = document.createElement("input");
n@548 1028 this.textInput.setAttribute("name","text");
n@548 1029 this.textInput.value = specification.text;
n@548 1030 this.specification = specification;
n@548 1031 this.parent = parent;
n@548 1032 this.handleEvent = function(event) {
n@548 1033 switch(event.currentTarget.getAttribute("name"))
n@548 1034 {
n@548 1035 case "position":
n@548 1036 this.specification.position = Number(event.currentTarget.value);
n@548 1037 break;
n@548 1038 case "text":
n@548 1039 this.specification.text = event.currentTarget.value;
n@548 1040 break;
n@548 1041 }
n@548 1042 }
n@548 1043 this.positionInput.addEventListener("change",this,false);
n@548 1044 this.textInput.addEventListener("change",this,false);
n@548 1045
n@548 1046 var posText = document.createElement("span");
n@548 1047 posText.textContent = "Position: ";
n@548 1048 var textText = document.createElement("span");
n@548 1049 textText.textContent = "Text: ";
n@548 1050 this.root.appendChild(posText);
n@548 1051 this.root.appendChild(this.positionInput);
n@548 1052 this.root.appendChild(textText);
n@548 1053 this.root.appendChild(this.textInput);
n@548 1054
n@548 1055 this.deleteMarker = {
n@548 1056 root: document.createElement("button"),
n@548 1057 parent: this,
n@548 1058 handleEvent: function() {
n@548 1059 var index = this.parent.parent.scaleRoot.scales.findIndex(function(element,index,array){
n@548 1060 if (element == this) {return true;} else {return false;}
n@548 1061 },this.parent.specification)
n@548 1062 if (index >= 0) {
n@548 1063 this.parent.parent.scaleRoot.scales.splice(index,1);
n@548 1064 }
n@548 1065 document.getElementById("popup-option-holder").removeChild(this.parent.root);
n@548 1066 }
n@548 1067 }
n@548 1068 this.deleteMarker.root.addEventListener("click",this.deleteMarker);
n@548 1069 this.deleteMarker.root.textContent = "Delete Marker"
n@548 1070 this.root.appendChild(this.deleteMarker.root);
n@548 1071 }
n@516 1072 }
n@501 1073 }
n@501 1074 }
n@501 1075
n@501 1076 function SpecificationToHTML()
n@501 1077 {
n@501 1078 // This takes the specification node and converts it to an on-page HTML object
n@501 1079 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
n@501 1080 // Once generated, it directly binds into the specification object to update with changes
n@501 1081 // Fixed DOM entries
n@501 1082 this.injectDOM;
n@501 1083 this.setupDOM;
n@501 1084 this.pages = [];
n@501 1085
n@501 1086 // Self-contained generators
n@501 1087 this.createGeneralNodeDOM = function(name,id,parent)
n@501 1088 {
n@506 1089 this.type = name;
n@501 1090 var root = document.createElement('div');
n@501 1091 root.id = id;
n@501 1092 root.className = "node";
n@501 1093
n@501 1094 var titleDiv = document.createElement('div');
n@501 1095 titleDiv.className = "node-title";
n@501 1096 var title = document.createElement('span');
n@501 1097 title.className = "node-title";
n@501 1098 title.textContent = name;
n@501 1099 titleDiv.appendChild(title);
n@501 1100
n@501 1101 var attributeDiv = document.createElement('div');
n@501 1102 attributeDiv.className = "node-attributes";
n@501 1103
n@501 1104 var childrenDiv = document.createElement('div');
n@501 1105 childrenDiv.className = "node-children";
n@501 1106
n@501 1107 var buttonsDiv = document.createElement('div');
n@501 1108 buttonsDiv.className = "node-buttons";
n@501 1109
n@501 1110 root.appendChild(titleDiv);
n@501 1111 root.appendChild(attributeDiv);
n@501 1112 root.appendChild(childrenDiv);
n@501 1113 root.appendChild(buttonsDiv);
n@501 1114
n@501 1115 var obj = {
n@501 1116 rootDOM: root,
n@501 1117 titleDOM: title,
n@501 1118 attributeDOM: attributeDiv,
n@501 1119 attributes: [],
n@501 1120 childrenDOM: childrenDiv,
n@501 1121 children: [],
n@501 1122 buttonDOM: buttonsDiv,
n@501 1123 parent: parent
n@501 1124 }
n@501 1125 return obj;
n@501 1126 }
n@501 1127
n@501 1128 this.convertAttributeToDOM = function(node,schema)
n@501 1129 {
n@501 1130 // This takes an attribute schema node and returns an object with the input node and any bindings
n@501 1131 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
n@501 1132 {
n@501 1133 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
n@501 1134 }
n@501 1135 var obj = new function()
n@501 1136 {
n@501 1137 this.input;
n@501 1138 this.name;
n@501 1139 this.owner;
n@501 1140 this.holder;
n@501 1141
n@501 1142 this.name = schema.getAttribute('name');
n@501 1143 this.default = schema.getAttribute('default');
n@501 1144 this.dataType = schema.getAttribute('type');
n@501 1145 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
n@501 1146 else {this.dataType = "string";}
n@501 1147 var minVar = undefined;
n@501 1148 var maxVar = undefined;
n@501 1149 switch(this.dataType)
n@501 1150 {
n@501 1151 case "negativeInteger":
n@501 1152 maxVar = -1;
n@501 1153 break;
n@501 1154 case "positiveInteger":
n@501 1155 minVar = 1;
n@501 1156 break;
n@501 1157 case "nonNegativeInteger":
n@501 1158 minVar = 0;
n@501 1159 break;
n@501 1160 case "nonPositiveInteger":
n@501 1161 maxVar = 0;
n@501 1162 break;
n@501 1163 case "byte":
n@501 1164 minVar = 0;
n@501 1165 maxVar = 256;
n@501 1166 break;
n@501 1167 case "short":
n@501 1168 minVar = 0;
n@501 1169 maxVar = 65536;
n@501 1170 break;
n@501 1171 default:
n@501 1172 break;
n@501 1173 }
n@501 1174
n@501 1175 this.input = document.createElement('input');
n@501 1176 switch(this.dataType)
n@501 1177 {
n@501 1178 case "boolean":
n@501 1179 this.input.type = "checkbox";
n@501 1180 break;
n@501 1181 case "negativeInteger":
n@501 1182 case "positiveInteger":
n@501 1183 case "nonNegativeInteger":
n@501 1184 case "nonPositiveInteger":
n@501 1185 case "integer":
n@501 1186 case "short":
n@501 1187 case "byte":
n@501 1188 this.input.step = 1;
n@501 1189 case "decimal":
n@501 1190 this.input.type = "number";
n@501 1191 this.input.min = minVar;
n@501 1192 this.input.max = maxVar;
n@501 1193 break;
n@501 1194 default:
n@501 1195 break;
n@501 1196 }
n@501 1197 var value;
n@504 1198 eval("value = node."+this.name)
n@501 1199 if (value != undefined)
n@501 1200 {
n@501 1201 this.input.value = value;
n@501 1202 } else if (this.default != undefined)
n@501 1203 {
n@501 1204 this.input.value = this.default;
n@501 1205 }
n@501 1206 this.handleEvent = function(event)
n@501 1207 {
n@501 1208 var value;
n@501 1209 switch(this.input.type)
n@501 1210 {
n@501 1211 case "checkbox":
n@501 1212 value = event.currentTarget.checked;
n@501 1213 break;
n@501 1214 case "number":
n@501 1215 value = Number(event.currentTarget.value);
n@501 1216 break;
n@501 1217 default:
n@501 1218 value = event.currentTarget.value;
n@501 1219 break;
n@501 1220 }
n@501 1221 eval("this.owner."+this.name+" = value");
n@501 1222 }
n@501 1223 this.holder = document.createElement('div');
n@501 1224 this.holder.className = "attribute";
n@501 1225 this.holder.setAttribute('name',this.name);
n@501 1226 var text = document.createElement('span');
n@501 1227 eval("text.textContent = attributeText."+this.name+"+': '");
n@501 1228 this.holder.appendChild(text);
n@501 1229 this.holder.appendChild(this.input);
n@501 1230 this.owner = node;
n@501 1231 this.input.addEventListener("change",this,false);
n@501 1232 }
n@501 1233 if (obj.attribute != null)
n@501 1234 {
n@501 1235 obj.input.value = obj.attribute;
n@501 1236 }
n@501 1237 return obj;
n@501 1238 }
n@501 1239
n@501 1240 this.convert = function(root)
n@501 1241 {
n@501 1242 //Performs the actual conversion using the given root DOM as the root
n@501 1243 this.injectDOM = root;
n@501 1244
n@504 1245 // Build the export button
n@504 1246 var exportButton = document.createElement("button");
n@504 1247 exportButton.textContent = "Export to XML";
n@504 1248 exportButton.onclick = function()
n@504 1249 {
n@504 1250 var doc = specification.encode();
n@504 1251 var obj = {};
n@504 1252 obj.title = "Export";
n@504 1253 obj.content = document.createElement("div");
n@504 1254 obj.content.id = "finish";
n@504 1255 var span = document.createElement("span");
n@504 1256 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 1257 obj.content.appendChild(span);
n@504 1258 var link = document.createElement("div");
n@504 1259 link.appendChild(doc.children[0]);
n@504 1260 var file = [link.innerHTML];
n@504 1261 var bb = new Blob(file,{type : 'application/xml'});
n@504 1262 var dnlk = window.URL.createObjectURL(bb);
n@504 1263 var a = document.createElement("a");
n@504 1264 a.hidden = '';
n@504 1265 a.href = dnlk;
n@504 1266 a.download = "project-specification.xml";
n@504 1267 a.textContent = "Save File";
n@504 1268 obj.content.appendChild(a);
n@504 1269 popupObject.show();
n@504 1270 popupObject.postNode(obj);
n@504 1271 }
n@504 1272 this.injectDOM.appendChild(exportButton);
n@504 1273
n@501 1274 // First perform the setupNode;
n@501 1275 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
n@547 1276 this.setupDOM = new this.createGeneralNodeDOM('Global Configuration','setup',null);
n@501 1277 this.injectDOM.appendChild(this.setupDOM.rootDOM);
n@501 1278 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
n@501 1279 for (var i=0; i<setupAttributes.length; i++)
n@501 1280 {
n@501 1281 var attributeName = setupAttributes[i].getAttribute('name');
n@501 1282 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
n@501 1283 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
n@501 1284 this.setupDOM.attributes.push(attrObject);
n@501 1285 }
n@501 1286
n@501 1287 // Now we must build the interface Node
n@501 1288 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
n@501 1289 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
n@501 1290
n@501 1291 // Now build the Metrics selection node
n@547 1292 var metric = this.createGeneralNodeDOM("Session Metrics","setup-metric",this.setupDOM);
n@501 1293 metric.rootDOM.removeChild(metric.attributeDOM);
n@501 1294 this.setupDOM.children.push(metric);
n@501 1295 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
n@501 1296 var interfaceName = popupStateNodes.state[1].select.value;
n@501 1297 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
n@501 1298 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1299 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
n@501 1300 testXML = testXML.getAllElementsByTagName("metrics");
n@501 1301 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1302 {
n@501 1303 var obj = {
n@501 1304 input: document.createElement('input'),
n@501 1305 root: document.createElement('div'),
n@501 1306 text: document.createElement('span'),
n@501 1307 specification: specification.metrics.enabled,
n@501 1308 name: interfaceXML.children[i].getAttribute("name"),
n@501 1309 handleEvent: function()
n@501 1310 {
n@501 1311 for (var i=0; i<this.specification.length; i++)
n@501 1312 {
n@501 1313 if (this.specification[i] == this.name)
n@501 1314 {
n@501 1315 var options = this.specification;
n@501 1316 if (this.input.checked == false) {
n@501 1317 if (i == options.length)
n@501 1318 {options = options.slice(0,i);}
n@501 1319 else {
n@501 1320 options = options.slice(0,i).concat(options.slice(i+1));
n@501 1321 }
n@501 1322 } else {
n@501 1323 return;
n@501 1324 }
n@501 1325 this.specification = options;
n@501 1326 break;
n@501 1327 }
n@501 1328 }
n@501 1329 if (this.input.checked) {
n@501 1330 this.specification.push(this.name);
n@501 1331 }
n@501 1332 }
n@501 1333 };
n@501 1334 obj.root.className = "attribute";
n@501 1335 obj.input.type = "checkbox";
n@501 1336 obj.root.appendChild(obj.text);
n@501 1337 obj.root.appendChild(obj.input);
n@501 1338 obj.text.textContent = checkText.children[i].textContent;
n@501 1339 metric.children.push(obj);
n@501 1340 metric.childrenDOM.appendChild(obj.root);
n@537 1341 for (var j=0; j<specification.metrics.enabled.length; j++)
n@501 1342 {
n@537 1343 if (specification.metrics.enabled[j] == obj.name)
n@501 1344 {
n@501 1345 obj.input.checked = true;
n@501 1346 break;
n@501 1347 }
n@501 1348 }
n@501 1349 }
n@501 1350
n@501 1351 // Now both before and after surveys
n@501 1352 if (specification.preTest == undefined){
n@501 1353 specification.preTest = new specification.surveyNode();
n@501 1354 specification.preTest.location = "pre";
n@501 1355 }
n@501 1356 if (specification.postTest == undefined){
n@501 1357 specification.postTest = new specification.surveyNode();
n@501 1358 specification.postTest.location = "post";
n@501 1359 }
n@501 1360 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
n@501 1361 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
n@501 1362 this.setupDOM.children.push(surveyBefore);
n@501 1363 this.setupDOM.children.push(surveyAfter);
n@501 1364 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
n@501 1365 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
n@501 1366
n@501 1367 // Add in the page creator button
n@501 1368 this.addPage = {
n@501 1369 root: document.createElement("button"),
n@501 1370 parent: this,
n@501 1371 handleEvent: function()
n@501 1372 {
n@501 1373 var pageObj = new specification.page();
n@501 1374 specification.pages.push(pageObj);
n@501 1375 var newPage = new this.parent.pageNode(this.parent,pageObj);
n@501 1376 this.parent.injectDOM.appendChild(newPage.rootDOM);
n@501 1377 this.parent.pages.push(newPage);
n@501 1378 }
n@501 1379 }
n@501 1380 this.addPage.root.textContent = "Add Page";
n@501 1381 this.addPage.root.addEventListener("click",this.addPage,false);
n@501 1382 this.injectDOM.appendChild(this.addPage.root);
n@505 1383
n@505 1384 // Build each page
n@505 1385 for (var page of specification.pages)
n@505 1386 {
n@505 1387 var newPage = new this.pageNode(this,page);
n@505 1388 this.injectDOM.appendChild(newPage.rootDOM);
n@505 1389 this.pages.push(newPage);
n@505 1390 }
n@501 1391 }
n@501 1392
n@501 1393 this.interfaceNode = function(parent,rootObject)
n@501 1394 {
n@506 1395 this.type = "interfaceNode";
n@501 1396 this.rootDOM;
n@501 1397 this.titleDOM;
n@501 1398 this.attributeDOM;
n@501 1399 this.attributes = [];
n@501 1400 this.childrenDOM;
n@501 1401 this.children = [];
n@501 1402 this.buttonDOM;
n@501 1403 this.parent = parent;
n@501 1404 this.HTMLPoint;
n@501 1405 this.specification = rootObject;
n@501 1406 this.schema = specification.schema.getAllElementsByName("interface")[1];
n@501 1407
n@501 1408 this.createIOasAttr = function(name,specification,parent,type) {
n@501 1409 this.root = document.createElement('div');
n@501 1410 this.input = document.createElement("input");
n@501 1411 this.name = name;
n@501 1412 this.type = type;
n@501 1413 this.parent = parent;
n@501 1414 this.specification = specification;
n@501 1415 this.handleEvent = function(event) {
n@501 1416 for (var i=0; i<this.specification.options.length; i++)
n@501 1417 {
n@501 1418 if (this.specification.options[i].name == this.name)
n@501 1419 {
n@501 1420 var options = this.specification.options;
n@501 1421 if (this.input.checked == false) {
n@501 1422 if (i == options.length)
n@501 1423 {options = options.slice(0,i);}
n@501 1424 else {
n@501 1425 options = options.slice(0,i).concat(options.slice(i+1));
n@501 1426 }
n@501 1427 } else {
n@501 1428 return;
n@501 1429 }
n@501 1430 this.specification.options = options;
n@501 1431 break;
n@501 1432 }
n@501 1433 }
n@501 1434 if (this.input.checked) {
n@501 1435 var obj = {
n@501 1436 name: this.name,
n@501 1437 type: this.type
n@501 1438 };
n@501 1439 this.specification.options.push(obj);
n@501 1440 }
n@501 1441 if (this.parent.HTMLPoint.id == "setup")
n@501 1442 {
n@501 1443 // We've changed a global setting, must update all child 'interfaces' and disable them
n@501 1444 for (pages of convert.pages)
n@501 1445 {
n@501 1446 for (interface of pages.interfaces)
n@501 1447 {
n@501 1448 if (this.type == "check")
n@501 1449 {
n@501 1450 for (node of interface.children[0].attributes)
n@501 1451 {
n@501 1452 if (node.name == this.name) {
n@501 1453 if (this.input.checked) {
n@501 1454 node.input.disabled = true;
n@501 1455 node.input.checked = false;
n@501 1456 } else {
n@501 1457 node.input.disabled = false;
n@501 1458 }
n@501 1459 break;
n@501 1460 }
n@501 1461 }
n@501 1462 } else if (this.type == "show")
n@501 1463 {
n@501 1464 for (node of interface.children[1].attributes)
n@501 1465 {
n@501 1466 if (node.name == this.name) {
n@501 1467 if (this.input.checked) {
n@501 1468 node.input.disabled = true;
n@501 1469 } else {
n@501 1470 node.input.disabled = false;
n@501 1471 }
n@501 1472 break;
n@501 1473 }
n@501 1474 }
n@501 1475 }
n@501 1476 }
n@501 1477 }
n@501 1478 }
n@501 1479 };
n@501 1480 this.findIndex = function(element,index,array){
n@501 1481 if (element.name == this.name)
n@501 1482 return true;
n@501 1483 else
n@501 1484 return false;
n@501 1485 };
n@501 1486 this.findNode = function(element,index,array){
n@501 1487 if (element.name == this.name)
n@501 1488 return true;
n@501 1489 else
n@501 1490 return false;
n@501 1491 };
n@501 1492 this.input.type = "checkbox";
n@501 1493 this.input.setAttribute("name",name);
n@501 1494 this.input.addEventListener("change",this,false);
n@501 1495 this.root.appendChild(this.input);
n@501 1496 this.root.className = "attribute";
n@501 1497 return this;
n@501 1498 }
n@501 1499
n@501 1500 this.build = function(name,id,parent)
n@501 1501 {
n@501 1502 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
n@501 1503
n@501 1504 this.rootDOM = obj.rootDOM;
n@501 1505 this.titleDOM = obj.titleDOM;
n@501 1506 this.attributeDOM = obj.attributeDOM;
n@501 1507 this.childrenDOM = obj.childrenDOM;
n@501 1508 this.buttonDOM = obj.buttonsDOM;
n@501 1509 this.HTMLPoint = parent;
n@501 1510 this.rootDOM.removeChild(this.attributeDOM);
n@501 1511 // Put in the check / show options as individual children
n@501 1512 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
n@501 1513
n@501 1514 var interfaceName = popupStateNodes.state[1].select.value;
n@501 1515 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
n@501 1516 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1517 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
n@501 1518 testXML = testXML.getAllElementsByTagName("checks");
n@501 1519 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1520 {
n@501 1521 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"check");
n@501 1522 for (var option of this.specification.options)
n@501 1523 {
n@501 1524 if (option.name == obj.name)
n@501 1525 {
n@501 1526 obj.input.checked = true;
n@501 1527 break;
n@501 1528 }
n@501 1529 }
n@501 1530 if (parent.id != "setup") {
n@501 1531 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
n@512 1532 if (node != undefined) {
n@512 1533 if (node.input.checked) {
n@512 1534 obj.input.checked = false;
n@512 1535 obj.input.disabled = true;
n@512 1536 }
n@501 1537 }
n@501 1538 }
n@501 1539 var text = document.createElement('span');
n@501 1540 text.textContent = checkText.children[i].textContent;
n@501 1541 obj.root.appendChild(text);
n@501 1542 checks.attributeDOM.appendChild(obj.root);
n@501 1543 checks.attributes.push(obj);
n@501 1544 }
n@501 1545 this.children.push(checks);
n@501 1546 this.childrenDOM.appendChild(checks.rootDOM);
n@501 1547
n@501 1548 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
n@501 1549 interfaceName = popupStateNodes.state[1].select.value;
n@501 1550 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
n@501 1551 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
n@501 1552 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
n@501 1553 testXML = testXML.getAllElementsByTagName("show");
n@501 1554 for (var i=0; i<interfaceXML.children.length; i++)
n@501 1555 {
n@501 1556 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"show");
n@501 1557 for (var option of this.specification.options)
n@501 1558 {
n@501 1559 if (option.name == obj.name)
n@501 1560 {
n@501 1561 obj.input.checked = true;
n@501 1562 break;
n@501 1563 }
n@501 1564 }
n@501 1565 if (parent.id != "setup") {
n@501 1566 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
n@512 1567 if (node != undefined) {
n@512 1568 if (node.input.checked) {
n@512 1569 obj.input.checked = false;
n@512 1570 obj.input.disabled = true;
n@512 1571 }
n@501 1572 }
n@501 1573 }
n@501 1574 var text = document.createElement('span');
n@501 1575 text.textContent = checkText.children[i].textContent;
n@501 1576 obj.root.appendChild(text);
n@501 1577 show.attributeDOM.appendChild(obj.root);
n@501 1578 show.attributes.push(obj);
n@501 1579 }
n@501 1580 this.children.push(show);
n@501 1581 this.childrenDOM.appendChild(show.rootDOM);
n@501 1582
n@501 1583 if (parent.id == "setup")
n@501 1584 {
n@501 1585 } else {
n@501 1586 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
n@501 1587 this.attributeDOM.appendChild(nameAttr.holder);
n@501 1588 this.attributes.push(nameAttr);
n@516 1589 var scales = new this.scalesNode(this,this.specification);
n@516 1590 this.children.push(scales);
n@516 1591 this.childrenDOM.appendChild(scales.rootDOM);
n@501 1592 }
n@501 1593 if (parent != undefined)
n@501 1594 {
n@501 1595 parent.appendChild(this.rootDOM);
n@501 1596 }
n@501 1597 }
n@516 1598
n@516 1599 this.scalesNode = function(parent,rootObject)
n@516 1600 {
n@516 1601 this.type = "scalesNode";
n@516 1602 this.rootDOM = document.createElement("div");
n@516 1603 this.titleDOM = document.createElement("span");
n@516 1604 this.attributeDOM = document.createElement("div");
n@516 1605 this.attributes = [];
n@516 1606 this.childrenDOM = document.createElement("div");
n@516 1607 this.children = [];
n@516 1608 this.buttonDOM = document.createElement("div");
n@516 1609 this.parent = parent;
n@516 1610 this.specification = rootObject;
n@516 1611 this.schema = specification.schema.getAllElementsByName("page")[0];
n@516 1612 this.rootDOM.className = "node";
n@516 1613
n@516 1614 var titleDiv = document.createElement('div');
n@516 1615 titleDiv.className = "node-title";
n@516 1616 this.titleDOM.className = "node-title";
n@516 1617 this.titleDOM.textContent = "Interface Scales";
n@516 1618 titleDiv.appendChild(this.titleDOM);
n@516 1619
n@516 1620 this.attributeDOM.className = "node-attributes";
n@516 1621 this.childrenDOM.className = "node-children";
n@516 1622 this.buttonDOM.className = "node-buttons";
n@516 1623
n@516 1624 this.rootDOM.appendChild(titleDiv);
n@516 1625 this.rootDOM.appendChild(this.attributeDOM);
n@516 1626 this.rootDOM.appendChild(this.childrenDOM);
n@516 1627 this.rootDOM.appendChild(this.buttonDOM);
n@516 1628
n@516 1629 this.editButton = {
n@516 1630 button: document.createElement("button"),
n@516 1631 parent: this,
n@516 1632 handleEvent: function(event) {
n@516 1633 popupObject.show();
n@516 1634 popupObject.postNode(popupStateNodes.state[6]);
n@516 1635 popupStateNodes.state[6].generate(this.parent.specification,this.parent);
n@516 1636 }
n@516 1637 };
n@516 1638 this.editButton.button.textContent = "Edit Scales/Markers";
n@516 1639 this.editButton.button.addEventListener("click",this.editButton,false);
n@516 1640 this.buttonDOM.appendChild(this.editButton.button);
n@516 1641 }
n@501 1642 }
n@501 1643
n@501 1644 this.surveyNode = function(parent,rootObject,location)
n@501 1645 {
n@506 1646 this.type = "surveyNode";
n@501 1647 this.rootDOM = document.createElement("div");
n@501 1648 this.titleDOM = document.createElement("span");
n@501 1649 this.attributeDOM = document.createElement("div");
n@501 1650 this.attributes = [];
n@501 1651 this.childrenDOM = document.createElement("div");
n@501 1652 this.children = [];
n@501 1653 this.buttonDOM = document.createElement("div");
n@501 1654 this.parent = parent;
n@501 1655 this.specification = rootObject;
n@501 1656 this.schema = specification.schema.getAllElementsByName("survey")[1];
n@501 1657 this.rootDOM.className = "node";
n@501 1658
n@501 1659 var titleDiv = document.createElement('div');
n@501 1660 titleDiv.className = "node-title";
n@501 1661 this.titleDOM.className = "node-title";
n@501 1662 this.titleDOM.textContent = "Survey";
n@501 1663 titleDiv.appendChild(this.titleDOM);
n@501 1664
n@501 1665 this.attributeDOM.className = "node-attributes";
n@501 1666 var locationAttr = document.createElement("span");
n@501 1667 this.attributeDOM.appendChild(locationAttr);
n@501 1668 if (location == "Pre" || location == "pre") {
n@501 1669 locationAttr.textContent = "Location: Before";
n@501 1670 } else {
n@501 1671 locationAttr.textContent = "Location: After";
n@501 1672 }
n@501 1673 this.childrenDOM.className = "node-children";
n@501 1674 this.buttonDOM.className = "node-buttons";
n@501 1675
n@501 1676 this.rootDOM.appendChild(titleDiv);
n@501 1677 this.rootDOM.appendChild(this.attributeDOM);
n@501 1678 this.rootDOM.appendChild(this.childrenDOM);
n@501 1679 this.rootDOM.appendChild(this.buttonDOM);
n@501 1680
n@501 1681 this.surveyEntryNode = function(parent,rootObject)
n@501 1682 {
n@506 1683 this.type = "surveyEntryNode";
n@501 1684 this.rootDOM = document.createElement("div");
n@501 1685 this.titleDOM = document.createElement("span");
n@501 1686 this.attributeDOM = document.createElement("div");
n@501 1687 this.attributes = [];
n@501 1688 this.childrenDOM = document.createElement("div");
n@501 1689 this.children = [];
n@501 1690 this.buttonDOM = document.createElement("div");
n@501 1691 this.parent = parent;
n@501 1692 this.specification = rootObject;
n@501 1693 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
n@501 1694
n@501 1695 this.rootDOM.className = "node";
n@501 1696 this.rootDOM.style.minWidth = "50%";
n@501 1697
n@501 1698 var titleDiv = document.createElement('div');
n@501 1699 titleDiv.className = "node-title";
n@501 1700 this.titleDOM.className = "node-title";
n@501 1701 titleDiv.appendChild(this.titleDOM);
n@501 1702
n@501 1703 this.attributeDOM.className = "node-attributes";
n@501 1704 this.childrenDOM.className = "node-children";
n@501 1705 this.buttonDOM.className = "node-buttons";
n@501 1706
n@501 1707 this.rootDOM.appendChild(titleDiv);
n@501 1708 this.rootDOM.appendChild(this.attributeDOM);
n@501 1709 this.rootDOM.appendChild(this.childrenDOM);
n@501 1710 this.rootDOM.appendChild(this.buttonDOM);
n@501 1711
n@506 1712 this.build = function()
n@506 1713 {
n@506 1714 this.attributeDOM.innerHTML = null;
n@506 1715 this.childrenDOM.innerHTML = null;
n@506 1716 var statementRoot = document.createElement("div");
n@506 1717 var statement = document.createElement("span");
n@506 1718 statement.textContent = "Statement / Question: "+this.specification.statement;
n@506 1719 statementRoot.appendChild(statement);
n@506 1720 this.children.push(statementRoot);
n@506 1721 this.childrenDOM.appendChild(statementRoot);
n@506 1722 switch(this.specification.type)
n@506 1723 {
n@506 1724 case "statement":
n@506 1725 this.titleDOM.textContent = "Statement";
n@506 1726 break;
n@506 1727 case "question":
n@506 1728 this.titleDOM.textContent = "Question";
n@506 1729 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1730 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
n@506 1731 var boxsize = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("boxsize")[0]);
n@506 1732 this.attributeDOM.appendChild(id.holder);
n@506 1733 this.attributes.push(id);
n@506 1734 this.attributeDOM.appendChild(mandatory.holder);
n@506 1735 this.attributes.push(mandatory);
n@506 1736 this.attributeDOM.appendChild(boxsize.holder);
n@506 1737 this.attributes.push(boxsize);
n@506 1738 break;
n@506 1739 case "number":
n@506 1740 this.titleDOM.textContent = "Number";
n@506 1741 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1742 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
n@506 1743 var min = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("min")[0]);
n@506 1744 var max = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("max")[0]);
n@506 1745 this.attributeDOM.appendChild(id.holder);
n@506 1746 this.attributes.push(id);
n@506 1747 this.attributeDOM.appendChild(min.holder);
n@506 1748 this.attributes.push(min);
n@506 1749 this.attributeDOM.appendChild(max.holder);
n@506 1750 this.attributes.push(max);
n@506 1751 break;
n@506 1752 case "checkbox":
n@506 1753 this.titleDOM.textContent = "Checkbox";
n@506 1754 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1755 this.attributeDOM.appendChild(id.holder);
n@506 1756 this.attributes.push(id);
n@506 1757 break;
n@506 1758 case "radio":
n@506 1759 this.titleDOM.textContent = "Radio";
n@506 1760 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
n@506 1761 this.attributeDOM.appendChild(id.holder);
n@506 1762 this.attributes.push(id);
n@506 1763 break;
n@506 1764 }
n@501 1765 }
n@506 1766 this.build();
n@501 1767
n@501 1768 this.editNode = {
n@501 1769 root: document.createElement("button"),
n@501 1770 parent: this,
n@501 1771 handleEvent: function()
n@501 1772 {
n@501 1773 popupObject.show();
n@506 1774 popupStateNodes.state[5].generate(this.parent.specification,this.parent);
n@501 1775 popupObject.postNode(popupStateNodes.state[5]);
n@501 1776 }
n@501 1777 }
n@501 1778 this.editNode.root.textContent = "Edit Entry";
n@501 1779 this.editNode.root.addEventListener("click",this.editNode,false);
n@501 1780 this.buttonDOM.appendChild(this.editNode.root);
n@501 1781
n@501 1782 this.deleteNode = {
n@501 1783 root: document.createElement("button"),
n@501 1784 parent: this,
n@501 1785 handleEvent: function()
n@501 1786 {
n@501 1787 var optionList = this.parent.parent.specification.options;
n@501 1788 var childList = this.parent.parent.children;
n@501 1789 for (var i=0; i <this.parent.parent.specification.options.length; i++)
n@501 1790 {
n@501 1791 var option = this.parent.parent.specification.options[i];
n@501 1792 if (option == this.parent.specification)
n@501 1793 {
n@501 1794 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
n@501 1795 if (i == this.parent.parent.specification.options.length-1)
n@501 1796 {
n@501 1797 optionList = optionList.slice(0,i);
n@501 1798 childList = childList.slice(0,i);
n@501 1799 }
n@501 1800 else {
n@501 1801 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
n@501 1802 childList = childList.slice(0,i).concat(childList.slice(i+1));
n@501 1803 }
n@501 1804 this.parent.parent.specification.options = optionList;
n@501 1805 this.parent.parent.children = childList;
n@501 1806 }
n@501 1807 }
n@501 1808 }
n@501 1809 }
n@501 1810 this.deleteNode.root.textContent = "Delete Entry";
n@501 1811 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
n@501 1812 this.buttonDOM.appendChild(this.deleteNode.root);
n@501 1813 }
n@501 1814 this.addNode = {
n@501 1815 root: document.createElement("button"),
n@501 1816 parent: this,
n@501 1817 handleEvent: function()
n@501 1818 {
n@501 1819 var newNode = new this.parent.specification.OptionNode();
n@501 1820 this.parent.specification.options.push(newNode);
n@501 1821 popupObject.show();
n@501 1822 popupStateNodes.state[5].generate(newNode,this.parent);
n@501 1823 popupObject.postNode(popupStateNodes.state[5]);
n@501 1824 }
n@501 1825 }
n@501 1826 this.addNode.root.textContent = "Add Survey Entry";
n@501 1827 this.addNode.root.addEventListener("click",this.addNode,false);
n@501 1828 this.buttonDOM.appendChild(this.addNode.root);
n@501 1829
n@501 1830 for (var option of this.specification.options)
n@501 1831 {
n@501 1832 var newNode = new this.surveyEntryNode(this,option);
n@501 1833 this.children.push(newNode);
n@501 1834 this.childrenDOM.appendChild(newNode.rootDOM);
n@501 1835 }
n@501 1836 }
n@501 1837
n@501 1838 this.pageNode = function(parent,rootObject)
n@501 1839 {
n@506 1840 this.type = "pageNode";
n@501 1841 this.rootDOM = document.createElement("div");
n@501 1842 this.titleDOM = document.createElement("span");
n@501 1843 this.attributeDOM = document.createElement("div");
n@501 1844 this.attributes = [];
n@501 1845 this.childrenDOM = document.createElement("div");
n@501 1846 this.children = [];
n@501 1847 this.buttonDOM = document.createElement("div");
n@501 1848 this.parent = parent;
n@501 1849 this.specification = rootObject;
n@501 1850 this.schema = specification.schema.getAllElementsByName("page")[0];
n@501 1851 this.rootDOM.className = "node";
n@501 1852
n@501 1853 var titleDiv = document.createElement('div');
n@501 1854 titleDiv.className = "node-title";
n@501 1855 this.titleDOM.className = "node-title";
n@501 1856 this.titleDOM.textContent = "Test Page";
n@501 1857 titleDiv.appendChild(this.titleDOM);
n@501 1858
n@501 1859 this.attributeDOM.className = "node-attributes";
n@501 1860 this.childrenDOM.className = "node-children";
n@501 1861 this.buttonDOM.className = "node-buttons";
n@501 1862
n@501 1863 this.rootDOM.appendChild(titleDiv);
n@501 1864 this.rootDOM.appendChild(this.attributeDOM);
n@501 1865 this.rootDOM.appendChild(this.childrenDOM);
n@501 1866 this.rootDOM.appendChild(this.buttonDOM);
n@501 1867
n@501 1868 // Do the comment prefix node
n@501 1869 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
n@501 1870 cpn.rootDOM.removeChild(cpn.attributeDOM);
n@501 1871 var obj = {
n@501 1872 root: document.createElement("div"),
n@501 1873 input: document.createElement("input"),
n@501 1874 parent: this,
n@501 1875 handleEvent: function()
n@501 1876 {
n@501 1877 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
n@501 1878 }
n@501 1879 }
n@501 1880 cpn.children.push(obj);
n@501 1881 cpn.childrenDOM.appendChild(obj.root);
n@501 1882 obj.root.appendChild(obj.input);
n@501 1883 obj.input.addEventListener("change",obj,false);
n@501 1884 obj.input.value = this.specification.commentBoxPrefix;
n@501 1885 this.childrenDOM.appendChild(cpn.rootDOM);
n@501 1886 this.children.push(cpn);
n@501 1887
n@501 1888 // Now both before and after surveys
n@501 1889 if (this.specification.preTest == undefined){
n@501 1890 this.specification.preTest = new specification.surveyNode();
n@501 1891 this.specification.preTest.location = "pre";
n@501 1892 }
n@501 1893 if (this.specification.postTest == undefined){
n@501 1894 this.specification.postTest = new specification.surveyNode();
n@501 1895 this.specification.postTest.location = "post";
n@501 1896 }
n@501 1897 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
n@501 1898 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
n@501 1899 this.children.push(surveyBefore);
n@501 1900 this.children.push(surveyAfter);
n@501 1901 this.childrenDOM.appendChild(surveyBefore.rootDOM);
n@501 1902 this.childrenDOM.appendChild(surveyAfter.rootDOM);
n@501 1903
n@501 1904 // Build the attributes
n@501 1905 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
n@501 1906 for (var i=0; i<attributeList.length; i++)
n@501 1907 {
n@501 1908 var attributeName = attributeList[i].getAttribute('name');
n@501 1909 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
n@501 1910 this.attributeDOM.appendChild(attrObject.holder);
n@501 1911 this.attributes.push(attrObject);
n@501 1912 }
n@501 1913
n@501 1914 this.interfaces = [];
n@501 1915
n@501 1916 this.audioElementNode = function(parent,rootObject)
n@501 1917 {
n@506 1918 this.type = "audioElementNode";
n@501 1919 this.rootDOM = document.createElement("div");
n@501 1920 this.titleDOM = document.createElement("span");
n@501 1921 this.attributeDOM = document.createElement("div");
n@501 1922 this.attributes = [];
n@501 1923 this.childrenDOM = document.createElement("div");
n@501 1924 this.children = [];
n@501 1925 this.buttonDOM = document.createElement("div");
n@501 1926 this.parent = parent;
n@501 1927 this.specification = rootObject;
n@501 1928 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
n@501 1929 this.rootDOM.className = "node";
n@501 1930
n@501 1931 var titleDiv = document.createElement('div');
n@501 1932 titleDiv.className = "node-title";
n@501 1933 this.titleDOM.className = "node-title";
n@501 1934 this.titleDOM.textContent = "Audio Element";
n@501 1935 titleDiv.appendChild(this.titleDOM);
n@501 1936
n@501 1937 this.attributeDOM.className = "node-attributes";
n@501 1938 this.childrenDOM.className = "node-children";
n@501 1939 this.buttonDOM.className = "node-buttons";
n@501 1940
n@501 1941 this.rootDOM.appendChild(titleDiv);
n@501 1942 this.rootDOM.appendChild(this.attributeDOM);
n@501 1943 this.rootDOM.appendChild(this.childrenDOM);
n@501 1944 this.rootDOM.appendChild(this.buttonDOM);
n@501 1945
n@501 1946 // Build the attributes
n@501 1947 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
n@501 1948 for (var i=0; i<attributeList.length; i++)
n@501 1949 {
n@501 1950 var attributeName = attributeList[i].getAttribute('name');
n@501 1951 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
n@501 1952 this.attributeDOM.appendChild(attrObject.holder);
n@501 1953 this.attributes.push(attrObject);
n@501 1954 }
n@501 1955
n@501 1956 this.deleteNode = {
n@501 1957 root: document.createElement("button"),
n@501 1958 parent: this,
n@501 1959 handleEvent: function()
n@501 1960 {
n@501 1961 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
n@501 1962 if (i >= 0) {
n@501 1963 var aeList = this.parent.parent.specification.audioElements;
n@501 1964 if (i < aeList.length-1) {
n@501 1965 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
n@501 1966 } else {
n@501 1967 aeList = aeList.slice(0,i);
n@501 1968 }
n@501 1969 }
n@501 1970 i = this.parent.parent.children.findIndex(function(element,index,array){
n@501 1971 if (element == this.parent)
n@501 1972 return true;
n@501 1973 else
n@501 1974 return false;
n@501 1975 },this);
n@501 1976 if (i >= 0) {
n@501 1977 var childList = this.parent.children;
n@501 1978 if (i < aeList.length-1) {
n@501 1979 childList = childList.slice(0,i).concat(childList.slice(i+1));
n@501 1980 } else {
n@501 1981 childList = childList.slice(0,i);
n@501 1982 }
n@501 1983 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
n@501 1984 }
n@501 1985 },
n@501 1986 findNode: function(element,index,array){
n@501 1987 if (element == this.parent.specification)
n@501 1988 return true;
n@501 1989 else
n@501 1990 return false;
n@501 1991 }
n@501 1992 }
n@501 1993 this.deleteNode.root.textContent = "Delete Entry";
n@501 1994 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
n@501 1995 this.buttonDOM.appendChild(this.deleteNode.root);
n@501 1996 }
n@501 1997
n@501 1998 this.commentQuestionNode = function(parent,rootObject)
n@501 1999 {
n@506 2000 this.type = "commentQuestionNode";
n@501 2001 this.rootDOM = document.createElement("div");
n@501 2002 this.titleDOM = document.createElement("span");
n@501 2003 this.attributeDOM = document.createElement("div");
n@501 2004 this.attributes = [];
n@501 2005 this.childrenDOM = document.createElement("div");
n@501 2006 this.children = [];
n@501 2007 this.buttonDOM = document.createElement("div");
n@501 2008 this.parent = parent;
n@501 2009 this.specification = rootObject;
n@501 2010 this.schema = specification.schema.getAllElementsByName("page")[0];
n@501 2011 this.rootDOM.className = "node";
n@501 2012
n@501 2013 var titleDiv = document.createElement('div');
n@501 2014 titleDiv.className = "node-title";
n@501 2015 this.titleDOM.className = "node-title";
n@501 2016 this.titleDOM.textContent = "Test Page";
n@501 2017 titleDiv.appendChild(this.titleDOM);
n@501 2018
n@501 2019 this.attributeDOM.className = "node-attributes";
n@501 2020 this.childrenDOM.className = "node-children";
n@501 2021 this.buttonDOM.className = "node-buttons";
n@501 2022
n@501 2023 this.rootDOM.appendChild(titleDiv);
n@501 2024 this.rootDOM.appendChild(this.attributeDOM);
n@501 2025 this.rootDOM.appendChild(this.childrenDOM);
n@501 2026 this.rootDOM.appendChild(this.buttonDOM);
n@501 2027
n@501 2028 }
n@501 2029
n@505 2030 // Build the components
n@525 2031 if (this.specification.interfaces.length == 0) {
n@525 2032 this.specification.interfaces.push(new specification.interfaceNode());
n@525 2033 }
n@512 2034 for (var interfaceObj of this.specification.interfaces)
n@512 2035 {
n@512 2036 var newInterface = new this.parent.interfaceNode(this.parent,interfaceObj);
n@512 2037 newInterface.build("Interface",""+this.specification.id+"-interface",this.childrenDOM);
n@512 2038 this.children.push(newInterface);
n@512 2039 this.interfaces.push(newInterface);
n@512 2040 }
n@512 2041
n@505 2042 for (var elements of this.specification.audioElements)
n@505 2043 {
n@505 2044 var audioElementDOM = new this.audioElementNode(this,elements);
n@505 2045 this.children.push(audioElementDOM);
n@505 2046 this.childrenDOM.appendChild(audioElementDOM.rootDOM);
n@505 2047 }
n@505 2048
n@501 2049 this.addInterface = {
n@501 2050 root: document.createElement("button"),
n@501 2051 parent: this,
n@501 2052 handleEvent: function() {
n@501 2053 var InterfaceObj = new specification.interfaceNode();
n@501 2054 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
n@501 2055 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
n@501 2056 this.parent.children.push(newInterface);
n@501 2057 this.parent.specification.interfaces.push(InterfaceObj);
n@501 2058 this.parent.interfaces.push(newInterface);
n@501 2059 }
n@501 2060 }
n@501 2061 this.addInterface.root.textContent = "Add Interface";
n@501 2062 this.addInterface.root.addEventListener("click",this.addInterface,false);
n@501 2063 this.buttonDOM.appendChild(this.addInterface.root);
n@501 2064
n@501 2065 this.addAudioElement = {
n@501 2066 root: document.createElement("button"),
n@501 2067 parent: this,
n@501 2068 handleEvent: function() {
n@501 2069 var audioElementObject = new this.parent.specification.audioElementNode();
n@501 2070 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
n@501 2071 this.parent.specification.audioElements.push(audioElementObject);
n@501 2072 this.parent.children.push(audioElementDOM);
n@501 2073 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
n@501 2074 }
n@501 2075 }
n@501 2076 this.addAudioElement.root.textContent = "Add Audio Element";
n@501 2077 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
n@501 2078 this.buttonDOM.appendChild(this.addAudioElement.root);
n@501 2079 }
n@501 2080 }