annotate test_create/test_core.js @ 2412:18f88a726ccd

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