annotate test_create/test_core.js @ 1102:b5bf2f57187c

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