annotate test_create/test_core.js @ 2423:23bbd100b403

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