annotate test_create/test_core.js @ 2562:9c167c0d6c26

Added video and youtube creation to test_create #134
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Fri, 02 Sep 2016 11:38:09 +0100
parents 23bbd100b403
children 26045169b4b5
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;
nicholas@2562 858 case "video":
nicholas@2562 859 case "youtube":
nicholas@2562 860 this.dynamic.appendChild(id);
nicholas@2562 861
nicholas@2562 862 var mandatory = document.createElement("div");
nicholas@2562 863 var mandatoryInput = document.createElement("input");
nicholas@2562 864 var mandatoryText = document.createElement("span");
nicholas@2562 865 mandatoryText.textContent = "Mandatory: ";
nicholas@2562 866 mandatory.appendChild(mandatoryText);
nicholas@2562 867 mandatory.appendChild(mandatoryInput);
nicholas@2562 868 mandatory.className = "survey-entry-attribute";
nicholas@2562 869 mandatoryInput.type = "checkbox";
nicholas@2562 870 if (this.option.mandatory) {mandatoryInput.checked = true;} else {mandatoryInput.checked = false;}
nicholas@2562 871 mandatoryInput.setAttribute("name","mandatory");
nicholas@2562 872 mandatoryInput.addEventListener("change",this,false);
nicholas@2562 873 this.dynamic.appendChild(mandatory);
nicholas@2562 874
nicholas@2562 875 var url = document.createElement("div");
nicholas@2562 876 var urlInput = document.createElement("input");
nicholas@2562 877 var urlText = document.createElement("span");
nicholas@2562 878 urlText.textContent = "URL: ";
nicholas@2562 879 url.appendChild(urlText);
nicholas@2562 880 url.appendChild(urlInput);
nicholas@2562 881 url.className = "survey-entry-attribute";
nicholas@2562 882 urlInput.type = "text";
nicholas@2562 883 if (this.option.mandatory) {urlInput.value = this.option.mandatory;} else {urlInput.value = "";}
nicholas@2562 884 urlInput.setAttribute("name","url");
nicholas@2562 885 urlInput.addEventListener("change",this,false);
nicholas@2562 886 this.dynamic.appendChild(url);
nicholas@2562 887 break;
nickjillings@1375 888 case "checkbox":
nickjillings@1375 889 case "radio":
nickjillings@1375 890 this.dynamic.appendChild(id);
nickjillings@1375 891 var optionHolder = document.createElement("div");
nickjillings@1375 892 optionHolder.className = 'node';
nickjillings@1375 893 optionHolder.id = 'popup-option-holder';
nickjillings@1375 894 var optionObject = function(parent,option) {
nickjillings@1375 895 this.rootDOM = document.createElement("div");
nickjillings@1375 896 this.rootDOM.className = "popup-option-entry";
nickjillings@1375 897 this.inputName = document.createElement("input");
nickjillings@1375 898 this.inputName.setAttribute("name","name");
nickjillings@1375 899 this.inputLabel = document.createElement("input");
nickjillings@1375 900 this.inputLabel.setAttribute("name","text");
nickjillings@1375 901 this.specification = option;
nickjillings@1375 902 this.parent = parent;
nickjillings@1375 903 this.handleEvent = function()
nickjillings@1375 904 {
nickjillings@1375 905 var target = event.currentTarget.getAttribute("name");
nickjillings@1375 906 eval("this.specification."+target+" = event.currentTarget.value");
nickjillings@1375 907 };
nickjillings@1375 908
nickjillings@1375 909 var nameText = document.createElement("span");
nickjillings@1375 910 nameText.textContent = "Name: ";
nickjillings@1375 911 var labelText = document.createElement("span");
nickjillings@1375 912 labelText.textContent = "Label: ";
nickjillings@1375 913 this.rootDOM.appendChild(nameText);
nickjillings@1375 914 this.rootDOM.appendChild(this.inputName);
nickjillings@1375 915 this.rootDOM.appendChild(labelText);
nickjillings@1375 916 this.rootDOM.appendChild(this.inputLabel);
nickjillings@1375 917 this.inputName.addEventListener("change",this,false);
nickjillings@1375 918 this.inputLabel.addEventListener("change",this,false);
nickjillings@1375 919 this.inputName.value = this.specification.name;
nickjillings@1375 920 this.inputLabel.value = this.specification.text;
nickjillings@2180 921 this.inputLabel.style.width = "350px";
nickjillings@1375 922
nickjillings@1375 923 this.deleteEntry = {
nickjillings@1375 924 root: document.createElement("button"),
nickjillings@1375 925 parent: this,
nickjillings@1375 926 handleEvent: function() {
nickjillings@1375 927 document.getElementById("popup-option-holder").removeChild(this.parent.rootDOM);
nickjillings@1375 928 var index = this.parent.parent.option.options.findIndex(function(element,index,array){
nickjillings@1375 929 if (element == this.parent.specification)
nickjillings@1375 930 return true;
nickjillings@1375 931 else
nickjillings@1375 932 return false;
nickjillings@1375 933 },this);
nickjillings@1375 934 var optionList = this.parent.parent.option.options;
nickjillings@1375 935 if (index == optionList.length-1) {
nickjillings@1375 936 optionList = optionList.slice(0,index);
nickjillings@1375 937 } else {
nickjillings@1375 938 optionList = optionList.slice(0,index).concat(optionList.slice(index+1));
nickjillings@1375 939 }
nickjillings@1375 940 this.parent.parent.option.options = optionList;
nickjillings@1375 941 }
nickjillings@1375 942 };
nickjillings@1375 943 this.deleteEntry.root.textContent = "Delete Option";
nickjillings@1375 944 this.deleteEntry.root.addEventListener("click",this.deleteEntry,false);
nickjillings@1375 945 this.rootDOM.appendChild(this.deleteEntry.root);
nickjillings@1375 946 }
nickjillings@2158 947 this.addEntry = {
nickjillings@2158 948 parent: this,
nickjillings@2158 949 root: document.createElement("button"),
nickjillings@2158 950 handleEvent: function() {
nickjillings@2158 951 var node = {name: "name", text: "text"};
nickjillings@2158 952 var optionsList = this.parent.option.options;
nickjillings@2158 953 optionsList.push(node);
nickjillings@2158 954 var obj = new optionObject(this.parent,optionsList[optionsList.length-1]);
nickjillings@2158 955 this.parent.optionLists.push(obj);
nickjillings@2158 956 document.getElementById("popup-option-holder").appendChild(obj.rootDOM);
nickjillings@2158 957 }
nickjillings@2158 958 }
nickjillings@2158 959 this.addEntry.root.textContent = "Add Option";
nickjillings@2158 960 this.addEntry.root.addEventListener("click",this.addEntry);
nickjillings@2158 961 this.dynamic.appendChild(this.addEntry.root);
nickjillings@1375 962 for (var i=0; i<this.option.options.length; i++)
nickjillings@1375 963 {
nickjillings@1375 964 var obj = new optionObject(this,this.option.options[i]);
nickjillings@1375 965 this.optionLists.push(obj);
nickjillings@1375 966 optionHolder.appendChild(obj.rootDOM);
nickjillings@1375 967 }
nickjillings@1375 968 this.dynamic.appendChild(optionHolder);
nickjillings@1370 969 }
nickjillings@1370 970 }
nicholas@2562 971 this.handleEvent = function(event)
nickjillings@1370 972 {
nickjillings@1370 973 var name = event.currentTarget.getAttribute("name");
nickjillings@2159 974 var nodeName = event.currentTarget.nodeName;
nickjillings@2159 975 if (name == "type" && nodeName == "SELECT") {
nickjillings@2159 976 // If type has changed, we may need to rebuild the entire state node
nickjillings@2159 977 if (event.currentTarget.value != this.option.name)
nickjillings@2159 978 {
nickjillings@2159 979 this.option.type = event.currentTarget.value;
nickjillings@2159 980 this.generate(this.option,this.parent);
nickjillings@2159 981 }
nickjillings@2159 982 return;
nickjillings@2159 983 }
nickjillings@2162 984 switch(event.currentTarget.getAttribute("type")) {
nickjillings@2159 985 case "checkbox":
nickjillings@2159 986 eval("this.option."+name+" = event.currentTarget.checked");
nickjillings@1370 987 break;
nickjillings@2159 988 default:
nickjillings@2159 989 eval("this.option."+name+" = event.currentTarget.value");
nickjillings@1370 990 break;
nickjillings@1370 991 }
nickjillings@1370 992 }
nickjillings@1370 993 this.continue = function()
nickjillings@1370 994 {
nickjillings@1375 995 if (this.parent.type == "surveyNode")
nickjillings@1375 996 {
nickjillings@1375 997 var newNode = new this.parent.surveyEntryNode(this.parent,this.option);
nickjillings@1375 998 this.parent.children.push(newNode);
nickjillings@1375 999 this.parent.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1375 1000 } else if (this.parent.type == "surveyEntryNode") {
nickjillings@1375 1001 this.parent.build();
nickjillings@1375 1002 }
nickjillings@1370 1003 popupObject.hide();
nickjillings@1370 1004 }
nickjillings@1370 1005 }
nickjillings@1385 1006 this.state[6] = new function() {
nickjillings@1385 1007 this.title = "Edit Scale Markers";
nickjillings@1385 1008 this.content = document.createElement("div");
nickjillings@1385 1009 this.content.id = "state-6";
nickjillings@1385 1010 var spnH = document.createElement('div');
nickjillings@1385 1011 var span = document.createElement("span");
nickjillings@1385 1012 span.textContent = "You can edit your scale markers here for the selected interface.";
nickjillings@1385 1013 spnH.appendChild(span);
nickjillings@1385 1014 this.scaleRoot;
nickjillings@1385 1015 this.parent;
nickjillings@1385 1016 this.markerNodes =[];
nickjillings@1385 1017 this.preset = {
nickjillings@1385 1018 input: document.createElement("select"),
nickjillings@1385 1019 parent: this,
nickjillings@1385 1020 handleEvent: function(event) {
nickjillings@1385 1021 this.parent.scaleRoot.scales = [];
nickjillings@1385 1022 var protoScale = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getAllElementsByName(event.currentTarget.value)[0];
nicholas@2390 1023 var protoMarkers = protoScale.getElementsByTagName("scale");
nickjillings@1385 1024 for (var i=0; i<protoMarkers.length; i++)
nickjillings@1385 1025 {
nickjillings@1385 1026 var marker = {
nickjillings@1385 1027 position: protoMarkers[i].getAttribute("position"),
nickjillings@1385 1028 text: protoMarkers[i].textContent
nickjillings@1385 1029 }
nickjillings@1385 1030 this.parent.scaleRoot.scales.push(marker);
nickjillings@1385 1031 }
nickjillings@1385 1032 this.parent.buildMarkerList();
nickjillings@1385 1033 }
nickjillings@1385 1034 }
nickjillings@1385 1035 this.preset.input.addEventListener("change",this.preset);
nickjillings@1385 1036 this.content.appendChild(this.preset.input);
nickjillings@1385 1037 var optionHolder = document.createElement("div");
nickjillings@1385 1038 optionHolder.className = 'node';
nickjillings@1385 1039 optionHolder.id = 'popup-option-holder';
nickjillings@1385 1040 this.content.appendChild(optionHolder);
nickjillings@1385 1041 this.generate = function(scaleRoot,parent)
nickjillings@1385 1042 {
nickjillings@1385 1043 this.scaleRoot = scaleRoot;
nickjillings@1385 1044 this.parent = parent;
nickjillings@1385 1045
nickjillings@1385 1046 // Generate Pre-Set dropdown
nicholas@2390 1047 var protoScales = interfaceSpecs.getAllElementsByTagName('scaledefinitions')[0].getElementsByTagName("scale");
nickjillings@1385 1048 this.preset.input.innerHTML = "";
nickjillings@1385 1049
nickjillings@1385 1050 for (var i=0; i<protoScales.length; i++)
nickjillings@1385 1051 {
nickjillings@1385 1052 var selectOption = document.createElement("option");
nickjillings@1385 1053 var scaleName = protoScales[i].getAttribute("name");
nickjillings@1385 1054 selectOption.setAttribute("name",scaleName);
nickjillings@1385 1055 selectOption.textContent = scaleName;
nickjillings@1385 1056 this.preset.input.appendChild(selectOption);
nickjillings@1385 1057 }
nickjillings@1385 1058
nickjillings@2115 1059 this.addMarker = {
nickjillings@2115 1060 root: document.createElement("button"),
nickjillings@2115 1061 parent: this,
nickjillings@2115 1062 handleEvent: function() {
nickjillings@2115 1063 var marker = {
nickjillings@2115 1064 position: 0,
nickjillings@2115 1065 text: "text"
nickjillings@2115 1066 };
nickjillings@2115 1067 this.parent.scaleRoot.scales.push(marker);
nickjillings@2115 1068 var markerNode = new this.parent.buildMarkerNode(this.parent,marker);
nickjillings@2115 1069 document.getElementById("popup-option-holder").appendChild(markerNode.root);
nickjillings@2115 1070 this.parent.markerNodes.push(markerNode);
nickjillings@2115 1071 }
nickjillings@2115 1072 };
nickjillings@2115 1073 this.addMarker.root.textContent = "Add Marker";
nickjillings@2115 1074 this.addMarker.root.addEventListener("click",this.addMarker);
nickjillings@2115 1075 this.content.appendChild(this.addMarker.root);
nickjillings@2115 1076
nickjillings@1385 1077 // Create Marker List
nickjillings@1385 1078 this.buildMarkerList();
nickjillings@1385 1079 }
nickjillings@1385 1080 this.buildMarkerList = function() {
nickjillings@1385 1081 var markerInject = document.getElementById("popup-option-holder");
nickjillings@1385 1082 markerInject.innerHTML = "";
nickjillings@1385 1083 this.markerNodes = [];
nickjillings@1385 1084 for (var i=0; i<this.scaleRoot.scales.length; i++)
nickjillings@1385 1085 {
nickjillings@2115 1086 var markerNode = new this.buildMarkerNode(this,this.scaleRoot.scales[i]);
nickjillings@1385 1087 markerInject.appendChild(markerNode.root);
nickjillings@1385 1088 this.markerNodes.push(markerNode);
nickjillings@1385 1089
nickjillings@1385 1090 }
nickjillings@1385 1091 }
nickjillings@2115 1092
nickjillings@2115 1093 this.buildMarkerNode = function(parent,specification) {
nickjillings@2115 1094 this.root = document.createElement("div");
nickjillings@2115 1095 this.root.className = "popup-option-entry";
nickjillings@2115 1096 this.positionInput = document.createElement("input");
nickjillings@2115 1097 this.positionInput.min = 0;
nickjillings@2115 1098 this.positionInput.max = 100;
nickjillings@2115 1099 this.positionInput.value = specification.position;
nickjillings@2115 1100 this.positionInput.setAttribute("name","position");
nickjillings@2115 1101 this.textInput = document.createElement("input");
nickjillings@2115 1102 this.textInput.setAttribute("name","text");
nickjillings@2180 1103 this.textInput.style.width = "300px";
nickjillings@2115 1104 this.textInput.value = specification.text;
nickjillings@2115 1105 this.specification = specification;
nickjillings@2115 1106 this.parent = parent;
nickjillings@2115 1107 this.handleEvent = function(event) {
nickjillings@2115 1108 switch(event.currentTarget.getAttribute("name"))
nickjillings@2115 1109 {
nickjillings@2115 1110 case "position":
nickjillings@2115 1111 this.specification.position = Number(event.currentTarget.value);
nickjillings@2115 1112 break;
nickjillings@2115 1113 case "text":
nickjillings@2115 1114 this.specification.text = event.currentTarget.value;
nickjillings@2115 1115 break;
nickjillings@2115 1116 }
nickjillings@2115 1117 }
nickjillings@2115 1118 this.positionInput.addEventListener("change",this,false);
nickjillings@2115 1119 this.textInput.addEventListener("change",this,false);
nickjillings@2115 1120
nickjillings@2115 1121 var posText = document.createElement("span");
nickjillings@2115 1122 posText.textContent = "Position: ";
nickjillings@2115 1123 var textText = document.createElement("span");
nickjillings@2115 1124 textText.textContent = "Text: ";
nickjillings@2115 1125 this.root.appendChild(posText);
nickjillings@2115 1126 this.root.appendChild(this.positionInput);
nickjillings@2115 1127 this.root.appendChild(textText);
nickjillings@2115 1128 this.root.appendChild(this.textInput);
nickjillings@2115 1129
nickjillings@2115 1130 this.deleteMarker = {
nickjillings@2115 1131 root: document.createElement("button"),
nickjillings@2115 1132 parent: this,
nickjillings@2115 1133 handleEvent: function() {
nickjillings@2115 1134 var index = this.parent.parent.scaleRoot.scales.findIndex(function(element,index,array){
nickjillings@2115 1135 if (element == this) {return true;} else {return false;}
nickjillings@2115 1136 },this.parent.specification)
nickjillings@2115 1137 if (index >= 0) {
nickjillings@2115 1138 this.parent.parent.scaleRoot.scales.splice(index,1);
nickjillings@2115 1139 }
nickjillings@2115 1140 document.getElementById("popup-option-holder").removeChild(this.parent.root);
nickjillings@2115 1141 }
nickjillings@2115 1142 }
nickjillings@2115 1143 this.deleteMarker.root.addEventListener("click",this.deleteMarker);
nickjillings@2115 1144 this.deleteMarker.root.textContent = "Delete Marker"
nickjillings@2115 1145 this.root.appendChild(this.deleteMarker.root);
nickjillings@2115 1146 }
nickjillings@1385 1147 }
nickjillings@1370 1148 }
nickjillings@1370 1149 }
nickjillings@1370 1150
nickjillings@1370 1151 function SpecificationToHTML()
nickjillings@1370 1152 {
nickjillings@1370 1153 // This takes the specification node and converts it to an on-page HTML object
nickjillings@1370 1154 // Each Specification Node is given its own JS object which listens to the XSD for instant verification
nickjillings@1370 1155 // Once generated, it directly binds into the specification object to update with changes
nickjillings@1370 1156 // Fixed DOM entries
nickjillings@1370 1157 this.injectDOM;
nickjillings@1370 1158 this.setupDOM;
nickjillings@1370 1159 this.pages = [];
nickjillings@1370 1160
nickjillings@1370 1161 // Self-contained generators
nickjillings@1370 1162 this.createGeneralNodeDOM = function(name,id,parent)
nickjillings@1370 1163 {
nickjillings@1375 1164 this.type = name;
nickjillings@1370 1165 var root = document.createElement('div');
nickjillings@1370 1166 root.id = id;
nickjillings@1370 1167 root.className = "node";
nickjillings@1370 1168
nickjillings@1370 1169 var titleDiv = document.createElement('div');
nickjillings@1370 1170 titleDiv.className = "node-title";
nickjillings@1370 1171 var title = document.createElement('span');
nickjillings@1370 1172 title.className = "node-title";
nickjillings@1370 1173 title.textContent = name;
nickjillings@1370 1174 titleDiv.appendChild(title);
nickjillings@1370 1175
nickjillings@1370 1176 var attributeDiv = document.createElement('div');
nickjillings@1370 1177 attributeDiv.className = "node-attributes";
nickjillings@1370 1178
nickjillings@1370 1179 var childrenDiv = document.createElement('div');
nickjillings@1370 1180 childrenDiv.className = "node-children";
nickjillings@1370 1181
nickjillings@1370 1182 var buttonsDiv = document.createElement('div');
nickjillings@1370 1183 buttonsDiv.className = "node-buttons";
nickjillings@1370 1184
nickjillings@1370 1185 root.appendChild(titleDiv);
nickjillings@1370 1186 root.appendChild(attributeDiv);
nickjillings@1370 1187 root.appendChild(childrenDiv);
nickjillings@1370 1188 root.appendChild(buttonsDiv);
nickjillings@1370 1189
nickjillings@1370 1190 var obj = {
nickjillings@1370 1191 rootDOM: root,
nickjillings@1370 1192 titleDOM: title,
nickjillings@1370 1193 attributeDOM: attributeDiv,
nickjillings@1370 1194 attributes: [],
nickjillings@1370 1195 childrenDOM: childrenDiv,
nickjillings@1370 1196 children: [],
nickjillings@1370 1197 buttonDOM: buttonsDiv,
nickjillings@1370 1198 parent: parent
nickjillings@1370 1199 }
nickjillings@1370 1200 return obj;
nickjillings@1370 1201 }
nickjillings@1370 1202
nickjillings@1370 1203 this.convertAttributeToDOM = function(node,schema)
nickjillings@1370 1204 {
nickjillings@1370 1205 // This takes an attribute schema node and returns an object with the input node and any bindings
nickjillings@1370 1206 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
nickjillings@1370 1207 {
nickjillings@1370 1208 schema = specification.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
nickjillings@1370 1209 }
nickjillings@1370 1210 var obj = new function()
nickjillings@1370 1211 {
nickjillings@1370 1212 this.input;
nickjillings@1370 1213 this.name;
nickjillings@1370 1214 this.owner;
nickjillings@1370 1215 this.holder;
nickjillings@1370 1216
nickjillings@1370 1217 this.name = schema.getAttribute('name');
nickjillings@1370 1218 this.default = schema.getAttribute('default');
nickjillings@1370 1219 this.dataType = schema.getAttribute('type');
nickjillings@2158 1220 if (this.dataType == undefined) {
nickjillings@2158 1221 if (schema.childElementCount > 0) {
nicholas@2390 1222 if (schema.firstElementChild.nodeName == "xs:simpleType") {
nickjillings@2158 1223 this.dataType = schema.getAllElementsByTagName("xs:restriction")[0].getAttribute("base");
nickjillings@2158 1224 }
nickjillings@2158 1225 }
nickjillings@2158 1226 }
nickjillings@1370 1227 if (typeof this.dataType == "string") { this.dataType = this.dataType.substr(3);}
nickjillings@1370 1228 else {this.dataType = "string";}
nickjillings@1370 1229 var minVar = undefined;
nickjillings@1370 1230 var maxVar = undefined;
nickjillings@1370 1231 switch(this.dataType)
nickjillings@1370 1232 {
nickjillings@1370 1233 case "negativeInteger":
nickjillings@1370 1234 maxVar = -1;
nickjillings@1370 1235 break;
nickjillings@1370 1236 case "positiveInteger":
nickjillings@1370 1237 minVar = 1;
nickjillings@1370 1238 break;
nickjillings@1370 1239 case "nonNegativeInteger":
nickjillings@1370 1240 minVar = 0;
nickjillings@1370 1241 break;
nickjillings@1370 1242 case "nonPositiveInteger":
nickjillings@1370 1243 maxVar = 0;
nickjillings@1370 1244 break;
nickjillings@1370 1245 case "byte":
nickjillings@1370 1246 minVar = 0;
nickjillings@1370 1247 maxVar = 256;
nickjillings@1370 1248 break;
nickjillings@1370 1249 case "short":
nickjillings@1370 1250 minVar = 0;
nickjillings@1370 1251 maxVar = 65536;
nickjillings@1370 1252 break;
nickjillings@1370 1253 default:
nickjillings@1370 1254 break;
nickjillings@1370 1255 }
nickjillings@2174 1256
nickjillings@2174 1257 this.enumeration = schema.getAllElementsByTagName("xs:enumeration");
nickjillings@2174 1258 if (this.enumeration.length == 0) {
nickjillings@2174 1259 this.input = document.createElement('input');
nickjillings@2174 1260 switch(this.dataType)
nickjillings@2174 1261 {
nickjillings@2174 1262 case "boolean":
nickjillings@2174 1263 this.input.type = "checkbox";
nickjillings@2174 1264 break;
nickjillings@2174 1265 case "negativeInteger":
nickjillings@2174 1266 case "positiveInteger":
nickjillings@2174 1267 case "nonNegativeInteger":
nickjillings@2174 1268 case "nonPositiveInteger":
nickjillings@2174 1269 case "integer":
nickjillings@2174 1270 case "short":
nickjillings@2174 1271 case "byte":
nickjillings@2174 1272 this.input.step = 1;
nickjillings@2174 1273 case "decimal":
nickjillings@2174 1274 this.input.type = "number";
nickjillings@2174 1275 this.input.min = minVar;
nickjillings@2174 1276 this.input.max = maxVar;
nickjillings@2174 1277 break;
nickjillings@2174 1278 default:
nickjillings@2174 1279 break;
nickjillings@2174 1280 }
nickjillings@2174 1281 } else {
nickjillings@2174 1282 this.input = document.createElement("select");
nickjillings@2174 1283 for (var i=0; i<this.enumeration.length; i++)
nickjillings@2174 1284 {
nickjillings@2174 1285 var option = document.createElement("option");
nickjillings@2174 1286 var value = this.enumeration[i].getAttribute("value");
nickjillings@2174 1287 option.setAttribute("value",value);
nickjillings@2174 1288 option.textContent = value;
nickjillings@2174 1289 this.input.appendChild(option);
nickjillings@2174 1290 }
nickjillings@1370 1291 }
nickjillings@1370 1292 var value;
nickjillings@1373 1293 eval("value = node."+this.name)
nickjillings@2174 1294 if (this.default != undefined && value == undefined)
nickjillings@1370 1295 {
nickjillings@2174 1296 value = this.default;
nickjillings@2174 1297 }
nickjillings@2174 1298 if (this.input.type == "checkbox") {
nicholas@2239 1299 if (value == "true" || value == "True") {this.input.checked = false;}
nicholas@2239 1300 else {this.input.checked = false;}
nickjillings@2174 1301 } else {
nickjillings@1370 1302 this.input.value = value;
nickjillings@1370 1303 }
nickjillings@1370 1304 this.handleEvent = function(event)
nickjillings@1370 1305 {
nickjillings@1370 1306 var value;
nickjillings@2174 1307 if (this.input.nodeName == "INPUT")
nickjillings@1370 1308 {
nickjillings@2174 1309 switch(this.input.type)
nickjillings@2174 1310 {
nickjillings@2174 1311 case "checkbox":
nickjillings@2174 1312 value = event.currentTarget.checked;
nickjillings@2174 1313 break;
nickjillings@2174 1314 case "number":
n@2423 1315 if (event.currentTarget.value != "") {
n@2423 1316 value = Number(event.currentTarget.value);
n@2423 1317 } else {
n@2423 1318 value = undefined;
n@2423 1319 }
nickjillings@2174 1320 break;
nickjillings@2174 1321 default:
n@2423 1322 if (event.currentTarget.value != "") {
n@2423 1323 value = event.currentTarget.value;
n@2423 1324 } else {
n@2423 1325 value = undefined;
n@2423 1326 }
nickjillings@2174 1327 break;
nickjillings@2174 1328 }
nickjillings@2174 1329 } else if (this.input.nodeName == "SELECT") {
nickjillings@2174 1330 value = event.currentTarget.value;
nickjillings@1370 1331 }
nickjillings@1370 1332 eval("this.owner."+this.name+" = value");
nickjillings@1370 1333 }
nickjillings@1370 1334 this.holder = document.createElement('div');
nickjillings@1370 1335 this.holder.className = "attribute";
nickjillings@1370 1336 this.holder.setAttribute('name',this.name);
nickjillings@1370 1337 var text = document.createElement('span');
nickjillings@1370 1338 eval("text.textContent = attributeText."+this.name+"+': '");
nickjillings@1370 1339 this.holder.appendChild(text);
nickjillings@1370 1340 this.holder.appendChild(this.input);
nickjillings@1370 1341 this.owner = node;
nickjillings@1370 1342 this.input.addEventListener("change",this,false);
nickjillings@1370 1343 }
nickjillings@1370 1344 if (obj.attribute != null)
nickjillings@1370 1345 {
nickjillings@1370 1346 obj.input.value = obj.attribute;
nickjillings@1370 1347 }
nickjillings@1370 1348 return obj;
nickjillings@1370 1349 }
nickjillings@1370 1350
nickjillings@1370 1351 this.convert = function(root)
nickjillings@1370 1352 {
nickjillings@1370 1353 //Performs the actual conversion using the given root DOM as the root
nickjillings@1370 1354 this.injectDOM = root;
nickjillings@1370 1355
nickjillings@1373 1356 // Build the export button
nickjillings@1373 1357 var exportButton = document.createElement("button");
nickjillings@1373 1358 exportButton.textContent = "Export to XML";
nickjillings@1373 1359 exportButton.onclick = function()
nickjillings@1373 1360 {
nickjillings@1373 1361 var doc = specification.encode();
nickjillings@1373 1362 var obj = {};
nickjillings@1373 1363 obj.title = "Export";
nickjillings@1373 1364 obj.content = document.createElement("div");
nickjillings@1373 1365 obj.content.id = "finish";
nickjillings@1373 1366 var span = document.createElement("span");
n@2405 1367 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."
n@2405 1368 obj.content.appendChild(span);
n@2405 1369 span = document.createElement("p");
n@2405 1370 span.textContent = "NOTE FOR SAFARI! You cannot right click on the below link and save it as a file, Safari does not like that at all. Instead click on it to open the XML, the Press Cmd+S to open the save dialogue. Make sure you have 'save as Page Source' selected on the bottom of the window. Currently Safari has no plans to support the HTML 'download' attribute which causes this problem";
nickjillings@1373 1371 obj.content.appendChild(span);
nickjillings@1373 1372 var link = document.createElement("div");
n@2412 1373 link.appendChild(doc.firstChild);
nickjillings@1373 1374 var file = [link.innerHTML];
nickjillings@1373 1375 var bb = new Blob(file,{type : 'application/xml'});
nickjillings@1373 1376 var dnlk = window.URL.createObjectURL(bb);
nickjillings@1373 1377 var a = document.createElement("a");
nickjillings@1373 1378 a.hidden = '';
nickjillings@1373 1379 a.href = dnlk;
nickjillings@1373 1380 a.download = "project-specification.xml";
nickjillings@1373 1381 a.textContent = "Save File";
nickjillings@1373 1382 obj.content.appendChild(a);
nickjillings@1373 1383 popupObject.show();
nickjillings@1373 1384 popupObject.postNode(obj);
nickjillings@1373 1385 }
nickjillings@1373 1386 this.injectDOM.appendChild(exportButton);
nickjillings@1373 1387
nickjillings@1370 1388 // First perform the setupNode;
nickjillings@1370 1389 var setupSchema = specification.schema.getAllElementsByName('setup')[0];
nickjillings@2114 1390 this.setupDOM = new this.createGeneralNodeDOM('Global Configuration','setup',null);
nickjillings@1370 1391 this.injectDOM.appendChild(this.setupDOM.rootDOM);
nickjillings@1370 1392 var setupAttributes = setupSchema.getAllElementsByTagName('xs:attribute');
nickjillings@1370 1393 for (var i=0; i<setupAttributes.length; i++)
nickjillings@1370 1394 {
nickjillings@1370 1395 var attributeName = setupAttributes[i].getAttribute('name');
nickjillings@1370 1396 var attrObject = this.convertAttributeToDOM(specification,setupAttributes[i]);
nickjillings@1370 1397 this.setupDOM.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 1398 this.setupDOM.attributes.push(attrObject);
nickjillings@1370 1399 }
nickjillings@1370 1400
nickjillings@2179 1401 // Build the exit Text node
nickjillings@2179 1402 var exitText = new this.createGeneralNodeDOM("Exit Text","exit-test",this.setupDOM);
nickjillings@2179 1403 exitText.rootDOM.removeChild(exitText.attributeDOM);
nickjillings@2179 1404 this.setupDOM.children.push(exitText);
nickjillings@2179 1405 this.setupDOM.childrenDOM.appendChild(exitText.rootDOM);
nickjillings@2179 1406 var obj = {
nickjillings@2179 1407 rootDOM: document.createElement("div"),
nickjillings@2179 1408 labelDOM: document.createElement("label"),
nickjillings@2179 1409 inputDOM: document.createElement("textarea"),
nickjillings@2179 1410 parent: exitText,
nickjillings@2179 1411 specification: specification,
nickjillings@2179 1412 handleEvent: function(event) {
nickjillings@2179 1413 this.specification.exitText = this.inputDOM.value;
nickjillings@2179 1414 }
nickjillings@2179 1415 }
b@2367 1416 var exitWarning = document.createElement("div");
b@2367 1417 obj.rootDOM.appendChild(exitWarning);
b@2367 1418 exitWarning.textContent = "Only visible when the above 'On complete redirect URL' field is empty.";
nickjillings@2179 1419 obj.rootDOM.appendChild(obj.labelDOM);
nickjillings@2179 1420 obj.rootDOM.appendChild(obj.inputDOM);
nickjillings@2179 1421 obj.labelDOM.textContent = "Text: ";
nickjillings@2179 1422 obj.inputDOM.value = obj.specification.exitText;
nickjillings@2179 1423 obj.inputDOM.addEventListener("change",obj);
nickjillings@2179 1424 exitText.children.push(obj);
nickjillings@2179 1425 exitText.childrenDOM.appendChild(obj.rootDOM);
nickjillings@2179 1426
nickjillings@1370 1427 // Now we must build the interface Node
nickjillings@1370 1428 this.interfaceDOM = new this.interfaceNode(this,specification.interfaces);
nickjillings@1370 1429 this.interfaceDOM.build("Interface","setup-interface",this.setupDOM.rootDOM);
nickjillings@1370 1430
nickjillings@1370 1431 // Now build the Metrics selection node
nickjillings@2114 1432 var metric = this.createGeneralNodeDOM("Session Metrics","setup-metric",this.setupDOM);
nickjillings@1370 1433 metric.rootDOM.removeChild(metric.attributeDOM);
nickjillings@1370 1434 this.setupDOM.children.push(metric);
nickjillings@1370 1435 this.setupDOM.childrenDOM.appendChild(metric.rootDOM);
nickjillings@1370 1436 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1437 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 1438 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1439 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("metrics")[0];
nickjillings@1370 1440 testXML = testXML.getAllElementsByTagName("metrics");
nicholas@2390 1441 var interfaceXMLChild = interfaceXML.firstElementChild;
nicholas@2390 1442 while(interfaceXMLChild)
nickjillings@1370 1443 {
nickjillings@1370 1444 var obj = {
nickjillings@1370 1445 input: document.createElement('input'),
nickjillings@1370 1446 root: document.createElement('div'),
nickjillings@1370 1447 text: document.createElement('span'),
nickjillings@1370 1448 specification: specification.metrics.enabled,
nicholas@2390 1449 name: interfaceXMLChild.getAttribute("name"),
nickjillings@1370 1450 handleEvent: function()
nickjillings@1370 1451 {
nickjillings@1370 1452 for (var i=0; i<this.specification.length; i++)
nickjillings@1370 1453 {
nickjillings@1370 1454 if (this.specification[i] == this.name)
nickjillings@1370 1455 {
nickjillings@1370 1456 var options = this.specification;
nickjillings@1370 1457 if (this.input.checked == false) {
nickjillings@1370 1458 if (i == options.length)
nickjillings@1370 1459 {options = options.slice(0,i);}
nickjillings@1370 1460 else {
nickjillings@1370 1461 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 1462 }
nickjillings@1370 1463 } else {
nickjillings@1370 1464 return;
nickjillings@1370 1465 }
nickjillings@1370 1466 this.specification = options;
nickjillings@1370 1467 break;
nickjillings@1370 1468 }
nickjillings@1370 1469 }
nickjillings@1370 1470 if (this.input.checked) {
nickjillings@1370 1471 this.specification.push(this.name);
nickjillings@1370 1472 }
nickjillings@1370 1473 }
nickjillings@1370 1474 };
nickjillings@1370 1475 obj.root.className = "attribute";
nickjillings@1370 1476 obj.input.type = "checkbox";
nickjillings@1370 1477 obj.root.appendChild(obj.text);
nickjillings@1370 1478 obj.root.appendChild(obj.input);
nicholas@2390 1479 obj.text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
nickjillings@1370 1480 metric.children.push(obj);
nickjillings@1370 1481 metric.childrenDOM.appendChild(obj.root);
nickjillings@1314 1482 for (var j=0; j<specification.metrics.enabled.length; j++)
nickjillings@1370 1483 {
nickjillings@1314 1484 if (specification.metrics.enabled[j] == obj.name)
nickjillings@1370 1485 {
nickjillings@1370 1486 obj.input.checked = true;
nickjillings@1370 1487 break;
nickjillings@1370 1488 }
nickjillings@1370 1489 }
nicholas@2390 1490 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
nickjillings@1370 1491 }
nickjillings@1370 1492
nickjillings@1370 1493 // Now both before and after surveys
nickjillings@1370 1494 if (specification.preTest == undefined){
nickjillings@2194 1495 specification.preTest = new specification.surveyNode(specification);
nickjillings@1370 1496 specification.preTest.location = "pre";
nickjillings@1370 1497 }
nickjillings@1370 1498 if (specification.postTest == undefined){
nickjillings@2194 1499 specification.postTest = new specification.surveyNode(specification);
nickjillings@1370 1500 specification.postTest.location = "post";
nickjillings@1370 1501 }
nickjillings@1370 1502 var surveyBefore = new this.surveyNode(this,specification.preTest,"Pre");
nickjillings@1370 1503 var surveyAfter = new this.surveyNode(this,specification.postTest,"Post");
nickjillings@1370 1504 this.setupDOM.children.push(surveyBefore);
nickjillings@1370 1505 this.setupDOM.children.push(surveyAfter);
nickjillings@1370 1506 this.setupDOM.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 1507 this.setupDOM.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 1508
nickjillings@1370 1509 // Add in the page creator button
nickjillings@1370 1510 this.addPage = {
nickjillings@1370 1511 root: document.createElement("button"),
nickjillings@1370 1512 parent: this,
nickjillings@1370 1513 handleEvent: function()
nickjillings@1370 1514 {
nickjillings@2194 1515 var pageObj = new specification.page(specification);
nickjillings@1370 1516 specification.pages.push(pageObj);
nickjillings@1370 1517 var newPage = new this.parent.pageNode(this.parent,pageObj);
nicholas@2315 1518 document.getElementById("page-holder").appendChild(newPage.rootDOM);
nickjillings@1370 1519 this.parent.pages.push(newPage);
nickjillings@1370 1520 }
nickjillings@1370 1521 }
nickjillings@1370 1522 this.addPage.root.textContent = "Add Page";
nicholas@2315 1523 this.addPage.root.id = "new-page-button";
nicholas@2315 1524 this.addPage.root.style.float = "left";
nickjillings@1370 1525 this.addPage.root.addEventListener("click",this.addPage,false);
nicholas@2315 1526
nicholas@2315 1527 var pageHolder = document.createElement("div");
nicholas@2315 1528 pageHolder.id ="page-holder";
nicholas@2315 1529 this.injectDOM.appendChild(pageHolder);
nickjillings@1374 1530
nickjillings@1374 1531 // Build each page
nickjillings@1374 1532 for (var page of specification.pages)
nickjillings@1374 1533 {
nickjillings@1374 1534 var newPage = new this.pageNode(this,page);
nicholas@2315 1535 pageHolder.appendChild(newPage.rootDOM);
nickjillings@1374 1536 this.pages.push(newPage);
nickjillings@1374 1537 }
nicholas@2315 1538
nicholas@2315 1539 this.injectDOM.appendChild(this.addPage.root);
nickjillings@1370 1540 }
nickjillings@1370 1541
nickjillings@1370 1542 this.interfaceNode = function(parent,rootObject)
nickjillings@1370 1543 {
nickjillings@1375 1544 this.type = "interfaceNode";
nickjillings@1370 1545 this.rootDOM;
nickjillings@1370 1546 this.titleDOM;
nickjillings@1370 1547 this.attributeDOM;
nickjillings@1370 1548 this.attributes = [];
nickjillings@1370 1549 this.childrenDOM;
nickjillings@1370 1550 this.children = [];
nickjillings@1370 1551 this.buttonDOM;
nickjillings@1370 1552 this.parent = parent;
nickjillings@1370 1553 this.HTMLPoint;
nickjillings@1370 1554 this.specification = rootObject;
nickjillings@1370 1555 this.schema = specification.schema.getAllElementsByName("interface")[1];
nickjillings@1370 1556
nickjillings@1370 1557 this.createIOasAttr = function(name,specification,parent,type) {
nickjillings@1370 1558 this.root = document.createElement('div');
nickjillings@1370 1559 this.input = document.createElement("input");
nickjillings@1370 1560 this.name = name;
nickjillings@1370 1561 this.type = type;
nickjillings@1370 1562 this.parent = parent;
nickjillings@1370 1563 this.specification = specification;
nickjillings@1370 1564 this.handleEvent = function(event) {
nickjillings@1370 1565 for (var i=0; i<this.specification.options.length; i++)
nickjillings@1370 1566 {
nickjillings@1370 1567 if (this.specification.options[i].name == this.name)
nickjillings@1370 1568 {
nickjillings@1370 1569 var options = this.specification.options;
nickjillings@1370 1570 if (this.input.checked == false) {
nickjillings@1370 1571 if (i == options.length)
nickjillings@1370 1572 {options = options.slice(0,i);}
nickjillings@1370 1573 else {
nickjillings@1370 1574 options = options.slice(0,i).concat(options.slice(i+1));
nickjillings@1370 1575 }
nickjillings@1370 1576 } else {
nickjillings@1370 1577 return;
nickjillings@1370 1578 }
nickjillings@1370 1579 this.specification.options = options;
nickjillings@1370 1580 break;
nickjillings@1370 1581 }
nickjillings@1370 1582 }
nickjillings@1370 1583 if (this.input.checked) {
nickjillings@1370 1584 var obj = {
nickjillings@1370 1585 name: this.name,
nickjillings@1370 1586 type: this.type
nickjillings@1370 1587 };
nickjillings@1370 1588 this.specification.options.push(obj);
nickjillings@1370 1589 }
nickjillings@1370 1590 if (this.parent.HTMLPoint.id == "setup")
nickjillings@1370 1591 {
nickjillings@1370 1592 // We've changed a global setting, must update all child 'interfaces' and disable them
nickjillings@1370 1593 for (pages of convert.pages)
nickjillings@1370 1594 {
nickjillings@1370 1595 for (interface of pages.interfaces)
nickjillings@1370 1596 {
nickjillings@1370 1597 if (this.type == "check")
nickjillings@1370 1598 {
nickjillings@1370 1599 for (node of interface.children[0].attributes)
nickjillings@1370 1600 {
nickjillings@1370 1601 if (node.name == this.name) {
nickjillings@1370 1602 if (this.input.checked) {
nickjillings@1370 1603 node.input.disabled = true;
nickjillings@1370 1604 node.input.checked = false;
nickjillings@1370 1605 } else {
nickjillings@1370 1606 node.input.disabled = false;
nickjillings@1370 1607 }
nickjillings@1370 1608 break;
nickjillings@1370 1609 }
nickjillings@1370 1610 }
nickjillings@1370 1611 } else if (this.type == "show")
nickjillings@1370 1612 {
nickjillings@1370 1613 for (node of interface.children[1].attributes)
nickjillings@1370 1614 {
nickjillings@1370 1615 if (node.name == this.name) {
nickjillings@1370 1616 if (this.input.checked) {
nickjillings@1370 1617 node.input.disabled = true;
nickjillings@1370 1618 } else {
nickjillings@1370 1619 node.input.disabled = false;
nickjillings@1370 1620 }
nickjillings@1370 1621 break;
nickjillings@1370 1622 }
nickjillings@1370 1623 }
nickjillings@1370 1624 }
nickjillings@1370 1625 }
nickjillings@1370 1626 }
nickjillings@1370 1627 }
nickjillings@1370 1628 };
nickjillings@1370 1629 this.findIndex = function(element,index,array){
nickjillings@1370 1630 if (element.name == this.name)
nickjillings@1370 1631 return true;
nickjillings@1370 1632 else
nickjillings@1370 1633 return false;
nickjillings@1370 1634 };
nickjillings@1370 1635 this.findNode = function(element,index,array){
nickjillings@1370 1636 if (element.name == this.name)
nickjillings@1370 1637 return true;
nickjillings@1370 1638 else
nickjillings@1370 1639 return false;
nickjillings@1370 1640 };
nickjillings@1370 1641 this.input.type = "checkbox";
nickjillings@1370 1642 this.input.setAttribute("name",name);
nickjillings@1370 1643 this.input.addEventListener("change",this,false);
nickjillings@1370 1644 this.root.appendChild(this.input);
nickjillings@1370 1645 this.root.className = "attribute";
nickjillings@1370 1646 return this;
nickjillings@1370 1647 }
nickjillings@1370 1648
nickjillings@1370 1649 this.build = function(name,id,parent)
nickjillings@1370 1650 {
nickjillings@1370 1651 var obj = this.parent.createGeneralNodeDOM(name,id,parent);
nickjillings@1370 1652
nickjillings@1370 1653 this.rootDOM = obj.rootDOM;
nickjillings@1370 1654 this.titleDOM = obj.titleDOM;
nickjillings@1370 1655 this.attributeDOM = obj.attributeDOM;
nickjillings@1370 1656 this.childrenDOM = obj.childrenDOM;
nickjillings@1370 1657 this.buttonDOM = obj.buttonsDOM;
nickjillings@1370 1658 this.HTMLPoint = parent;
nickjillings@1370 1659 this.rootDOM.removeChild(this.attributeDOM);
nicholas@2243 1660 if (parent.id != "setup") {
nicholas@2243 1661 // Put in the <title> node:
nicholas@2243 1662 this.titleNode = {
nicholas@2243 1663 root: document.createElement("div"),
nicholas@2243 1664 label: document.createElement("span"),
nicholas@2243 1665 input: document.createElement("input"),
nicholas@2243 1666 parent: this,
nicholas@2243 1667 handleEvent: function(event) {
nicholas@2243 1668 this.parent.specification.title = event.currentTarget.value;
nicholas@2243 1669 }
nicholas@2243 1670 }
nicholas@2243 1671 this.titleNode.label.textContent = "Axis Title:";
nicholas@2243 1672 this.titleNode.root.className = "node-children";
nicholas@2243 1673 this.titleNode.root.appendChild(this.titleNode.label);
nicholas@2243 1674 this.titleNode.root.appendChild(this.titleNode.input);
nicholas@2243 1675 this.titleNode.input.addEventListener("change",this.titleNode,false);
nicholas@2243 1676 this.titleNode.input.value = this.specification.title;
nicholas@2243 1677 this.children.push(this.titleNode);
nicholas@2243 1678 this.childrenDOM.appendChild(this.titleNode.root);
nicholas@2243 1679 }
nicholas@2243 1680
nickjillings@1370 1681 // Put in the check / show options as individual children
nickjillings@1370 1682 var checks = this.parent.createGeneralNodeDOM("Checks","setup-interface-checks",this);
nickjillings@1370 1683
nickjillings@1370 1684 var interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1685 var checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1686 var testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1687 var interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("checks")[0];
nickjillings@1370 1688 testXML = testXML.getAllElementsByTagName("checks");
nicholas@2390 1689 var interfaceXMLChild = interfaceXML.firstElementChild;
nicholas@2390 1690 while (interfaceXMLChild)
nickjillings@1370 1691 {
nicholas@2390 1692 var obj = new this.createIOasAttr(interfaceXMLChild.getAttribute("name"),this.specification,this,"check");
nickjillings@1370 1693 for (var option of this.specification.options)
nickjillings@1370 1694 {
nickjillings@1370 1695 if (option.name == obj.name)
nickjillings@1370 1696 {
nickjillings@1370 1697 obj.input.checked = true;
nickjillings@1370 1698 break;
nickjillings@1370 1699 }
nickjillings@1370 1700 }
nickjillings@1370 1701 if (parent.id != "setup") {
nickjillings@1370 1702 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1381 1703 if (node != undefined) {
nickjillings@1381 1704 if (node.input.checked) {
nickjillings@1381 1705 obj.input.checked = false;
nickjillings@1381 1706 obj.input.disabled = true;
nickjillings@1381 1707 }
nickjillings@1370 1708 }
nickjillings@1370 1709 }
nickjillings@1370 1710 var text = document.createElement('span');
nicholas@2390 1711 text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
nickjillings@1370 1712 obj.root.appendChild(text);
nickjillings@1370 1713 checks.attributeDOM.appendChild(obj.root);
nickjillings@1370 1714 checks.attributes.push(obj);
nicholas@2390 1715 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
nickjillings@1370 1716 }
nickjillings@1370 1717 this.children.push(checks);
nickjillings@1370 1718 this.childrenDOM.appendChild(checks.rootDOM);
nickjillings@1370 1719
nickjillings@1370 1720 var show = this.parent.createGeneralNodeDOM("Show","setup-interface-show",this);
nickjillings@1370 1721 interfaceName = popupStateNodes.state[1].select.value;
nickjillings@1370 1722 checkText = interfaceSpecs.getElementsByTagName("global")[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1723 testXML = interfaceSpecs.getElementsByTagName("tests")[0].getAllElementsByName(interfaceName)[0];
nickjillings@1370 1724 interfaceXML = interfaceSpecs.getAllElementsByTagName("interfaces")[0].getAllElementsByName(testXML.getAttribute("interface"))[0].getAllElementsByTagName("show")[0];
nickjillings@1370 1725 testXML = testXML.getAllElementsByTagName("show");
nicholas@2390 1726 interfaceXMLChild = interfaceXML.firstElementChild;
nicholas@2390 1727 while(interfaceXMLChild)
nickjillings@1370 1728 {
nicholas@2390 1729 var obj = new this.createIOasAttr(interfaceXMLChild.getAttribute("name"),this.specification,this,"show");
nickjillings@1370 1730 for (var option of this.specification.options)
nickjillings@1370 1731 {
nickjillings@1370 1732 if (option.name == obj.name)
nickjillings@1370 1733 {
nickjillings@1370 1734 obj.input.checked = true;
nickjillings@1370 1735 break;
nickjillings@1370 1736 }
nickjillings@1370 1737 }
nickjillings@1370 1738 if (parent.id != "setup") {
nickjillings@1370 1739 var node = convert.interfaceDOM.children[0].attributes.find(obj.findNode,obj);
nickjillings@1381 1740 if (node != undefined) {
nickjillings@1381 1741 if (node.input.checked) {
nickjillings@1381 1742 obj.input.checked = false;
nickjillings@1381 1743 obj.input.disabled = true;
nickjillings@1381 1744 }
nickjillings@1370 1745 }
nickjillings@1370 1746 }
nickjillings@1370 1747 var text = document.createElement('span');
nicholas@2390 1748 text.textContent = checkText.getAllElementsByName(interfaceXMLChild.getAttribute("name"))[0].textContent;
nickjillings@1370 1749 obj.root.appendChild(text);
nickjillings@1370 1750 show.attributeDOM.appendChild(obj.root);
nickjillings@1370 1751 show.attributes.push(obj);
nicholas@2390 1752 interfaceXMLChild = interfaceXMLChild.nextElementSibling;
nickjillings@1370 1753 }
nickjillings@1370 1754 this.children.push(show);
nickjillings@1370 1755 this.childrenDOM.appendChild(show.rootDOM);
nickjillings@1370 1756
nickjillings@1370 1757 if (parent.id == "setup")
nickjillings@1370 1758 {
nickjillings@1370 1759 } else {
nickjillings@1370 1760 var nameAttr = this.parent.convertAttributeToDOM(this,specification.schema.getAllElementsByName("name")[0]);
nickjillings@1370 1761 this.attributeDOM.appendChild(nameAttr.holder);
nickjillings@1370 1762 this.attributes.push(nameAttr);
nickjillings@1385 1763 var scales = new this.scalesNode(this,this.specification);
nickjillings@1385 1764 this.children.push(scales);
nickjillings@1385 1765 this.childrenDOM.appendChild(scales.rootDOM);
nickjillings@1370 1766 }
nickjillings@1370 1767 if (parent != undefined)
nickjillings@1370 1768 {
nickjillings@1370 1769 parent.appendChild(this.rootDOM);
nickjillings@1370 1770 }
nickjillings@1370 1771 }
nickjillings@1385 1772
nickjillings@1385 1773 this.scalesNode = function(parent,rootObject)
nickjillings@1385 1774 {
nickjillings@1385 1775 this.type = "scalesNode";
nickjillings@1385 1776 this.rootDOM = document.createElement("div");
nickjillings@1385 1777 this.titleDOM = document.createElement("span");
nickjillings@1385 1778 this.attributeDOM = document.createElement("div");
nickjillings@1385 1779 this.attributes = [];
nickjillings@1385 1780 this.childrenDOM = document.createElement("div");
nickjillings@1385 1781 this.children = [];
nickjillings@1385 1782 this.buttonDOM = document.createElement("div");
nickjillings@1385 1783 this.parent = parent;
nickjillings@1385 1784 this.specification = rootObject;
nickjillings@1385 1785 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1385 1786 this.rootDOM.className = "node";
nickjillings@1385 1787
nickjillings@1385 1788 var titleDiv = document.createElement('div');
nickjillings@1385 1789 titleDiv.className = "node-title";
nickjillings@1385 1790 this.titleDOM.className = "node-title";
nickjillings@1385 1791 this.titleDOM.textContent = "Interface Scales";
nickjillings@1385 1792 titleDiv.appendChild(this.titleDOM);
nickjillings@1385 1793
nickjillings@1385 1794 this.attributeDOM.className = "node-attributes";
nickjillings@1385 1795 this.childrenDOM.className = "node-children";
nickjillings@1385 1796 this.buttonDOM.className = "node-buttons";
nickjillings@1385 1797
nickjillings@1385 1798 this.rootDOM.appendChild(titleDiv);
nickjillings@1385 1799 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1385 1800 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1385 1801 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1385 1802
nickjillings@1385 1803 this.editButton = {
nickjillings@1385 1804 button: document.createElement("button"),
nickjillings@1385 1805 parent: this,
nickjillings@1385 1806 handleEvent: function(event) {
nickjillings@1385 1807 popupObject.show();
nickjillings@1385 1808 popupObject.postNode(popupStateNodes.state[6]);
nickjillings@1385 1809 popupStateNodes.state[6].generate(this.parent.specification,this.parent);
nickjillings@1385 1810 }
nickjillings@1385 1811 };
nickjillings@1385 1812 this.editButton.button.textContent = "Edit Scales/Markers";
nickjillings@1385 1813 this.editButton.button.addEventListener("click",this.editButton,false);
nickjillings@1385 1814 this.buttonDOM.appendChild(this.editButton.button);
nickjillings@1385 1815 }
nickjillings@1370 1816 }
nickjillings@1370 1817
nickjillings@1370 1818 this.surveyNode = function(parent,rootObject,location)
nickjillings@1370 1819 {
nickjillings@1375 1820 this.type = "surveyNode";
nickjillings@1370 1821 this.rootDOM = document.createElement("div");
nickjillings@1370 1822 this.titleDOM = document.createElement("span");
nickjillings@1370 1823 this.attributeDOM = document.createElement("div");
nickjillings@1370 1824 this.attributes = [];
nickjillings@1370 1825 this.childrenDOM = document.createElement("div");
nickjillings@1370 1826 this.children = [];
nickjillings@1370 1827 this.buttonDOM = document.createElement("div");
nickjillings@1370 1828 this.parent = parent;
nickjillings@1370 1829 this.specification = rootObject;
nickjillings@1370 1830 this.schema = specification.schema.getAllElementsByName("survey")[1];
nickjillings@1370 1831 this.rootDOM.className = "node";
nickjillings@1370 1832
nickjillings@1370 1833 var titleDiv = document.createElement('div');
nickjillings@1370 1834 titleDiv.className = "node-title";
nickjillings@1370 1835 this.titleDOM.className = "node-title";
nickjillings@1370 1836 this.titleDOM.textContent = "Survey";
nickjillings@1370 1837 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1838
nickjillings@1370 1839 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1840 var locationAttr = document.createElement("span");
nickjillings@1370 1841 this.attributeDOM.appendChild(locationAttr);
nickjillings@1370 1842 if (location == "Pre" || location == "pre") {
nickjillings@1370 1843 locationAttr.textContent = "Location: Before";
nickjillings@1370 1844 } else {
nickjillings@1370 1845 locationAttr.textContent = "Location: After";
nickjillings@1370 1846 }
nickjillings@1370 1847 this.childrenDOM.className = "node-children";
nickjillings@1370 1848 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1849
nickjillings@1370 1850 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1851 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1852 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1853 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1854
nickjillings@1370 1855 this.surveyEntryNode = function(parent,rootObject)
nickjillings@1370 1856 {
nickjillings@1375 1857 this.type = "surveyEntryNode";
nickjillings@1370 1858 this.rootDOM = document.createElement("div");
nickjillings@1370 1859 this.titleDOM = document.createElement("span");
nickjillings@1370 1860 this.attributeDOM = document.createElement("div");
nickjillings@1370 1861 this.attributes = [];
nickjillings@1370 1862 this.childrenDOM = document.createElement("div");
nickjillings@1370 1863 this.children = [];
nickjillings@1370 1864 this.buttonDOM = document.createElement("div");
nickjillings@1370 1865 this.parent = parent;
nickjillings@1370 1866 this.specification = rootObject;
nickjillings@1370 1867 this.schema = specification.schema.getAllElementsByName("surveyentry")[1];
nickjillings@1370 1868
nickjillings@1370 1869 this.rootDOM.className = "node";
nickjillings@1370 1870 this.rootDOM.style.minWidth = "50%";
nickjillings@1370 1871
nickjillings@1370 1872 var titleDiv = document.createElement('div');
nickjillings@1370 1873 titleDiv.className = "node-title";
nickjillings@1370 1874 this.titleDOM.className = "node-title";
nickjillings@1370 1875 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 1876
nickjillings@1370 1877 this.attributeDOM.className = "node-attributes";
nickjillings@1370 1878 this.childrenDOM.className = "node-children";
nickjillings@1370 1879 this.buttonDOM.className = "node-buttons";
nickjillings@1370 1880
nickjillings@1370 1881 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 1882 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 1883 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 1884 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 1885
nickjillings@1375 1886 this.build = function()
nickjillings@1375 1887 {
nickjillings@1375 1888 this.attributeDOM.innerHTML = null;
nickjillings@1375 1889 this.childrenDOM.innerHTML = null;
nickjillings@1375 1890 var statementRoot = document.createElement("div");
nickjillings@1375 1891 var statement = document.createElement("span");
nickjillings@1375 1892 statement.textContent = "Statement / Question: "+this.specification.statement;
nickjillings@1375 1893 statementRoot.appendChild(statement);
nickjillings@1375 1894 this.children.push(statementRoot);
nickjillings@1375 1895 this.childrenDOM.appendChild(statementRoot);
nickjillings@1375 1896 switch(this.specification.type)
nickjillings@1375 1897 {
nickjillings@1375 1898 case "statement":
nickjillings@1375 1899 this.titleDOM.textContent = "Statement";
nickjillings@1375 1900 break;
nickjillings@1375 1901 case "question":
nickjillings@1375 1902 this.titleDOM.textContent = "Question";
nickjillings@1375 1903 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1375 1904 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
nickjillings@1375 1905 var boxsize = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("boxsize")[0]);
nickjillings@1375 1906 this.attributeDOM.appendChild(id.holder);
nickjillings@1375 1907 this.attributes.push(id);
nickjillings@1375 1908 this.attributeDOM.appendChild(mandatory.holder);
nickjillings@1375 1909 this.attributes.push(mandatory);
nickjillings@1375 1910 this.attributeDOM.appendChild(boxsize.holder);
nickjillings@1375 1911 this.attributes.push(boxsize);
nickjillings@1375 1912 break;
nickjillings@1375 1913 case "number":
nickjillings@1375 1914 this.titleDOM.textContent = "Number";
nickjillings@1375 1915 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1375 1916 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
nickjillings@1375 1917 var min = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("min")[0]);
nickjillings@1375 1918 var max = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("max")[0]);
nickjillings@1375 1919 this.attributeDOM.appendChild(id.holder);
nickjillings@1375 1920 this.attributes.push(id);
nicholas@2562 1921 this.attributeDOM.appendChild(mandatory.holder);
nicholas@2562 1922 this.attributes.push(mandatory);
nickjillings@1375 1923 this.attributeDOM.appendChild(min.holder);
nickjillings@1375 1924 this.attributes.push(min);
nickjillings@1375 1925 this.attributeDOM.appendChild(max.holder);
nickjillings@1375 1926 this.attributes.push(max);
nickjillings@1375 1927 break;
nickjillings@1375 1928 case "checkbox":
nickjillings@1375 1929 this.titleDOM.textContent = "Checkbox";
nickjillings@1375 1930 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1375 1931 this.attributeDOM.appendChild(id.holder);
nickjillings@1375 1932 this.attributes.push(id);
nickjillings@1375 1933 break;
nickjillings@1375 1934 case "radio":
nickjillings@1375 1935 this.titleDOM.textContent = "Radio";
nickjillings@1375 1936 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nickjillings@1375 1937 this.attributeDOM.appendChild(id.holder);
nickjillings@1375 1938 this.attributes.push(id);
nickjillings@1375 1939 break;
nicholas@2562 1940 case "video":
nicholas@2562 1941 this.titleDOM.textContent = "Video";
nicholas@2562 1942 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nicholas@2562 1943 this.attributeDOM.appendChild(id.holder);
nicholas@2562 1944 this.attributes.push(id);
nicholas@2562 1945 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
nicholas@2562 1946 var url = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("url")[0]);
nicholas@2562 1947 this.attributeDOM.appendChild(mandatory.holder);
nicholas@2562 1948 this.attributes.push(mandatory);
nicholas@2562 1949 this.attributeDOM.appendChild(url.holder);
nicholas@2562 1950 this.attributes.push(url);
nicholas@2562 1951 break;
nicholas@2562 1952 case "youtube":
nicholas@2562 1953 this.titleDOM.textContent = "YouTube";
nicholas@2562 1954 var id = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("id")[0]);
nicholas@2562 1955 this.attributeDOM.appendChild(id.holder);
nicholas@2562 1956 this.attributes.push(id);
nicholas@2562 1957 var mandatory = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("mandatory")[0]);
nicholas@2562 1958 var url = convert.convertAttributeToDOM(this.specification,specification.schema.getAllElementsByName("url")[0]);
nicholas@2562 1959 this.attributeDOM.appendChild(mandatory.holder);
nicholas@2562 1960 this.attributes.push(mandatory);
nicholas@2562 1961 this.attributeDOM.appendChild(url.holder);
nicholas@2562 1962 this.attributes.push(url);
nicholas@2562 1963 break;
nickjillings@1375 1964 }
nickjillings@1370 1965 }
nickjillings@1375 1966 this.build();
nickjillings@1370 1967
nickjillings@1370 1968 this.editNode = {
nickjillings@1370 1969 root: document.createElement("button"),
nickjillings@1370 1970 parent: this,
nickjillings@1370 1971 handleEvent: function()
nickjillings@1370 1972 {
nickjillings@1370 1973 popupObject.show();
nickjillings@1375 1974 popupStateNodes.state[5].generate(this.parent.specification,this.parent);
nickjillings@1370 1975 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 1976 }
nickjillings@1370 1977 }
nickjillings@1370 1978 this.editNode.root.textContent = "Edit Entry";
nickjillings@1370 1979 this.editNode.root.addEventListener("click",this.editNode,false);
nickjillings@1370 1980 this.buttonDOM.appendChild(this.editNode.root);
nickjillings@1370 1981
nickjillings@1370 1982 this.deleteNode = {
nickjillings@1370 1983 root: document.createElement("button"),
nickjillings@1370 1984 parent: this,
nickjillings@1370 1985 handleEvent: function()
nickjillings@1370 1986 {
nickjillings@1370 1987 var optionList = this.parent.parent.specification.options;
nickjillings@1370 1988 var childList = this.parent.parent.children;
nickjillings@1370 1989 for (var i=0; i <this.parent.parent.specification.options.length; i++)
nickjillings@1370 1990 {
nickjillings@1370 1991 var option = this.parent.parent.specification.options[i];
nickjillings@1370 1992 if (option == this.parent.specification)
nickjillings@1370 1993 {
nickjillings@1370 1994 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 1995 if (i == this.parent.parent.specification.options.length-1)
nickjillings@1370 1996 {
nickjillings@1370 1997 optionList = optionList.slice(0,i);
nickjillings@1370 1998 childList = childList.slice(0,i);
nickjillings@1370 1999 }
nickjillings@1370 2000 else {
nickjillings@1370 2001 optionList = optionList.slice(0,i).concat(optionList.slice(i+1));
nickjillings@1370 2002 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 2003 }
nickjillings@1370 2004 this.parent.parent.specification.options = optionList;
nickjillings@1370 2005 this.parent.parent.children = childList;
nickjillings@1370 2006 }
nickjillings@1370 2007 }
nickjillings@1370 2008 }
nickjillings@1370 2009 }
nickjillings@1370 2010 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 2011 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 2012 this.buttonDOM.appendChild(this.deleteNode.root);
n@2414 2013
n@2416 2014 this.moveToPosition = function(new_index){
n@2416 2015 new_index = Math.min(new_index,this.parent.children.length);
n@2416 2016 var curr_index = this.parent.children.findIndex(function(elem){
n@2416 2017 if (elem == this) {return true;} else {return false;}
n@2416 2018 },this);
n@2416 2019 // Split at the current location to remove the node and shift all the children up
n@2416 2020 var tail = this.parent.children.splice(curr_index+1);
n@2416 2021 this.parent.children.pop();
n@2416 2022 this.parent.children = this.parent.children.concat(tail);
n@2416 2023
n@2416 2024 //Split at the new location and insert the node
n@2416 2025 tail = this.parent.children.splice(new_index);
n@2416 2026 this.parent.children.push(this);
n@2416 2027 this.parent.children = this.parent.children.concat(tail);
n@2416 2028
n@2416 2029 // Re-build the specification
n@2416 2030 this.parent.specification.options = [];
n@2416 2031 this.parent.childrenDOM.innerHTML = "";
n@2416 2032 for (var obj of this.parent.children) {
n@2416 2033 this.parent.specification.options.push(obj.specification);
n@2416 2034 this.parent.childrenDOM.appendChild(obj.rootDOM);
n@2416 2035 }
n@2420 2036 this.parent.children.forEach(function(obj,index){
n@2420 2037 obj.moveButtons.disable(index);
n@2420 2038 });
n@2414 2039 }
n@2420 2040
n@2420 2041 this.moveButtons = {
n@2420 2042 root_up: document.createElement("button"),
n@2420 2043 root_down: document.createElement("button"),
n@2420 2044 parent: this,
n@2420 2045 handleEvent: function(event) {
n@2420 2046 var index = this.parent.parent.children.indexOf(this.parent);
n@2420 2047 if (event.currentTarget.getAttribute("direction") == "up") {
n@2420 2048 index = Math.max(index-1,0);
n@2420 2049 } else if (event.currentTarget.getAttribute("direction") == "down") {
n@2420 2050 index = Math.min(index+1,this.parent.parent.children.length-1);
n@2420 2051 }
n@2420 2052 this.parent.moveToPosition(index);
n@2420 2053 this.disable(index);
n@2420 2054 },
n@2420 2055 disable: function(index) {
n@2420 2056 if (index == 0) {
n@2420 2057 this.root_up.disabled = true;
n@2420 2058 } else {
n@2420 2059 this.root_up.disabled = false;
n@2420 2060 }
n@2420 2061 if (index == this.parent.parent.children.length-1) {
n@2420 2062 this.root_down.disabled = true;
n@2420 2063 } else {
n@2420 2064 this.root_down.disabled = false;
n@2420 2065 }
n@2420 2066 }
n@2420 2067 }
n@2420 2068 this.moveButtons.root_up.setAttribute("direction","up");
n@2420 2069 this.moveButtons.root_down.setAttribute("direction","down");
n@2420 2070 this.moveButtons.root_up.addEventListener("click",this.moveButtons,false);
n@2420 2071 this.moveButtons.root_down.addEventListener("click",this.moveButtons,false);
n@2420 2072 this.moveButtons.root_up.textContent = "Move Up";
n@2420 2073 this.moveButtons.root_down.textContent = "Move Down";
n@2420 2074 this.buttonDOM.appendChild(this.moveButtons.root_up);
n@2420 2075 this.buttonDOM.appendChild(this.moveButtons.root_down);
nickjillings@1370 2076 }
nickjillings@1370 2077 this.addNode = {
nickjillings@1370 2078 root: document.createElement("button"),
nickjillings@1370 2079 parent: this,
nickjillings@1370 2080 handleEvent: function()
nickjillings@1370 2081 {
nickjillings@2194 2082 var newNode = new this.parent.specification.OptionNode(this.parent.specification);
nickjillings@1370 2083 this.parent.specification.options.push(newNode);
nickjillings@1370 2084 popupObject.show();
nickjillings@1370 2085 popupStateNodes.state[5].generate(newNode,this.parent);
nickjillings@1370 2086 popupObject.postNode(popupStateNodes.state[5]);
nickjillings@1370 2087 }
nickjillings@1370 2088 }
nickjillings@1370 2089 this.addNode.root.textContent = "Add Survey Entry";
nickjillings@1370 2090 this.addNode.root.addEventListener("click",this.addNode,false);
nickjillings@1370 2091 this.buttonDOM.appendChild(this.addNode.root);
nickjillings@1370 2092
nickjillings@1370 2093 for (var option of this.specification.options)
nickjillings@1370 2094 {
nickjillings@1370 2095 var newNode = new this.surveyEntryNode(this,option);
nickjillings@1370 2096 this.children.push(newNode);
nickjillings@1370 2097 this.childrenDOM.appendChild(newNode.rootDOM);
nickjillings@1370 2098 }
n@2420 2099
n@2420 2100 this.children.forEach(function(obj,index){
n@2420 2101 obj.moveButtons.disable(index);
n@2420 2102 });
nickjillings@1370 2103 }
nickjillings@1370 2104
nickjillings@1370 2105 this.pageNode = function(parent,rootObject)
nickjillings@1370 2106 {
nickjillings@1375 2107 this.type = "pageNode";
nickjillings@1370 2108 this.rootDOM = document.createElement("div");
nickjillings@1370 2109 this.titleDOM = document.createElement("span");
nickjillings@1370 2110 this.attributeDOM = document.createElement("div");
nickjillings@1370 2111 this.attributes = [];
nickjillings@1370 2112 this.childrenDOM = document.createElement("div");
nickjillings@1370 2113 this.children = [];
nickjillings@1370 2114 this.buttonDOM = document.createElement("div");
nickjillings@1370 2115 this.parent = parent;
nickjillings@1370 2116 this.specification = rootObject;
nickjillings@1370 2117 this.schema = specification.schema.getAllElementsByName("page")[0];
nickjillings@1370 2118 this.rootDOM.className = "node";
nickjillings@1370 2119
nickjillings@1370 2120 var titleDiv = document.createElement('div');
nickjillings@1370 2121 titleDiv.className = "node-title";
nickjillings@1370 2122 this.titleDOM.className = "node-title";
nickjillings@1370 2123 this.titleDOM.textContent = "Test Page";
nickjillings@1370 2124 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 2125
nickjillings@1370 2126 this.attributeDOM.className = "node-attributes";
nickjillings@1370 2127 this.childrenDOM.className = "node-children";
nickjillings@1370 2128 this.buttonDOM.className = "node-buttons";
nickjillings@1370 2129
nickjillings@1370 2130 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 2131 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 2132 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 2133 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 2134
nickjillings@1370 2135 // Do the comment prefix node
nickjillings@1370 2136 var cpn = this.parent.createGeneralNodeDOM("Comment Prefix",""+this.specification.id+"-commentprefix",this.parent);
nickjillings@1370 2137 cpn.rootDOM.removeChild(cpn.attributeDOM);
nickjillings@1370 2138 var obj = {
nickjillings@1370 2139 root: document.createElement("div"),
nickjillings@1370 2140 input: document.createElement("input"),
nickjillings@1370 2141 parent: this,
nickjillings@1370 2142 handleEvent: function()
nickjillings@1370 2143 {
nickjillings@1370 2144 this.parent.specification.commentBoxPrefix = event.currentTarget.value;
nickjillings@1370 2145 }
nickjillings@1370 2146 }
nickjillings@1370 2147 cpn.children.push(obj);
nickjillings@1370 2148 cpn.childrenDOM.appendChild(obj.root);
nickjillings@1370 2149 obj.root.appendChild(obj.input);
nickjillings@1370 2150 obj.input.addEventListener("change",obj,false);
nickjillings@1370 2151 obj.input.value = this.specification.commentBoxPrefix;
nickjillings@1370 2152 this.childrenDOM.appendChild(cpn.rootDOM);
nickjillings@1370 2153 this.children.push(cpn);
nickjillings@1370 2154
nickjillings@1370 2155 // Now both before and after surveys
nickjillings@1370 2156 if (this.specification.preTest == undefined){
nickjillings@2194 2157 this.specification.preTest = new specification.surveyNode(specification);
nickjillings@1370 2158 this.specification.preTest.location = "pre";
nickjillings@1370 2159 }
nickjillings@1370 2160 if (this.specification.postTest == undefined){
nickjillings@2194 2161 this.specification.postTest = new specification.surveyNode(specification);
nickjillings@1370 2162 this.specification.postTest.location = "post";
nickjillings@1370 2163 }
nickjillings@1370 2164 var surveyBefore = new this.parent.surveyNode(this,this.specification.preTest,"Pre");
nickjillings@1370 2165 var surveyAfter = new this.parent.surveyNode(this,this.specification.postTest,"Post");
nickjillings@1370 2166 this.children.push(surveyBefore);
nickjillings@1370 2167 this.children.push(surveyAfter);
nickjillings@1370 2168 this.childrenDOM.appendChild(surveyBefore.rootDOM);
nickjillings@1370 2169 this.childrenDOM.appendChild(surveyAfter.rootDOM);
nickjillings@1370 2170
nickjillings@1370 2171 // Build the attributes
nickjillings@1370 2172 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 2173 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 2174 {
nickjillings@1370 2175 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 2176 var attrObject = this.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 2177 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 2178 this.attributes.push(attrObject);
nickjillings@1370 2179 }
nickjillings@1370 2180
nickjillings@1370 2181 this.interfaces = [];
nickjillings@1370 2182
n@2421 2183 this.getAudioElements = function() {
n@2421 2184 var array = [];
n@2421 2185 for (var i=0; i<this.children.length; i++) {
n@2421 2186 if (this.children[i].type == "audioElementNode") {
n@2421 2187 array[array.length] = this.children[i];
n@2421 2188 }
n@2421 2189 }
n@2421 2190 return array;
n@2421 2191 }
n@2421 2192
n@2421 2193 this.redrawChildren = function() {
n@2421 2194 this.childrenDOM.innerHTML = "";
n@2421 2195 for(var child of this.children) {
n@2421 2196 this.childrenDOM.appendChild(child.rootDOM);
n@2421 2197 }
n@2421 2198 }
n@2421 2199
nickjillings@1370 2200 this.audioElementNode = function(parent,rootObject)
nickjillings@1370 2201 {
nickjillings@1375 2202 this.type = "audioElementNode";
nickjillings@1370 2203 this.rootDOM = document.createElement("div");
nickjillings@1370 2204 this.titleDOM = document.createElement("span");
nickjillings@1370 2205 this.attributeDOM = document.createElement("div");
nickjillings@1370 2206 this.attributes = [];
nickjillings@1370 2207 this.childrenDOM = document.createElement("div");
nickjillings@1370 2208 this.children = [];
nickjillings@1370 2209 this.buttonDOM = document.createElement("div");
nickjillings@1370 2210 this.parent = parent;
nickjillings@1370 2211 this.specification = rootObject;
nickjillings@1370 2212 this.schema = specification.schema.getAllElementsByName("audioelement")[0];
nickjillings@1370 2213 this.rootDOM.className = "node";
nickjillings@1370 2214
nickjillings@1370 2215 var titleDiv = document.createElement('div');
nickjillings@1370 2216 titleDiv.className = "node-title";
nickjillings@1370 2217 this.titleDOM.className = "node-title";
nickjillings@1370 2218 this.titleDOM.textContent = "Audio Element";
nickjillings@1370 2219 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 2220
nickjillings@1370 2221 this.attributeDOM.className = "node-attributes";
nickjillings@1370 2222 this.childrenDOM.className = "node-children";
nickjillings@1370 2223 this.buttonDOM.className = "node-buttons";
nickjillings@1370 2224
nickjillings@1370 2225 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 2226 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 2227 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 2228 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 2229
nickjillings@1370 2230 // Build the attributes
nickjillings@1370 2231 var attributeList = this.schema.getAllElementsByTagName("xs:attribute");
nickjillings@1370 2232 for (var i=0; i<attributeList.length; i++)
nickjillings@1370 2233 {
nickjillings@1370 2234 var attributeName = attributeList[i].getAttribute('name');
nickjillings@1370 2235 var attrObject = this.parent.parent.convertAttributeToDOM(rootObject,attributeList[i]);
nickjillings@1370 2236 this.attributeDOM.appendChild(attrObject.holder);
nickjillings@1370 2237 this.attributes.push(attrObject);
nickjillings@1370 2238 }
nickjillings@1370 2239
nickjillings@1370 2240 this.deleteNode = {
nickjillings@1370 2241 root: document.createElement("button"),
nickjillings@1370 2242 parent: this,
nickjillings@1370 2243 handleEvent: function()
nickjillings@1370 2244 {
nickjillings@1370 2245 var i = this.parent.parent.specification.audioElements.findIndex(this.findNode,this);
nickjillings@1370 2246 if (i >= 0) {
nickjillings@1370 2247 var aeList = this.parent.parent.specification.audioElements;
nickjillings@1370 2248 if (i < aeList.length-1) {
nickjillings@1370 2249 aeList = aeList.slice(0,i).concat(aeList.slice(i+1));
nickjillings@1370 2250 } else {
nickjillings@1370 2251 aeList = aeList.slice(0,i);
nickjillings@1370 2252 }
nickjillings@1370 2253 }
nickjillings@1370 2254 i = this.parent.parent.children.findIndex(function(element,index,array){
nickjillings@1370 2255 if (element == this.parent)
nickjillings@1370 2256 return true;
nickjillings@1370 2257 else
nickjillings@1370 2258 return false;
nickjillings@1370 2259 },this);
nickjillings@1370 2260 if (i >= 0) {
nickjillings@1370 2261 var childList = this.parent.children;
nickjillings@1370 2262 if (i < aeList.length-1) {
nickjillings@1370 2263 childList = childList.slice(0,i).concat(childList.slice(i+1));
nickjillings@1370 2264 } else {
nickjillings@1370 2265 childList = childList.slice(0,i);
nickjillings@1370 2266 }
nickjillings@1370 2267 this.parent.parent.childrenDOM.removeChild(this.parent.rootDOM);
nickjillings@1370 2268 }
nickjillings@1370 2269 },
nickjillings@1370 2270 findNode: function(element,index,array){
nickjillings@1370 2271 if (element == this.parent.specification)
nickjillings@1370 2272 return true;
nickjillings@1370 2273 else
nickjillings@1370 2274 return false;
nickjillings@1370 2275 }
nickjillings@1370 2276 }
nickjillings@1370 2277 this.deleteNode.root.textContent = "Delete Entry";
nickjillings@1370 2278 this.deleteNode.root.addEventListener("click",this.deleteNode,false);
nickjillings@1370 2279 this.buttonDOM.appendChild(this.deleteNode.root);
n@2421 2280
n@2421 2281 this.moveButtons = {
n@2421 2282 root_up: document.createElement("button"),
n@2421 2283 root_down: document.createElement("button"),
n@2421 2284 parent: this,
n@2421 2285 handleEvent: function(event) {
n@2421 2286 var index = this.parent.parent.getAudioElements().indexOf(this.parent);
n@2421 2287 if (event.currentTarget.getAttribute("direction") == "up") {
n@2421 2288 index = Math.max(index-1,0);
n@2421 2289 } else if (event.currentTarget.getAttribute("direction") == "down") {
n@2421 2290 index = Math.min(index+1,this.parent.parent.getAudioElements().length-1);
n@2421 2291 }
n@2421 2292 this.parent.moveToPosition(index);
n@2421 2293 this.disable(index);
n@2421 2294 },
n@2421 2295 disable: function(index) {
n@2421 2296 if (index == 0) {
n@2421 2297 this.root_up.disabled = true;
n@2421 2298 } else {
n@2421 2299 this.root_up.disabled = false;
n@2421 2300 }
n@2421 2301 if (index == this.parent.parent.getAudioElements().length-1) {
n@2421 2302 this.root_down.disabled = true;
n@2421 2303 } else {
n@2421 2304 this.root_down.disabled = false;
n@2421 2305 }
n@2421 2306 }
n@2421 2307 }
n@2421 2308 this.moveButtons.root_up.setAttribute("direction","up");
n@2421 2309 this.moveButtons.root_down.setAttribute("direction","down");
n@2421 2310 this.moveButtons.root_up.addEventListener("click",this.moveButtons,false);
n@2421 2311 this.moveButtons.root_down.addEventListener("click",this.moveButtons,false);
n@2421 2312 this.moveButtons.root_up.textContent = "Move Up";
n@2421 2313 this.moveButtons.root_down.textContent = "Move Down";
n@2421 2314 this.buttonDOM.appendChild(this.moveButtons.root_up);
n@2421 2315 this.buttonDOM.appendChild(this.moveButtons.root_down);
n@2421 2316
n@2421 2317 this.moveToPosition = function(new_index) {
n@2421 2318
n@2421 2319 // Get the zero-th Object
n@2421 2320 var zero_object = this.parent.getAudioElements()[0];
n@2421 2321 var parent_children_root_index = this.parent.children.indexOf(zero_object);
n@2421 2322 // splice out the array for processing
n@2421 2323 var process_array = this.parent.children.splice(parent_children_root_index);
n@2421 2324
n@2421 2325
n@2421 2326 new_index = Math.min(new_index, process_array.length);
n@2421 2327 var curr_index = process_array.findIndex(function(elem){
n@2421 2328 if (elem == this) {return true;} else {return false;}
n@2421 2329 },this);
n@2421 2330
n@2421 2331 // Split at the current location to remove the node and shift all the children up
n@2421 2332 var tail = process_array.splice(curr_index+1);
n@2421 2333 process_array.pop();
n@2421 2334 process_array = process_array.concat(tail);
n@2421 2335
n@2421 2336 //Split at the new location and insert the node
n@2421 2337 tail = process_array.splice(new_index);
n@2421 2338 process_array.push(this);
n@2421 2339 process_array = process_array.concat(tail);
n@2421 2340
n@2421 2341 // Re-attach to the parent.children
n@2421 2342 this.parent.children = this.parent.children.concat(process_array);
n@2421 2343
n@2421 2344 // Re-build the specification
n@2421 2345 this.parent.specification.audioElements = [];
n@2421 2346 for (var obj of process_array) {
n@2421 2347 this.parent.specification.audioElements.push(obj.specification);
n@2421 2348 }
n@2421 2349 this.parent.redrawChildren();
n@2421 2350
n@2421 2351 process_array.forEach(function(obj,index){
n@2421 2352 obj.moveButtons.disable(index);
n@2421 2353 });
n@2421 2354
n@2421 2355 }
nickjillings@1370 2356 }
nickjillings@1370 2357
nickjillings@1370 2358 this.commentQuestionNode = function(parent,rootObject)
nickjillings@1370 2359 {
nickjillings@1375 2360 this.type = "commentQuestionNode";
nickjillings@1370 2361 this.rootDOM = document.createElement("div");
nickjillings@1370 2362 this.titleDOM = document.createElement("span");
nickjillings@1370 2363 this.attributeDOM = document.createElement("div");
nickjillings@1370 2364 this.attributes = [];
nickjillings@1370 2365 this.childrenDOM = document.createElement("div");
nickjillings@1370 2366 this.children = [];
nickjillings@1370 2367 this.buttonDOM = document.createElement("div");
nickjillings@1370 2368 this.parent = parent;
nickjillings@1370 2369 this.specification = rootObject;
nickjillings@1370 2370 this.schema = specification.schema.getAllElementsByName("page")[0];
n@2421 2371 this.rootDOM.className = "node audio-element";
nickjillings@1370 2372
nickjillings@1370 2373 var titleDiv = document.createElement('div');
nickjillings@1370 2374 titleDiv.className = "node-title";
nickjillings@1370 2375 this.titleDOM.className = "node-title";
nickjillings@1370 2376 this.titleDOM.textContent = "Test Page";
nickjillings@1370 2377 titleDiv.appendChild(this.titleDOM);
nickjillings@1370 2378
nickjillings@1370 2379 this.attributeDOM.className = "node-attributes";
nickjillings@1370 2380 this.childrenDOM.className = "node-children";
nickjillings@1370 2381 this.buttonDOM.className = "node-buttons";
nickjillings@1370 2382
nickjillings@1370 2383 this.rootDOM.appendChild(titleDiv);
nickjillings@1370 2384 this.rootDOM.appendChild(this.attributeDOM);
nickjillings@1370 2385 this.rootDOM.appendChild(this.childrenDOM);
nickjillings@1370 2386 this.rootDOM.appendChild(this.buttonDOM);
nickjillings@1370 2387
nickjillings@1370 2388 }
nickjillings@1370 2389
nickjillings@1374 2390 // Build the components
nickjillings@1310 2391 if (this.specification.interfaces.length == 0) {
nickjillings@2194 2392 this.specification.interfaces.push(new specification.interfaceNode(specification));
nickjillings@1310 2393 }
nickjillings@1381 2394 for (var interfaceObj of this.specification.interfaces)
nickjillings@1381 2395 {
nickjillings@1381 2396 var newInterface = new this.parent.interfaceNode(this.parent,interfaceObj);
nickjillings@1381 2397 newInterface.build("Interface",""+this.specification.id+"-interface",this.childrenDOM);
nickjillings@1381 2398 this.children.push(newInterface);
nickjillings@1381 2399 this.interfaces.push(newInterface);
nickjillings@1381 2400 }
nickjillings@1381 2401
nickjillings@1374 2402 for (var elements of this.specification.audioElements)
nickjillings@1374 2403 {
nickjillings@1374 2404 var audioElementDOM = new this.audioElementNode(this,elements);
nickjillings@1374 2405 this.children.push(audioElementDOM);
nickjillings@1374 2406 this.childrenDOM.appendChild(audioElementDOM.rootDOM);
nickjillings@1374 2407 }
nickjillings@1374 2408
n@2421 2409 this.getAudioElements().forEach(function(elem){
n@2421 2410 elem.moveButtons.disable();
n@2421 2411 });
n@2421 2412
nickjillings@1370 2413 this.addInterface = {
nickjillings@1370 2414 root: document.createElement("button"),
nickjillings@1370 2415 parent: this,
nickjillings@1370 2416 handleEvent: function() {
nickjillings@2194 2417 var InterfaceObj = new specification.interfaceNode(specification);
nickjillings@1370 2418 var newInterface = new this.parent.parent.interfaceNode(this.parent.parent,InterfaceObj);
nickjillings@1370 2419 newInterface.build("Interface",""+this.parent.specification.id+"-interface",this.parent.childrenDOM);
nickjillings@1370 2420 this.parent.children.push(newInterface);
nickjillings@1370 2421 this.parent.specification.interfaces.push(InterfaceObj);
nickjillings@1370 2422 this.parent.interfaces.push(newInterface);
nickjillings@1370 2423 }
nickjillings@1370 2424 }
nickjillings@1370 2425 this.addInterface.root.textContent = "Add Interface";
nickjillings@1370 2426 this.addInterface.root.addEventListener("click",this.addInterface,false);
nickjillings@1370 2427 this.buttonDOM.appendChild(this.addInterface.root);
nickjillings@1370 2428
nickjillings@1370 2429 this.addAudioElement = {
nickjillings@1370 2430 root: document.createElement("button"),
nickjillings@1370 2431 parent: this,
nickjillings@1370 2432 handleEvent: function() {
nickjillings@2194 2433 var audioElementObject = new this.parent.specification.audioElementNode(specification);
nickjillings@1370 2434 var audioElementDOM = new this.parent.audioElementNode(this.parent,audioElementObject);
nickjillings@1370 2435 this.parent.specification.audioElements.push(audioElementObject);
nickjillings@1370 2436 this.parent.children.push(audioElementDOM);
nickjillings@1370 2437 this.parent.childrenDOM.appendChild(audioElementDOM.rootDOM);
nickjillings@1370 2438 }
nickjillings@1370 2439 }
nickjillings@1370 2440 this.addAudioElement.root.textContent = "Add Audio Element";
nickjillings@1370 2441 this.addAudioElement.root.addEventListener("click",this.addAudioElement,false);
nickjillings@1370 2442 this.buttonDOM.appendChild(this.addAudioElement.root);
nickjillings@1370 2443 }
nickjillings@1370 2444 }