# HG changeset patch # User Nicholas Jillings # Date 1452784831 0 # Node ID c73f3540db5919f7ca9b8e27f1e940c526a8817f # Parent 9ae9d1fb80bf74f8d69fbf9608000999302d118f Added common .getAllElementsByName and .getAllElementsByTagName to aid cross-browser differences in specification. diff -r 9ae9d1fb80bf -r c73f3540db59 core.js --- a/core.js Thu Jan 14 12:19:42 2016 +0000 +++ b/core.js Thu Jan 14 15:20:31 2016 +0000 @@ -26,6 +26,83 @@ // Add a prototype to the bufferNode to hold the computed LUFS loudness AudioBuffer.prototype.lufs = undefined; +// Firefox does not have an XMLDocument.prototype.getElementsByName +// and there is no searchAll style command, this custom function will +// search all children recusrively for the name. Used for XSD where all +// element nodes must have a name and therefore can pull the schema node +XMLDocument.prototype.getAllElementsByName = function(name) +{ + name = String(name); + var selected = this.documentElement.getAllElementsByName(name); + return selected; +} + +Element.prototype.getAllElementsByName = function(name) +{ + name = String(name); + var selected = []; + var node = this.firstElementChild; + while(node != null) + { + if (node.getAttribute('name') == name) + { + selected.push(node); + } + if (node.childElementCount > 0) + { + selected = selected.concat(node.getAllElementsByName(name)); + } + node = node.nextElementSibling; + } + return selected; +} + +XMLDocument.prototype.getAllElementsByTagName = function(name) +{ + name = String(name); + var selected = this.documentElement.getAllElementsByTagName(name); + return selected; +} + +Element.prototype.getAllElementsByTagName = function(name) +{ + name = String(name); + var selected = []; + var node = this.firstElementChild; + while(node != null) + { + if (node.nodeName == name) + { + selected.push(node); + } + if (node.childElementCount > 0) + { + selected = selected.concat(node.getAllElementsByTagName(name)); + } + node = node.nextElementSibling; + } + return selected; +} + +// Firefox does not have an XMLDocument.prototype.getElementsByName +if (typeof XMLDocument.prototype.getElementsByName != "function") { + XMLDocument.prototype.getElementsByName = function(name) + { + name = String(name); + var node = this.documentElement.firstElementChild; + var selected = []; + while(node != null) + { + if (node.getAttribute('name') == name) + { + selected.push(node); + } + node = node.nextElementSibling; + } + return selected; + } +} + window.onload = function() { // Function called once the browser has loaded all files. // This should perform any initial commands such as structure / loading documents @@ -1181,7 +1258,7 @@ this.state = 1; this.buffer.buffer.playbackGain = callee.buffer.playbackGain; this.buffer.buffer.lufs = callee.buffer.lufs; - var targetLUFS = this.specification.parent.loudness; + var targetLUFS = this.specification.parent.loudness || specification.loudness; if (typeof targetLUFS === "number") { this.buffer.buffer.playbackGain = decibelToLinear(targetLUFS - this.buffer.buffer.lufs); @@ -1655,7 +1732,7 @@ // schema is the node if (schema.getAttribute('name') == undefined && schema.getAttribute('ref') != undefined) { - schema = this.schema.getElementsByName(schema.getAttribute('ref'))[0]; + schema = this.schema.getAllElementsByName(schema.getAttribute('ref'))[0]; } var defaultOpt = schema.getAttribute('default'); if (attribute == null) { @@ -1695,9 +1772,9 @@ // projectXML - DOM Parsed document this.projectXML = projectXML.childNodes[0]; var setupNode = projectXML.getElementsByTagName('setup')[0]; - var schemaSetup = this.schema.getElementsByName('setup')[0]; + var schemaSetup = this.schema.getAllElementsByName('setup')[0]; // First decode the attributes - var attributes = schemaSetup.getElementsByTagName('attribute'); + var attributes = schemaSetup.getAllElementsByTagName('xs:attribute'); for (var i in attributes) { if (isNaN(Number(i)) == true){break;} @@ -1743,7 +1820,7 @@ // Now process the survey node options var survey = setupNode.getElementsByTagName('survey'); - var surveySchema = specification.schema.getElementsByName('survey')[0]; + var surveySchema = specification.schema.getAllElementsByName('survey')[0]; for (var i in survey) { if (isNaN(Number(i)) == true){break;} var location = survey[i].getAttribute('location'); @@ -1772,12 +1849,12 @@ if (interfaceNode.length != 0) { interfaceNode = interfaceNode[0]; - this.interfaces.decode(this,interfaceNode,this.schema.getElementsByName('interface')[1]); + this.interfaces.decode(this,interfaceNode,this.schema.getAllElementsByName('interface')[1]); } // Page tags var pageTags = projectXML.getElementsByTagName('page'); - var pageSchema = this.schema.getElementsByName('page')[0]; + var pageSchema = this.schema.getAllElementsByName('page')[0]; for (var i=0; i