annotate test_create/test_create.html @ 1304:3abbe1cc81ca

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