annotate test_create/test_core.js @ 2420:02d5d22d7018

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