annotate test_create/test_core.js @ 1370:f329347e8918

New test creator tool. Still WIP, but much more dynamic. Based on XSD and external lists so far easier to modify.
author Nicholas Jillings <nickjillings@users.noreply.github.com>
date Wed, 10 Feb 2016 12:02:25 +0000
parents
children f8920367ec32
rev   line source
nickjillings@1370 1 var interfaceSpecs;
nickjillings@1370 2 var xmlHttp;
nickjillings@1370 3 var popupObject;
nickjillings@1370 4 var popupStateNodes;
nickjillings@1370 5 var specification;
nickjillings@1370 6 var convert;
nickjillings@1370 7 var attributeText;
nickjillings@1370 8
nickjillings@1370 9 // Firefox does not have an XMLDocument.prototype.getElementsByName
nickjillings@1370 10 // and there is no searchAll style command, this custom function will
nickjillings@1370 11 // search all children recusrively for the name. Used for XSD where all
nickjillings@1370 12 // element nodes must have a name and therefore can pull the schema node
nickjillings@1370 13 XMLDocument.prototype.getAllElementsByName = function(name)
nickjillings@1370 14 {
nickjillings@1370 15 name = String(name);
nickjillings@1370 16 var selected = this.documentElement.getAllElementsByName(name);
nickjillings@1370 17 return selected;
nickjillings@1370 18 }
nickjillings@1370 19
nickjillings@1370 20 Element.prototype.getAllElementsByName = function(name)
nickjillings@1370 21 {
nickjillings@1370 22 name = String(name);
nickjillings@1370 23 var selected = [];
nickjillings@1370 24 var node = this.firstElementChild;
nickjillings@1370 25 while(node != null)
nickjillings@1370 26 {
nickjillings@1370 27 if (node.getAttribute('name') == name)
nickjillings@1370 28 {
nickjillings@1370 29 selected.push(node);
nickjillings@1370 30 }
nickjillings@1370 31 if (node.childElementCount > 0)
nickjillings@1370 32 {
nickjillings@1370 33 selected = selected.concat(node.getAllElementsByName(name));
nickjillings@1370 34 }
nickjillings@1370 35 node = node.nextElementSibling;
nickjillings@1370 36 }
nickjillings@1370 37 return selected;
nickjillings@1370 38 }
nickjillings@1370 39
nickjillings@1370 40 XMLDocument.prototype.getAllElementsByTagName = function(name)
nickjillings@1370 41 {
nickjillings@1370 42 name = String(name);
nickjillings@1370 43 var selected = this.documentElement.getAllElementsByTagName(name);
nickjillings@1370 44 return selected;
nickjillings@1370 45 }
nickjillings@1370 46
nickjillings@1370 47 Element.prototype.getAllElementsByTagName = function(name)
nickjillings@1370 48 {
nickjillings@1370 49 name = String(name);
nickjillings@1370 50 var selected = [];
nickjillings@1370 51 var node = this.firstElementChild;
nickjillings@1370 52 while(node != null)
nickjillings@1370 53 {
nickjillings@1370 54 if (node.nodeName == name)
nickjillings@1370 55 {
nickjillings@1370 56 selected.push(node);
nickjillings@1370 57 }
nickjillings@1370 58 if (node.childElementCount > 0)
nickjillings@1370 59 {
nickjillings@1370 60 selected = selected.concat(node.getAllElementsByTagName(name));
nickjillings@1370 61 }
nickjillings@1370 62 node = node.nextElementSibling;
nickjillings@1370 63 }
nickjillings@1370 64 return selected;
nickjillings@1370 65 }
nickjillings@1370 66
nickjillings@1370 67 // Firefox does not have an XMLDocument.prototype.getElementsByName
nickjillings@1370 68 if (typeof XMLDocument.prototype.getElementsByName != "function") {
nickjillings@1370 69 XMLDocument.prototype.getElementsByName = function(name)
nickjillings@1370 70 {
nickjillings@1370 71 name = String(name);
nickjillings@1370 72 var node = this.documentElement.firstElementChild;
nickjillings@1370 73 var selected = [];
nickjillings@1370 74 while(node != null)
nickjillings@1370 75 {
nickjillings@1370 76 if (node.getAttribute('name') == name)
nickjillings@1370 77 {
nickjillings@1370 78 selected.push(node);
nickjillings@1370 79 }
nickjillings@1370 80 node = node.nextElementSibling;
nickjillings@1370 81 }
nickjillings@1370 82 return selected;
nickjillings@1370 83 }
nickjillings@1370 84 }
nickjillings@1370 85
nickjillings@1370 86 window.onload = function()
nickjillings@1370 87 {
nickjillings@1370 88 specification = new Specification();
nickjillings@1370 89 convert = new SpecificationToHTML();
nickjillings@1370 90 xmlHttp = new XMLHttpRequest();
nickjillings@1370 91 xmlHttp.open("GET","./interface-specs.xml",true);
nickjillings@1370 92 xmlHttp.onload = function()
nickjillings@1370 93 {
nickjillings@1370 94 var parse = new DOMParser();
nickjillings@1370 95 interfaceSpecs = parse.parseFromString(xmlHttp.response,'text/xml');
nickjillings@1370 96 buildPage();
nickjillings@1370 97 popupObject.postNode(popupStateNodes.state[0])
nickjillings@1370 98 }
nickjillings@1370 99 xmlHttp.send();
nickjillings@1370 100
nickjillings@1370 101 var xsdGet = new XMLHttpRequest();
nickjillings@1370 102 xsdGet.open("GET","../test-schema.xsd",true);
nickjillings@1370 103 xsdGet.onload = function()
nickjillings@1370 104 {
nickjillings@1370 105 var parse = new DOMParser();
nickjillings@1370 106 specification.schema = parse.parseFromString(xsdGet.response,'text/xml');;
nickjillings@1370 107 }
nickjillings@1370 108 xsdGet.send();
nickjillings@1370 109
nickjillings@1370 110 var jsonAttribute = new XMLHttpRequest();
nickjillings@1370 111 jsonAttribute.open("GET","./attributes.json",true);
nickjillings@1370 112 jsonAttribute.onload = function()
nickjillings@1370 113 {
nickjillings@1370 114 attributeText = JSON.parse(jsonAttribute.response)
nickjillings@1370 115 }
nickjillings@1370 116 jsonAttribute.send();
nickjillings@1370 117 }
nickjillings@1370 118
nickjillings@1370 119 function buildPage()
nickjillings@1370 120 {
nickjillings@1370 121 popupObject = new function() {
nickjillings@1370 122 this.object = document.getElementById("popupHolder");
nickjillings@1370 123 this.blanket = document.getElementById("blanket");
nickjillings@1370 124
nickjillings@1370 125 this.popupTitle = document.createElement("div");
nickjillings@1370 126 this.popupTitle.id = "popup-title-holder";
nickjillings@1370 127 this.popupTitle.align = "center";
nickjillings@1370 128 this.titleDOM = document.createElement("span");
nickjillings@1370 129 this.titleDOM.id = "popup-title";
nickjillings@1370 130 this.popupTitle.appendChild(this.titleDOM);
nickjillings@1370 131 this.object.appendChild(this.popupTitle);
nickjillings@1370 132
nickjillings@1370 133 this.popupContent = document.createElement("div");
nickjillings@1370 134 this.popupContent.id = "popup-content";
nickjillings@1370 135 this.object.appendChild(this.popupContent);
nickjillings@1370 136
nickjillings@1370 137 this.proceedButton = document.createElement("button");
nickjillings@1370 138 this.proceedButton.id = "popup-proceed";
nickjillings@1370 139 this.proceedButton.textContent = "Next";
nickjillings@1370 140 this.proceedButton.onclick = function()
nickjillings@1370 141 {
nickjillings@1370 142 popupObject.popupContent.innerHTML = null;
nickjillings@1370 143 popupObject.shownObject.continue();
nickjillings@1370 144 };
nickjillings@1370 145 this.object.appendChild(this.proceedButton);
nickjillings@1370 146
nickjillings@1370 147 this.shownObject;
nickjillings@1370 148
nickjillings@1370 149 this.resize = function()
nickjillings@1370 150 {
nickjillings@1370 151 var w = window.innerWidth;
nickjillings@1370 152 var h = window.innerHeight;
nickjillings@1370 153 this.object.style.left = Math.floor((w-750)/2) + 'px';
nickjillings@1370 154 this.object.style.top = Math.floor((h-500)/2) + 'px';
nickjillings@1370 155 }
nickjillings@1370 156
nickjillings@1370 157 this.show = function()
nickjillings@1370 158 {
nickjillings@1370 159 this.object.style.visibility = "visible";
nickjillings@1370 160 this.blanket.style.visibility = "visible";
nickjillings@1370 161 }
nickjillings@1370 162
nickjillings@1370 163 this.hide = function()
nickjillings@1370 164 {
nickjillings@1370 165 this.object.style.visibility = "hidden";
nickjillings@1370 166 this.blanket.style.visibility = "hidden";
nickjillings@1370 167 }
nickjillings@1370 168
nickjillings@1370 169 this.postNode = function(postObject)
nickjillings@1370 170 {
nickjillings@1370 171 this.show();
nickjillings@1370 172 //Passed object must have the following:
nickjillings@1370 173 // Title: text to show in the title
nickjillings@1370 174 // Content: HTML DOM to show on the page
nickjillings@1370 175 // On complete this HTML DOM is destroyed so make sure it is referenced elsewhere for processing
nickjillings@1370 176 this.titleDOM.textContent = postObject.title;
nickjillings@1370 177 this.popupContent.appendChild(postObject.content);
nickjillings@1370 178 this.shownObject = postObject;
nickjillings@1370 179 }
nickjillings@1370 180
nickjillings@1370 181 this.resize();
nickjillings@1370 182 this.hide();
nickjillings@1370 183 };
nickjillings@1370 184
nickjillings@1370 185 popupStateNodes = new function()
nickjillings@1370 186 {
nickjillings@1370 187 // This defines the several popup states wanted
nickjillings@1370 188 this.state = [];
nickjillings@1370 189 this.state[0] = new function()
nickjillings@1370 190 {
nickjillings@1370 191 this.title = "Welcome";
nickjillings@1370 192 this.content = document.createElement("div");
nickjillings@1370 193 this.content.id = "state-0";
nickjillings@1370 194 var span = document.createElement("span");
nickjillings@1370 195 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."
nickjillings@1370 196 this.content.appendChild(span);
nickjillings@1370 197 this.dragArea = document.createElement("div");
nickjillings@1370 198 this.dragArea.classList = "drag-area";
nickjillings@1370 199 this.content.appendChild(this.dragArea);
nickjillings@1370 200
nickjillings@1370 201 this.continue = function()
nickjillings@1370 202 {
nickjillings@1370 203 popupObject.postNode(popupStateNodes.state[1]);
nickjillings@1370 204 }
nickjillings@1370 205 }
nickjillings@1370 206 this.state[1] = new function()
nickjillings@1370 207 {
nickjillings@1370 208 this.title = "Select your interface";
nickjillings@1370 209 this.content = document.createElement("div");
nickjillings@1370 210 this.content.id = "state-1";
nickjillings@1370 211 var spnH = document.createElement('div');
nickjillings@1370 212 var span = document.createElement("span");
nickjillings@1370 213 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.";
nickjillings@1370 214 spnH.appendChild(span);
nickjillings@1370 215 this.content.appendChild(spnH);
nickjillings@1370 216 this.select = document.createElement("select");
nickjillings@1370 217 this.testsXML = interfaceSpecs.getElementsByTagName('tests')[0].children;
nickjillings@1370 218 for (var i=0; i<this.testsXML.length; i++)
nickjillings@1370 219 {
nickjillings@1370 220 var option = document.createElement('option');
nickjillings@1370 221 option.value = this.testsXML[i].getAttribute('name');
nickjillings@1370 222 option.textContent = this.testsXML[i].getAttribute('name');
nickjillings@1370 223 this.select.appendChild(option);
nickjillings@1370 224 }
nickjillings@1370 225 this.content.appendChild(this.select);
nickjillings@1370 226 this.continue = function()
nickjillings@1370 227 {
nickjillings@1370 228 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(this.select.value)[0];
nickjillings@1370 229 specification.interface = testXML.getAttribute("interface");
nickjillings@1370 230 popupStateNodes.state[2].generate();
nickjillings@1370 231 popupObject.postNode(popupStateNodes.state[2]);
nickjillings@1370 232 }
nickjillings@1370 233 }
nickjillings@1370 234 this.state[2] = new function()
nickjillings@1370 235 {
nickjillings@1370 236 this.title = "Test Checks & Restrictions";
nickjillings@1370 237 this.content = document.createElement("div");
nickjillings@1370 238 this.content.id = "state-1";
nickjillings@1370 239 var spnH = document.createElement('div');
nickjillings@1370 240 var span = document.createElement("span");
nickjillings@1370 241 span.textContent = "Select your test checks and restrictions. Greyed out items are fixed by the test/interface and cannot be changed";
nickjillings@1370 242 spnH.appendChild(span);
nickjillings@1370 243 this.content.appendChild(spnH);
nickjillings@1370 244 var holder = document.createElement("div");
nickjillings@1370 245 this.options = [];
nickjillings@1370 246 this.testXML = null;
nickjillings@1370 247 this.interfaceXML = null;
nickjillings@1370 248 this.generate = function()
nickjillings@1370 249 {
nickjillings@1370 250 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 251 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 252 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 253 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 254 this.testXML = this.testXML.getAllElementsByTagName("checks");
nickjillings@1370 255 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 256 {
nickjillings@1370 257 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 258 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 259 var testNode
nickjillings@1370 260 if (this.testXML.length > 0)
nickjillings@1370 261 {
nickjillings@1370 262 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 263 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 264 else {testNode = undefined;}
nickjillings@1370 265 } else {
nickjillings@1370 266 testNode = undefined;
nickjillings@1370 267 }
nickjillings@1370 268 var optH = document.createElement('div');
nickjillings@1370 269 optH.className = "popup-checkbox";
nickjillings@1370 270 var checkbox = document.createElement('input');
nickjillings@1370 271 checkbox.type = "checkbox";
nickjillings@1370 272 var text = document.createElement('span');
nickjillings@1370 273 checkbox.setAttribute('name',checkName);
nickjillings@1370 274 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 275 {
nickjillings@1370 276 checkbox.checked = true;
nickjillings@1370 277 }
nickjillings@1370 278 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 279 {
nickjillings@1370 280 checkbox.disabled = true;
nickjillings@1370 281 checkbox.checked = false;
nickjillings@1370 282 optH.className = "popup-checkbox disabled";
nickjillings@1370 283 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 284 {
nickjillings@1370 285 checkbox.disabled = true;
nickjillings@1370 286 checkbox.checked = true;
nickjillings@1370 287 optH.className = "popup-checkbox disabled";
nickjillings@1370 288 }
nickjillings@1370 289 if(testNode != undefined)
nickjillings@1370 290 {
nickjillings@1370 291 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 292 {
nickjillings@1370 293 checkbox.checked = true;
nickjillings@1370 294 }
nickjillings@1370 295 if (testNode.getAttribute('support') == "none")
nickjillings@1370 296 {
nickjillings@1370 297 checkbox.disabled = true;
nickjillings@1370 298 checkbox.checked = false;
nickjillings@1370 299 optH.className = "popup-checkbox disabled";
nickjillings@1370 300 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 301 {
nickjillings@1370 302 checkbox.disabled = true;
nickjillings@1370 303 checkbox.checked = true;
nickjillings@1370 304 optH.className = "popup-checkbox disabled";
nickjillings@1370 305 }
nickjillings@1370 306 }
nickjillings@1370 307 text.textContent = popupStateNodes.state[2].checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 308 optH.appendChild(checkbox);
nickjillings@1370 309 optH.appendChild(text);
nickjillings@1370 310 this.options.push(optH);
nickjillings@1370 311 this.content.appendChild(optH);
nickjillings@1370 312 }
nickjillings@1370 313 }
nickjillings@1370 314 this.continue = function()
nickjillings@1370 315 {
nickjillings@1370 316 if (specification.interfaces == null)
nickjillings@1370 317 {
nickjillings@1370 318 specification.interfaces = new specification.interfaceNode();
nickjillings@1370 319 }
nickjillings@1370 320 for (var object of this.options)
nickjillings@1370 321 {
nickjillings@1370 322 var checkbox = object.children[0];
nickjillings@1370 323 if (checkbox.checked)
nickjillings@1370 324 {
nickjillings@1370 325 var option = {
nickjillings@1370 326 type: "check",
nickjillings@1370 327 name: checkbox.getAttribute('name')
nickjillings@1370 328 };
nickjillings@1370 329 specification.interfaces.options.push(option);
nickjillings@1370 330 }
nickjillings@1370 331 }
nickjillings@1370 332 popupStateNodes.state[3].generate();
nickjillings@1370 333 popupObject.postNode(popupStateNodes.state[3]);
nickjillings@1370 334 }
nickjillings@1370 335 }
nickjillings@1370 336 this.state[3] = new function()
nickjillings@1370 337 {
nickjillings@1370 338 this.title = "Test Metrics";
nickjillings@1370 339 this.content = document.createElement("div");
nickjillings@1370 340 this.content.id = "state-1";
nickjillings@1370 341 var spnH = document.createElement('div');
nickjillings@1370 342 var span = document.createElement("span");
nickjillings@1370 343 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";
nickjillings@1370 344 spnH.appendChild(span);
nickjillings@1370 345 this.content.appendChild(spnH);
nickjillings@1370 346 this.options = [];
nickjillings@1370 347 this.checkText;
nickjillings@1370 348 this.testXML;
nickjillings@1370 349 this.interfaceXML;
nickjillings@1370 350 this.generate = function()
nickjillings@1370 351 {
nickjillings@1370 352 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 353 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 354 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 355 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 356 this.testXML = this.testXML.getAllElementsByTagName("metrics");
nickjillings@1370 357 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 358 {
nickjillings@1370 359 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 360 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 361 var testNode
nickjillings@1370 362 if (this.testXML.length > 0)
nickjillings@1370 363 {
nickjillings@1370 364 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 365 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 366 else {testNode = undefined;}
nickjillings@1370 367 } else {
nickjillings@1370 368 testNode = undefined;
nickjillings@1370 369 }
nickjillings@1370 370 var optH = document.createElement('div');
nickjillings@1370 371 optH.className = "popup-checkbox";
nickjillings@1370 372 var checkbox = document.createElement('input');
nickjillings@1370 373 checkbox.type = "checkbox";
nickjillings@1370 374 var text = document.createElement('span');
nickjillings@1370 375 checkbox.setAttribute('name',checkName);
nickjillings@1370 376 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 377 {
nickjillings@1370 378 checkbox.checked = true;
nickjillings@1370 379 }
nickjillings@1370 380 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 381 {
nickjillings@1370 382 checkbox.disabled = true;
nickjillings@1370 383 checkbox.checked = false;
nickjillings@1370 384 optH.className = "popup-checkbox disabled";
nickjillings@1370 385 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 386 {
nickjillings@1370 387 checkbox.disabled = true;
nickjillings@1370 388 checkbox.checked = true;
nickjillings@1370 389 optH.className = "popup-checkbox disabled";
nickjillings@1370 390 }
nickjillings@1370 391 if(testNode != undefined)
nickjillings@1370 392 {
nickjillings@1370 393 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 394 {
nickjillings@1370 395 checkbox.checked = true;
nickjillings@1370 396 }
nickjillings@1370 397 if (testNode.getAttribute('support') == "none")
nickjillings@1370 398 {
nickjillings@1370 399 checkbox.disabled = true;
nickjillings@1370 400 checkbox.checked = false;
nickjillings@1370 401 optH.className = "popup-checkbox disabled";
nickjillings@1370 402 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 403 {
nickjillings@1370 404 checkbox.disabled = true;
nickjillings@1370 405 checkbox.checked = true;
nickjillings@1370 406 optH.className = "popup-checkbox disabled";
nickjillings@1370 407 }
nickjillings@1370 408 }
nickjillings@1370 409 text.textContent = popupStateNodes.state[3].checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 410 optH.appendChild(checkbox);
nickjillings@1370 411 optH.appendChild(text);
nickjillings@1370 412 this.options.push(optH);
nickjillings@1370 413 this.content.appendChild(optH);
nickjillings@1370 414 }
nickjillings@1370 415 }
nickjillings@1370 416 this.continue = function()
nickjillings@1370 417 {
nickjillings@1370 418 if (specification.metrics == null) {
nickjillings@1370 419 specification.metrics = new specification.metricNode();
nickjillings@1370 420 }
nickjillings@1370 421 for (var object of this.options)
nickjillings@1370 422 {
nickjillings@1370 423 var checkbox = object.children[0];
nickjillings@1370 424 if (checkbox.checked)
nickjillings@1370 425 {
nickjillings@1370 426 specification.metrics.enabled.push(checkbox.getAttribute('name'));
nickjillings@1370 427 }
nickjillings@1370 428 }
nickjillings@1370 429 popupStateNodes.state[4].generate();
nickjillings@1370 430 popupObject.postNode(popupStateNodes.state[4]);
nickjillings@1370 431 }
nickjillings@1370 432 }
nickjillings@1370 433 this.state[4] = new function()
nickjillings@1370 434 {
nickjillings@1370 435 this.title = "Test Visuals";
nickjillings@1370 436 this.content = document.createElement("div");
nickjillings@1370 437 this.content.id = "state-1";
nickjillings@1370 438 var spnH = document.createElement('div');
nickjillings@1370 439 var span = document.createElement("span");
nickjillings@1370 440 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";
nickjillings@1370 441 spnH.appendChild(span);
nickjillings@1370 442 this.content.appendChild(spnH);
nickjillings@1370 443 this.options = [];
nickjillings@1370 444 this.checkText;
nickjillings@1370 445 this.testXML;
nickjillings@1370 446 this.interfaceXML;
nickjillings@1370 447 this.generate = function()
nickjillings@1370 448 {
nickjillings@1370 449 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 450 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
nickjillings@1370 451 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 452 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
nickjillings@1370 453 this.testXML = this.testXML.getAllElementsByTagName("metrics");
nickjillings@1370 454 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 455 {
nickjillings@1370 456 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 457 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 458 var testNode
nickjillings@1370 459 if (this.testXML.length > 0)
nickjillings@1370 460 {
nickjillings@1370 461 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 462 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 463 else {testNode = undefined;}
nickjillings@1370 464 } else {
nickjillings@1370 465 testNode = undefined;
nickjillings@1370 466 }
nickjillings@1370 467 var optH = document.createElement('div');
nickjillings@1370 468 optH.className = "popup-checkbox";
nickjillings@1370 469 var checkbox = document.createElement('input');
nickjillings@1370 470 checkbox.type = "checkbox";
nickjillings@1370 471 var text = document.createElement('span');
nickjillings@1370 472 checkbox.setAttribute('name',checkName);
nickjillings@1370 473 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 474 {
nickjillings@1370 475 checkbox.checked = true;
nickjillings@1370 476 }
nickjillings@1370 477 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 478 {
nickjillings@1370 479 checkbox.disabled = true;
nickjillings@1370 480 checkbox.checked = false;
nickjillings@1370 481 optH.className = "popup-checkbox disabled";
nickjillings@1370 482 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 483 {
nickjillings@1370 484 checkbox.disabled = true;
nickjillings@1370 485 checkbox.checked = true;
nickjillings@1370 486 optH.className = "popup-checkbox disabled";
nickjillings@1370 487 }
nickjillings@1370 488 if(testNode != undefined)
nickjillings@1370 489 {
nickjillings@1370 490 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 491 {
nickjillings@1370 492 checkbox.checked = true;
nickjillings@1370 493 }
nickjillings@1370 494 if (testNode.getAttribute('support') == "none")
nickjillings@1370 495 {
nickjillings@1370 496 checkbox.disabled = true;
nickjillings@1370 497 checkbox.checked = false;
nickjillings@1370 498 optH.className = "popup-checkbox disabled";
nickjillings@1370 499 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 500 {
nickjillings@1370 501 checkbox.disabled = true;
nickjillings@1370 502 checkbox.checked = true;
nickjillings@1370 503 optH.className = "popup-checkbox disabled";
nickjillings@1370 504 }
nickjillings@1370 505 }
nickjillings@1370 506 text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 507 optH.appendChild(checkbox);
nickjillings@1370 508 optH.appendChild(text);
nickjillings@1370 509 this.options.push(optH);
nickjillings@1370 510 this.content.appendChild(optH);
nickjillings@1370 511 }
nickjillings@1370 512 }
nickjillings@1370 513 this.continue = function()
nickjillings@1370 514 {
nickjillings@1370 515 if (specification.interfaces == null)
nickjillings@1370 516 {
nickjillings@1370 517 specification.interfaces = new specification.interfaceNode();
nickjillings@1370 518 }
nickjillings@1370 519 for (var object of this.options)
nickjillings@1370 520 {
nickjillings@1370 521 var checkbox = object.children[0];
nickjillings@1370 522 if (checkbox.checked)
nickjillings@1370 523 {
nickjillings@1370 524 var option = {
nickjillings@1370 525 type: "show",
nickjillings@1370 526 name: checkbox.getAttribute('name')
nickjillings@1370 527 };
nickjillings@1370 528 specification.interfaces.options.push(option);
nickjillings@1370 529 }
nickjillings@1370 530 }
nickjillings@1370 531 popupObject.hide();
nickjillings@1370 532 convert.convert(document.getElementById('content'));
nickjillings@1370 533 }
nickjillings@1370 534 }
nickjillings@1370 535 this.state[5] = new function() {
nickjillings@1370 536 this.title = "Add/Edit Survey Element";
nickjillings@1370 537 this.content = document.createElement("div");
nickjillings@1370 538 this.content.id = "state-1";
nickjillings@1370 539 var spnH = document.createElement('div');
nickjillings@1370 540 var span = document.createElement("span");
nickjillings@1370 541 span.textContent = "You can configure your survey element here. Press 'Continue' to complete your changes.";
nickjillings@1370 542 spnH.appendChild(span);
nickjillings@1370 543 this.content.appendChild(spnH);
nickjillings@1370 544 this.dynamic = document.createElement("div");
nickjillings@1370 545 this.option = null;
nickjillings@1370 546 this.parent = null;
nickjillings@1370 547 var select = document.createElement("select");
nickjillings@1370 548 select.setAttribute("name","type");
nickjillings@1370 549 select.addEventListener("change",this,false);
nickjillings@1370 550 this.content.appendChild(select);
nickjillings@1370 551 this.content.appendChild(this.dynamic);
nickjillings@1370 552 this.generate = function(option, parent)
nickjillings@1370 553 {
nickjillings@1370 554 this.option = option;
nickjillings@1370 555 this.parent = parent;
nickjillings@1370 556 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("type")[0].getAllElementsByTagName("xs:enumeration");
nickjillings@1370 557 for (var i=0; i<optionList.length; i++)
nickjillings@1370 558 {
nickjillings@1370 559 var selectOption = document.createElement("option");
nickjillings@1370 560 selectOption.value = optionList[i].getAttribute("value");
nickjillings@1370 561 selectOption.textContent = selectOption.value;
nickjillings@1370 562 select.appendChild(selectOption);
nickjillings@1370 563 }
nickjillings@1370 564 if (this.option.type != undefined){
nickjillings@1370 565 select.value = this.option.type
nickjillings@1370 566 } else {
nickjillings@1370 567 select.value = "statement";
nickjillings@1370 568 this.option.type = "statement";
nickjillings@1370 569 }
nickjillings@1370 570
nickjillings@1370 571 this.dynamic.innerHTML = null;
nickjillings@1370 572 var statement = document.createElement("div");
nickjillings@1370 573 var statementText = document.createElement("span");
nickjillings@1370 574 var statementEntry = document.createElement("textarea");
nickjillings@1370 575 statement.appendChild(statementText);
nickjillings@1370 576 statement.appendChild(statementEntry);
nickjillings@1370 577 statementText.textContent = "Statement/Question";
nickjillings@1370 578 statementEntry.addEventListener("change",this,false);
nickjillings@1370 579 statementEntry.setAttribute("name","statement");
nickjillings@1370 580 statementEntry.value = this.option.statement;
nickjillings@1370 581 this.dynamic.appendChild(statement);
nickjillings@1370 582 switch(this.option.type)
nickjillings@1370 583 {
nickjillings@1370 584 case "statement":
nickjillings@1370 585 break;
nickjillings@1370 586 case "question":
nickjillings@1370 587 var boxsizeSelect = document.createElement("select");
nickjillings@1370 588 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("boxsize")[0].getAllElementsByTagName("xs:enumeration");
nickjillings@1370 589 for (var i=0; i<optionList.length; i++)
nickjillings@1370 590 {
nickjillings@1370 591 var selectOption = document.createElement("option");
nickjillings@1370 592 selectOption.value = optionList[i].getAttribute("value");
nickjillings@1370 593 selectOption.textContent = selectOption.value;
nickjillings@1370 594 boxsizeSelect.appendChild(selectOption);
nickjillings@1370 595 }
nickjillings@1370 596 if(this.option.boxsize != undefined) {
nickjillings@1370 597 boxsizeSelect.value = this.option.boxsize;
nickjillings@1370 598 } else {
nickjillings@1370 599 boxsizeSelect.value = "normal";
nickjillings@1370 600 this.option.boxsize = "normal";
nickjillings@1370 601 }
nickjillings@1370 602 boxsizeSelect.setAttribute("name","boxsize");
nickjillings@1370 603 boxsizeSelect.addEventListener("change",this,false);
nickjillings@1370 604 var boxsize = document.createElement("div");
nickjillings@1370 605 var boxsizeText = document.createElement("span");
nickjillings@1370 606 boxsizeText.textContent = "Entry Size: ";
nickjillings@1370 607 boxsize.appendChild(boxsizeText);
nickjillings@1370 608 boxsize.appendChild(boxsizeSelect);
nickjillings@1370 609 this.dynamic.appendChild(boxsize);
nickjillings@1370 610
nickjillings@1370 611 var mandatory = document.createElement("div");
nickjillings@1370 612 var mandatoryInput = document.createElement("input");
nickjillings@1370 613 var mandatoryText = document.createElement("span");
nickjillings@1370 614 mandatoryText.textContent = "Mandatory: ";
nickjillings@1370 615 mandatory.appendChild(mandatoryText);
nickjillings@1370 616 mandatory.appendChild(mandatoryInput);
nickjillings@1370 617 mandatoryInput.type = "checkbox";
nickjillings@1370 618 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
nickjillings@1370 619 mandatoryInput.setAttribute("name","mandatory");
nickjillings@1370 620 mandatoryInput.addEventListener("change",this,false);
nickjillings@1370 621 mandatory.appendChild(mandatoryText);
nickjillings@1370 622 mandatory.appendChild(mandatoryInput);
nickjillings@1370 623 this.dynamic.appendChild(mandatory);
nickjillings@1370 624 break;
nickjillings@1370 625 }
nickjillings@1370 626 }
nickjillings@1370 627 this.handleEvent = function()
nickjillings@1370 628 {
nickjillings@1370 629 var name = event.currentTarget.getAttribute("name");
nickjillings@1370 630 switch(name) {
nickjillings@1370 631 case "type":
nickjillings@1370 632 // If type has changed, we may need to rebuild the entire state node
nickjillings@1370 633 if (event.currentTarget.value != this.option.name)
nickjillings@1370 634 {
nickjillings@1370 635 this.option.type = event.currentTarget.value;
nickjillings@1370 636 this.generate(this.option,this.parent);
nickjillings@1370 637 }
nickjillings@1370 638 break;
nickjillings@1370 639 case "mandatory":
nickjillings@1370 640 this.option.mandatory = event.currentTarget.checked;
nickjillings@1370 641 break;
nickjillings@1370 642 case "boxsize":
nickjillings@1370 643 this.option.boxsize = event.currentTarget.value;
nickjillings@1370 644 break;
nickjillings@1370 645 case "statement":
nickjillings@1370 646 this.option.statement = event.currentTarget.value;
nickjillings@1370 647 break;
nickjillings@1370 648 }
nickjillings@1370 649 }
nickjillings@1370 650 this.continue = function()
nickjillings@1370 651 {
nickjillings@1370 652 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
nickjillings@1370 653 this.parent.children.push(newNode);
nickjillings@1370 654 this.parent.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1370 655 popupObject.hide();
nickjillings@1370 656 }
nickjillings@1370 657 }
nickjillings@1370 658 }
nickjillings@1370 659 }
nickjillings@1370 660
nickjillings@1370 661 function SpecificationToHTML()
nickjillings@1370 662 {
nickjillings@1370 663 // This takes the specification node and converts it to an on-page HTML object
nickjillings@1370 664 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
nickjillings@1370 665 // Once generated, it directly binds into the specification object to update with changes
nickjillings@1370 666 // Fixed DOM entries
nickjillings@1370 667 this.injectDOM;
nickjillings@1370 668 this.setupDOM;
nickjillings@1370 669 this.pages = [];
nickjillings@1370 670
nickjillings@1370 671 // Self-contained generators
nickjillings@1370 672 this.createGeneralNodeDOM = function(name,id,parent)
nickjillings@1370 673 {
nickjillings@1370 674 var root = document.createElement('div');
nickjillings@1370 675 root.id = id;
nickjillings@1370 676 root.className = "node";
nickjillings@1370 677
nickjillings@1370 678 var titleDiv = document.createElement('div');
nickjillings@1370 679 titleDiv.className = "node-title";
nickjillings@1370 680 var title = document.createElement('span');
nickjillings@1370 681 title.className = "node-title";
nickjillings@1370 682 title.textContent = name;
nickjillings@1370 683 titleDiv.appendChild(title);
nickjillings@1370 684
nickjillings@1370 685 var attributeDiv = document.createElement('div');
nickjillings@1370 686 attributeDiv.className = "node-attributes";
nickjillings@1370 687
nickjillings@1370 688 var childrenDiv = document.createElement('div');
nickjillings@1370 689 childrenDiv.className = "node-children";
nickjillings@1370 690
nickjillings@1370 691 var buttonsDiv = document.createElement('div');
nickjillings@1370 692 buttonsDiv.className = "node-buttons";
nickjillings@1370 693
nickjillings@1370 694 root.appendChild(titleDiv);
nickjillings@1370 695 root.appendChild(attributeDiv);
nickjillings@1370 696 root.appendChild(childrenDiv);
nickjillings@1370 697 root.appendChild(buttonsDiv);
nickjillings@1370 698
nickjillings@1370 699 var obj = {
nickjillings@1370 700 rootDOM: root,
nickjillings@1370 701 titleDOM: title,
nickjillings@1370 702 attributeDOM: attributeDiv,
nickjillings@1370 703 attributes: [],
nickjillings@1370 704 childrenDOM: childrenDiv,
nickjillings@1370 705 children: [],
nickjillings@1370 706 buttonDOM: buttonsDiv,
nickjillings@1370 707 parent: parent
nickjillings@1370 708 }
nickjillings@1370 709 return obj;
nickjillings@1370 710 }
nickjillings@1370 711
nickjillings@1370 712 this.convertAttributeToDOM = function(node,schema)
nickjillings@1370 713 {
nickjillings@1370 714 // This takes an attribute schema node and returns an object with the input node and any bindings
nickjillings@1370 715 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
nickjillings@1370 716 {
nickjillings@1370 717 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
nickjillings@1370 718 }
nickjillings@1370 719 var obj = new function()
nickjillings@1370 720 {
nickjillings@1370 721 this.input;
nickjillings@1370 722 this.name;
nickjillings@1370 723 this.owner;
nickjillings@1370 724 this.holder;
nickjillings@1370 725
nickjillings@1370 726 this.name = schema.getAttribute('name');
nickjillings@1370 727 this.default = schema.getAttribute('default');
nickjillings@1370 728 this.dataType = schema.getAttribute('type');
nickjillings@1370 729 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
nickjillings@1370 730 else {this.dataType = "string";}
nickjillings@1370 731 var minVar = undefined;
nickjillings@1370 732 var maxVar = undefined;
nickjillings@1370 733 switch(this.dataType)
nickjillings@1370 734 {
nickjillings@1370 735 case "negativeInteger":
nickjillings@1370 736 maxVar = -1;
nickjillings@1370 737 break;
nickjillings@1370 738 case "positiveInteger":
nickjillings@1370 739 minVar = 1;
nickjillings@1370 740 break;
nickjillings@1370 741 case "nonNegativeInteger":
nickjillings@1370 742 minVar = 0;
nickjillings@1370 743 break;
nickjillings@1370 744 case "nonPositiveInteger":
nickjillings@1370 745 maxVar = 0;
nickjillings@1370 746 break;
nickjillings@1370 747 case "byte":
nickjillings@1370 748 minVar = 0;
nickjillings@1370 749 maxVar = 256;
nickjillings@1370 750 break;
nickjillings@1370 751 case "short":
nickjillings@1370 752 minVar = 0;
nickjillings@1370 753 maxVar = 65536;
nickjillings@1370 754 break;
nickjillings@1370 755 default:
nickjillings@1370 756 break;
nickjillings@1370 757 }
nickjillings@1370 758
nickjillings@1370 759 this.input = document.createElement('input');
nickjillings@1370 760 switch(this.dataType)
nickjillings@1370 761 {
nickjillings@1370 762 case "boolean":
nickjillings@1370 763 this.input.type = "checkbox";
nickjillings@1370 764 break;
nickjillings@1370 765 case "negativeInteger":
nickjillings@1370 766 case "positiveInteger":
nickjillings@1370 767 case "nonNegativeInteger":
nickjillings@1370 768 case "nonPositiveInteger":
nickjillings@1370 769 case "integer":
nickjillings@1370 770 case "short":
nickjillings@1370 771 case "byte":
nickjillings@1370 772 this.input.step = 1;
nickjillings@1370 773 case "decimal":
nickjillings@1370 774 this.input.type = "number";
nickjillings@1370 775 this.input.min = minVar;
nickjillings@1370 776 this.input.max = maxVar;
nickjillings@1370 777 break;
nickjillings@1370 778 default:
nickjillings@1370 779 break;
nickjillings@1370 780 }
nickjillings@1370 781 var value;
nickjillings@1370 782 eval("value = specification."+this.name)
nickjillings@1370 783 if (value != undefined)
nickjillings@1370 784 {
nickjillings@1370 785 this.input.value = value;
nickjillings@1370 786 } else if (this.default != undefined)
nickjillings@1370 787 {
nickjillings@1370 788 this.input.value = this.default;
nickjillings@1370 789 }
nickjillings@1370 790 this.handleEvent = function(event)
nickjillings@1370 791 {
nickjillings@1370 792 var value;
nickjillings@1370 793 switch(this.input.type)
nickjillings@1370 794 {
nickjillings@1370 795 case "checkbox":
nickjillings@1370 796 value = event.currentTarget.checked;
nickjillings@1370 797 break;
nickjillings@1370 798 case "number":
nickjillings@1370 799 value = Number(event.currentTarget.value);
nickjillings@1370 800 break;
nickjillings@1370 801 default:
nickjillings@1370 802 value = event.currentTarget.value;
nickjillings@1370 803 break;
nickjillings@1370 804 }
nickjillings@1370 805 eval("this.owner."+this.name+" = value");
nickjillings@1370 806 }
nickjillings@1370 807 this.holder = document.createElement('div');
nickjillings@1370 808 this.holder.className = "attribute";
nickjillings@1370 809 this.holder.setAttribute('name',this.name);
nickjillings@1370 810 var text = document.createElement('span');
nickjillings@1370 811 eval("text.textContent = attributeText."+this.name+"+': '");
nickjillings@1370 812 this.holder.appendChild(text);
nickjillings@1370 813 this.holder.appendChild(this.input);
nickjillings@1370 814 this.owner = node;
nickjillings@1370 815 this.input.addEventListener("change",this,false);
nickjillings@1370 816 }
nickjillings@1370 817 if (obj.attribute != null)
nickjillings@1370 818 {
nickjillings@1370 819 obj.input.value = obj.attribute;
nickjillings@1370 820 }
nickjillings@1370 821 return obj;
nickjillings@1370 822 }
nickjillings@1370 823
nickjillings@1370 824 this.convert = function(root)
nickjillings@1370 825 {
nickjillings@1370 826 //Performs the actual conversion using the given root DOM as the root
nickjillings@1370 827 this.injectDOM = root;
nickjillings@1370 828
nickjillings@1370 829 // First perform the setupNode;
nickjillings@1370 830 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
nickjillings@1370 831 this.setupDOM = new this.createGeneralNodeDOM('setup','setup',null);
nickjillings@1370 832 this.injectDOM.appendChild(this.setupDOM.rootDOM);
nickjillings@1370 833 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
nickjillings@1370 834 for (var i=0; i<setupAttributes.length; i++)
nickjillings@1370 835 {
nickjillings@1370 836 var attributeName = setupAttributes[i].getAttribute('name');
nickjillings@1370 837 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
nickjillings@1370 838 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 839 this.setupDOM.attributes.push(attrObject);
nickjillings@1370 840 }
nickjillings@1370 841
nickjillings@1370 842 // Now we must build the interface Node
nickjillings@1370 843 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
nickjillings@1370 844 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
nickjillings@1370 845
nickjillings@1370 846 // Now build the Metrics selection node
nickjillings@1370 847 var metric = this.createGeneralNodeDOM("metrics","setup-metric",this.setupDOM);
nickjillings@1370 848 metric.rootDOM.removeChild(metric.attributeDOM);
nickjillings@1370 849 this.setupDOM.children.push(metric);
nickjillings@1370 850 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
nickjillings@1370 851 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 852 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 853 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 854 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 855 testXML = testXML.getAllElementsByTagName("metrics");
nickjillings@1370 856 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 857 {
nickjillings@1370 858 var obj = {
nickjillings@1370 859 input: document.createElement('input'),
nickjillings@1370 860 root: document.createElement('div'),
nickjillings@1370 861 text: document.createElement('span'),
nickjillings@1370 862 specification: specification.metrics.enabled,
nickjillings@1370 863 name: interfaceXML.children[i].getAttribute("name"),
nickjillings@1370 864 handleEvent: function()
nickjillings@1370 865 {
nickjillings@1370 866 for (var i=0; i<this.specification.length; i++)
nickjillings@1370 867 {
nickjillings@1370 868 if (this.specification[i] == this.name)
nickjillings@1370 869 {
nickjillings@1370 870 var options = this.specification;
nickjillings@1370 871 if (this.input.checked == false) {
nickjillings@1370 872 if (i == options.length)
nickjillings@1370 873 {options = options.slice(0,i);}
nickjillings@1370 874 else {
nickjillings@1370 875 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 876 }
nickjillings@1370 877 } else {
nickjillings@1370 878 return;
nickjillings@1370 879 }
nickjillings@1370 880 this.specification = options;
nickjillings@1370 881 break;
nickjillings@1370 882 }
nickjillings@1370 883 }
nickjillings@1370 884 if (this.input.checked) {
nickjillings@1370 885 this.specification.push(this.name);
nickjillings@1370 886 }
nickjillings@1370 887 }
nickjillings@1370 888 };
nickjillings@1370 889 obj.root.className = "attribute";
nickjillings@1370 890 obj.input.type = "checkbox";
nickjillings@1370 891 obj.root.appendChild(obj.text);
nickjillings@1370 892 obj.root.appendChild(obj.input);
nickjillings@1370 893 obj.text.textContent = checkText.children[i].textContent;
nickjillings@1370 894 metric.children.push(obj);
nickjillings@1370 895 metric.childrenDOM.appendChild(obj.root);
nickjillings@1370 896 for (var i=0; i<specification.metrics.enabled.length; i++)
nickjillings@1370 897 {
nickjillings@1370 898 if (specification.metrics.enabled[i] == obj.name)
nickjillings@1370 899 {
nickjillings@1370 900 obj.input.checked = true;
nickjillings@1370 901 break;
nickjillings@1370 902 }
nickjillings@1370 903 }
nickjillings@1370 904 }
nickjillings@1370 905
nickjillings@1370 906 // Now both before and after surveys
nickjillings@1370 907 if (specification.preTest == undefined){
nickjillings@1370 908 specification.preTest = new specification.surveyNode();
nickjillings@1370 909 specification.preTest.location = "pre";
nickjillings@1370 910 }
nickjillings@1370 911 if (specification.postTest == undefined){
nickjillings@1370 912 specification.postTest = new specification.surveyNode();
nickjillings@1370 913 specification.postTest.location = "post";
nickjillings@1370 914 }
nickjillings@1370 915 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
nickjillings@1370 916 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
nickjillings@1370 917 this.setupDOM.children.push(surveyBefore);
nickjillings@1370 918 this.setupDOM.children.push(surveyAfter);
nickjillings@1370 919 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 920 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 921
nickjillings@1370 922 // Add in the page creator button
nickjillings@1370 923 this.addPage = {
nickjillings@1370 924 root: document.createElement("button"),
nickjillings@1370 925 parent: this,
nickjillings@1370 926 handleEvent: function()
nickjillings@1370 927 {
nickjillings@1370 928 var pageObj = new specification.page();
nickjillings@1370 929 specification.pages.push(pageObj);
nickjillings@1370 930 var newPage = new this.parent.pageNode(this.parent,pageObj);
nickjillings@1370 931 this.parent.injectDOM.appendChild(newPage.rootDOM);
nickjillings@1370 932 this.parent.pages.push(newPage);
nickjillings@1370 933 }
nickjillings@1370 934 }
nickjillings@1370 935 this.addPage.root.textContent = "Add Page";
nickjillings@1370 936 this.addPage.root.addEventListener("click",this.addPage,false);
nickjillings@1370 937 this.injectDOM.appendChild(this.addPage.root);
nickjillings@1370 938 }
nickjillings@1370 939
nickjillings@1370 940 this.interfaceNode = function(parent,rootObject)
nickjillings@1370 941 {
nickjillings@1370 942 this.rootDOM;
nickjillings@1370 943 this.titleDOM;
nickjillings@1370 944 this.attributeDOM;
nickjillings@1370 945 this.attributes = [];
nickjillings@1370 946 this.childrenDOM;
nickjillings@1370 947 this.children = [];
nickjillings@1370 948 this.buttonDOM;
nickjillings@1370 949 this.parent = parent;
nickjillings@1370 950 this.HTMLPoint;
nickjillings@1370 951 this.specification = rootObject;
nickjillings@1370 952 this.schema = specification.schema.getAllElementsByName("interface")[1];
nickjillings@1370 953
nickjillings@1370 954 this.createIOasAttr = function(name,specification,parent,type) {
nickjillings@1370 955 this.root = document.createElement('div');
nickjillings@1370 956 this.input = document.createElement("input");
nickjillings@1370 957 this.name = name;
nickjillings@1370 958 this.type = type;
nickjillings@1370 959 this.parent = parent;
nickjillings@1370 960 this.specification = specification;
nickjillings@1370 961 this.handleEvent = function(event) {
nickjillings@1370 962 for (var i=0; i<this.specification.options.length; i++)
nickjillings@1370 963 {
nickjillings@1370 964 if (this.specification.options[i].name == this.name)
nickjillings@1370 965 {
nickjillings@1370 966 var options = this.specification.options;
nickjillings@1370 967 if (this.input.checked == false) {
nickjillings@1370 968 if (i == options.length)
nickjillings@1370 969 {options = options.slice(0,i);}
nickjillings@1370 970 else {
nickjillings@1370 971 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 972 }
nickjillings@1370 973 } else {
nickjillings@1370 974 return;
nickjillings@1370 975 }
nickjillings@1370 976 this.specification.options = options;
nickjillings@1370 977 break;
nickjillings@1370 978 }
nickjillings@1370 979 }
nickjillings@1370 980 if (this.input.checked) {
nickjillings@1370 981 var obj = {
nickjillings@1370 982 name: this.name,
nickjillings@1370 983 type: this.type
nickjillings@1370 984 };
nickjillings@1370 985 this.specification.options.push(obj);
nickjillings@1370 986 }
nickjillings@1370 987 if (this.parent.HTMLPoint.id == "setup")
nickjillings@1370 988 {
nickjillings@1370 989 // We've changed a global setting, must update all child 'interfaces' and disable them
nickjillings@1370 990 for (pages of convert.pages)
nickjillings@1370 991 {
nickjillings@1370 992 for (interface of pages.interfaces)
nickjillings@1370 993 {
nickjillings@1370 994 if (this.type == "check")
nickjillings@1370 995 {
nickjillings@1370 996 for (node of interface.children[0].attributes)
nickjillings@1370 997 {
nickjillings@1370 998 if (node.name == this.name) {
nickjillings@1370 999 if (this.input.checked) {
nickjillings@1370 1000 node.input.disabled = true;
nickjillings@1370 1001 node.input.checked = false;
nickjillings@1370 1002 } else {
nickjillings@1370 1003 node.input.disabled = false;
nickjillings@1370 1004 }
nickjillings@1370 1005 break;
nickjillings@1370 1006 }
nickjillings@1370 1007 }
nickjillings@1370 1008 } else if (this.type == "show")
nickjillings@1370 1009 {
nickjillings@1370 1010 for (node of interface.children[1].attributes)
nickjillings@1370 1011 {
nickjillings@1370 1012 if (node.name == this.name) {
nickjillings@1370 1013 if (this.input.checked) {
nickjillings@1370 1014 node.input.disabled = true;
nickjillings@1370 1015 } else {
nickjillings@1370 1016 node.input.disabled = false;
nickjillings@1370 1017 }
nickjillings@1370 1018 break;
nickjillings@1370 1019 }
nickjillings@1370 1020 }
nickjillings@1370 1021 }
nickjillings@1370 1022 }
nickjillings@1370 1023 }
nickjillings@1370 1024 }
nickjillings@1370 1025 };
nickjillings@1370 1026 this.findIndex = function(element,index,array){
nickjillings@1370 1027 if (element.name == this.name)
nickjillings@1370 1028 return true;
nickjillings@1370 1029 else
nickjillings@1370 1030 return false;
nickjillings@1370 1031 };
nickjillings@1370 1032 this.findNode = function(element,index,array){
nickjillings@1370 1033 if (element.name == this.name)
nickjillings@1370 1034 return true;
nickjillings@1370 1035 else
nickjillings@1370 1036 return false;
nickjillings@1370 1037 };
nickjillings@1370 1038 this.input.type = "checkbox";
nickjillings@1370 1039 this.input.setAttribute("name",name);
nickjillings@1370 1040 this.input.addEventListener("change",this,false);
nickjillings@1370 1041 this.root.appendChild(this.input);
nickjillings@1370 1042 this.root.className = "attribute";
nickjillings@1370 1043 return this;
nickjillings@1370 1044 }
nickjillings@1370 1045
nickjillings@1370 1046 this.build = function(name,id,parent)
nickjillings@1370 1047 {
nickjillings@1370 1048 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
nickjillings@1370 1049
nickjillings@1370 1050 this.rootDOM = obj.rootDOM;
nickjillings@1370 1051 this.titleDOM = obj.titleDOM;
nickjillings@1370 1052 this.attributeDOM = obj.attributeDOM;
nickjillings@1370 1053 this.childrenDOM = obj.childrenDOM;
nickjillings@1370 1054 this.buttonDOM = obj.buttonsDOM;
nickjillings@1370 1055 this.HTMLPoint = parent;
nickjillings@1370 1056 this.rootDOM.removeChild(this.attributeDOM);
nickjillings@1370 1057 // Put in the check / show options as individual children
nickjillings@1370 1058 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
nickjillings@1370 1059
nickjillings@1370 1060 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1061 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1062 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1063 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1064 testXML = testXML.getAllElementsByTagName("checks");
nickjillings@1370 1065 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 1066 {
nickjillings@1370 1067 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"check");
nickjillings@1370 1068 for (var option of this.specification.options)
nickjillings@1370 1069 {
nickjillings@1370 1070 if (option.name == obj.name)
nickjillings@1370 1071 {
nickjillings@1370 1072 obj.input.checked = true;
nickjillings@1370 1073 break;
nickjillings@1370 1074 }
nickjillings@1370 1075 }
nickjillings@1370 1076 if (parent.id != "setup") {
nickjillings@1370 1077 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1370 1078 if (node.input.checked) {
nickjillings@1370 1079 obj.input.checked = false;
nickjillings@1370 1080 obj.input.disable = true;
nickjillings@1370 1081 }
nickjillings@1370 1082 }
nickjillings@1370 1083 var text = document.createElement('span');
nickjillings@1370 1084 text.textContent = checkText.children[i].textContent;
nickjillings@1370 1085 obj.root.appendChild(text);
nickjillings@1370 1086 checks.attributeDOM.appendChild(obj.root);
nickjillings@1370 1087 checks.attributes.push(obj);
nickjillings@1370 1088 }
nickjillings@1370 1089 this.children.push(checks);
nickjillings@1370 1090 this.childrenDOM.appendChild(checks.rootDOM);
nickjillings@1370 1091
nickjillings@1370 1092 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
nickjillings@1370 1093 interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1094 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1095 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1096 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1097 testXML = testXML.getAllElementsByTagName("show");
nickjillings@1370 1098 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 1099 {
nickjillings@1370 1100 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"show");
nickjillings@1370 1101 for (var option of this.specification.options)
nickjillings@1370 1102 {
nickjillings@1370 1103 if (option.name == obj.name)
nickjillings@1370 1104 {
nickjillings@1370 1105 obj.input.checked = true;
nickjillings@1370 1106 break;
nickjillings@1370 1107 }
nickjillings@1370 1108 }
nickjillings@1370 1109 if (parent.id != "setup") {
nickjillings@1370 1110 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1370 1111 if (node.input.checked) {
nickjillings@1370 1112 obj.input.checked = false;
nickjillings@1370 1113 obj.input.disable = true;
nickjillings@1370 1114 }
nickjillings@1370 1115 }
nickjillings@1370 1116 var text = document.createElement('span');
nickjillings@1370 1117 text.textContent = checkText.children[i].textContent;
nickjillings@1370 1118 obj.root.appendChild(text);
nickjillings@1370 1119 show.attributeDOM.appendChild(obj.root);
nickjillings@1370 1120 show.attributes.push(obj);
nickjillings@1370 1121 }
nickjillings@1370 1122 this.children.push(show);
nickjillings@1370 1123 this.childrenDOM.appendChild(show.rootDOM);
nickjillings@1370 1124
nickjillings@1370 1125 if (parent.id == "setup")
nickjillings@1370 1126 {
nickjillings@1370 1127 } else {
nickjillings@1370 1128 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
nickjillings@1370 1129 this.attributeDOM.appendChild(nameAttr.holder);
nickjillings@1370 1130 this.attributes.push(nameAttr);
nickjillings@1370 1131 }
nickjillings@1370 1132 if (parent != undefined)
nickjillings@1370 1133 {
nickjillings@1370 1134 parent.appendChild(this.rootDOM);
nickjillings@1370 1135 }
nickjillings@1370 1136 }
nickjillings@1370 1137 }
nickjillings@1370 1138
nickjillings@1370 1139 this.surveyNode = function(parent,rootObject,location)
nickjillings@1370 1140 {
nickjillings@1370 1141 this.rootDOM = document.createElement("div");
nickjillings@1370 1142 this.titleDOM = document.createElement("span");
nickjillings@1370 1143 this.attributeDOM = document.createElement("div");
nickjillings@1370 1144 this.attributes = [];
nickjillings@1370 1145 this.childrenDOM = document.createElement("div");
nickjillings@1370 1146 this.children = [];
nickjillings@1370 1147 this.buttonDOM = document.createElement("div");
nickjillings@1370 1148 this.parent = parent;
nickjillings@1370 1149 this.specification = rootObject;
nickjillings@1370 1150 this.schema = specification.schema.getAllElementsByName("survey")[1];
nickjillings@1370 1151 this.rootDOM.className = "node";
nickjillings@1370 1152
nickjillings@1370 1153 var titleDiv = document.createElement('div');
nickjillings@1370 1154 titleDiv.className = "node-title";
nickjillings@1370 1155 this.titleDOM.className = "node-title";
nickjillings@1370 1156 this.titleDOM.textContent = "Survey";
nickjillings@1370 1157 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1158
nickjillings@1370 1159 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1160 var locationAttr = document.createElement("span");
nickjillings@1370 1161 this.attributeDOM.appendChild(locationAttr);
nickjillings@1370 1162 if (location == "Pre" || location == "pre") {
nickjillings@1370 1163 locationAttr.textContent = "Location: Before";
nickjillings@1370 1164 } else {
nickjillings@1370 1165 locationAttr.textContent = "Location: After";
nickjillings@1370 1166 }
nickjillings@1370 1167 this.childrenDOM.className = "node-children";
nickjillings@1370 1168 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1169
nickjillings@1370 1170 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1171 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1172 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1173 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1174
nickjillings@1370 1175 this.surveyEntryNode = function(parent,rootObject)
nickjillings@1370 1176 {
nickjillings@1370 1177 this.rootDOM = document.createElement("div");
nickjillings@1370 1178 this.titleDOM = document.createElement("span");
nickjillings@1370 1179 this.attributeDOM = document.createElement("div");
nickjillings@1370 1180 this.attributes = [];
nickjillings@1370 1181 this.childrenDOM = document.createElement("div");
nickjillings@1370 1182 this.children = [];
nickjillings@1370 1183 this.buttonDOM = document.createElement("div");
nickjillings@1370 1184 this.parent = parent;
nickjillings@1370 1185 this.specification = rootObject;
nickjillings@1370 1186 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
nickjillings@1370 1187
nickjillings@1370 1188 this.rootDOM.id = id;
nickjillings@1370 1189 this.rootDOM.className = "node";
nickjillings@1370 1190 this.rootDOM.style.minWidth = "50%";
nickjillings@1370 1191
nickjillings@1370 1192 var titleDiv = document.createElement('div');
nickjillings@1370 1193 titleDiv.className = "node-title";
nickjillings@1370 1194 this.titleDOM.className = "node-title";
nickjillings@1370 1195 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1196
nickjillings@1370 1197 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1198 this.childrenDOM.className = "node-children";
nickjillings@1370 1199 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1200
nickjillings@1370 1201 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1202 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1203 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1204 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1205
nickjillings@1370 1206 var statement = {};
nickjillings@1370 1207 statement.rootDOM = document.createElement("div");
nickjillings@1370 1208 statement.titleDOM = document.createElement("span");
nickjillings@1370 1209 statement.titleDOM.textContent = "Statement/Question";
nickjillings@1370 1210 statement.input = document.createElement("textarea");
nickjillings@1370 1211 statement.input.value = this.specification.statement;
nickjillings@1370 1212 statement.specification = this.specification;
nickjillings@1370 1213 statement.handleEvent = function() {
nickjillings@1370 1214 this.specification.statement = this.input.value;
nickjillings@1370 1215 }
nickjillings@1370 1216 statement.input.addEventListener("change",statement,false);
nickjillings@1370 1217 statement.rootDOM.appendChild(statement.titleDOM);
nickjillings@1370 1218 statement.rootDOM.appendChild(statement.input);
nickjillings@1370 1219 this.children.push(statement);
nickjillings@1370 1220 this.childrenDOM.appendChild(statement.rootDOM);
nickjillings@1370 1221 switch(this.specification.type)
nickjillings@1370 1222 {
nickjillings@1370 1223 case "statement":
nickjillings@1370 1224 this.titleDOM.textContent = "Statement";
nickjillings@1370 1225 this.rootDOM.removeChild(this.attributeDOM);
nickjillings@1370 1226 break;
nickjillings@1370 1227 case "question":
nickjillings@1370 1228 var id = convert.convertAttributeToDOM(this.specification.id,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1370 1229 var mandatory = convert.convertAttributeToDOM(this.specification.mandatory,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1370 1230 var boxsize = convert.convertAttributeToDOM(this.specification.mandatory,specification.schema.getAllElementsByName("boxsize")[0]);
nickjillings@1370 1231 break;
nickjillings@1370 1232 }
nickjillings@1370 1233
nickjillings@1370 1234 this.editNode = {
nickjillings@1370 1235 root: document.createElement("button"),
nickjillings@1370 1236 parent: this,
nickjillings@1370 1237 handleEvent: function()
nickjillings@1370 1238 {
nickjillings@1370 1239 popupObject.show();
nickjillings@1370 1240 popupStateNodes.state[5].generate(this,this.parent);
nickjillings@1370 1241 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 1242 }
nickjillings@1370 1243 }
nickjillings@1370 1244 this.editNode.root.textContent = "Edit Entry";
nickjillings@1370 1245 this.editNode.root.addEventListener("click",this.editNode,false);
nickjillings@1370 1246 this.buttonDOM.appendChild(this.editNode.root);
nickjillings@1370 1247
nickjillings@1370 1248 this.deleteNode = {
nickjillings@1370 1249 root: document.createElement("button"),
nickjillings@1370 1250 parent: this,
nickjillings@1370 1251 handleEvent: function()
nickjillings@1370 1252 {
nickjillings@1370 1253 var optionList = this.parent.parent.specification.options;
nickjillings@1370 1254 var childList = this.parent.parent.children;
nickjillings@1370 1255 for (var i=0; i <this.parent.parent.specification.options.length; i++)
nickjillings@1370 1256 {
nickjillings@1370 1257 var option = this.parent.parent.specification.options[i];
nickjillings@1370 1258 if (option == this.parent.specification)
nickjillings@1370 1259 {
nickjillings@1370 1260 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 1261 if (i == this.parent.parent.specification.options.length-1)
nickjillings@1370 1262 {
nickjillings@1370 1263 optionList = optionList.slice(0,i);
nickjillings@1370 1264 childList = childList.slice(0,i);
nickjillings@1370 1265 }
nickjillings@1370 1266 else {
nickjillings@1370 1267 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
nickjillings@1370 1268 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 1269 }
nickjillings@1370 1270 this.parent.parent.specification.options = optionList;
nickjillings@1370 1271 this.parent.parent.children = childList;
nickjillings@1370 1272 }
nickjillings@1370 1273 }
nickjillings@1370 1274 }
nickjillings@1370 1275 }
nickjillings@1370 1276 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 1277 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 1278 this.buttonDOM.appendChild(this.deleteNode.root);
nickjillings@1370 1279 }
nickjillings@1370 1280 this.addNode = {
nickjillings@1370 1281 root: document.createElement("button"),
nickjillings@1370 1282 parent: this,
nickjillings@1370 1283 handleEvent: function()
nickjillings@1370 1284 {
nickjillings@1370 1285 var newNode = new this.parent.specification.OptionNode();
nickjillings@1370 1286 this.parent.specification.options.push(newNode);
nickjillings@1370 1287 popupObject.show();
nickjillings@1370 1288 popupStateNodes.state[5].generate(newNode,this.parent);
nickjillings@1370 1289 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 1290 }
nickjillings@1370 1291 }
nickjillings@1370 1292 this.addNode.root.textContent = "Add Survey Entry";
nickjillings@1370 1293 this.addNode.root.addEventListener("click",this.addNode,false);
nickjillings@1370 1294 this.buttonDOM.appendChild(this.addNode.root);
nickjillings@1370 1295
nickjillings@1370 1296 for (var option of this.specification.options)
nickjillings@1370 1297 {
nickjillings@1370 1298 var newNode = new this.surveyEntryNode(this,option);
nickjillings@1370 1299 this.children.push(newNode);
nickjillings@1370 1300 this.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1370 1301 }
nickjillings@1370 1302 }
nickjillings@1370 1303
nickjillings@1370 1304 this.pageNode = function(parent,rootObject)
nickjillings@1370 1305 {
nickjillings@1370 1306 this.rootDOM = document.createElement("div");
nickjillings@1370 1307 this.titleDOM = document.createElement("span");
nickjillings@1370 1308 this.attributeDOM = document.createElement("div");
nickjillings@1370 1309 this.attributes = [];
nickjillings@1370 1310 this.childrenDOM = document.createElement("div");
nickjillings@1370 1311 this.children = [];
nickjillings@1370 1312 this.buttonDOM = document.createElement("div");
nickjillings@1370 1313 this.parent = parent;
nickjillings@1370 1314 this.specification = rootObject;
nickjillings@1370 1315 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1370 1316 this.rootDOM.className = "node";
nickjillings@1370 1317
nickjillings@1370 1318 var titleDiv = document.createElement('div');
nickjillings@1370 1319 titleDiv.className = "node-title";
nickjillings@1370 1320 this.titleDOM.className = "node-title";
nickjillings@1370 1321 this.titleDOM.textContent = "Test Page";
nickjillings@1370 1322 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1323
nickjillings@1370 1324 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1325 this.childrenDOM.className = "node-children";
nickjillings@1370 1326 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1327
nickjillings@1370 1328 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1329 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1330 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1331 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1332
nickjillings@1370 1333 // Do the comment prefix node
nickjillings@1370 1334 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
nickjillings@1370 1335 cpn.rootDOM.removeChild(cpn.attributeDOM);
nickjillings@1370 1336 var obj = {
nickjillings@1370 1337 root: document.createElement("div"),
nickjillings@1370 1338 input: document.createElement("input"),
nickjillings@1370 1339 parent: this,
nickjillings@1370 1340 handleEvent: function()
nickjillings@1370 1341 {
nickjillings@1370 1342 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
nickjillings@1370 1343 }
nickjillings@1370 1344 }
nickjillings@1370 1345 cpn.children.push(obj);
nickjillings@1370 1346 cpn.childrenDOM.appendChild(obj.root);
nickjillings@1370 1347 obj.root.appendChild(obj.input);
nickjillings@1370 1348 obj.input.addEventListener("change",obj,false);
nickjillings@1370 1349 obj.input.value = this.specification.commentBoxPrefix;
nickjillings@1370 1350 this.childrenDOM.appendChild(cpn.rootDOM);
nickjillings@1370 1351 this.children.push(cpn);
nickjillings@1370 1352
nickjillings@1370 1353 // Now both before and after surveys
nickjillings@1370 1354 if (this.specification.preTest == undefined){
nickjillings@1370 1355 this.specification.preTest = new specification.surveyNode();
nickjillings@1370 1356 this.specification.preTest.location = "pre";
nickjillings@1370 1357 }
nickjillings@1370 1358 if (this.specification.postTest == undefined){
nickjillings@1370 1359 this.specification.postTest = new specification.surveyNode();
nickjillings@1370 1360 this.specification.postTest.location = "post";
nickjillings@1370 1361 }
nickjillings@1370 1362 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
nickjillings@1370 1363 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
nickjillings@1370 1364 this.children.push(surveyBefore);
nickjillings@1370 1365 this.children.push(surveyAfter);
nickjillings@1370 1366 this.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 1367 this.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 1368
nickjillings@1370 1369 // Build the attributes
nickjillings@1370 1370 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 1371 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 1372 {
nickjillings@1370 1373 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 1374 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 1375 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 1376 this.attributes.push(attrObject);
nickjillings@1370 1377 }
nickjillings@1370 1378
nickjillings@1370 1379 this.interfaces = [];
nickjillings@1370 1380
nickjillings@1370 1381 this.audioElementNode = function(parent,rootObject)
nickjillings@1370 1382 {
nickjillings@1370 1383 this.rootDOM = document.createElement("div");
nickjillings@1370 1384 this.titleDOM = document.createElement("span");
nickjillings@1370 1385 this.attributeDOM = document.createElement("div");
nickjillings@1370 1386 this.attributes = [];
nickjillings@1370 1387 this.childrenDOM = document.createElement("div");
nickjillings@1370 1388 this.children = [];
nickjillings@1370 1389 this.buttonDOM = document.createElement("div");
nickjillings@1370 1390 this.parent = parent;
nickjillings@1370 1391 this.specification = rootObject;
nickjillings@1370 1392 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
nickjillings@1370 1393 this.rootDOM.className = "node";
nickjillings@1370 1394
nickjillings@1370 1395 var titleDiv = document.createElement('div');
nickjillings@1370 1396 titleDiv.className = "node-title";
nickjillings@1370 1397 this.titleDOM.className = "node-title";
nickjillings@1370 1398 this.titleDOM.textContent = "Audio Element";
nickjillings@1370 1399 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1400
nickjillings@1370 1401 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1402 this.childrenDOM.className = "node-children";
nickjillings@1370 1403 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1404
nickjillings@1370 1405 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1406 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1407 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1408 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1409
nickjillings@1370 1410 // Build the attributes
nickjillings@1370 1411 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 1412 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 1413 {
nickjillings@1370 1414 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 1415 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 1416 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 1417 this.attributes.push(attrObject);
nickjillings@1370 1418 }
nickjillings@1370 1419
nickjillings@1370 1420 this.deleteNode = {
nickjillings@1370 1421 root: document.createElement("button"),
nickjillings@1370 1422 parent: this,
nickjillings@1370 1423 handleEvent: function()
nickjillings@1370 1424 {
nickjillings@1370 1425 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
nickjillings@1370 1426 if (i >= 0) {
nickjillings@1370 1427 var aeList = this.parent.parent.specification.audioElements;
nickjillings@1370 1428 if (i < aeList.length-1) {
nickjillings@1370 1429 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
nickjillings@1370 1430 } else {
nickjillings@1370 1431 aeList = aeList.slice(0,i);
nickjillings@1370 1432 }
nickjillings@1370 1433 }
nickjillings@1370 1434 i = this.parent.parent.children.findIndex(function(element,index,array){
nickjillings@1370 1435 if (element == this.parent)
nickjillings@1370 1436 return true;
nickjillings@1370 1437 else
nickjillings@1370 1438 return false;
nickjillings@1370 1439 },this);
nickjillings@1370 1440 if (i >= 0) {
nickjillings@1370 1441 var childList = this.parent.children;
nickjillings@1370 1442 if (i < aeList.length-1) {
nickjillings@1370 1443 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 1444 } else {
nickjillings@1370 1445 childList = childList.slice(0,i);
nickjillings@1370 1446 }
nickjillings@1370 1447 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 1448 }
nickjillings@1370 1449 },
nickjillings@1370 1450 findNode: function(element,index,array){
nickjillings@1370 1451 if (element == this.parent.specification)
nickjillings@1370 1452 return true;
nickjillings@1370 1453 else
nickjillings@1370 1454 return false;
nickjillings@1370 1455 }
nickjillings@1370 1456 }
nickjillings@1370 1457 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 1458 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 1459 this.buttonDOM.appendChild(this.deleteNode.root);
nickjillings@1370 1460 }
nickjillings@1370 1461
nickjillings@1370 1462 this.commentQuestionNode = function(parent,rootObject)
nickjillings@1370 1463 {
nickjillings@1370 1464 this.rootDOM = document.createElement("div");
nickjillings@1370 1465 this.titleDOM = document.createElement("span");
nickjillings@1370 1466 this.attributeDOM = document.createElement("div");
nickjillings@1370 1467 this.attributes = [];
nickjillings@1370 1468 this.childrenDOM = document.createElement("div");
nickjillings@1370 1469 this.children = [];
nickjillings@1370 1470 this.buttonDOM = document.createElement("div");
nickjillings@1370 1471 this.parent = parent;
nickjillings@1370 1472 this.specification = rootObject;
nickjillings@1370 1473 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1370 1474 this.rootDOM.className = "node";
nickjillings@1370 1475
nickjillings@1370 1476 var titleDiv = document.createElement('div');
nickjillings@1370 1477 titleDiv.className = "node-title";
nickjillings@1370 1478 this.titleDOM.className = "node-title";
nickjillings@1370 1479 this.titleDOM.textContent = "Test Page";
nickjillings@1370 1480 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1481
nickjillings@1370 1482 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1483 this.childrenDOM.className = "node-children";
nickjillings@1370 1484 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1485
nickjillings@1370 1486 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1487 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1488 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1489 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1490
nickjillings@1370 1491 }
nickjillings@1370 1492
nickjillings@1370 1493 this.addInterface = {
nickjillings@1370 1494 root: document.createElement("button"),
nickjillings@1370 1495 parent: this,
nickjillings@1370 1496 handleEvent: function() {
nickjillings@1370 1497 var InterfaceObj = new specification.interfaceNode();
nickjillings@1370 1498 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
nickjillings@1370 1499 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
nickjillings@1370 1500 this.parent.children.push(newInterface);
nickjillings@1370 1501 this.parent.specification.interfaces.push(InterfaceObj);
nickjillings@1370 1502 this.parent.interfaces.push(newInterface);
nickjillings@1370 1503 }
nickjillings@1370 1504 }
nickjillings@1370 1505 this.addInterface.root.textContent = "Add Interface";
nickjillings@1370 1506 this.addInterface.root.addEventListener("click",this.addInterface,false);
nickjillings@1370 1507 this.buttonDOM.appendChild(this.addInterface.root);
nickjillings@1370 1508
nickjillings@1370 1509 this.addAudioElement = {
nickjillings@1370 1510 root: document.createElement("button"),
nickjillings@1370 1511 parent: this,
nickjillings@1370 1512 handleEvent: function() {
nickjillings@1370 1513 var audioElementObject = new this.parent.specification.audioElementNode();
nickjillings@1370 1514 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
nickjillings@1370 1515 this.parent.specification.audioElements.push(audioElementObject);
nickjillings@1370 1516 this.parent.children.push(audioElementDOM);
nickjillings@1370 1517 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
nickjillings@1370 1518 }
nickjillings@1370 1519 }
nickjillings@1370 1520 this.addAudioElement.root.textContent = "Add Audio Element";
nickjillings@1370 1521 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
nickjillings@1370 1522 this.buttonDOM.appendChild(this.addAudioElement.root);
nickjillings@1370 1523 }
nickjillings@1370 1524 }