annotate test_create/test_core.js @ 1843:6c05c36a34ea

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