annotate test_create/test_create.html @ 1099:0a15fa67bda1

First draft of AES poster
author Dave <djmoffat@users.noreply.github.com>
date Tue, 23 Feb 2016 15:19:31 +0000
parents
children b5bf2f57187c f53b1098795f a4ad9e55b5b8
rev   line source
djmoffat@1099 1 <html>
djmoffat@1099 2 <head>
djmoffat@1099 3 <!-- This defines the test creator tool for the Web Audio Evaluation Toolbox -->
djmoffat@1099 4 <link rel='stylesheet' type="text/css" href="style.css"/>
djmoffat@1099 5 <script type="text/javascript">
djmoffat@1099 6 // Copy of Specifiation node from Core.js
djmoffat@1099 7 function Specification() {
djmoffat@1099 8 // Handles the decoding of the project specification XML into a simple JavaScript Object.
djmoffat@1099 9
djmoffat@1099 10 this.interface = null;
djmoffat@1099 11 this.projectReturn = "null";
djmoffat@1099 12 this.randomiseOrder = null;
djmoffat@1099 13 this.testPages = null;
djmoffat@1099 14 this.pages = [];
djmoffat@1099 15 this.metrics = null;
djmoffat@1099 16 this.interfaces = null;
djmoffat@1099 17 this.loudness = null;
djmoffat@1099 18 this.errors = [];
djmoffat@1099 19 this.schema = null;
djmoffat@1099 20
djmoffat@1099 21 this.processAttribute = function(attribute,schema)
djmoffat@1099 22 {
djmoffat@1099 23 // attribute is the string returned from getAttribute on the XML
djmoffat@1099 24 // schema is the <xs:attribute> node
djmoffat@1099 25 if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined)
djmoffat@1099 26 {
djmoffat@1099 27 schema = this.schema.getAllElementsByName(schema.getAttribute('ref'))[0];
djmoffat@1099 28 }
djmoffat@1099 29 var defaultOpt = schema.getAttribute('default');
djmoffat@1099 30 if (attribute == null) {
djmoffat@1099 31 attribute = defaultOpt;
djmoffat@1099 32 }
djmoffat@1099 33 var dataType = schema.getAttribute('type');
djmoffat@1099 34 if (typeof dataType == "string") { dataType = dataType.substr(3);}
djmoffat@1099 35 else {dataType = "string";}
djmoffat@1099 36 if (attribute == null)
djmoffat@1099 37 {
djmoffat@1099 38 return attribute;
djmoffat@1099 39 }
djmoffat@1099 40 switch(dataType)
djmoffat@1099 41 {
djmoffat@1099 42 case "boolean":
djmoffat@1099 43 if (attribute == 'true'){attribute = true;}else{attribute=false;}
djmoffat@1099 44 break;
djmoffat@1099 45 case "negativeInteger":
djmoffat@1099 46 case "positiveInteger":
djmoffat@1099 47 case "nonNegativeInteger":
djmoffat@1099 48 case "nonPositiveInteger":
djmoffat@1099 49 case "integer":
djmoffat@1099 50 case "decimal":
djmoffat@1099 51 case "short":
djmoffat@1099 52 attribute = Number(attribute);
djmoffat@1099 53 break;
djmoffat@1099 54 case "string":
djmoffat@1099 55 default:
djmoffat@1099 56 attribute = String(attribute);
djmoffat@1099 57 break;
djmoffat@1099 58 }
djmoffat@1099 59 return attribute;
djmoffat@1099 60 };
djmoffat@1099 61
djmoffat@1099 62 this.decode = function(projectXML) {
djmoffat@1099 63 this.errors = [];
djmoffat@1099 64 // projectXML - DOM Parsed document
djmoffat@1099 65 this.projectXML = projectXML.childNodes[0];
djmoffat@1099 66 var setupNode = projectXML.getElementsByTagName('setup')[0];
djmoffat@1099 67 var schemaSetup = this.schema.getAllElementsByName('setup')[0];
djmoffat@1099 68 // First decode the attributes
djmoffat@1099 69 var attributes = schemaSetup.getAllElementsByTagName('xs:attribute');
djmoffat@1099 70 for (var i in attributes)
djmoffat@1099 71 {
djmoffat@1099 72 if (isNaN(Number(i)) == true){break;}
djmoffat@1099 73 var attributeName = attributes[i].getAttribute('name');
djmoffat@1099 74 var projectAttr = setupNode.getAttribute(attributeName);
djmoffat@1099 75 projectAttr = this.processAttribute(projectAttr,attributes[i]);
djmoffat@1099 76 switch(typeof projectAttr)
djmoffat@1099 77 {
djmoffat@1099 78 case "number":
djmoffat@1099 79 case "boolean":
djmoffat@1099 80 eval('this.'+attributeName+' = '+projectAttr);
djmoffat@1099 81 break;
djmoffat@1099 82 case "string":
djmoffat@1099 83 eval('this.'+attributeName+' = "'+projectAttr+'"');
djmoffat@1099 84 break;
djmoffat@1099 85 }
djmoffat@1099 86
djmoffat@1099 87 }
djmoffat@1099 88
djmoffat@1099 89 this.metrics = new this.metricNode();
djmoffat@1099 90
djmoffat@1099 91 this.metrics.decode(this,setupNode.getElementsByTagName('metric')[0]);
djmoffat@1099 92
djmoffat@1099 93 // Now process the survey node options
djmoffat@1099 94 var survey = setupNode.getElementsByTagName('survey');
djmoffat@1099 95 for (var i in survey) {
djmoffat@1099 96 if (isNaN(Number(i)) == true){break;}
djmoffat@1099 97 var location = survey[i].getAttribute('location');
djmoffat@1099 98 if (location == 'pre' || location == 'before')
djmoffat@1099 99 {
djmoffat@1099 100 if (this.preTest != null){this.errors.push("Already a pre/before test survey defined! Ignoring second!!");}
djmoffat@1099 101 else {
djmoffat@1099 102 this.preTest = new this.surveyNode();
djmoffat@1099 103 this.preTest.decode(this,survey[i]);
djmoffat@1099 104 }
djmoffat@1099 105 } else if (location == 'post' || location == 'after') {
djmoffat@1099 106 if (this.postTest != null){this.errors.push("Already a post/after test survey defined! Ignoring second!!");}
djmoffat@1099 107 else {
djmoffat@1099 108 this.postTest = new this.surveyNode();
djmoffat@1099 109 this.postTest.decode(this,survey[i]);
djmoffat@1099 110 }
djmoffat@1099 111 }
djmoffat@1099 112 }
djmoffat@1099 113
djmoffat@1099 114 var interfaceNode = setupNode.getElementsByTagName('interface');
djmoffat@1099 115 if (interfaceNode.length > 1)
djmoffat@1099 116 {
djmoffat@1099 117 this.errors.push("Only one <interface> node in the <setup> node allowed! Others except first ingnored!");
djmoffat@1099 118 }
djmoffat@1099 119 this.interfaces = new this.interfaceNode();
djmoffat@1099 120 if (interfaceNode.length != 0)
djmoffat@1099 121 {
djmoffat@1099 122 interfaceNode = interfaceNode[0];
djmoffat@1099 123 this.interfaces.decode(this,interfaceNode,this.schema.getAllElementsByName('interface')[1]);
djmoffat@1099 124 }
djmoffat@1099 125
djmoffat@1099 126 // Page tags
djmoffat@1099 127 var pageTags = projectXML.getElementsByTagName('page');
djmoffat@1099 128 var pageSchema = this.schema.getAllElementsByName('page')[0];
djmoffat@1099 129 for (var i=0; i<pageTags.length; i++)
djmoffat@1099 130 {
djmoffat@1099 131 var node = new this.page();
djmoffat@1099 132 node.decode(this,pageTags[i],pageSchema);
djmoffat@1099 133 this.pages.push(node);
djmoffat@1099 134 }
djmoffat@1099 135 };
djmoffat@1099 136
djmoffat@1099 137 this.encode = function()
djmoffat@1099 138 {
djmoffat@1099 139 var RootDocument = document.implementation.createDocument(null,"waet");
djmoffat@1099 140 var root = RootDocument.children[0];
djmoffat@1099 141 root.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
djmoffat@1099 142 root.setAttribute("xsi:noNamespaceSchemaLocation","test-schema.xsd");
djmoffat@1099 143 // Build setup node
djmoffat@1099 144 var setup = RootDocument.createElement("setup");
djmoffat@1099 145 var schemaSetup = this.schema.getAllElementsByName('setup')[0];
djmoffat@1099 146 // First decode the attributes
djmoffat@1099 147 var attributes = schemaSetup.getAllElementsByTagName('xs:attribute');
djmoffat@1099 148 for (var i=0; i<attributes.length; i++)
djmoffat@1099 149 {
djmoffat@1099 150 var name = attributes[i].getAttribute("name");
djmoffat@1099 151 if (name == undefined) {
djmoffat@1099 152 name = attributes[i].getAttribute("ref");
djmoffat@1099 153 }
djmoffat@1099 154 if(eval("this."+name+" != undefined") || attributes[i].getAttribute("use") == "required")
djmoffat@1099 155 {
djmoffat@1099 156 eval("setup.setAttribute('"+name+"',this."+name+")");
djmoffat@1099 157 }
djmoffat@1099 158 }
djmoffat@1099 159 root.appendChild(setup);
djmoffat@1099 160 // Survey node
djmoffat@1099 161 setup.appendChild(this.preTest.encode(RootDocument));
djmoffat@1099 162 setup.appendChild(this.postTest.encode(RootDocument));
djmoffat@1099 163 setup.appendChild(this.metrics.encode(RootDocument));
djmoffat@1099 164 setup.appendChild(this.interfaces.encode(RootDocument));
djmoffat@1099 165 for (var page of this.pages)
djmoffat@1099 166 {
djmoffat@1099 167 root.appendChild(page.encode(RootDocument));
djmoffat@1099 168 }
djmoffat@1099 169 return RootDocument;
djmoffat@1099 170 };
djmoffat@1099 171
djmoffat@1099 172 this.surveyNode = function() {
djmoffat@1099 173 this.location = null;
djmoffat@1099 174 this.options = [];
djmoffat@1099 175 this.schema = specification.schema.getAllElementsByName('survey')[0];
djmoffat@1099 176
djmoffat@1099 177 this.OptionNode = function() {
djmoffat@1099 178 this.type = undefined;
djmoffat@1099 179 this.schema = specification.schema.getAllElementsByName('surveyentry')[0];
djmoffat@1099 180 this.id = undefined;
djmoffat@1099 181 this.mandatory = undefined;
djmoffat@1099 182 this.statement = undefined;
djmoffat@1099 183 this.boxsize = undefined;
djmoffat@1099 184 this.options = [];
djmoffat@1099 185 this.min = undefined;
djmoffat@1099 186 this.max = undefined;
djmoffat@1099 187 this.step = undefined;
djmoffat@1099 188
djmoffat@1099 189 this.decode = function(parent,child)
djmoffat@1099 190 {
djmoffat@1099 191 var attributeMap = this.schema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 192 for (var i in attributeMap){
djmoffat@1099 193 if(isNaN(Number(i)) == true){break;}
djmoffat@1099 194 var attributeName = attributeMap[i].getAttribute('name') || attributeMap[i].getAttribute('ref');
djmoffat@1099 195 var projectAttr = child.getAttribute(attributeName);
djmoffat@1099 196 projectAttr = parent.processAttribute(projectAttr,attributeMap[i]);
djmoffat@1099 197 switch(typeof projectAttr)
djmoffat@1099 198 {
djmoffat@1099 199 case "number":
djmoffat@1099 200 case "boolean":
djmoffat@1099 201 eval('this.'+attributeName+' = '+projectAttr);
djmoffat@1099 202 break;
djmoffat@1099 203 case "string":
djmoffat@1099 204 eval('this.'+attributeName+' = "'+projectAttr+'"');
djmoffat@1099 205 break;
djmoffat@1099 206 }
djmoffat@1099 207 }
djmoffat@1099 208 this.statement = child.getElementsByTagName('statement')[0].textContent;
djmoffat@1099 209 if (this.type == "checkbox" || this.type == "radio") {
djmoffat@1099 210 var children = child.getElementsByTagName('option');
djmoffat@1099 211 if (children.length == null) {
djmoffat@1099 212 console.log('Malformed' +child.nodeName+ 'entry');
djmoffat@1099 213 this.statement = 'Malformed' +child.nodeName+ 'entry';
djmoffat@1099 214 this.type = 'statement';
djmoffat@1099 215 } else {
djmoffat@1099 216 this.options = [];
djmoffat@1099 217 for (var i in children)
djmoffat@1099 218 {
djmoffat@1099 219 if (isNaN(Number(i))==true){break;}
djmoffat@1099 220 this.options.push({
djmoffat@1099 221 name: children[i].getAttribute('name'),
djmoffat@1099 222 text: children[i].textContent
djmoffat@1099 223 });
djmoffat@1099 224 }
djmoffat@1099 225 }
djmoffat@1099 226 }
djmoffat@1099 227 };
djmoffat@1099 228
djmoffat@1099 229 this.exportXML = function(doc)
djmoffat@1099 230 {
djmoffat@1099 231 var node = doc.createElement('surveyelement');
djmoffat@1099 232 node.setAttribute('type',this.type);
djmoffat@1099 233 var statement = doc.createElement('statement');
djmoffat@1099 234 statement.textContent = this.statement;
djmoffat@1099 235 node.appendChild(statement);
djmoffat@1099 236 switch(this.type)
djmoffat@1099 237 {
djmoffat@1099 238 case "statement":
djmoffat@1099 239 break;
djmoffat@1099 240 case "question":
djmoffat@1099 241 node.id = this.id;
djmoffat@1099 242 node.setAttribute("mandatory",this.mandatory);
djmoffat@1099 243 node.setAttribute("boxsize",this.boxsize);
djmoffat@1099 244 break;
djmoffat@1099 245 case "number":
djmoffat@1099 246 node.id = this.id;
djmoffat@1099 247 node.setAttribute("mandatory",this.mandatory);
djmoffat@1099 248 node.setAttribute("min", this.min);
djmoffat@1099 249 node.setAttribute("max", this.max);
djmoffat@1099 250 node.setAttribute("step", this.step);
djmoffat@1099 251 break;
djmoffat@1099 252 case "checkbox":
djmoffat@1099 253 case "radio":
djmoffat@1099 254 node.id = this.id;
djmoffat@1099 255 for (var i=0; i<this.options.length; i++)
djmoffat@1099 256 {
djmoffat@1099 257 var option = this.options[i];
djmoffat@1099 258 var optionNode = doc.createElement("option");
djmoffat@1099 259 optionNode.setAttribute("name",option.name);
djmoffat@1099 260 optionNode.textContent = option.text;
djmoffat@1099 261 node.appendChild(optionNode);
djmoffat@1099 262 }
djmoffat@1099 263 break;
djmoffat@1099 264 }
djmoffat@1099 265 return node;
djmoffat@1099 266 };
djmoffat@1099 267 };
djmoffat@1099 268 this.decode = function(parent,xml) {
djmoffat@1099 269 this.location = xml.getAttribute('location');
djmoffat@1099 270 if (this.location == 'before'){this.location = 'pre';}
djmoffat@1099 271 else if (this.location == 'after'){this.location = 'post';}
djmoffat@1099 272 for (var i in xml.children)
djmoffat@1099 273 {
djmoffat@1099 274 if(isNaN(Number(i))==true){break;}
djmoffat@1099 275 var node = new this.OptionNode();
djmoffat@1099 276 node.decode(parent,xml.children[i]);
djmoffat@1099 277 this.options.push(node);
djmoffat@1099 278 }
djmoffat@1099 279 };
djmoffat@1099 280 this.encode = function(doc) {
djmoffat@1099 281 var node = doc.createElement('survey');
djmoffat@1099 282 node.setAttribute('location',this.location);
djmoffat@1099 283 for (var i=0; i<this.options.length; i++)
djmoffat@1099 284 {
djmoffat@1099 285 node.appendChild(this.options[i].exportXML(doc));
djmoffat@1099 286 }
djmoffat@1099 287 return node;
djmoffat@1099 288 };
djmoffat@1099 289 };
djmoffat@1099 290
djmoffat@1099 291 this.interfaceNode = function()
djmoffat@1099 292 {
djmoffat@1099 293 this.title = null;
djmoffat@1099 294 this.name = null;
djmoffat@1099 295 this.options = [];
djmoffat@1099 296 this.scales = [];
djmoffat@1099 297 this.schema = specification.schema.getAllElementsByName('interface')[1];
djmoffat@1099 298
djmoffat@1099 299 this.decode = function(parent,xml) {
djmoffat@1099 300 this.name = xml.getAttribute('name');
djmoffat@1099 301 var titleNode = xml.getElementsByTagName('title');
djmoffat@1099 302 if (titleNode.length == 1)
djmoffat@1099 303 {
djmoffat@1099 304 this.title = titleNode[0].textContent;
djmoffat@1099 305 }
djmoffat@1099 306 var interfaceOptionNodes = xml.getElementsByTagName('interfaceoption');
djmoffat@1099 307 // Extract interfaceoption node schema
djmoffat@1099 308 var interfaceOptionNodeSchema = this.schema.getAllElementsByName('interfaceoption')[0];
djmoffat@1099 309 var attributeMap = interfaceOptionNodeSchema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 310 for (var i=0; i<interfaceOptionNodes.length; i++)
djmoffat@1099 311 {
djmoffat@1099 312 var ioNode = interfaceOptionNodes[i];
djmoffat@1099 313 var option = {};
djmoffat@1099 314 for (var j=0; j<attributeMap.length; j++)
djmoffat@1099 315 {
djmoffat@1099 316 var attributeName = attributeMap[j].getAttribute('name') || attributeMap[j].getAttribute('ref');
djmoffat@1099 317 var projectAttr = ioNode.getAttribute(attributeName);
djmoffat@1099 318 projectAttr = parent.processAttribute(projectAttr,attributeMap[j]);
djmoffat@1099 319 switch(typeof projectAttr)
djmoffat@1099 320 {
djmoffat@1099 321 case "number":
djmoffat@1099 322 case "boolean":
djmoffat@1099 323 eval('option.'+attributeName+' = '+projectAttr);
djmoffat@1099 324 break;
djmoffat@1099 325 case "string":
djmoffat@1099 326 eval('option.'+attributeName+' = "'+projectAttr+'"');
djmoffat@1099 327 break;
djmoffat@1099 328 }
djmoffat@1099 329 }
djmoffat@1099 330 this.options.push(option);
djmoffat@1099 331 }
djmoffat@1099 332
djmoffat@1099 333 // Now the scales nodes
djmoffat@1099 334 var scaleParent = xml.getElementsByTagName('scales');
djmoffat@1099 335 if (scaleParent.length == 1) {
djmoffat@1099 336 scaleParent = scaleParent[0];
djmoffat@1099 337 for (var i=0; i<scaleParent.children.length; i++) {
djmoffat@1099 338 var child = scaleParent.children[i];
djmoffat@1099 339 this.scales.push({
djmoffat@1099 340 text: child.textContent,
djmoffat@1099 341 position: Number(child.getAttribute('position'))
djmoffat@1099 342 });
djmoffat@1099 343 }
djmoffat@1099 344 }
djmoffat@1099 345 };
djmoffat@1099 346
djmoffat@1099 347 this.encode = function(doc) {
djmoffat@1099 348 var node = doc.createElement("interface");
djmoffat@1099 349 if (typeof name == "string")
djmoffat@1099 350 node.setAttribute("name",this.name);
djmoffat@1099 351 for (var option of this.options)
djmoffat@1099 352 {
djmoffat@1099 353 var child = doc.createElement("interfaceoption");
djmoffat@1099 354 child.setAttribute("type",option.type);
djmoffat@1099 355 child.setAttribute("name",option.name);
djmoffat@1099 356 node.appendChild(child);
djmoffat@1099 357 }
djmoffat@1099 358 if (this.scales.length != 0) {
djmoffat@1099 359 var scales = doc.createElement("scales");
djmoffat@1099 360 for (var scale of this.scales)
djmoffat@1099 361 {
djmoffat@1099 362 var child = doc.createElement("scalelabel");
djmoffat@1099 363 child.setAttribute("position",scale.position);
djmoffat@1099 364 child.textContent = scale.text;
djmoffat@1099 365 scales.appendChild(child);
djmoffat@1099 366 }
djmoffat@1099 367 node.appendChild(scales);
djmoffat@1099 368 }
djmoffat@1099 369 return node;
djmoffat@1099 370 };
djmoffat@1099 371 };
djmoffat@1099 372
djmoffat@1099 373 this.metricNode = function() {
djmoffat@1099 374 this.enabled = [];
djmoffat@1099 375 this.decode = function(parent, xml) {
djmoffat@1099 376 var children = xml.getElementsByTagName('metricenable');
djmoffat@1099 377 for (var i in children) {
djmoffat@1099 378 if (isNaN(Number(i)) == true){break;}
djmoffat@1099 379 this.enabled.push(children[i].textContent);
djmoffat@1099 380 }
djmoffat@1099 381 }
djmoffat@1099 382 this.encode = function(doc) {
djmoffat@1099 383 var node = doc.createElement('metric');
djmoffat@1099 384 for (var i in this.enabled)
djmoffat@1099 385 {
djmoffat@1099 386 if (isNaN(Number(i)) == true){break;}
djmoffat@1099 387 var child = doc.createElement('metricenable');
djmoffat@1099 388 child.textContent = this.enabled[i];
djmoffat@1099 389 node.appendChild(child);
djmoffat@1099 390 }
djmoffat@1099 391 return node;
djmoffat@1099 392 }
djmoffat@1099 393 }
djmoffat@1099 394
djmoffat@1099 395 this.page = function() {
djmoffat@1099 396 this.presentedId = undefined;
djmoffat@1099 397 this.id = undefined;
djmoffat@1099 398 this.hostURL = undefined;
djmoffat@1099 399 this.randomiseOrder = undefined;
djmoffat@1099 400 this.loop = undefined;
djmoffat@1099 401 this.showElementComments = undefined;
djmoffat@1099 402 this.outsideReference = null;
djmoffat@1099 403 this.loudness = null;
djmoffat@1099 404 this.preTest = null;
djmoffat@1099 405 this.postTest = null;
djmoffat@1099 406 this.interfaces = [];
djmoffat@1099 407 this.commentBoxPrefix = "Comment on track";
djmoffat@1099 408 this.audioElements = [];
djmoffat@1099 409 this.commentQuestions = [];
djmoffat@1099 410 this.schema = specification.schema.getAllElementsByName("page")[0];
djmoffat@1099 411
djmoffat@1099 412 this.decode = function(parent,xml)
djmoffat@1099 413 {
djmoffat@1099 414 var attributeMap = this.schema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 415 for (var i=0; i<attributeMap.length; i++)
djmoffat@1099 416 {
djmoffat@1099 417 var attributeName = attributeMap[i].getAttribute('name') || attributeMap[i].getAttribute('ref');
djmoffat@1099 418 var projectAttr = xml.getAttribute(attributeName);
djmoffat@1099 419 projectAttr = parent.processAttribute(projectAttr,attributeMap[i]);
djmoffat@1099 420 switch(typeof projectAttr)
djmoffat@1099 421 {
djmoffat@1099 422 case "number":
djmoffat@1099 423 case "boolean":
djmoffat@1099 424 eval('this.'+attributeName+' = '+projectAttr);
djmoffat@1099 425 break;
djmoffat@1099 426 case "string":
djmoffat@1099 427 eval('this.'+attributeName+' = "'+projectAttr+'"');
djmoffat@1099 428 break;
djmoffat@1099 429 }
djmoffat@1099 430 }
djmoffat@1099 431
djmoffat@1099 432 // Get the Comment Box Prefix
djmoffat@1099 433 var CBP = xml.getElementsByTagName('commentboxprefix');
djmoffat@1099 434 if (CBP.length != 0) {
djmoffat@1099 435 this.commentBoxPrefix = CBP[0].textContent;
djmoffat@1099 436 }
djmoffat@1099 437
djmoffat@1099 438 // Now decode the interfaces
djmoffat@1099 439 var interfaceNode = xml.getElementsByTagName('interface');
djmoffat@1099 440 for (var i=0; i<interfaceNode.length; i++)
djmoffat@1099 441 {
djmoffat@1099 442 var node = new parent.interfaceNode();
djmoffat@1099 443 node.decode(this,interfaceNode[i],parent.schema.getAllElementsByName('interface')[1]);
djmoffat@1099 444 this.interfaces.push(node);
djmoffat@1099 445 }
djmoffat@1099 446
djmoffat@1099 447 // Now process the survey node options
djmoffat@1099 448 var survey = xml.getElementsByTagName('survey');
djmoffat@1099 449 var surveySchema = parent.schema.getAllElementsByName('survey')[0];
djmoffat@1099 450 for (var i in survey) {
djmoffat@1099 451 if (isNaN(Number(i)) == true){break;}
djmoffat@1099 452 var location = survey[i].getAttribute('location');
djmoffat@1099 453 if (location == 'pre' || location == 'before')
djmoffat@1099 454 {
djmoffat@1099 455 if (this.preTest != null){this.errors.push("Already a pre/before test survey defined! Ignoring second!!");}
djmoffat@1099 456 else {
djmoffat@1099 457 this.preTest = new parent.surveyNode();
djmoffat@1099 458 this.preTest.decode(parent,survey[i],surveySchema);
djmoffat@1099 459 }
djmoffat@1099 460 } else if (location == 'post' || location == 'after') {
djmoffat@1099 461 if (this.postTest != null){this.errors.push("Already a post/after test survey defined! Ignoring second!!");}
djmoffat@1099 462 else {
djmoffat@1099 463 this.postTest = new parent.surveyNode();
djmoffat@1099 464 this.postTest.decode(parent,survey[i],surveySchema);
djmoffat@1099 465 }
djmoffat@1099 466 }
djmoffat@1099 467 }
djmoffat@1099 468
djmoffat@1099 469 // Now process the audioelement tags
djmoffat@1099 470 var audioElements = xml.getElementsByTagName('audioelement');
djmoffat@1099 471 for (var i=0; i<audioElements.length; i++)
djmoffat@1099 472 {
djmoffat@1099 473 var node = new this.audioElementNode();
djmoffat@1099 474 node.decode(this,audioElements[i]);
djmoffat@1099 475 this.audioElements.push(node);
djmoffat@1099 476 }
djmoffat@1099 477
djmoffat@1099 478 // Now decode the commentquestions
djmoffat@1099 479 var commentQuestions = xml.getElementsByTagName('commentquestion');
djmoffat@1099 480 for (var i=0; i<commentQuestions.length; i++)
djmoffat@1099 481 {
djmoffat@1099 482 var node = new this.commentQuestionNode();
djmoffat@1099 483 node.decode(parent,commentQuestions[i]);
djmoffat@1099 484 this.commentQuestions.push(node);
djmoffat@1099 485 }
djmoffat@1099 486 };
djmoffat@1099 487
djmoffat@1099 488 this.encode = function(root)
djmoffat@1099 489 {
djmoffat@1099 490 var AHNode = root.createElement("page");
djmoffat@1099 491 // First decode the attributes
djmoffat@1099 492 var attributes = this.schema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 493 for (var i=0; i<attributes.length; i++)
djmoffat@1099 494 {
djmoffat@1099 495 var name = attributes[i].getAttribute("name");
djmoffat@1099 496 if (name == undefined) {
djmoffat@1099 497 name = attributes[i].getAttribute("ref");
djmoffat@1099 498 }
djmoffat@1099 499 if(eval("this."+name+" != undefined") || attributes[i].getAttribute("use") == "required")
djmoffat@1099 500 {
djmoffat@1099 501 eval("AHNode.setAttribute('"+name+"',this."+name+")");
djmoffat@1099 502 }
djmoffat@1099 503 }
djmoffat@1099 504 if(this.loudness != null) {AHNode.setAttribute("loudness",this.loudness);}
djmoffat@1099 505 // <commentboxprefix>
djmoffat@1099 506 var commentboxprefix = root.createElement("commentboxprefix");
djmoffat@1099 507 commentboxprefix.textContent = this.commentBoxPrefix;
djmoffat@1099 508 AHNode.appendChild(commentboxprefix);
djmoffat@1099 509
djmoffat@1099 510 for (var i=0; i<this.interfaces.length; i++)
djmoffat@1099 511 {
djmoffat@1099 512 AHNode.appendChild(this.interfaces[i].encode(root));
djmoffat@1099 513 }
djmoffat@1099 514
djmoffat@1099 515 for (var i=0; i<this.audioElements.length; i++) {
djmoffat@1099 516 AHNode.appendChild(this.audioElements[i].encode(root));
djmoffat@1099 517 }
djmoffat@1099 518 // Create <CommentQuestion>
djmoffat@1099 519 for (var i=0; i<this.commentQuestions.length; i++)
djmoffat@1099 520 {
djmoffat@1099 521 AHNode.appendChild(this.commentQuestions[i].encode(root));
djmoffat@1099 522 }
djmoffat@1099 523
djmoffat@1099 524 AHNode.appendChild(this.preTest.encode(root));
djmoffat@1099 525 AHNode.appendChild(this.postTest.encode(root));
djmoffat@1099 526 return AHNode;
djmoffat@1099 527 };
djmoffat@1099 528
djmoffat@1099 529 this.commentQuestionNode = function() {
djmoffat@1099 530 this.id = null;
djmoffat@1099 531 this.type = undefined;
djmoffat@1099 532 this.options = [];
djmoffat@1099 533 this.statement = undefined;
djmoffat@1099 534 this.schema = specification.schema.getAllElementsByName('commentquestion')[0];
djmoffat@1099 535 this.decode = function(parent,xml)
djmoffat@1099 536 {
djmoffat@1099 537 this.id = xml.id;
djmoffat@1099 538 this.type = xml.getAttribute('type');
djmoffat@1099 539 this.statement = xml.getElementsByTagName('statement')[0].textContent;
djmoffat@1099 540 var optNodes = xml.getElementsByTagName('option');
djmoffat@1099 541 for (var i=0; i<optNodes.length; i++)
djmoffat@1099 542 {
djmoffat@1099 543 var optNode = optNodes[i];
djmoffat@1099 544 this.options.push({
djmoffat@1099 545 name: optNode.getAttribute('name'),
djmoffat@1099 546 text: optNode.textContent
djmoffat@1099 547 });
djmoffat@1099 548 }
djmoffat@1099 549 };
djmoffat@1099 550
djmoffat@1099 551 this.encode = function(root)
djmoffat@1099 552 {
djmoffat@1099 553 var node = root.createElement("commentquestion");
djmoffat@1099 554 node.id = this.id;
djmoffat@1099 555 node.setAttribute("type",this.type);
djmoffat@1099 556 var statement = root.createElement("statement");
djmoffat@1099 557 statement.textContent = this.statement;
djmoffat@1099 558 node.appendChild(statement);
djmoffat@1099 559 for (var option of this.options)
djmoffat@1099 560 {
djmoffat@1099 561 var child = root.createElement("option");
djmoffat@1099 562 child.setAttribute("name",option.name);
djmoffat@1099 563 child.textContent = option.text;
djmoffat@1099 564 node.appendChild(child);
djmoffat@1099 565 }
djmoffat@1099 566 return node;
djmoffat@1099 567 };
djmoffat@1099 568 };
djmoffat@1099 569
djmoffat@1099 570 this.audioElementNode = function() {
djmoffat@1099 571 this.url = null;
djmoffat@1099 572 this.id = null;
djmoffat@1099 573 this.parent = null;
djmoffat@1099 574 this.type = null;
djmoffat@1099 575 this.marker = false;
djmoffat@1099 576 this.enforce = false;
djmoffat@1099 577 this.gain = 1.0;
djmoffat@1099 578 this.schema = specification.schema.getAllElementsByName('audioelement')[0];;
djmoffat@1099 579 this.parent = null;
djmoffat@1099 580 this.decode = function(parent,xml)
djmoffat@1099 581 {
djmoffat@1099 582 this.parent = parent;
djmoffat@1099 583 var attributeMap = this.schema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 584 for (var i=0; i<attributeMap.length; i++)
djmoffat@1099 585 {
djmoffat@1099 586 var attributeName = attributeMap[i].getAttribute('name') || attributeMap[i].getAttribute('ref');
djmoffat@1099 587 var projectAttr = xml.getAttribute(attributeName);
djmoffat@1099 588 projectAttr = specification.processAttribute(projectAttr,attributeMap[i]);
djmoffat@1099 589 switch(typeof projectAttr)
djmoffat@1099 590 {
djmoffat@1099 591 case "number":
djmoffat@1099 592 case "boolean":
djmoffat@1099 593 eval('this.'+attributeName+' = '+projectAttr);
djmoffat@1099 594 break;
djmoffat@1099 595 case "string":
djmoffat@1099 596 eval('this.'+attributeName+' = "'+projectAttr+'"');
djmoffat@1099 597 break;
djmoffat@1099 598 }
djmoffat@1099 599 }
djmoffat@1099 600
djmoffat@1099 601 };
djmoffat@1099 602 this.encode = function(root)
djmoffat@1099 603 {
djmoffat@1099 604 var AENode = root.createElement("audioelement");
djmoffat@1099 605 var attributes = this.schema.getAllElementsByTagName('xs:attribute');
djmoffat@1099 606 for (var i=0; i<attributes.length; i++)
djmoffat@1099 607 {
djmoffat@1099 608 var name = attributes[i].getAttribute("name");
djmoffat@1099 609 if (name == undefined) {
djmoffat@1099 610 name = attributes[i].getAttribute("ref");
djmoffat@1099 611 }
djmoffat@1099 612 if(eval("this."+name+" != undefined") || attributes[i].getAttribute("use") == "required")
djmoffat@1099 613 {
djmoffat@1099 614 eval("AENode.setAttribute('"+name+"',this."+name+")");
djmoffat@1099 615 }
djmoffat@1099 616 }
djmoffat@1099 617 return AENode;
djmoffat@1099 618 };
djmoffat@1099 619 };
djmoffat@1099 620 };
djmoffat@1099 621 }
djmoffat@1099 622
djmoffat@1099 623 </script>
djmoffat@1099 624 <script src="../jquery-2.1.4.js"></script>
djmoffat@1099 625 <script type="text/javascript" src="test_core.js"/>
djmoffat@1099 626 <script type="text/javascript">
djmoffat@1099 627
djmoffat@1099 628 </script>
djmoffat@1099 629 </head>
djmoffat@1099 630 <body>
djmoffat@1099 631 <div id="popupHolder"></div>
djmoffat@1099 632 <div id="blanket"></div>
djmoffat@1099 633 <div id="content"></div>
djmoffat@1099 634 </body>
djmoffat@1099 635 </html>