annotate test_create/test_create.html @ 1088:3705f68a38b7

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