annotate test_create/test_core.js @ 1374:efbd764e1d60

Test create drag and drop active. Auto-builds on page HTML from specification.
author Nicholas Jillings <nickjillings@users.noreply.github.com>
date Thu, 11 Feb 2016 12:06:54 +0000
parents 65eecc71c381
children 1dbc6d3e6fb5
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@1373 198 this.dragArea.className = "drag-area";
nickjillings@1373 199 this.dragArea.id = "project-drop";
nickjillings@1370 200 this.content.appendChild(this.dragArea);
nickjillings@1373 201
nickjillings@1374 202 this.dragArea.addEventListener('dragover',function(e){
nickjillings@1373 203 e.stopPropagation();
nickjillings@1373 204 e.preventDefault();
nickjillings@1373 205 e.dataTransfer.dropEffect = 'copy';
nickjillings@1373 206 e.currentTarget.className = "drag-area drag-over";
nickjillings@1373 207 });
nickjillings@1373 208
nickjillings@1373 209 this.dragArea.addEventListener('dragexit',function(e){
nickjillings@1373 210 e.stopPropagation();
nickjillings@1373 211 e.preventDefault();
nickjillings@1373 212 e.dataTransfer.dropEffect = 'copy';
nickjillings@1373 213 e.currentTarget.className = "drag-area";
nickjillings@1373 214 });
nickjillings@1373 215
nickjillings@1373 216 this.dragArea.addEventListener('drop',function(e){
nickjillings@1373 217 e.stopPropagation();
nickjillings@1373 218 e.preventDefault();
nickjillings@1373 219 e.currentTarget.className = "drag-area drag-dropped";
nickjillings@1373 220 var files = e.dataTransfer.files[0];
nickjillings@1374 221 var reader = new FileReader();
nickjillings@1374 222 reader.onload = function(decoded) {
nickjillings@1374 223 var parse = new DOMParser();
nickjillings@1374 224 specification.decode(parse.parseFromString(decoded.target.result,'text/xml'));
nickjillings@1374 225 popupObject.hide();
nickjillings@1374 226 convert.convert(document.getElementById('content'));
nickjillings@1374 227 }
nickjillings@1374 228 reader.readAsText(files);
nickjillings@1373 229 });
nickjillings@1373 230
nickjillings@1370 231
nickjillings@1370 232 this.continue = function()
nickjillings@1370 233 {
nickjillings@1370 234 popupObject.postNode(popupStateNodes.state[1]);
nickjillings@1370 235 }
nickjillings@1370 236 }
nickjillings@1370 237 this.state[1] = new function()
nickjillings@1370 238 {
nickjillings@1370 239 this.title = "Select your interface";
nickjillings@1370 240 this.content = document.createElement("div");
nickjillings@1370 241 this.content.id = "state-1";
nickjillings@1370 242 var spnH = document.createElement('div');
nickjillings@1370 243 var span = document.createElement("span");
nickjillings@1370 244 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 245 spnH.appendChild(span);
nickjillings@1370 246 this.content.appendChild(spnH);
nickjillings@1370 247 this.select = document.createElement("select");
nickjillings@1370 248 this.testsXML = interfaceSpecs.getElementsByTagName('tests')[0].children;
nickjillings@1370 249 for (var i=0; i<this.testsXML.length; i++)
nickjillings@1370 250 {
nickjillings@1370 251 var option = document.createElement('option');
nickjillings@1370 252 option.value = this.testsXML[i].getAttribute('name');
nickjillings@1370 253 option.textContent = this.testsXML[i].getAttribute('name');
nickjillings@1370 254 this.select.appendChild(option);
nickjillings@1370 255 }
nickjillings@1370 256 this.content.appendChild(this.select);
nickjillings@1370 257 this.continue = function()
nickjillings@1370 258 {
nickjillings@1370 259 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(this.select.value)[0];
nickjillings@1370 260 specification.interface = testXML.getAttribute("interface");
nickjillings@1370 261 popupStateNodes.state[2].generate();
nickjillings@1370 262 popupObject.postNode(popupStateNodes.state[2]);
nickjillings@1370 263 }
nickjillings@1370 264 }
nickjillings@1370 265 this.state[2] = new function()
nickjillings@1370 266 {
nickjillings@1370 267 this.title = "Test Checks & Restrictions";
nickjillings@1370 268 this.content = document.createElement("div");
nickjillings@1370 269 this.content.id = "state-1";
nickjillings@1370 270 var spnH = document.createElement('div');
nickjillings@1370 271 var span = document.createElement("span");
nickjillings@1370 272 span.textContent = "Select your test checks and restrictions. Greyed out items are fixed by the test/interface and cannot be changed";
nickjillings@1370 273 spnH.appendChild(span);
nickjillings@1370 274 this.content.appendChild(spnH);
nickjillings@1370 275 var holder = document.createElement("div");
nickjillings@1370 276 this.options = [];
nickjillings@1370 277 this.testXML = null;
nickjillings@1370 278 this.interfaceXML = null;
nickjillings@1370 279 this.generate = function()
nickjillings@1370 280 {
nickjillings@1370 281 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 282 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 283 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 284 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 285 this.testXML = this.testXML.getAllElementsByTagName("checks");
nickjillings@1370 286 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 287 {
nickjillings@1370 288 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 289 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 290 var testNode
nickjillings@1370 291 if (this.testXML.length > 0)
nickjillings@1370 292 {
nickjillings@1370 293 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 294 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 295 else {testNode = undefined;}
nickjillings@1370 296 } else {
nickjillings@1370 297 testNode = undefined;
nickjillings@1370 298 }
nickjillings@1370 299 var optH = document.createElement('div');
nickjillings@1370 300 optH.className = "popup-checkbox";
nickjillings@1370 301 var checkbox = document.createElement('input');
nickjillings@1370 302 checkbox.type = "checkbox";
nickjillings@1370 303 var text = document.createElement('span');
nickjillings@1370 304 checkbox.setAttribute('name',checkName);
nickjillings@1370 305 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 306 {
nickjillings@1370 307 checkbox.checked = true;
nickjillings@1370 308 }
nickjillings@1370 309 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 310 {
nickjillings@1370 311 checkbox.disabled = true;
nickjillings@1370 312 checkbox.checked = false;
nickjillings@1370 313 optH.className = "popup-checkbox disabled";
nickjillings@1370 314 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 315 {
nickjillings@1370 316 checkbox.disabled = true;
nickjillings@1370 317 checkbox.checked = true;
nickjillings@1370 318 optH.className = "popup-checkbox disabled";
nickjillings@1370 319 }
nickjillings@1370 320 if(testNode != undefined)
nickjillings@1370 321 {
nickjillings@1370 322 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 323 {
nickjillings@1370 324 checkbox.checked = true;
nickjillings@1370 325 }
nickjillings@1370 326 if (testNode.getAttribute('support') == "none")
nickjillings@1370 327 {
nickjillings@1370 328 checkbox.disabled = true;
nickjillings@1370 329 checkbox.checked = false;
nickjillings@1370 330 optH.className = "popup-checkbox disabled";
nickjillings@1370 331 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 332 {
nickjillings@1370 333 checkbox.disabled = true;
nickjillings@1370 334 checkbox.checked = true;
nickjillings@1370 335 optH.className = "popup-checkbox disabled";
nickjillings@1370 336 }
nickjillings@1370 337 }
nickjillings@1370 338 text.textContent = popupStateNodes.state[2].checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 339 optH.appendChild(checkbox);
nickjillings@1370 340 optH.appendChild(text);
nickjillings@1370 341 this.options.push(optH);
nickjillings@1370 342 this.content.appendChild(optH);
nickjillings@1370 343 }
nickjillings@1370 344 }
nickjillings@1370 345 this.continue = function()
nickjillings@1370 346 {
nickjillings@1370 347 if (specification.interfaces == null)
nickjillings@1370 348 {
nickjillings@1370 349 specification.interfaces = new specification.interfaceNode();
nickjillings@1370 350 }
nickjillings@1370 351 for (var object of this.options)
nickjillings@1370 352 {
nickjillings@1370 353 var checkbox = object.children[0];
nickjillings@1370 354 if (checkbox.checked)
nickjillings@1370 355 {
nickjillings@1370 356 var option = {
nickjillings@1370 357 type: "check",
nickjillings@1370 358 name: checkbox.getAttribute('name')
nickjillings@1370 359 };
nickjillings@1370 360 specification.interfaces.options.push(option);
nickjillings@1370 361 }
nickjillings@1370 362 }
nickjillings@1370 363 popupStateNodes.state[3].generate();
nickjillings@1370 364 popupObject.postNode(popupStateNodes.state[3]);
nickjillings@1370 365 }
nickjillings@1370 366 }
nickjillings@1370 367 this.state[3] = new function()
nickjillings@1370 368 {
nickjillings@1370 369 this.title = "Test Metrics";
nickjillings@1370 370 this.content = document.createElement("div");
nickjillings@1370 371 this.content.id = "state-1";
nickjillings@1370 372 var spnH = document.createElement('div');
nickjillings@1370 373 var span = document.createElement("span");
nickjillings@1370 374 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 375 spnH.appendChild(span);
nickjillings@1370 376 this.content.appendChild(spnH);
nickjillings@1370 377 this.options = [];
nickjillings@1370 378 this.checkText;
nickjillings@1370 379 this.testXML;
nickjillings@1370 380 this.interfaceXML;
nickjillings@1370 381 this.generate = function()
nickjillings@1370 382 {
nickjillings@1370 383 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 384 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 385 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 386 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 387 this.testXML = this.testXML.getAllElementsByTagName("metrics");
nickjillings@1370 388 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 389 {
nickjillings@1370 390 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 391 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 392 var testNode
nickjillings@1370 393 if (this.testXML.length > 0)
nickjillings@1370 394 {
nickjillings@1370 395 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 396 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 397 else {testNode = undefined;}
nickjillings@1370 398 } else {
nickjillings@1370 399 testNode = undefined;
nickjillings@1370 400 }
nickjillings@1370 401 var optH = document.createElement('div');
nickjillings@1370 402 optH.className = "popup-checkbox";
nickjillings@1370 403 var checkbox = document.createElement('input');
nickjillings@1370 404 checkbox.type = "checkbox";
nickjillings@1370 405 var text = document.createElement('span');
nickjillings@1370 406 checkbox.setAttribute('name',checkName);
nickjillings@1370 407 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 408 {
nickjillings@1370 409 checkbox.checked = true;
nickjillings@1370 410 }
nickjillings@1370 411 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 412 {
nickjillings@1370 413 checkbox.disabled = true;
nickjillings@1370 414 checkbox.checked = false;
nickjillings@1370 415 optH.className = "popup-checkbox disabled";
nickjillings@1370 416 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 417 {
nickjillings@1370 418 checkbox.disabled = true;
nickjillings@1370 419 checkbox.checked = true;
nickjillings@1370 420 optH.className = "popup-checkbox disabled";
nickjillings@1370 421 }
nickjillings@1370 422 if(testNode != undefined)
nickjillings@1370 423 {
nickjillings@1370 424 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 425 {
nickjillings@1370 426 checkbox.checked = true;
nickjillings@1370 427 }
nickjillings@1370 428 if (testNode.getAttribute('support') == "none")
nickjillings@1370 429 {
nickjillings@1370 430 checkbox.disabled = true;
nickjillings@1370 431 checkbox.checked = false;
nickjillings@1370 432 optH.className = "popup-checkbox disabled";
nickjillings@1370 433 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 434 {
nickjillings@1370 435 checkbox.disabled = true;
nickjillings@1370 436 checkbox.checked = true;
nickjillings@1370 437 optH.className = "popup-checkbox disabled";
nickjillings@1370 438 }
nickjillings@1370 439 }
nickjillings@1370 440 text.textContent = popupStateNodes.state[3].checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 441 optH.appendChild(checkbox);
nickjillings@1370 442 optH.appendChild(text);
nickjillings@1370 443 this.options.push(optH);
nickjillings@1370 444 this.content.appendChild(optH);
nickjillings@1370 445 }
nickjillings@1370 446 }
nickjillings@1370 447 this.continue = function()
nickjillings@1370 448 {
nickjillings@1370 449 if (specification.metrics == null) {
nickjillings@1370 450 specification.metrics = new specification.metricNode();
nickjillings@1370 451 }
nickjillings@1370 452 for (var object of this.options)
nickjillings@1370 453 {
nickjillings@1370 454 var checkbox = object.children[0];
nickjillings@1370 455 if (checkbox.checked)
nickjillings@1370 456 {
nickjillings@1370 457 specification.metrics.enabled.push(checkbox.getAttribute('name'));
nickjillings@1370 458 }
nickjillings@1370 459 }
nickjillings@1370 460 popupStateNodes.state[4].generate();
nickjillings@1370 461 popupObject.postNode(popupStateNodes.state[4]);
nickjillings@1370 462 }
nickjillings@1370 463 }
nickjillings@1370 464 this.state[4] = new function()
nickjillings@1370 465 {
nickjillings@1370 466 this.title = "Test Visuals";
nickjillings@1370 467 this.content = document.createElement("div");
nickjillings@1370 468 this.content.id = "state-1";
nickjillings@1370 469 var spnH = document.createElement('div');
nickjillings@1370 470 var span = document.createElement("span");
nickjillings@1370 471 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 472 spnH.appendChild(span);
nickjillings@1370 473 this.content.appendChild(spnH);
nickjillings@1370 474 this.options = [];
nickjillings@1370 475 this.checkText;
nickjillings@1370 476 this.testXML;
nickjillings@1370 477 this.interfaceXML;
nickjillings@1370 478 this.generate = function()
nickjillings@1370 479 {
nickjillings@1370 480 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 481 this.checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
nickjillings@1370 482 this.testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 483 this.interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(this.testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
nickjillings@1370 484 this.testXML = this.testXML.getAllElementsByTagName("metrics");
nickjillings@1370 485 for (var i=0; i<this.interfaceXML.children.length; i++)
nickjillings@1370 486 {
nickjillings@1370 487 var interfaceNode = this.interfaceXML.children[i];
nickjillings@1370 488 var checkName = interfaceNode.getAttribute('name');
nickjillings@1370 489 var testNode
nickjillings@1370 490 if (this.testXML.length > 0)
nickjillings@1370 491 {
nickjillings@1370 492 testNode = this.testXML[0].getAllElementsByName(checkName);
nickjillings@1370 493 if(testNode.length != 0) {testNode = testNode[0];}
nickjillings@1370 494 else {testNode = undefined;}
nickjillings@1370 495 } else {
nickjillings@1370 496 testNode = undefined;
nickjillings@1370 497 }
nickjillings@1370 498 var optH = document.createElement('div');
nickjillings@1370 499 optH.className = "popup-checkbox";
nickjillings@1370 500 var checkbox = document.createElement('input');
nickjillings@1370 501 checkbox.type = "checkbox";
nickjillings@1370 502 var text = document.createElement('span');
nickjillings@1370 503 checkbox.setAttribute('name',checkName);
nickjillings@1370 504 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 505 {
nickjillings@1370 506 checkbox.checked = true;
nickjillings@1370 507 }
nickjillings@1370 508 if (interfaceNode.getAttribute('support') == "none")
nickjillings@1370 509 {
nickjillings@1370 510 checkbox.disabled = true;
nickjillings@1370 511 checkbox.checked = false;
nickjillings@1370 512 optH.className = "popup-checkbox disabled";
nickjillings@1370 513 } else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 514 {
nickjillings@1370 515 checkbox.disabled = true;
nickjillings@1370 516 checkbox.checked = true;
nickjillings@1370 517 optH.className = "popup-checkbox disabled";
nickjillings@1370 518 }
nickjillings@1370 519 if(testNode != undefined)
nickjillings@1370 520 {
nickjillings@1370 521 if (interfaceNode.getAttribute('default') == 'on')
nickjillings@1370 522 {
nickjillings@1370 523 checkbox.checked = true;
nickjillings@1370 524 }
nickjillings@1370 525 if (testNode.getAttribute('support') == "none")
nickjillings@1370 526 {
nickjillings@1370 527 checkbox.disabled = true;
nickjillings@1370 528 checkbox.checked = false;
nickjillings@1370 529 optH.className = "popup-checkbox disabled";
nickjillings@1370 530 }else if (interfaceNode.getAttribute('support') == "mandatory")
nickjillings@1370 531 {
nickjillings@1370 532 checkbox.disabled = true;
nickjillings@1370 533 checkbox.checked = true;
nickjillings@1370 534 optH.className = "popup-checkbox disabled";
nickjillings@1370 535 }
nickjillings@1370 536 }
nickjillings@1370 537 text.textContent = this.checkText.getAllElementsByName(checkName)[0].textContent;
nickjillings@1370 538 optH.appendChild(checkbox);
nickjillings@1370 539 optH.appendChild(text);
nickjillings@1370 540 this.options.push(optH);
nickjillings@1370 541 this.content.appendChild(optH);
nickjillings@1370 542 }
nickjillings@1370 543 }
nickjillings@1370 544 this.continue = function()
nickjillings@1370 545 {
nickjillings@1370 546 if (specification.interfaces == null)
nickjillings@1370 547 {
nickjillings@1370 548 specification.interfaces = new specification.interfaceNode();
nickjillings@1370 549 }
nickjillings@1370 550 for (var object of this.options)
nickjillings@1370 551 {
nickjillings@1370 552 var checkbox = object.children[0];
nickjillings@1370 553 if (checkbox.checked)
nickjillings@1370 554 {
nickjillings@1370 555 var option = {
nickjillings@1370 556 type: "show",
nickjillings@1370 557 name: checkbox.getAttribute('name')
nickjillings@1370 558 };
nickjillings@1370 559 specification.interfaces.options.push(option);
nickjillings@1370 560 }
nickjillings@1370 561 }
nickjillings@1370 562 popupObject.hide();
nickjillings@1370 563 convert.convert(document.getElementById('content'));
nickjillings@1370 564 }
nickjillings@1370 565 }
nickjillings@1370 566 this.state[5] = new function() {
nickjillings@1370 567 this.title = "Add/Edit Survey Element";
nickjillings@1370 568 this.content = document.createElement("div");
nickjillings@1370 569 this.content.id = "state-1";
nickjillings@1370 570 var spnH = document.createElement('div');
nickjillings@1370 571 var span = document.createElement("span");
nickjillings@1370 572 span.textContent = "You can configure your survey element here. Press 'Continue' to complete your changes.";
nickjillings@1370 573 spnH.appendChild(span);
nickjillings@1370 574 this.content.appendChild(spnH);
nickjillings@1370 575 this.dynamic = document.createElement("div");
nickjillings@1370 576 this.option = null;
nickjillings@1370 577 this.parent = null;
nickjillings@1370 578 var select = document.createElement("select");
nickjillings@1370 579 select.setAttribute("name","type");
nickjillings@1370 580 select.addEventListener("change",this,false);
nickjillings@1370 581 this.content.appendChild(select);
nickjillings@1370 582 this.content.appendChild(this.dynamic);
nickjillings@1370 583 this.generate = function(option, parent)
nickjillings@1370 584 {
nickjillings@1370 585 this.option = option;
nickjillings@1370 586 this.parent = parent;
nickjillings@1370 587 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("type")[0].getAllElementsByTagName("xs:enumeration");
nickjillings@1370 588 for (var i=0; i<optionList.length; i++)
nickjillings@1370 589 {
nickjillings@1370 590 var selectOption = document.createElement("option");
nickjillings@1370 591 selectOption.value = optionList[i].getAttribute("value");
nickjillings@1370 592 selectOption.textContent = selectOption.value;
nickjillings@1370 593 select.appendChild(selectOption);
nickjillings@1370 594 }
nickjillings@1370 595 if (this.option.type != undefined){
nickjillings@1370 596 select.value = this.option.type
nickjillings@1370 597 } else {
nickjillings@1370 598 select.value = "statement";
nickjillings@1370 599 this.option.type = "statement";
nickjillings@1370 600 }
nickjillings@1370 601
nickjillings@1370 602 this.dynamic.innerHTML = null;
nickjillings@1370 603 var statement = document.createElement("div");
nickjillings@1370 604 var statementText = document.createElement("span");
nickjillings@1370 605 var statementEntry = document.createElement("textarea");
nickjillings@1370 606 statement.appendChild(statementText);
nickjillings@1370 607 statement.appendChild(statementEntry);
nickjillings@1370 608 statementText.textContent = "Statement/Question";
nickjillings@1370 609 statementEntry.addEventListener("change",this,false);
nickjillings@1370 610 statementEntry.setAttribute("name","statement");
nickjillings@1370 611 statementEntry.value = this.option.statement;
nickjillings@1370 612 this.dynamic.appendChild(statement);
nickjillings@1370 613 switch(this.option.type)
nickjillings@1370 614 {
nickjillings@1370 615 case "statement":
nickjillings@1370 616 break;
nickjillings@1370 617 case "question":
nickjillings@1370 618 var boxsizeSelect = document.createElement("select");
nickjillings@1370 619 var optionList = specification.schema.getAllElementsByName("survey")[0].getAllElementsByName("boxsize")[0].getAllElementsByTagName("xs:enumeration");
nickjillings@1370 620 for (var i=0; i<optionList.length; i++)
nickjillings@1370 621 {
nickjillings@1370 622 var selectOption = document.createElement("option");
nickjillings@1370 623 selectOption.value = optionList[i].getAttribute("value");
nickjillings@1370 624 selectOption.textContent = selectOption.value;
nickjillings@1370 625 boxsizeSelect.appendChild(selectOption);
nickjillings@1370 626 }
nickjillings@1370 627 if(this.option.boxsize != undefined) {
nickjillings@1370 628 boxsizeSelect.value = this.option.boxsize;
nickjillings@1370 629 } else {
nickjillings@1370 630 boxsizeSelect.value = "normal";
nickjillings@1370 631 this.option.boxsize = "normal";
nickjillings@1370 632 }
nickjillings@1370 633 boxsizeSelect.setAttribute("name","boxsize");
nickjillings@1370 634 boxsizeSelect.addEventListener("change",this,false);
nickjillings@1370 635 var boxsize = document.createElement("div");
nickjillings@1370 636 var boxsizeText = document.createElement("span");
nickjillings@1370 637 boxsizeText.textContent = "Entry Size: ";
nickjillings@1370 638 boxsize.appendChild(boxsizeText);
nickjillings@1370 639 boxsize.appendChild(boxsizeSelect);
nickjillings@1370 640 this.dynamic.appendChild(boxsize);
nickjillings@1370 641
nickjillings@1370 642 var mandatory = document.createElement("div");
nickjillings@1370 643 var mandatoryInput = document.createElement("input");
nickjillings@1370 644 var mandatoryText = document.createElement("span");
nickjillings@1370 645 mandatoryText.textContent = "Mandatory: ";
nickjillings@1370 646 mandatory.appendChild(mandatoryText);
nickjillings@1370 647 mandatory.appendChild(mandatoryInput);
nickjillings@1370 648 mandatoryInput.type = "checkbox";
nickjillings@1370 649 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
nickjillings@1370 650 mandatoryInput.setAttribute("name","mandatory");
nickjillings@1370 651 mandatoryInput.addEventListener("change",this,false);
nickjillings@1370 652 mandatory.appendChild(mandatoryText);
nickjillings@1370 653 mandatory.appendChild(mandatoryInput);
nickjillings@1370 654 this.dynamic.appendChild(mandatory);
nickjillings@1370 655 break;
nickjillings@1370 656 }
nickjillings@1370 657 }
nickjillings@1370 658 this.handleEvent = function()
nickjillings@1370 659 {
nickjillings@1370 660 var name = event.currentTarget.getAttribute("name");
nickjillings@1370 661 switch(name) {
nickjillings@1370 662 case "type":
nickjillings@1370 663 // If type has changed, we may need to rebuild the entire state node
nickjillings@1370 664 if (event.currentTarget.value != this.option.name)
nickjillings@1370 665 {
nickjillings@1370 666 this.option.type = event.currentTarget.value;
nickjillings@1370 667 this.generate(this.option,this.parent);
nickjillings@1370 668 }
nickjillings@1370 669 break;
nickjillings@1370 670 case "mandatory":
nickjillings@1370 671 this.option.mandatory = event.currentTarget.checked;
nickjillings@1370 672 break;
nickjillings@1370 673 case "boxsize":
nickjillings@1370 674 this.option.boxsize = event.currentTarget.value;
nickjillings@1370 675 break;
nickjillings@1370 676 case "statement":
nickjillings@1370 677 this.option.statement = event.currentTarget.value;
nickjillings@1370 678 break;
nickjillings@1370 679 }
nickjillings@1370 680 }
nickjillings@1370 681 this.continue = function()
nickjillings@1370 682 {
nickjillings@1370 683 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
nickjillings@1370 684 this.parent.children.push(newNode);
nickjillings@1370 685 this.parent.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1370 686 popupObject.hide();
nickjillings@1370 687 }
nickjillings@1370 688 }
nickjillings@1370 689 }
nickjillings@1370 690 }
nickjillings@1370 691
nickjillings@1370 692 function SpecificationToHTML()
nickjillings@1370 693 {
nickjillings@1370 694 // This takes the specification node and converts it to an on-page HTML object
nickjillings@1370 695 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
nickjillings@1370 696 // Once generated, it directly binds into the specification object to update with changes
nickjillings@1370 697 // Fixed DOM entries
nickjillings@1370 698 this.injectDOM;
nickjillings@1370 699 this.setupDOM;
nickjillings@1370 700 this.pages = [];
nickjillings@1370 701
nickjillings@1370 702 // Self-contained generators
nickjillings@1370 703 this.createGeneralNodeDOM = function(name,id,parent)
nickjillings@1370 704 {
nickjillings@1370 705 var root = document.createElement('div');
nickjillings@1370 706 root.id = id;
nickjillings@1370 707 root.className = "node";
nickjillings@1370 708
nickjillings@1370 709 var titleDiv = document.createElement('div');
nickjillings@1370 710 titleDiv.className = "node-title";
nickjillings@1370 711 var title = document.createElement('span');
nickjillings@1370 712 title.className = "node-title";
nickjillings@1370 713 title.textContent = name;
nickjillings@1370 714 titleDiv.appendChild(title);
nickjillings@1370 715
nickjillings@1370 716 var attributeDiv = document.createElement('div');
nickjillings@1370 717 attributeDiv.className = "node-attributes";
nickjillings@1370 718
nickjillings@1370 719 var childrenDiv = document.createElement('div');
nickjillings@1370 720 childrenDiv.className = "node-children";
nickjillings@1370 721
nickjillings@1370 722 var buttonsDiv = document.createElement('div');
nickjillings@1370 723 buttonsDiv.className = "node-buttons";
nickjillings@1370 724
nickjillings@1370 725 root.appendChild(titleDiv);
nickjillings@1370 726 root.appendChild(attributeDiv);
nickjillings@1370 727 root.appendChild(childrenDiv);
nickjillings@1370 728 root.appendChild(buttonsDiv);
nickjillings@1370 729
nickjillings@1370 730 var obj = {
nickjillings@1370 731 rootDOM: root,
nickjillings@1370 732 titleDOM: title,
nickjillings@1370 733 attributeDOM: attributeDiv,
nickjillings@1370 734 attributes: [],
nickjillings@1370 735 childrenDOM: childrenDiv,
nickjillings@1370 736 children: [],
nickjillings@1370 737 buttonDOM: buttonsDiv,
nickjillings@1370 738 parent: parent
nickjillings@1370 739 }
nickjillings@1370 740 return obj;
nickjillings@1370 741 }
nickjillings@1370 742
nickjillings@1370 743 this.convertAttributeToDOM = function(node,schema)
nickjillings@1370 744 {
nickjillings@1370 745 // This takes an attribute schema node and returns an object with the input node and any bindings
nickjillings@1370 746 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
nickjillings@1370 747 {
nickjillings@1370 748 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
nickjillings@1370 749 }
nickjillings@1370 750 var obj = new function()
nickjillings@1370 751 {
nickjillings@1370 752 this.input;
nickjillings@1370 753 this.name;
nickjillings@1370 754 this.owner;
nickjillings@1370 755 this.holder;
nickjillings@1370 756
nickjillings@1370 757 this.name = schema.getAttribute('name');
nickjillings@1370 758 this.default = schema.getAttribute('default');
nickjillings@1370 759 this.dataType = schema.getAttribute('type');
nickjillings@1370 760 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
nickjillings@1370 761 else {this.dataType = "string";}
nickjillings@1370 762 var minVar = undefined;
nickjillings@1370 763 var maxVar = undefined;
nickjillings@1370 764 switch(this.dataType)
nickjillings@1370 765 {
nickjillings@1370 766 case "negativeInteger":
nickjillings@1370 767 maxVar = -1;
nickjillings@1370 768 break;
nickjillings@1370 769 case "positiveInteger":
nickjillings@1370 770 minVar = 1;
nickjillings@1370 771 break;
nickjillings@1370 772 case "nonNegativeInteger":
nickjillings@1370 773 minVar = 0;
nickjillings@1370 774 break;
nickjillings@1370 775 case "nonPositiveInteger":
nickjillings@1370 776 maxVar = 0;
nickjillings@1370 777 break;
nickjillings@1370 778 case "byte":
nickjillings@1370 779 minVar = 0;
nickjillings@1370 780 maxVar = 256;
nickjillings@1370 781 break;
nickjillings@1370 782 case "short":
nickjillings@1370 783 minVar = 0;
nickjillings@1370 784 maxVar = 65536;
nickjillings@1370 785 break;
nickjillings@1370 786 default:
nickjillings@1370 787 break;
nickjillings@1370 788 }
nickjillings@1370 789
nickjillings@1370 790 this.input = document.createElement('input');
nickjillings@1370 791 switch(this.dataType)
nickjillings@1370 792 {
nickjillings@1370 793 case "boolean":
nickjillings@1370 794 this.input.type = "checkbox";
nickjillings@1370 795 break;
nickjillings@1370 796 case "negativeInteger":
nickjillings@1370 797 case "positiveInteger":
nickjillings@1370 798 case "nonNegativeInteger":
nickjillings@1370 799 case "nonPositiveInteger":
nickjillings@1370 800 case "integer":
nickjillings@1370 801 case "short":
nickjillings@1370 802 case "byte":
nickjillings@1370 803 this.input.step = 1;
nickjillings@1370 804 case "decimal":
nickjillings@1370 805 this.input.type = "number";
nickjillings@1370 806 this.input.min = minVar;
nickjillings@1370 807 this.input.max = maxVar;
nickjillings@1370 808 break;
nickjillings@1370 809 default:
nickjillings@1370 810 break;
nickjillings@1370 811 }
nickjillings@1370 812 var value;
nickjillings@1373 813 eval("value = node."+this.name)
nickjillings@1370 814 if (value != undefined)
nickjillings@1370 815 {
nickjillings@1370 816 this.input.value = value;
nickjillings@1370 817 } else if (this.default != undefined)
nickjillings@1370 818 {
nickjillings@1370 819 this.input.value = this.default;
nickjillings@1370 820 }
nickjillings@1370 821 this.handleEvent = function(event)
nickjillings@1370 822 {
nickjillings@1370 823 var value;
nickjillings@1370 824 switch(this.input.type)
nickjillings@1370 825 {
nickjillings@1370 826 case "checkbox":
nickjillings@1370 827 value = event.currentTarget.checked;
nickjillings@1370 828 break;
nickjillings@1370 829 case "number":
nickjillings@1370 830 value = Number(event.currentTarget.value);
nickjillings@1370 831 break;
nickjillings@1370 832 default:
nickjillings@1370 833 value = event.currentTarget.value;
nickjillings@1370 834 break;
nickjillings@1370 835 }
nickjillings@1370 836 eval("this.owner."+this.name+" = value");
nickjillings@1370 837 }
nickjillings@1370 838 this.holder = document.createElement('div');
nickjillings@1370 839 this.holder.className = "attribute";
nickjillings@1370 840 this.holder.setAttribute('name',this.name);
nickjillings@1370 841 var text = document.createElement('span');
nickjillings@1370 842 eval("text.textContent = attributeText."+this.name+"+': '");
nickjillings@1370 843 this.holder.appendChild(text);
nickjillings@1370 844 this.holder.appendChild(this.input);
nickjillings@1370 845 this.owner = node;
nickjillings@1370 846 this.input.addEventListener("change",this,false);
nickjillings@1370 847 }
nickjillings@1370 848 if (obj.attribute != null)
nickjillings@1370 849 {
nickjillings@1370 850 obj.input.value = obj.attribute;
nickjillings@1370 851 }
nickjillings@1370 852 return obj;
nickjillings@1370 853 }
nickjillings@1370 854
nickjillings@1370 855 this.convert = function(root)
nickjillings@1370 856 {
nickjillings@1370 857 //Performs the actual conversion using the given root DOM as the root
nickjillings@1370 858 this.injectDOM = root;
nickjillings@1370 859
nickjillings@1373 860 // Build the export button
nickjillings@1373 861 var exportButton = document.createElement("button");
nickjillings@1373 862 exportButton.textContent = "Export to XML";
nickjillings@1373 863 exportButton.onclick = function()
nickjillings@1373 864 {
nickjillings@1373 865 var doc = specification.encode();
nickjillings@1373 866 var obj = {};
nickjillings@1373 867 obj.title = "Export";
nickjillings@1373 868 obj.content = document.createElement("div");
nickjillings@1373 869 obj.content.id = "finish";
nickjillings@1373 870 var span = document.createElement("span");
nickjillings@1373 871 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."
nickjillings@1373 872 obj.content.appendChild(span);
nickjillings@1373 873 var link = document.createElement("div");
nickjillings@1373 874 link.appendChild(doc.children[0]);
nickjillings@1373 875 var file = [link.innerHTML];
nickjillings@1373 876 var bb = new Blob(file,{type : 'application/xml'});
nickjillings@1373 877 var dnlk = window.URL.createObjectURL(bb);
nickjillings@1373 878 var a = document.createElement("a");
nickjillings@1373 879 a.hidden = '';
nickjillings@1373 880 a.href = dnlk;
nickjillings@1373 881 a.download = "project-specification.xml";
nickjillings@1373 882 a.textContent = "Save File";
nickjillings@1373 883 obj.content.appendChild(a);
nickjillings@1373 884 popupObject.show();
nickjillings@1373 885 popupObject.postNode(obj);
nickjillings@1373 886 }
nickjillings@1373 887 this.injectDOM.appendChild(exportButton);
nickjillings@1373 888
nickjillings@1370 889 // First perform the setupNode;
nickjillings@1370 890 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
nickjillings@1370 891 this.setupDOM = new this.createGeneralNodeDOM('setup','setup',null);
nickjillings@1370 892 this.injectDOM.appendChild(this.setupDOM.rootDOM);
nickjillings@1370 893 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
nickjillings@1370 894 for (var i=0; i<setupAttributes.length; i++)
nickjillings@1370 895 {
nickjillings@1370 896 var attributeName = setupAttributes[i].getAttribute('name');
nickjillings@1370 897 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
nickjillings@1370 898 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 899 this.setupDOM.attributes.push(attrObject);
nickjillings@1370 900 }
nickjillings@1370 901
nickjillings@1370 902 // Now we must build the interface Node
nickjillings@1370 903 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
nickjillings@1370 904 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
nickjillings@1370 905
nickjillings@1370 906 // Now build the Metrics selection node
nickjillings@1370 907 var metric = this.createGeneralNodeDOM("metrics","setup-metric",this.setupDOM);
nickjillings@1370 908 metric.rootDOM.removeChild(metric.attributeDOM);
nickjillings@1370 909 this.setupDOM.children.push(metric);
nickjillings@1370 910 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
nickjillings@1370 911 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 912 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 913 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 914 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 915 testXML = testXML.getAllElementsByTagName("metrics");
nickjillings@1370 916 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 917 {
nickjillings@1370 918 var obj = {
nickjillings@1370 919 input: document.createElement('input'),
nickjillings@1370 920 root: document.createElement('div'),
nickjillings@1370 921 text: document.createElement('span'),
nickjillings@1370 922 specification: specification.metrics.enabled,
nickjillings@1370 923 name: interfaceXML.children[i].getAttribute("name"),
nickjillings@1370 924 handleEvent: function()
nickjillings@1370 925 {
nickjillings@1370 926 for (var i=0; i<this.specification.length; i++)
nickjillings@1370 927 {
nickjillings@1370 928 if (this.specification[i] == this.name)
nickjillings@1370 929 {
nickjillings@1370 930 var options = this.specification;
nickjillings@1370 931 if (this.input.checked == false) {
nickjillings@1370 932 if (i == options.length)
nickjillings@1370 933 {options = options.slice(0,i);}
nickjillings@1370 934 else {
nickjillings@1370 935 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 936 }
nickjillings@1370 937 } else {
nickjillings@1370 938 return;
nickjillings@1370 939 }
nickjillings@1370 940 this.specification = options;
nickjillings@1370 941 break;
nickjillings@1370 942 }
nickjillings@1370 943 }
nickjillings@1370 944 if (this.input.checked) {
nickjillings@1370 945 this.specification.push(this.name);
nickjillings@1370 946 }
nickjillings@1370 947 }
nickjillings@1370 948 };
nickjillings@1370 949 obj.root.className = "attribute";
nickjillings@1370 950 obj.input.type = "checkbox";
nickjillings@1370 951 obj.root.appendChild(obj.text);
nickjillings@1370 952 obj.root.appendChild(obj.input);
nickjillings@1370 953 obj.text.textContent = checkText.children[i].textContent;
nickjillings@1370 954 metric.children.push(obj);
nickjillings@1370 955 metric.childrenDOM.appendChild(obj.root);
nickjillings@1370 956 for (var i=0; i<specification.metrics.enabled.length; i++)
nickjillings@1370 957 {
nickjillings@1370 958 if (specification.metrics.enabled[i] == obj.name)
nickjillings@1370 959 {
nickjillings@1370 960 obj.input.checked = true;
nickjillings@1370 961 break;
nickjillings@1370 962 }
nickjillings@1370 963 }
nickjillings@1370 964 }
nickjillings@1370 965
nickjillings@1370 966 // Now both before and after surveys
nickjillings@1370 967 if (specification.preTest == undefined){
nickjillings@1370 968 specification.preTest = new specification.surveyNode();
nickjillings@1370 969 specification.preTest.location = "pre";
nickjillings@1370 970 }
nickjillings@1370 971 if (specification.postTest == undefined){
nickjillings@1370 972 specification.postTest = new specification.surveyNode();
nickjillings@1370 973 specification.postTest.location = "post";
nickjillings@1370 974 }
nickjillings@1370 975 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
nickjillings@1370 976 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
nickjillings@1370 977 this.setupDOM.children.push(surveyBefore);
nickjillings@1370 978 this.setupDOM.children.push(surveyAfter);
nickjillings@1370 979 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 980 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 981
nickjillings@1370 982 // Add in the page creator button
nickjillings@1370 983 this.addPage = {
nickjillings@1370 984 root: document.createElement("button"),
nickjillings@1370 985 parent: this,
nickjillings@1370 986 handleEvent: function()
nickjillings@1370 987 {
nickjillings@1370 988 var pageObj = new specification.page();
nickjillings@1370 989 specification.pages.push(pageObj);
nickjillings@1370 990 var newPage = new this.parent.pageNode(this.parent,pageObj);
nickjillings@1370 991 this.parent.injectDOM.appendChild(newPage.rootDOM);
nickjillings@1370 992 this.parent.pages.push(newPage);
nickjillings@1370 993 }
nickjillings@1370 994 }
nickjillings@1370 995 this.addPage.root.textContent = "Add Page";
nickjillings@1370 996 this.addPage.root.addEventListener("click",this.addPage,false);
nickjillings@1370 997 this.injectDOM.appendChild(this.addPage.root);
nickjillings@1374 998
nickjillings@1374 999 // Build each page
nickjillings@1374 1000 for (var page of specification.pages)
nickjillings@1374 1001 {
nickjillings@1374 1002 var newPage = new this.pageNode(this,page);
nickjillings@1374 1003 this.injectDOM.appendChild(newPage.rootDOM);
nickjillings@1374 1004 this.pages.push(newPage);
nickjillings@1374 1005 }
nickjillings@1370 1006 }
nickjillings@1370 1007
nickjillings@1370 1008 this.interfaceNode = function(parent,rootObject)
nickjillings@1370 1009 {
nickjillings@1370 1010 this.rootDOM;
nickjillings@1370 1011 this.titleDOM;
nickjillings@1370 1012 this.attributeDOM;
nickjillings@1370 1013 this.attributes = [];
nickjillings@1370 1014 this.childrenDOM;
nickjillings@1370 1015 this.children = [];
nickjillings@1370 1016 this.buttonDOM;
nickjillings@1370 1017 this.parent = parent;
nickjillings@1370 1018 this.HTMLPoint;
nickjillings@1370 1019 this.specification = rootObject;
nickjillings@1370 1020 this.schema = specification.schema.getAllElementsByName("interface")[1];
nickjillings@1370 1021
nickjillings@1370 1022 this.createIOasAttr = function(name,specification,parent,type) {
nickjillings@1370 1023 this.root = document.createElement('div');
nickjillings@1370 1024 this.input = document.createElement("input");
nickjillings@1370 1025 this.name = name;
nickjillings@1370 1026 this.type = type;
nickjillings@1370 1027 this.parent = parent;
nickjillings@1370 1028 this.specification = specification;
nickjillings@1370 1029 this.handleEvent = function(event) {
nickjillings@1370 1030 for (var i=0; i<this.specification.options.length; i++)
nickjillings@1370 1031 {
nickjillings@1370 1032 if (this.specification.options[i].name == this.name)
nickjillings@1370 1033 {
nickjillings@1370 1034 var options = this.specification.options;
nickjillings@1370 1035 if (this.input.checked == false) {
nickjillings@1370 1036 if (i == options.length)
nickjillings@1370 1037 {options = options.slice(0,i);}
nickjillings@1370 1038 else {
nickjillings@1370 1039 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 1040 }
nickjillings@1370 1041 } else {
nickjillings@1370 1042 return;
nickjillings@1370 1043 }
nickjillings@1370 1044 this.specification.options = options;
nickjillings@1370 1045 break;
nickjillings@1370 1046 }
nickjillings@1370 1047 }
nickjillings@1370 1048 if (this.input.checked) {
nickjillings@1370 1049 var obj = {
nickjillings@1370 1050 name: this.name,
nickjillings@1370 1051 type: this.type
nickjillings@1370 1052 };
nickjillings@1370 1053 this.specification.options.push(obj);
nickjillings@1370 1054 }
nickjillings@1370 1055 if (this.parent.HTMLPoint.id == "setup")
nickjillings@1370 1056 {
nickjillings@1370 1057 // We've changed a global setting, must update all child 'interfaces' and disable them
nickjillings@1370 1058 for (pages of convert.pages)
nickjillings@1370 1059 {
nickjillings@1370 1060 for (interface of pages.interfaces)
nickjillings@1370 1061 {
nickjillings@1370 1062 if (this.type == "check")
nickjillings@1370 1063 {
nickjillings@1370 1064 for (node of interface.children[0].attributes)
nickjillings@1370 1065 {
nickjillings@1370 1066 if (node.name == this.name) {
nickjillings@1370 1067 if (this.input.checked) {
nickjillings@1370 1068 node.input.disabled = true;
nickjillings@1370 1069 node.input.checked = false;
nickjillings@1370 1070 } else {
nickjillings@1370 1071 node.input.disabled = false;
nickjillings@1370 1072 }
nickjillings@1370 1073 break;
nickjillings@1370 1074 }
nickjillings@1370 1075 }
nickjillings@1370 1076 } else if (this.type == "show")
nickjillings@1370 1077 {
nickjillings@1370 1078 for (node of interface.children[1].attributes)
nickjillings@1370 1079 {
nickjillings@1370 1080 if (node.name == this.name) {
nickjillings@1370 1081 if (this.input.checked) {
nickjillings@1370 1082 node.input.disabled = true;
nickjillings@1370 1083 } else {
nickjillings@1370 1084 node.input.disabled = false;
nickjillings@1370 1085 }
nickjillings@1370 1086 break;
nickjillings@1370 1087 }
nickjillings@1370 1088 }
nickjillings@1370 1089 }
nickjillings@1370 1090 }
nickjillings@1370 1091 }
nickjillings@1370 1092 }
nickjillings@1370 1093 };
nickjillings@1370 1094 this.findIndex = function(element,index,array){
nickjillings@1370 1095 if (element.name == this.name)
nickjillings@1370 1096 return true;
nickjillings@1370 1097 else
nickjillings@1370 1098 return false;
nickjillings@1370 1099 };
nickjillings@1370 1100 this.findNode = function(element,index,array){
nickjillings@1370 1101 if (element.name == this.name)
nickjillings@1370 1102 return true;
nickjillings@1370 1103 else
nickjillings@1370 1104 return false;
nickjillings@1370 1105 };
nickjillings@1370 1106 this.input.type = "checkbox";
nickjillings@1370 1107 this.input.setAttribute("name",name);
nickjillings@1370 1108 this.input.addEventListener("change",this,false);
nickjillings@1370 1109 this.root.appendChild(this.input);
nickjillings@1370 1110 this.root.className = "attribute";
nickjillings@1370 1111 return this;
nickjillings@1370 1112 }
nickjillings@1370 1113
nickjillings@1370 1114 this.build = function(name,id,parent)
nickjillings@1370 1115 {
nickjillings@1370 1116 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
nickjillings@1370 1117
nickjillings@1370 1118 this.rootDOM = obj.rootDOM;
nickjillings@1370 1119 this.titleDOM = obj.titleDOM;
nickjillings@1370 1120 this.attributeDOM = obj.attributeDOM;
nickjillings@1370 1121 this.childrenDOM = obj.childrenDOM;
nickjillings@1370 1122 this.buttonDOM = obj.buttonsDOM;
nickjillings@1370 1123 this.HTMLPoint = parent;
nickjillings@1370 1124 this.rootDOM.removeChild(this.attributeDOM);
nickjillings@1370 1125 // Put in the check / show options as individual children
nickjillings@1370 1126 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
nickjillings@1370 1127
nickjillings@1370 1128 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1129 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1130 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1131 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1132 testXML = testXML.getAllElementsByTagName("checks");
nickjillings@1370 1133 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 1134 {
nickjillings@1370 1135 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"check");
nickjillings@1370 1136 for (var option of this.specification.options)
nickjillings@1370 1137 {
nickjillings@1370 1138 if (option.name == obj.name)
nickjillings@1370 1139 {
nickjillings@1370 1140 obj.input.checked = true;
nickjillings@1370 1141 break;
nickjillings@1370 1142 }
nickjillings@1370 1143 }
nickjillings@1370 1144 if (parent.id != "setup") {
nickjillings@1370 1145 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1370 1146 if (node.input.checked) {
nickjillings@1370 1147 obj.input.checked = false;
nickjillings@1370 1148 obj.input.disable = true;
nickjillings@1370 1149 }
nickjillings@1370 1150 }
nickjillings@1370 1151 var text = document.createElement('span');
nickjillings@1370 1152 text.textContent = checkText.children[i].textContent;
nickjillings@1370 1153 obj.root.appendChild(text);
nickjillings@1370 1154 checks.attributeDOM.appendChild(obj.root);
nickjillings@1370 1155 checks.attributes.push(obj);
nickjillings@1370 1156 }
nickjillings@1370 1157 this.children.push(checks);
nickjillings@1370 1158 this.childrenDOM.appendChild(checks.rootDOM);
nickjillings@1370 1159
nickjillings@1370 1160 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
nickjillings@1370 1161 interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1162 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1163 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1164 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1165 testXML = testXML.getAllElementsByTagName("show");
nickjillings@1370 1166 for (var i=0; i<interfaceXML.children.length; i++)
nickjillings@1370 1167 {
nickjillings@1370 1168 var obj = new this.createIOasAttr(interfaceXML.children[i].getAttribute("name"),this.specification,this,"show");
nickjillings@1370 1169 for (var option of this.specification.options)
nickjillings@1370 1170 {
nickjillings@1370 1171 if (option.name == obj.name)
nickjillings@1370 1172 {
nickjillings@1370 1173 obj.input.checked = true;
nickjillings@1370 1174 break;
nickjillings@1370 1175 }
nickjillings@1370 1176 }
nickjillings@1370 1177 if (parent.id != "setup") {
nickjillings@1370 1178 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1370 1179 if (node.input.checked) {
nickjillings@1370 1180 obj.input.checked = false;
nickjillings@1370 1181 obj.input.disable = true;
nickjillings@1370 1182 }
nickjillings@1370 1183 }
nickjillings@1370 1184 var text = document.createElement('span');
nickjillings@1370 1185 text.textContent = checkText.children[i].textContent;
nickjillings@1370 1186 obj.root.appendChild(text);
nickjillings@1370 1187 show.attributeDOM.appendChild(obj.root);
nickjillings@1370 1188 show.attributes.push(obj);
nickjillings@1370 1189 }
nickjillings@1370 1190 this.children.push(show);
nickjillings@1370 1191 this.childrenDOM.appendChild(show.rootDOM);
nickjillings@1370 1192
nickjillings@1370 1193 if (parent.id == "setup")
nickjillings@1370 1194 {
nickjillings@1370 1195 } else {
nickjillings@1370 1196 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
nickjillings@1370 1197 this.attributeDOM.appendChild(nameAttr.holder);
nickjillings@1370 1198 this.attributes.push(nameAttr);
nickjillings@1370 1199 }
nickjillings@1370 1200 if (parent != undefined)
nickjillings@1370 1201 {
nickjillings@1370 1202 parent.appendChild(this.rootDOM);
nickjillings@1370 1203 }
nickjillings@1370 1204 }
nickjillings@1370 1205 }
nickjillings@1370 1206
nickjillings@1370 1207 this.surveyNode = function(parent,rootObject,location)
nickjillings@1370 1208 {
nickjillings@1370 1209 this.rootDOM = document.createElement("div");
nickjillings@1370 1210 this.titleDOM = document.createElement("span");
nickjillings@1370 1211 this.attributeDOM = document.createElement("div");
nickjillings@1370 1212 this.attributes = [];
nickjillings@1370 1213 this.childrenDOM = document.createElement("div");
nickjillings@1370 1214 this.children = [];
nickjillings@1370 1215 this.buttonDOM = document.createElement("div");
nickjillings@1370 1216 this.parent = parent;
nickjillings@1370 1217 this.specification = rootObject;
nickjillings@1370 1218 this.schema = specification.schema.getAllElementsByName("survey")[1];
nickjillings@1370 1219 this.rootDOM.className = "node";
nickjillings@1370 1220
nickjillings@1370 1221 var titleDiv = document.createElement('div');
nickjillings@1370 1222 titleDiv.className = "node-title";
nickjillings@1370 1223 this.titleDOM.className = "node-title";
nickjillings@1370 1224 this.titleDOM.textContent = "Survey";
nickjillings@1370 1225 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1226
nickjillings@1370 1227 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1228 var locationAttr = document.createElement("span");
nickjillings@1370 1229 this.attributeDOM.appendChild(locationAttr);
nickjillings@1370 1230 if (location == "Pre" || location == "pre") {
nickjillings@1370 1231 locationAttr.textContent = "Location: Before";
nickjillings@1370 1232 } else {
nickjillings@1370 1233 locationAttr.textContent = "Location: After";
nickjillings@1370 1234 }
nickjillings@1370 1235 this.childrenDOM.className = "node-children";
nickjillings@1370 1236 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1237
nickjillings@1370 1238 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1239 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1240 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1241 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1242
nickjillings@1370 1243 this.surveyEntryNode = function(parent,rootObject)
nickjillings@1370 1244 {
nickjillings@1370 1245 this.rootDOM = document.createElement("div");
nickjillings@1370 1246 this.titleDOM = document.createElement("span");
nickjillings@1370 1247 this.attributeDOM = document.createElement("div");
nickjillings@1370 1248 this.attributes = [];
nickjillings@1370 1249 this.childrenDOM = document.createElement("div");
nickjillings@1370 1250 this.children = [];
nickjillings@1370 1251 this.buttonDOM = document.createElement("div");
nickjillings@1370 1252 this.parent = parent;
nickjillings@1370 1253 this.specification = rootObject;
nickjillings@1370 1254 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
nickjillings@1370 1255
nickjillings@1370 1256 this.rootDOM.id = id;
nickjillings@1370 1257 this.rootDOM.className = "node";
nickjillings@1370 1258 this.rootDOM.style.minWidth = "50%";
nickjillings@1370 1259
nickjillings@1370 1260 var titleDiv = document.createElement('div');
nickjillings@1370 1261 titleDiv.className = "node-title";
nickjillings@1370 1262 this.titleDOM.className = "node-title";
nickjillings@1370 1263 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1264
nickjillings@1370 1265 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1266 this.childrenDOM.className = "node-children";
nickjillings@1370 1267 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1268
nickjillings@1370 1269 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1270 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1271 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1272 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1273
nickjillings@1370 1274 var statement = {};
nickjillings@1370 1275 statement.rootDOM = document.createElement("div");
nickjillings@1370 1276 statement.titleDOM = document.createElement("span");
nickjillings@1370 1277 statement.titleDOM.textContent = "Statement/Question";
nickjillings@1370 1278 statement.input = document.createElement("textarea");
nickjillings@1370 1279 statement.input.value = this.specification.statement;
nickjillings@1370 1280 statement.specification = this.specification;
nickjillings@1370 1281 statement.handleEvent = function() {
nickjillings@1370 1282 this.specification.statement = this.input.value;
nickjillings@1370 1283 }
nickjillings@1370 1284 statement.input.addEventListener("change",statement,false);
nickjillings@1370 1285 statement.rootDOM.appendChild(statement.titleDOM);
nickjillings@1370 1286 statement.rootDOM.appendChild(statement.input);
nickjillings@1370 1287 this.children.push(statement);
nickjillings@1370 1288 this.childrenDOM.appendChild(statement.rootDOM);
nickjillings@1370 1289 switch(this.specification.type)
nickjillings@1370 1290 {
nickjillings@1370 1291 case "statement":
nickjillings@1370 1292 this.titleDOM.textContent = "Statement";
nickjillings@1370 1293 this.rootDOM.removeChild(this.attributeDOM);
nickjillings@1370 1294 break;
nickjillings@1370 1295 case "question":
nickjillings@1374 1296 this.titleDOM.textContent = "Question";
nickjillings@1370 1297 var id = convert.convertAttributeToDOM(this.specification.id,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1374 1298 var mandatory = convert.convertAttributeToDOM(this.specification.mandatory,specification.schema.getAllElementsByName("mandatory")[0]);
nickjillings@1370 1299 var boxsize = convert.convertAttributeToDOM(this.specification.mandatory,specification.schema.getAllElementsByName("boxsize")[0]);
nickjillings@1374 1300 this.attributeDOM.appendChild(id.holder);
nickjillings@1374 1301 this.attributes.push(id);
nickjillings@1374 1302 this.attributeDOM.appendChild(mandatory.holder);
nickjillings@1374 1303 this.attributes.push(mandatory);
nickjillings@1374 1304 this.attributeDOM.appendChild(boxsize.holder);
nickjillings@1374 1305 this.attributes.push(boxsize);
nickjillings@1370 1306 break;
nickjillings@1374 1307 case "checkbox":
nickjillings@1374 1308 this.titleDOM.textContent = "Checkbox";
nickjillings@1374 1309 var id = convert.convertAttributeToDOM(this.specification.id,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1374 1310 this.attributeDOM.appendChild(id.holder);
nickjillings@1374 1311 this.attributes.push(id);
nickjillings@1374 1312 case "radio":
nickjillings@1374 1313 this.titleDOM.textContent = "Radio";
nickjillings@1374 1314 var id = convert.convertAttributeToDOM(this.specification.id,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1374 1315 this.attributeDOM.appendChild(id.holder);
nickjillings@1374 1316 this.attributes.push(id);
nickjillings@1370 1317 }
nickjillings@1370 1318
nickjillings@1370 1319 this.editNode = {
nickjillings@1370 1320 root: document.createElement("button"),
nickjillings@1370 1321 parent: this,
nickjillings@1370 1322 handleEvent: function()
nickjillings@1370 1323 {
nickjillings@1370 1324 popupObject.show();
nickjillings@1370 1325 popupStateNodes.state[5].generate(this,this.parent);
nickjillings@1370 1326 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 1327 }
nickjillings@1370 1328 }
nickjillings@1370 1329 this.editNode.root.textContent = "Edit Entry";
nickjillings@1370 1330 this.editNode.root.addEventListener("click",this.editNode,false);
nickjillings@1370 1331 this.buttonDOM.appendChild(this.editNode.root);
nickjillings@1370 1332
nickjillings@1370 1333 this.deleteNode = {
nickjillings@1370 1334 root: document.createElement("button"),
nickjillings@1370 1335 parent: this,
nickjillings@1370 1336 handleEvent: function()
nickjillings@1370 1337 {
nickjillings@1370 1338 var optionList = this.parent.parent.specification.options;
nickjillings@1370 1339 var childList = this.parent.parent.children;
nickjillings@1370 1340 for (var i=0; i <this.parent.parent.specification.options.length; i++)
nickjillings@1370 1341 {
nickjillings@1370 1342 var option = this.parent.parent.specification.options[i];
nickjillings@1370 1343 if (option == this.parent.specification)
nickjillings@1370 1344 {
nickjillings@1370 1345 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 1346 if (i == this.parent.parent.specification.options.length-1)
nickjillings@1370 1347 {
nickjillings@1370 1348 optionList = optionList.slice(0,i);
nickjillings@1370 1349 childList = childList.slice(0,i);
nickjillings@1370 1350 }
nickjillings@1370 1351 else {
nickjillings@1370 1352 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
nickjillings@1370 1353 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 1354 }
nickjillings@1370 1355 this.parent.parent.specification.options = optionList;
nickjillings@1370 1356 this.parent.parent.children = childList;
nickjillings@1370 1357 }
nickjillings@1370 1358 }
nickjillings@1370 1359 }
nickjillings@1370 1360 }
nickjillings@1370 1361 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 1362 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 1363 this.buttonDOM.appendChild(this.deleteNode.root);
nickjillings@1370 1364 }
nickjillings@1370 1365 this.addNode = {
nickjillings@1370 1366 root: document.createElement("button"),
nickjillings@1370 1367 parent: this,
nickjillings@1370 1368 handleEvent: function()
nickjillings@1370 1369 {
nickjillings@1370 1370 var newNode = new this.parent.specification.OptionNode();
nickjillings@1370 1371 this.parent.specification.options.push(newNode);
nickjillings@1370 1372 popupObject.show();
nickjillings@1370 1373 popupStateNodes.state[5].generate(newNode,this.parent);
nickjillings@1370 1374 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 1375 }
nickjillings@1370 1376 }
nickjillings@1370 1377 this.addNode.root.textContent = "Add Survey Entry";
nickjillings@1370 1378 this.addNode.root.addEventListener("click",this.addNode,false);
nickjillings@1370 1379 this.buttonDOM.appendChild(this.addNode.root);
nickjillings@1370 1380
nickjillings@1370 1381 for (var option of this.specification.options)
nickjillings@1370 1382 {
nickjillings@1370 1383 var newNode = new this.surveyEntryNode(this,option);
nickjillings@1370 1384 this.children.push(newNode);
nickjillings@1370 1385 this.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1370 1386 }
nickjillings@1370 1387 }
nickjillings@1370 1388
nickjillings@1370 1389 this.pageNode = function(parent,rootObject)
nickjillings@1370 1390 {
nickjillings@1370 1391 this.rootDOM = document.createElement("div");
nickjillings@1370 1392 this.titleDOM = document.createElement("span");
nickjillings@1370 1393 this.attributeDOM = document.createElement("div");
nickjillings@1370 1394 this.attributes = [];
nickjillings@1370 1395 this.childrenDOM = document.createElement("div");
nickjillings@1370 1396 this.children = [];
nickjillings@1370 1397 this.buttonDOM = document.createElement("div");
nickjillings@1370 1398 this.parent = parent;
nickjillings@1370 1399 this.specification = rootObject;
nickjillings@1370 1400 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1370 1401 this.rootDOM.className = "node";
nickjillings@1370 1402
nickjillings@1370 1403 var titleDiv = document.createElement('div');
nickjillings@1370 1404 titleDiv.className = "node-title";
nickjillings@1370 1405 this.titleDOM.className = "node-title";
nickjillings@1370 1406 this.titleDOM.textContent = "Test Page";
nickjillings@1370 1407 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1408
nickjillings@1370 1409 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1410 this.childrenDOM.className = "node-children";
nickjillings@1370 1411 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1412
nickjillings@1370 1413 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1414 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1415 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1416 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1417
nickjillings@1370 1418 // Do the comment prefix node
nickjillings@1370 1419 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
nickjillings@1370 1420 cpn.rootDOM.removeChild(cpn.attributeDOM);
nickjillings@1370 1421 var obj = {
nickjillings@1370 1422 root: document.createElement("div"),
nickjillings@1370 1423 input: document.createElement("input"),
nickjillings@1370 1424 parent: this,
nickjillings@1370 1425 handleEvent: function()
nickjillings@1370 1426 {
nickjillings@1370 1427 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
nickjillings@1370 1428 }
nickjillings@1370 1429 }
nickjillings@1370 1430 cpn.children.push(obj);
nickjillings@1370 1431 cpn.childrenDOM.appendChild(obj.root);
nickjillings@1370 1432 obj.root.appendChild(obj.input);
nickjillings@1370 1433 obj.input.addEventListener("change",obj,false);
nickjillings@1370 1434 obj.input.value = this.specification.commentBoxPrefix;
nickjillings@1370 1435 this.childrenDOM.appendChild(cpn.rootDOM);
nickjillings@1370 1436 this.children.push(cpn);
nickjillings@1370 1437
nickjillings@1370 1438 // Now both before and after surveys
nickjillings@1370 1439 if (this.specification.preTest == undefined){
nickjillings@1370 1440 this.specification.preTest = new specification.surveyNode();
nickjillings@1370 1441 this.specification.preTest.location = "pre";
nickjillings@1370 1442 }
nickjillings@1370 1443 if (this.specification.postTest == undefined){
nickjillings@1370 1444 this.specification.postTest = new specification.surveyNode();
nickjillings@1370 1445 this.specification.postTest.location = "post";
nickjillings@1370 1446 }
nickjillings@1370 1447 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
nickjillings@1370 1448 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
nickjillings@1370 1449 this.children.push(surveyBefore);
nickjillings@1370 1450 this.children.push(surveyAfter);
nickjillings@1370 1451 this.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 1452 this.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 1453
nickjillings@1370 1454 // Build the attributes
nickjillings@1370 1455 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 1456 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 1457 {
nickjillings@1370 1458 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 1459 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 1460 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 1461 this.attributes.push(attrObject);
nickjillings@1370 1462 }
nickjillings@1370 1463
nickjillings@1370 1464 this.interfaces = [];
nickjillings@1370 1465
nickjillings@1370 1466 this.audioElementNode = function(parent,rootObject)
nickjillings@1370 1467 {
nickjillings@1370 1468 this.rootDOM = document.createElement("div");
nickjillings@1370 1469 this.titleDOM = document.createElement("span");
nickjillings@1370 1470 this.attributeDOM = document.createElement("div");
nickjillings@1370 1471 this.attributes = [];
nickjillings@1370 1472 this.childrenDOM = document.createElement("div");
nickjillings@1370 1473 this.children = [];
nickjillings@1370 1474 this.buttonDOM = document.createElement("div");
nickjillings@1370 1475 this.parent = parent;
nickjillings@1370 1476 this.specification = rootObject;
nickjillings@1370 1477 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
nickjillings@1370 1478 this.rootDOM.className = "node";
nickjillings@1370 1479
nickjillings@1370 1480 var titleDiv = document.createElement('div');
nickjillings@1370 1481 titleDiv.className = "node-title";
nickjillings@1370 1482 this.titleDOM.className = "node-title";
nickjillings@1370 1483 this.titleDOM.textContent = "Audio Element";
nickjillings@1370 1484 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1485
nickjillings@1370 1486 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1487 this.childrenDOM.className = "node-children";
nickjillings@1370 1488 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1489
nickjillings@1370 1490 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1491 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1492 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1493 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1494
nickjillings@1370 1495 // Build the attributes
nickjillings@1370 1496 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 1497 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 1498 {
nickjillings@1370 1499 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 1500 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 1501 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 1502 this.attributes.push(attrObject);
nickjillings@1370 1503 }
nickjillings@1370 1504
nickjillings@1370 1505 this.deleteNode = {
nickjillings@1370 1506 root: document.createElement("button"),
nickjillings@1370 1507 parent: this,
nickjillings@1370 1508 handleEvent: function()
nickjillings@1370 1509 {
nickjillings@1370 1510 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
nickjillings@1370 1511 if (i >= 0) {
nickjillings@1370 1512 var aeList = this.parent.parent.specification.audioElements;
nickjillings@1370 1513 if (i < aeList.length-1) {
nickjillings@1370 1514 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
nickjillings@1370 1515 } else {
nickjillings@1370 1516 aeList = aeList.slice(0,i);
nickjillings@1370 1517 }
nickjillings@1370 1518 }
nickjillings@1370 1519 i = this.parent.parent.children.findIndex(function(element,index,array){
nickjillings@1370 1520 if (element == this.parent)
nickjillings@1370 1521 return true;
nickjillings@1370 1522 else
nickjillings@1370 1523 return false;
nickjillings@1370 1524 },this);
nickjillings@1370 1525 if (i >= 0) {
nickjillings@1370 1526 var childList = this.parent.children;
nickjillings@1370 1527 if (i < aeList.length-1) {
nickjillings@1370 1528 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 1529 } else {
nickjillings@1370 1530 childList = childList.slice(0,i);
nickjillings@1370 1531 }
nickjillings@1370 1532 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 1533 }
nickjillings@1370 1534 },
nickjillings@1370 1535 findNode: function(element,index,array){
nickjillings@1370 1536 if (element == this.parent.specification)
nickjillings@1370 1537 return true;
nickjillings@1370 1538 else
nickjillings@1370 1539 return false;
nickjillings@1370 1540 }
nickjillings@1370 1541 }
nickjillings@1370 1542 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 1543 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 1544 this.buttonDOM.appendChild(this.deleteNode.root);
nickjillings@1370 1545 }
nickjillings@1370 1546
nickjillings@1370 1547 this.commentQuestionNode = function(parent,rootObject)
nickjillings@1370 1548 {
nickjillings@1370 1549 this.rootDOM = document.createElement("div");
nickjillings@1370 1550 this.titleDOM = document.createElement("span");
nickjillings@1370 1551 this.attributeDOM = document.createElement("div");
nickjillings@1370 1552 this.attributes = [];
nickjillings@1370 1553 this.childrenDOM = document.createElement("div");
nickjillings@1370 1554 this.children = [];
nickjillings@1370 1555 this.buttonDOM = document.createElement("div");
nickjillings@1370 1556 this.parent = parent;
nickjillings@1370 1557 this.specification = rootObject;
nickjillings@1370 1558 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1370 1559 this.rootDOM.className = "node";
nickjillings@1370 1560
nickjillings@1370 1561 var titleDiv = document.createElement('div');
nickjillings@1370 1562 titleDiv.className = "node-title";
nickjillings@1370 1563 this.titleDOM.className = "node-title";
nickjillings@1370 1564 this.titleDOM.textContent = "Test Page";
nickjillings@1370 1565 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1566
nickjillings@1370 1567 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1568 this.childrenDOM.className = "node-children";
nickjillings@1370 1569 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1570
nickjillings@1370 1571 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1572 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1573 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1574 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1575
nickjillings@1370 1576 }
nickjillings@1370 1577
nickjillings@1374 1578 // Build the components
nickjillings@1374 1579 for (var elements of this.specification.audioElements)
nickjillings@1374 1580 {
nickjillings@1374 1581 var audioElementDOM = new this.audioElementNode(this,elements);
nickjillings@1374 1582 this.children.push(audioElementDOM);
nickjillings@1374 1583 this.childrenDOM.appendChild(audioElementDOM.rootDOM);
nickjillings@1374 1584 }
nickjillings@1374 1585
nickjillings@1370 1586 this.addInterface = {
nickjillings@1370 1587 root: document.createElement("button"),
nickjillings@1370 1588 parent: this,
nickjillings@1370 1589 handleEvent: function() {
nickjillings@1370 1590 var InterfaceObj = new specification.interfaceNode();
nickjillings@1370 1591 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
nickjillings@1370 1592 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
nickjillings@1370 1593 this.parent.children.push(newInterface);
nickjillings@1370 1594 this.parent.specification.interfaces.push(InterfaceObj);
nickjillings@1370 1595 this.parent.interfaces.push(newInterface);
nickjillings@1370 1596 }
nickjillings@1370 1597 }
nickjillings@1370 1598 this.addInterface.root.textContent = "Add Interface";
nickjillings@1370 1599 this.addInterface.root.addEventListener("click",this.addInterface,false);
nickjillings@1370 1600 this.buttonDOM.appendChild(this.addInterface.root);
nickjillings@1370 1601
nickjillings@1370 1602 this.addAudioElement = {
nickjillings@1370 1603 root: document.createElement("button"),
nickjillings@1370 1604 parent: this,
nickjillings@1370 1605 handleEvent: function() {
nickjillings@1370 1606 var audioElementObject = new this.parent.specification.audioElementNode();
nickjillings@1370 1607 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
nickjillings@1370 1608 this.parent.specification.audioElements.push(audioElementObject);
nickjillings@1370 1609 this.parent.children.push(audioElementDOM);
nickjillings@1370 1610 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
nickjillings@1370 1611 }
nickjillings@1370 1612 }
nickjillings@1370 1613 this.addAudioElement.root.textContent = "Add Audio Element";
nickjillings@1370 1614 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
nickjillings@1370 1615 this.buttonDOM.appendChild(this.addAudioElement.root);
nickjillings@1370 1616 }
nickjillings@1370 1617 }