annotate test_create/test_core.js @ 2108:b65c4941fc1f

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