annotate new/js/specification.js @ 22:1f375b7d75fd tip

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